Commit e9d3d67e by yangzhi

Merge branch 'dev'

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