Commit e9d3d67e by yangzhi

Merge branch 'dev'

parents c5a887e2 8a05eddc
......@@ -7,6 +7,7 @@ const axios = Axios.create({
baseURL: window.apiHostSetting.VUE_APP_BASE_URL + '/api',
timeout: 30 * 1000,
})
let HTTPNUM = 0
axios.interceptors.request.use((config) => {
if (config.data && typeof config.data === 'object') {
const data = config.data
......@@ -45,25 +46,27 @@ axios.interceptors.response.use(
})
return Promise.reject(res.data)
} else if (res.data.code === 403) {
console.log(Vue)
// token过期
Vue.prototype.$message({
type: 'error',
message: res.data.message,
})
router
.replace({
name: 'login',
})
.catch((err) => {
console.log(err)
if (HTTPNUM === 0) {
HTTPNUM++
Vue.prototype.$message({
type: 'error',
message: res.data.message,
})
router
.replace({
name: 'login',
})
.catch((err) => {
console.log(err)
})
}
return Promise.reject(res.data)
} else if (res.data.code === 500) {
Vue.prototype.$alert(
'<div style="max-height:500px;overflow:auto">' +
res.data.message +
'</div>',
res.data.message +
'</div>',
'错误提示',
{
dangerouslyUseHTMLString: true,
......@@ -75,23 +78,26 @@ axios.interceptors.response.use(
if (res.data) {
const fileReader = new FileReader()
fileReader.readAsText(res.data)
fileReader.onload = function (ev) {
fileReader.onload = function(ev) {
console.log(ev.target.result)
Vue.prototype.$alert(ev.target.result, '提示', {
confirmButtonText: '确定',
callback: () => {},
callback: () => {
},
})
}
} else {
Vue.prototype.$alert('请求参数有误', '提示', {
confirmButtonText: '确定',
callback: () => {},
callback: () => {
},
})
}
} else if (res.status === 404) {
Vue.prototype.$alert('请求不存在', '提示', {
confirmButtonText: '确定',
callback: () => {},
callback: () => {
},
})
}
}
......@@ -101,11 +107,13 @@ axios.interceptors.response.use(
(error) => {
Vue.prototype.$alert(error.message, 'Error', {
confirmButtonText: '确定',
callback: () => {},
callback: () => {
},
})
return Promise.reject(error)
},
)
export function get(url, params) {
return new Promise((resolve, reject) => {
axios.get(url, { params })
......@@ -121,6 +129,7 @@ export function get(url, params) {
})
})
}
export function post(url, params, headers) {
return new Promise((resolve, reject) => {
axios.post(url, params, headers)
......@@ -136,4 +145,5 @@ export function post(url, params, headers) {
})
})
}
export default axios
......@@ -42,7 +42,7 @@
v-model='searchForm.prop'
placeholder='请选择'
clearable
style='width: 100px'
style='width: 88px'
>
<el-option
label='开始时间'
......@@ -61,7 +61,7 @@
</el-form-item>
<el-form-item label='工单编号'>
<el-input
style='width: 120px'
style='width: 110px'
v-model='searchForm.orderNo'
placeholder='请输入'
clearable
......@@ -69,7 +69,7 @@
</el-form-item>
<el-form-item label='工单标题'>
<el-input
style='width: 120px'
style='width: 110px'
v-model='searchForm.title'
placeholder='请输入'
clearable
......@@ -78,7 +78,7 @@
<el-form-item label='工单类型'>
<el-select
v-model='searchForm.orderType'
style='width: 120px'
style='width: 110px'
value-key=''
placeholder='请选择'
clearable
......@@ -92,27 +92,14 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label='负责人'>
<el-form-item label='负责人/参与人' v-if="!(statusCode=== 'PRE_HANDLING'||statusCode==='TO_BE_ASSIGN')">
<el-select
style='width: 120px'
style='width: 150px'
placeholder='请选择'
clearable
v-model='searchForm.leaders'
>
<el-option
v-for='user in userList'
:key='user.id'
:label='user.realName'
:value='user.id'
></el-option>
</el-select>
</el-form-item>
<el-form-item label='参与人'>
<el-select
style='width: 120px'
placeholder='请选择'
clearable
v-model='searchForm.participator'
multiple
collapse-tags
v-model='searchForm.leaderAndParticipator'
>
<el-option
v-for='user in userList'
......@@ -122,9 +109,9 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label='验收人'>
<el-form-item label='验收人' v-if="!(statusCode=== 'PRE_HANDLING'||statusCode==='TO_BE_ASSIGN')">
<el-select
style='width: 120px'
style='width: 110px'
placeholder='请选择'
clearable
v-model='searchForm.acceptanceUserId'
......@@ -139,7 +126,7 @@
</el-form-item>
<el-form-item label='优先级'>
<el-select
style='width: 120px'
style='width: 110px'
filterable
clearable
v-model='searchForm.priorityStatus'
......@@ -159,7 +146,7 @@
<el-select
v-model='searchForm.sign'
placeholder='请选择'
style='width: 120px'
style='width: 110px'
clearable
>
<el-option
......@@ -216,10 +203,11 @@
</div>
<!-- 详情 -->
<el-dialog
title='详情'
:close-on-click-modal='false'
:visible.sync='detailVisible'
width='1100px'
class='dialogDetail'
:class="[dialogFullScreen ? 'fullscreen' : 'no_fullscreen']"
:fullscreen='dialogFullScreen'
@close='getlist()'
>
<!-- <div class="step-bar">
......@@ -272,6 +260,15 @@
<span>已归档</span>
</div>
</div> -->
<template slot='title'>
<div class='custom_dialog_header'>
<span class='el_dialog_title'>详情</span>
<div class='custom_dialog_menu' @click='dialogFullScreen = !dialogFullScreen'
style='text-align: right;margin-top: 11px'>
<i class='el-icon-full-screen'></i>
</div>
</div>
</template>
<div class='content' v-loading='detailLoading'>
<div class='detail_list'>
<div class='item_wrap'>
......@@ -316,29 +313,19 @@
>
<span class='label'>工单内容</span>
<span
style="
flex: 1;
display: inline-block;
padding: 0 3%;
"
class="value"
v-html="detail.content"
></span>
</p>
<p
class='item'
style='width: 100%; display: flex'
>
<span class='label'>备注</span>
<span
style="
flex: 1;
display: inline-block;
padding: 0 3%;
"
class="value"
v-html="detail.remark"
style='flex: 1; display: inline-block;max-width: 84%;'
class='value'
@click.stop='hanldeImage($event)'
v-html='detail.content'
></span>
<el-image-viewer
v-if='imgPreviewUrl'
:initial-index='subscript'
:src='imgPreviewUrl'
:on-close='closeViewer'
:url-list='imgList'
style='z-index: 3000'
></el-image-viewer>
</p>
</div>
<div
......@@ -348,6 +335,21 @@
></div>
</div>
<div class='record'>
<div class='title'>备注</div>
<ul class='chat_content'>
<el-input
style='width: 95%'
type='textarea'
:rows='4'
v-model='detail.remark'
placeholder='备注'
></el-input>
<el-button type='success' size='mini' @click='saveRemark' v-if='detail.remark' style='margin-left: 8px'>
保存
</el-button>
</ul>
</div>
<div class='record'>
<div class='title'>沟通记录</div>
<ul
class='chat_content'
......@@ -723,6 +725,7 @@ import resumetWork from '@/assets/work/resume.png'
import closetWork from '@/assets/work/close.png'
import updateWork from '@/assets/work/update.png'
import anceingWork from '@/assets/work/anceing.png'
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
export default {
name: 'task_center',
......@@ -731,6 +734,7 @@ export default {
ChooseTimePeriod,
tableView,
Edit,
ElImageViewer,
},
data() {
const userInfo = localStorage.getItem('user')
......@@ -823,6 +827,7 @@ export default {
commentsVisible: false,
detail: {},
detailVisible: false,
dialogFullScreen: false,
taskTypes: [],
treeData: [],
defaultProps: {
......@@ -862,6 +867,9 @@ export default {
],
pendingVisible: false,
pendingForm: {},
imgPreviewUrl: '',
subscript: 0,
imgList: [],
}
},
mounted() {
......@@ -896,11 +904,6 @@ export default {
),
},
{
label: '工单编号',
key: 'orderNo',
width: 110,
},
{
label: '工单模块',
key: 'moduleName',
width: 110,
......@@ -912,14 +915,9 @@ export default {
width: 80,
},
{
label: '工单状态',
key: 'orderStatusTxt',
width: 80,
},
{
label: '优先级',
key: 'priorityStatus',
width: 120,
width: 70,
render: item => {
if (item.orderStatus === 'TO_BE_ASSIGN') {
item.priorityStatus = item.priorityStatus
......@@ -963,8 +961,8 @@ export default {
},
},
{
label: '来源',
key: 'fromBusiness',
label: '备注',
key: 'remark',
width: 80,
},
{
......@@ -975,21 +973,25 @@ export default {
{
label: '负责人',
key: 'leaderNames',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN'),
width: 80,
},
{
label: '参与人',
key: 'participatorName',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN'),
width: 80,
},
{
label: '验收人',
key: 'acceptanceUserName',
show: this.statusCode === 'ACCEPTANCEING',
width: 80,
},
{
label: '验收意见',
key: 'acceptanceContent',
show: this.statusCode === 'ACCEPTANCEING',
width: 80,
},
{
......@@ -1001,6 +1003,7 @@ export default {
{
label: '开始时间',
key: 'startTime',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN'),
width: 130,
},
{
......@@ -1011,21 +1014,25 @@ export default {
{
label: '预计完成时间',
key: 'estimateCompleteTime',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN'),
width: 130,
},
{
label: '验收时间',
key: 'acceptanceTime',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN'),
width: 130,
},
{
label: '完成时间',
key: 'completeTime',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN'),
width: 130,
},
{
label: '用户评价',
key: 'evaluations',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN'),
width: 140,
},
{
......@@ -1034,24 +1041,39 @@ export default {
width: 130,
},
{
label: '验收人',
key: 'acceptanceUserName',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN' || this.statusCode === 'ACCEPTANCEING'),
width: 80,
},
{
label: '验收意见',
show: !(this.statusCode === 'PRE_HANDLING' || this.statusCode === 'TO_BE_ASSIGN' || this.statusCode === 'ACCEPTANCEING'),
key: 'acceptanceContent',
width: 80,
},
{
label: '工单编号',
key: 'orderNo',
width: 110,
},
{
label: '工单状态',
key: 'orderStatusTxt',
width: 80,
},
{
label: '来源',
key: 'fromBusiness',
width: 80,
},
{
label: '操作',
fixed: 'right',
width: 120,
align: 'center',
render: (item) => (
<span>
{(item.orderStatus === 'PRE_HANDLING' ||
item.orderStatus === 'TO_BE_ASSIGN' ||
item.orderStatus === 'TO_BE_CONFIRMED') && (
<span title='修改' class='icon-view'>
<img
width='24'
height='24'
src={updateWork}
onClick={() => this.update(item)}
/>
</span>
)}
{
<span
title='详情'
......@@ -1063,6 +1085,16 @@ export default {
></i>
</span>
}
{(item.orderStatus === 'PRE_HANDLING') && (
<span title='修改' class='icon-view'>
<img
width='24'
height='24'
src={updateWork}
onClick={() => this.update(item)}
/>
</span>
)}
{item.orderStatus === 'TO_BE_ASSIGN' && (
<span title='指派给' class='icon-view'>
<img
......@@ -1245,43 +1277,44 @@ export default {
cellClassName({
row,
columnIndex,
column,
}) {
if (
(row.orderStatus === 'TO_BE_ASSIGN' ||
row.orderStatus === 'TO_BE_CONFIRMED' ||
row.orderStatus === 'IN_PROGRESS') &&
columnIndex === 4
column.field === 'orderTypeTxt'
) {
return 'order-blue'
}
if (
row.orderStatus === 'PRE_HANDLING' &&
columnIndex === 4 &&
column.field === 'orderTypeTxt' &&
row.sign === 1
) {
return 'order-red'
}
if (
row.orderStatus === 'PRE_HANDLING' &&
columnIndex === 4 &&
column.field === 'orderTypeTxt' &&
row.sign === 0
) {
return 'order-green'
}
if (columnIndex === 4) {
if (column.field === 'orderTypeTxt') {
return 'order-grey'
}
},
cellStyle({
row,
columnIndex,
column,
}) {
if (
(row.orderStatus === 'PRE_HANDLING' ||
row.orderStatus === 'TO_BE_ASSIGN' ||
row.orderStatus === 'TO_BE_CONFIRMED' ||
row.orderStatus === 'IN_PROGRESS') &&
columnIndex === 15
column.field === 'expectCompleteTime'
) {
if (row.columnRenderColor) {
return {
......@@ -1461,24 +1494,14 @@ export default {
if (data.statusCode === 'IN_PROGRESS') {
this.$set(
this.searchForm,
'leaders',
this.userInfo.id,
)
this.$set(
this.searchForm,
'participator',
this.userInfo.id,
'leaderAndParticipator',
[this.userInfo.id],
)
} else {
this.$set(
this.searchForm,
'leaders',
'',
)
this.$set(
this.searchForm,
'participator',
'',
'leaderAndParticipator',
[],
)
}
this.statusCode = data.statusCode
......@@ -1496,6 +1519,7 @@ export default {
startTime: this.periodTime && this.periodTime[0],
endTime: this.periodTime && this.periodTime[1],
...this.searchForm,
leaderAndParticipator: this.searchForm.leaderAndParticipator ? this.searchForm.leaderAndParticipator.join(',') : '',
})
.then((res) => {
if (res.code !== 200) return
......@@ -1652,12 +1676,46 @@ export default {
this.detailLoading = false
}
},
getimgsrc(htmlstr) {
const reg = /<img.+?src=('|")?([^'"]+)('|")?(?:\s+|>)/g
const arr = []
let tem = 0
while ((tem = reg.exec(htmlstr))) {
arr.push(tem[2]) // eslint-disable-line
}
return arr
},
closeViewer() {
this.imgPreviewUrl = ''
document.documentElement.style.overflowY = 'auto'
},
hanldeImage(event) {
if (event.target.nodeName === 'IMG' || event.target.nodeName === 'img') {
this.imgPreviewUrl = decodeURIComponent(event.target.currentSrc)
const subscript = this.imgList.indexOf(this.imgPreviewUrl)
this.subscript = subscript > -1 ? subscript : 0
document.documentElement.style.overflowY = 'hidden'
}
},
saveRemark() {
axios.post('platform/platformWorkOrder/updateRemark', {
id: this.currentRowId,
remark: this.detail.remark,
}).then(res => {
if (res.code === 200) {
this.$message.success('保存成功')
}
})
},
async showDetail(item) {
this.currentRowId = item.id
await axios.get(`platform/platformWorkOrder/get?id=${item.id}`,
).then(res => {
if (res.code === 200) {
this.detail = res.data
this.imgList = Object.values(this.getimgsrc(this.detail.content))
const subscript = this.imgList.indexOf(this.imgPreviewUrl)
this.subscript = subscript > -1 ? subscript : 0
} else {
this.detailLoading = false
}
......@@ -1676,7 +1734,8 @@ export default {
this.detailVisible = true
this.textarea = ''
},
},
}
,
}
</script>
<style lang='scss' scoped>
......@@ -1782,7 +1841,7 @@ export default {
}
.content {
max-height: 68vh;
max-height: 61vh;
overflow: auto;
}
......@@ -1808,6 +1867,10 @@ export default {
.detail_list .item .value {
color: #222;
&::v-deep img {
width: 100%;
}
}
.item_wrap {
......@@ -1983,6 +2046,20 @@ export default {
padding: 20px 0;
}
.dialogDetail {
&::v-deep .el-dialog {
margin-top: 9vh !important;
}
}
.fullscreen {
width: 100%;
}
.no_fullscreen {
//width: 1300px;
}
.detail_list {
&::v-deep {
table {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment