Commit de8e2aeb by yangzhi

Merge branch 'dev'

parents a25697f9 b81f421e
......@@ -15,11 +15,11 @@ export function workConfirmed(id) {
)
}
export function workAssigned(id, user) {
return axios.post('platform/platformWorkOrder/assign', {
id: id,
leaders: user,
})
export function workAssigned(data) {
return axios.post(
'platform/platformWorkOrder/assign',
data,
)
}
export function startWorder(id, estimateCompleteTime) {
......@@ -35,12 +35,31 @@ export function archiveWorkOrder(id) {
})
}
// export function completeWorkOrder(id) {
// return axios.post('platform/platformWorkOrder/complete', {
// id: id,
// })
// }
export function completeWorkOrder(id) {
return axios.post('platform/platformWorkOrder/complete', {
id: id,
})
return axios.post(
'platform/platformWorkOrder/intoAcceptance',
{
id: id,
},
)
}
export function acceptanWorkOrder(data) {
return axios.post(
'platform/platformWorkOrder/acceptance',
data,
)
}
export function PendingWorkOrder(data) {
return axios.post(
'platform/platformWorkOrder/closeForPending',
data,
)
}
export function replyTocustomer(id, msg) {
return axios.post('platform/platformWorkOrderChat/add', {
msg: msg,
......@@ -76,6 +95,11 @@ export function closeForPending(id) {
},
)
}
export function close(id) {
return axios.post('platform/platformWorkOrder/close', {
id: id,
})
}
export function getInfo(id) {
return axios.get(
'platform/platformWorkOrder/get?id=' + id,
......
......@@ -3,7 +3,9 @@ import { mapState } from 'vuex'
const globalIndex = Math.random()
function getKey() {
return Math.random().toString().substr(3, 10)
return Math.random()
.toString()
.substr(3, 10)
}
export default {
name: 'my-table',
......@@ -86,6 +88,10 @@ export default {
type: Function,
default: () => {},
},
cellStyle: {
type: Function,
default: () => {},
},
highIds: {
// 高亮显示行
type: Array,
......@@ -168,8 +174,12 @@ export default {
// visibleMethod: this.visibleMethod
}
if (this.$props.customRightMenu?.name) {
const { code, name, prefixIcon, disabled } =
this.$props.customRightMenu
const {
code,
name,
prefixIcon,
disabled,
} = this.$props.customRightMenu
obj.body.options[0].push({
code,
name,
......@@ -310,8 +320,7 @@ export default {
this.$emit('selectionChange', arr)
} else if (this.keyCode === 'Control') {
this.$refs.vxetable.setCheckboxRow([row], true)
const arr1 =
this.$refs.vxetable.getCheckboxRecords()
const arr1 = this.$refs.vxetable.getCheckboxRecords()
this.$emit('selectionChange', arr1)
} else {
this.startIndex = $rowIndex
......@@ -560,6 +569,7 @@ export default {
loading={this.loading}
cell-class-name={this.cellClassName}
row-class-name={this.rowClassName}
cell-style={this.cellStyle}
onCurrent-change={this.currentChange}
onCheckbox-change={this.checkboxChange}
onCheckbox-all={this.checkboxAll}
......
......@@ -18,6 +18,7 @@ import {
Option,
Cascader,
Radio,
RadioGroup,
Menu,
Submenu,
MenuItem,
......@@ -48,6 +49,7 @@ const components = [
Option,
Cascader,
Radio,
RadioGroup,
Menu,
MenuItem,
Submenu,
......
......@@ -6,116 +6,144 @@
* @LastEditTime: 2020-11-18 09:25:23
-->
<template>
<div class="wraper">
<div class="page_left">
<div class='wraper'>
<div class='page_left'>
<el-tree
:data="treeData"
:props="defaultProps"
ref="tree"
:data='treeData'
:props='defaultProps'
ref='tree'
highlight-current
:node-key="'statusCode'"
:expand-on-click-node="false"
:expand-on-click-node='false'
default-expand-all
@node-click="handleNodeClick"
@node-click='handleNodeClick'
>
<span
class="custom-tree-node"
slot-scope="{ node, data }"
class='custom-tree-node'
slot-scope='{ node, data }'
>
<span v-html="node.label"></span>
<span v-html='node.label'></span>
<span>({{ data.quantity }})</span>
</span>
</el-tree>
</div>
<div class="page_right">
<div class='page_right'>
<el-form
v-show="is_tab == 1"
:model="searchForm"
size="mini"
v-enter-submit="getlist"
:inline="true"
ref="form"
class="search_form"
v-show='is_tab == 1'
:model='searchForm'
size='mini'
v-enter-submit='getlist'
:inline='true'
ref='form'
class='search_form'
>
<el-form-item>
<el-select
v-model="searchForm.prop"
placeholder="请选择"
v-model='searchForm.prop'
placeholder='请选择'
clearable
style="width: 100px"
style='width: 100px'
>
<el-option
label="开始时间"
value="startTime"
label='开始时间'
value='startTime'
></el-option>
<el-option
label="创建时间"
value="createTime"
label='创建时间'
value='createTime'
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<choose-time-period
v-model="periodTime"
v-model='periodTime'
></choose-time-period>
</el-form-item>
<el-form-item label="工单编号">
<el-form-item label='工单编号'>
<el-input
style="width: 120px"
v-model="searchForm.orderNo"
placeholder="请输入"
style='width: 120px'
v-model='searchForm.orderNo'
placeholder='请输入'
clearable
></el-input>
</el-form-item>
<el-form-item label="工单类型">
<el-form-item label='工单标题'>
<el-input
style='width: 120px'
v-model='searchForm.title'
placeholder='请输入'
clearable
></el-input>
</el-form-item>
<el-form-item label='工单类型'>
<el-select
v-model="searchForm.orderType"
style="width: 120px"
value-key=""
placeholder="请选择"
v-model='searchForm.orderType'
style='width: 120px'
value-key=''
placeholder='请选择'
clearable
filterable
>
<el-option
v-for="(type, index) in orderTypes"
:key="index"
:label="type.value"
:value="type.key"
v-for='(type, index) in orderTypes'
:key='index'
:label='type.value'
:value='type.key'
></el-option>
</el-select>
</el-form-item>
<el-form-item label="工单标题">
<el-input
style="width: 120px"
v-model="searchForm.title"
placeholder="请输入"
<el-form-item label='负责人'>
<el-select
style='width: 120px'
placeholder='请选择'
clearable
></el-input>
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-form-item label='参与人'>
<el-select
style="width: 120px"
placeholder="请选择"
style='width: 120px'
placeholder='请选择'
clearable
multiple
collapse-tags
v-model="searchForm.leaders"
v-model='searchForm.participator'
>
<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.acceptanceUserId'
>
<el-option
v-for="user in userList"
:key="user.id"
:label="user.realName"
:value="user.id"
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-form-item label='优先级'>
<el-select
style="width: 120px"
style='width: 120px'
filterable
clearable
v-model="searchForm.priorityStatus"
placeholder="请选择"
v-model='searchForm.priorityStatus'
placeholder='请选择'
>
<el-option
v-for="(
......@@ -127,69 +155,72 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="沟通状态">
<el-form-item label='沟通状态'>
<el-select
v-model="searchForm.sign"
placeholder="请选择"
style="width: 120px"
v-model='searchForm.sign'
placeholder='请选择'
style='width: 120px'
clearable
>
<el-option
label="待回复"
:value="1"
label='待回复'
:value='1'
></el-option>
<el-option
label="已回复"
:value="0"
label='已回复'
:value='0'
></el-option>
</el-select>
</el-form-item>
<el-form-item label>
<el-button
@click="getlist()"
type="primary"
size="mini"
@click='getlist()'
type='primary'
size='mini'
>
查询
</el-button>
</el-form-item>
<el-form-item v-if="statusCode === 'PRE_HANDLING'">
<el-button
type="success"
size="mini"
@click="addData"
>新增</el-button
type='success'
size='mini'
@click='addData'
>新增
</el-button
>
</el-form-item>
</el-form>
<div class="table-wrap" v-loading="loading">
<div class='table-wrap' v-loading='loading'>
<table-view
:tableColumns="tableColumns"
:sourceData="sourceData"
:cellClassName="cellClassName"
:tableColumns='tableColumns'
:sourceData='sourceData'
:cellClassName='cellClassName'
:cellStyle='cellStyle'
@sortChange='sortChange'
>
</table-view>
</div>
<div class="pagination">
<div class='pagination'>
<el-pagination
layout="sizes, total, prev, pager, next, jumper"
layout='sizes, total, prev, pager, next, jumper'
background
:total="centerPageOptions.total"
:page-size="centerPageOptions.pageSize"
:current-page="centerPageOptions.currentPage"
@size-change="sizeChange"
@current-change="onCurrentChange"
:total='centerPageOptions.total'
:page-size='centerPageOptions.pageSize'
:current-page='centerPageOptions.currentPage'
@size-change='sizeChange'
@current-change='onCurrentChange'
>
</el-pagination>
</div>
</div>
<!-- 详情 -->
<el-dialog
title="详情"
:close-on-click-modal="false"
:visible.sync="detailVisible"
width="1100px"
@close="getlist()"
title='详情'
:close-on-click-modal='false'
:visible.sync='detailVisible'
width='1100px'
@close='getlist()'
>
<!-- <div class="step-bar">
step-pass 已经完成,step-active当前步骤
......@@ -241,37 +272,37 @@
<span>已归档</span>
</div>
</div> -->
<div class="content" v-loading="detailLoading">
<div class="detail_list">
<div class="item_wrap">
<p class="item" style="width: 100%">
<span class="label">工单标题</span>
<span class="value" style="width: 732px">{{
detail.title
}}</span>
<div class='content' v-loading='detailLoading'>
<div class='detail_list'>
<div class='item_wrap'>
<p class='item' style='width: 100%'>
<span class='label'>工单标题</span>
<span class='value' style='width: 732px'>{{
detail.title
}}</span>
</p>
<p class="item">
<span class="label">工单编码</span>
<span class="value">{{
detail.orderNo
}}</span>
<p class='item'>
<span class='label'>工单编码</span>
<span class='value'>{{
detail.orderNo
}}</span>
</p>
<p class="item">
<span class="label">工单类型</span>
<span class="value">
<p class='item'>
<span class='label'>工单类型</span>
<span class='value'>
{{ detail.orderTypeTxt }}
</span>
</p>
<p class="item">
<span class="label">工单状态</span>
<span class="value">
<p class='item'>
<span class='label'>工单状态</span>
<span class='value'>
{{ detail.orderStatusTxt }}
</span>
</p>
<p class="item">
<span class="label">优先级</span>
<span class="value">
<p class='item'>
<span class='label'>优先级</span>
<span class='value'>
{{
handlePriorityStatus(
detail.priorityStatus,
......@@ -280,10 +311,10 @@
</span>
</p>
<p
class="item"
style="width: 100%; display: flex"
class='item'
style='width: 100%; display: flex'
>
<span class="label">工单内容</span>
<span class='label'>工单内容</span>
<span
style="
flex: 1;
......@@ -295,10 +326,10 @@
></span>
</p>
<p
class="item"
style="width: 100%; display: flex"
class='item'
style='width: 100%; display: flex'
>
<span class="label">备注</span>
<span class='label'>备注</span>
<span
style="
flex: 1;
......@@ -311,52 +342,52 @@
</p>
</div>
<div
style="padding: 5px; overflow: auto"
v-html="detail.taskContent"
@click="fullScreenDisplay"
style='padding: 5px; overflow: auto'
v-html='detail.taskContent'
@click='fullScreenDisplay'
></div>
</div>
<div class="record">
<div class="title">沟通记录</div>
<div class='record'>
<div class='title'>沟通记录</div>
<ul
class="chat_content"
v-if="chatRecord.length > 0"
class='chat_content'
v-if='chatRecord.length > 0'
>
<li
v-for="(item, index) in chatRecord"
:key="index"
class="chat_item"
:class="{ chat_right: item.type === 2 }"
v-for='(item, index) in chatRecord'
:key='index'
class='chat_item'
:class='{ chat_right: item.type === 2 }'
>
<div class="chat_warp" v-if="item.type === 2">
<div class="chat_user">
<div class="chat_user_time">
<div class='chat_warp' v-if='item.type === 2'>
<div class='chat_user'>
<div class='chat_user_time'>
{{
item.createTime
}}&nbsp;&nbsp;&nbsp;&nbsp;客服
</div>
<div class="chat_text">
<div class='chat_text'>
{{ item.msg }}
</div>
</div>
<div class="chat_icon">
<div class='chat_icon'>
<img
width="100%"
src="http://img.alicdn.com/tfs/TB14feR0AL0gK0jSZFAXXcA9pXa-64-64.png"
alt=""
width='100%'
src='http://img.alicdn.com/tfs/TB14feR0AL0gK0jSZFAXXcA9pXa-64-64.png'
alt=''
/>
</div>
</div>
<div v-else class="chat_warp">
<div class="chat_icon">
<div v-else class='chat_warp'>
<div class='chat_icon'>
<img
width="100%"
src="http://img.alicdn.com/tfs/TB14feR0AL0gK0jSZFAXXcA9pXa-64-64.png"
alt=""
width='100%'
src='http://img.alicdn.com/tfs/TB14feR0AL0gK0jSZFAXXcA9pXa-64-64.png'
alt=''
/>
</div>
<div class="chat_user">
<div class="chat_user_time">
<div class='chat_user'>
<div class='chat_user_time'>
{{
item.sendUserName
}}:&nbsp;&nbsp;&nbsp;&nbsp;{{
......@@ -364,118 +395,291 @@
}}
</div>
<div class="chat_text">
<div class='chat_text'>
{{ item.msg }}
</div>
</div>
</div>
</li>
</ul>
<div class="empty-data" v-else>暂无数据</div>
<div class='empty-data' v-else>暂无数据</div>
</div>
</div>
<div style="margin-top: 10px">
<div style='margin-top: 10px'>
<div>
<el-input
type="textarea"
:rows="4"
maxlength="1000"
placeholder="请输入内容"
v-model="textarea"
type='textarea'
:rows='4'
maxlength='1000'
placeholder='请输入内容'
v-model='textarea'
>
</el-input>
</div>
<div style="margin-top: 10px; text-align: right">
<div style='margin-top: 10px; text-align: right'>
<el-button
size='mini'
type='primary'
@click='reply'
>回复
</el-button
>
<el-button
size="mini"
type="primary"
@click="reply"
>回复</el-button
size='mini'
type='success'
v-if="statusCode === 'PRE_HANDLING'"
@click='confirm'
>受理
</el-button
>
<el-button
size="mini"
type="success"
size='mini'
type='danger'
v-if="statusCode === 'PRE_HANDLING'"
@click="confirm"
>受理</el-button
@click='closeForPendingDialog'
>不受理
</el-button
>
</div>
</div>
</el-dialog>
<edit
:editDialog.sync="editDialog"
@onSubmit="onSubmit"
@onChangeModule="onChangeModule"
:editForm="editForm"
:orderTypes="orderTypes"
:isEdit="isEdit"
:editFlag="editFlag"
ref="edit"
:editDialog.sync='editDialog'
@onSubmit='onSubmit'
@onChangeModule='onChangeModule'
:editForm='editForm'
:orderTypes='orderTypes'
:isEdit='isEdit'
:editFlag='editFlag'
ref='edit'
></edit>
<!-- 指派 -->
<el-dialog
title="指派给"
:close-on-click-modal="false"
:visible.sync="assignVisible"
width="300px"
title='指派给'
:close-on-click-modal='false'
:visible.sync='assignVisible'
width='900px'
>
<el-select
style="width: 100%"
size="small"
v-model="user"
multiple
<el-form
:inline='true'
size='mini'
:model='assignForm'
ref='assignForm'
:rules='assignFormRules'
label-width='130px'
>
<el-option
v-for="user in userList"
:key="user.id"
:label="user.realName"
:value="user.id"
></el-option>
</el-select>
<span slot="footer">
<el-form-item label='负责人' prop='leaders'>
<el-select
style='width: 100%'
size='small'
v-model='assignForm.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='参与人' prop='participator'>
<el-select
style='width: 100%'
size='small'
v-model='assignForm.participator'
multiple
>
<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='验收人'
prop='acceptanceUserId'
>
<el-select
style='width: 100%'
size='small'
v-model='assignForm.acceptanceUserId'
>
<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>
<span slot='footer'>
<el-button
size="mini"
@click="assignVisible = false"
>取消</el-button
size='mini'
@click='assignVisible = false'
>取消</el-button
>
<el-button
size="mini"
type="primary"
@click="submitAssign"
>确定</el-button
size='mini'
type='primary'
@click='submitAssign'
>确定</el-button
>
</span>
</el-dialog>
<el-dialog
title="预计完成时间"
:visible.sync="completeVisible"
width="500px"
:close-on-click-modal="false"
title='预计完成时间'
:visible.sync='completeVisible'
width='500px'
:close-on-click-modal='false'
>
<el-form size="mini">
<el-form-item label="预计完成时间">
<el-form size='mini'>
<el-form-item label='预计完成时间'>
<el-date-picker
style="width: 100%"
v-model="estimateCompleteTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
default-time="23:59:59"
placeholder="选择日期"
style='width: 100%'
v-model='estimateCompleteTime'
value-format='yyyy-MM-dd HH:mm:ss'
type='datetime'
default-time='23:59:59'
placeholder='选择日期'
:picker-options='pickerOptions'
></el-date-picker>
</el-form-item>
</el-form>
<span slot="footer">
<span slot='footer'>
<el-button
size='small'
@click='completeVisible = false'
>取消</el-button
>
<el-button
size='small'
type='primary'
@click='submitTime'
>确认</el-button
>
</span>
</el-dialog>
<!-- 指派 -->
<el-dialog
title='验收'
:close-on-click-modal='false'
:visible.sync='acceptVisible'
width='800px'
>
<el-form
:inline='true'
size='mini'
:model='acceptForm'
ref='acceptForm'
:rules='acceptFormRules'
label-width='110px'
>
<el-form-item
label='验收结果'
prop='acceptanceResult'
>
<el-radio-group
v-model='acceptForm.acceptanceResult'
size='small'
style='width: 100%'
>
<el-radio
:label='item.value'
v-for='(item, index) in acceptanceResultList'
:key='index'
>{{ item.label }}
</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
label='验收意见'
prop='acceptanceContent'
:rules="[
{
required:
acceptForm.acceptanceResult == 'failure'
? true
: false,
message: '请填写',
trigger: 'blur',
},
]"
>
<el-input
type='textarea'
:autosize='{ minRows: 4 }'
style='width:400px'
placeholder='请输入内容'
v-model='acceptForm.acceptanceContent'
>
</el-input>
</el-form-item>
</el-form>
<span slot='footer'>
<el-button
size='mini'
@click='acceptVisible = false'
>取消</el-button
>
<el-button
size='mini'
type='primary'
@click='submitAccept'
>确定</el-button
>
</span>
</el-dialog>
<!-- 不受理 -->
<el-dialog
title='不受理'
:close-on-click-modal='false'
:visible.sync='pendingVisible'
width='800px'
>
<el-form
:inline='true'
size='mini'
:model='pendingForm'
ref='pendingForm'
label-width='110px'
>
<el-form-item
label='原因'
prop='closeReason'
:rules="[
{
required: true,
message: '请填写',
trigger: 'blur',
},
]"
>
<el-input
type='textarea'
:autosize='{ minRows: 4 }'
style='width:400px'
placeholder='请输入'
v-model='pendingForm.closeReason'
>
</el-input>
</el-form-item>
</el-form>
<span slot='footer'>
<el-button
size="small"
@click="completeVisible = false"
>取消</el-button
size='mini'
@click='pendingVisible = false'
>取消</el-button
>
<el-button
size="small"
type="primary"
@click="submitTime"
>确认</el-button
size='mini'
type='primary'
@click='submitPending'
>确定</el-button
>
</span>
</el-dialog>
......@@ -496,11 +700,14 @@ import {
archiveWorkOrder,
completeWorkOrder,
replyTocustomer,
acceptanWorkOrder,
PendingWorkOrder,
getOrderType,
resume,
pause,
reject,
closeForPending,
close,
getInfo,
} from '@/common/api/order'
import { getSystemUserList } from '@/common/api/system'
......@@ -515,6 +722,8 @@ import pauseWork from '@/assets/work/pause.png'
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'
export default {
name: 'task_center',
mixins: [pagination],
......@@ -526,6 +735,34 @@ export default {
data() {
const userInfo = localStorage.getItem('user')
return {
pickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now()
},
},
assignFormRules: {
leaders: [
{
required: true,
message: '请选择负责人',
trigger: 'blur',
},
],
fromUser: [
{
required: true,
message: '请选择参与人',
trigger: 'blur',
},
],
acceptanceUserId: [
{
required: true,
message: '请选择验收人',
trigger: 'blur',
},
],
},
priorityStatusList: [
{
value: 1,
......@@ -542,7 +779,7 @@ export default {
],
loading: false,
detailLoading: false,
user: [],
assignForm: {},
textarea: '',
centerPageOptions: {
pageSize: 100,
......@@ -558,7 +795,6 @@ export default {
statusCode: 'PRE_HANDLING',
searchForm: {
timeProp: 'create_time',
leaders: [],
prop: 'createTime',
},
isEdit: false,
......@@ -582,6 +818,30 @@ export default {
editDialog: false,
completeVisible: false,
estimateCompleteTime: '',
currentItem: null,
acceptVisible: false,
acceptFormRules: {
acceptanceResult: [
{
required: true,
message: '请选择',
trigger: 'blur',
},
],
},
acceptForm: {},
acceptanceResultList: [
{
value: 'success',
label: '验收通过',
},
{
value: 'failure',
label: '验收不通过',
},
],
pendingVisible: false,
pendingForm: {},
}
},
mounted() {
......@@ -608,14 +868,18 @@ export default {
{item.sign === 1 &&
item.orderStatus === 'PRE_HANDLING' && (
<i
class="el-icon-info"
title="待回复"
class='el-icon-info'
title='待回复'
></i>
)}
</span>
),
},
{ label: '工单编号', key: 'orderNo', width: 110 },
{
label: '工单编号',
key: 'orderNo',
width: 110,
},
{
label: '工单模块',
key: 'moduleName',
......@@ -633,14 +897,55 @@ export default {
width: 80,
},
{
label: '验收意见',
key: 'evaluations',
width: 140,
label: '优先级',
key: 'priorityStatus',
width: 120,
render: item => {
if (item.orderStatus === 'TO_BE_ASSIGN') {
item.priorityStatus = item.priorityStatus
? String(item.priorityStatus)
: ''
return (
<div class='priorityStatus-select'>
<el-select
v-model={item.priorityStatus}
placeholder=''
onChange={v => this.setStatus(item, v)}
>
<el-option
label=''
value=''
></el-option>
<el-option
label='低'
value='1'
></el-option>
<el-option
label='中'
value='2'
></el-option>
<el-option
label='高'
value='3'
></el-option>
</el-select>
</div>
)
} else {
if (item.priorityStatus) {
return this.priorityStatusList.find(v => {
return v.value === item.priorityStatus
}).name
} else {
return ''
}
}
},
},
{
label: '来源',
key: 'fromBusiness',
width: 140,
width: 80,
},
{
label: '创建人',
......@@ -653,34 +958,24 @@ export default {
width: 80,
},
{
label: '优先级',
key: 'priorityStatus',
label: '参与人',
key: 'participatorName',
width: 80,
render: (item) => {
if (item.priorityStatus) {
return this.priorityStatusList.find((v) => {
return v.value === item.priorityStatus
}).name
} else {
return ''
}
},
},
{
label: '描述',
key: 'content',
render: (item) => {
return (
<div
class="description"
domPropsInnerHTML={item.content}
></div>
)
},
label: '验收人',
key: 'acceptanceUserName',
width: 80,
},
{
label: '验收意见',
key: 'acceptanceContent',
width: 80,
},
{
label: '创建时间',
key: 'createTime',
sortable: true,
width: 130,
},
{
......@@ -699,65 +994,80 @@ export default {
width: 130,
},
{
label: '验收时间',
key: 'acceptanceTime',
width: 130,
},
{
label: '完成时间',
key: 'completeTime',
width: 130,
},
{
label: '用户评价',
key: 'evaluations',
width: 140,
},
{
label: '不受理原因',
key: 'closeReason',
width: 130,
},
{
label: '操作',
fixed: 'right',
width: 120,
align: 'center',
render: (item) => (
<span>
{item.orderStatus === 'PRE_HANDLING' &&
Number(item.fromUser) ===
this.userInfo.id && (
<span title="修改" class="icon-view">
{(item.orderStatus === 'PRE_HANDLING' ||
item.orderStatus === 'TO_BE_ASSIGN' ||
item.orderStatus === 'TO_BE_CONFIRMED') && (
<span title='修改' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={updateWork}
onClick={() => this.update(item)}
/>
</span>
)}
)}
{
<span
title="详情"
class="icon-view icon-tools-view"
title='详情'
class='icon-view icon-tools-view'
>
<i
class="el-icon-tickets"
class='el-icon-tickets'
onClick={() => this.showDetail(item)}
></i>
</span>
}
{item.orderStatus === 'TO_BE_ASSIGN' && (
<span title="指派给" class="icon-view">
<span title='指派给' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={assignWork}
onClick={() => this.showAssign(item)}
/>
</span>
)}
{item.orderStatus === 'IN_PROGRESS' && (
<span title="暂停" class="icon-view">
<span title='暂停' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={pauseWork}
onClick={() => this.pause(item)}
/>
</span>
)}
{item.orderStatus === 'PAUSEING' && (
<span title="恢复" class="icon-view">
<span title='恢复' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={resumetWork}
onClick={() => this.resume(item)}
/>
......@@ -771,8 +1081,8 @@ export default {
.includes(this.userInfo.id) && (
<span title="开始" class="icon-view">
<img
width="24"
height="24"
width='24'
height='24'
src={startWork}
onClick={() =>
this.startWorkOrder(item)
......@@ -781,30 +1091,41 @@ export default {
</span>
)}
{item.orderStatus === 'CLOSED' && (
<span title="归档" class="icon-view">
<span title='归档' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={archiveWork}
onClick={() => this.archive(item)}
/>
</span>
)}
{item.orderStatus === 'IN_PROGRESS' && (
<span title="完成" class="icon-view">
<span title='处理完成' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={completeWork}
onClick={() => this.complete(item)}
/>
</span>
)}
{item.orderStatus === 'PRE_HANDLING' && (
<span title="关闭" class="icon-view">
{item.orderStatus === 'ACCEPTANCEING' && Number(item.acceptanceUserId) ===
this.userInfo.id && (
<span title='已完成' class='icon-view'>
<img
width='24'
height='24'
src={anceingWork}
onClick={() => this.anceing(item)}
/>
</span>
)}
{item.orderStatus === 'IN_COMPLETE' && (
<span title='关闭' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={closetWork}
onClick={() => this.close(item)}
/>
......@@ -814,10 +1135,10 @@ export default {
item.orderStatus === 'TO_BE_CONFIRMED' ||
item.orderStatus === 'IN_PROGRESS' ||
item.orderStatus === 'IN_COMPLETE') && (
<span title="驳回" class="icon-view">
<span title='驳回' class='icon-view'>
<img
width="24"
height="24"
width='24'
height='24'
src={rejectWork}
onClick={() => this.reject(item)}
/>
......@@ -830,10 +1151,38 @@ export default {
},
},
methods: {
// 排序
sortChange(column) {
if (column.order === 'asc') {
this.searchForm.createTimeSort = 'asc'
} else {
this.searchForm.createTimeSort = 'desc'
}
this.getlist()
},
/*
设置优先级
*/
setStatus(data, i) {
const {
id,
priorityStatus,
} = data
axios
.post('platform/platformWorkOrder/updatePriority', {
id,
priorityStatus: Number(priorityStatus),
})
.then(res => {
if (res.code === 200) {
this.$message.success(res.message)
}
})
},
handlePriorityStatus(data) {
if (data) {
return this.priorityStatusList.find((v) => {
return v.value === data
return this.priorityStatusList.find(v => {
return v.value === Number(data)
}).name
} else {
return ''
......@@ -846,7 +1195,7 @@ export default {
this.isEdit = false
this.editDialog = true
this.$refs.editForm &&
this.$refs.editForm.resetFields()
this.$refs.editForm.resetFields()
},
update(v) {
getInfo(v.id).then((res) => {
......@@ -861,7 +1210,7 @@ export default {
this.isEdit = true
this.editDialog = true
this.$refs.editForm &&
this.$refs.editForm.resetFields()
this.$refs.editForm.resetFields()
}
})
},
......@@ -873,7 +1222,10 @@ export default {
this.getlist()
this.getOrderTree()
},
cellClassName({ row, columnIndex }) {
cellClassName({
row,
columnIndex,
}) {
if (
(row.orderStatus === 'TO_BE_ASSIGN' ||
row.orderStatus === 'TO_BE_CONFIRMED' ||
......@@ -900,6 +1252,27 @@ export default {
return 'order-grey'
}
},
cellStyle({
row,
columnIndex,
}) {
if (
(row.orderStatus === 'PRE_HANDLING' ||
row.orderStatus === 'TO_BE_ASSIGN' ||
row.orderStatus === 'TO_BE_CONFIRMED' ||
row.orderStatus === 'IN_PROGRESS') &&
columnIndex === 15
) {
if (row.columnRenderColor) {
return {
backgroundColor: row.columnRenderColor,
color: 'white',
}
} else {
return { backgroundColor: 'white' }
}
}
},
async getOrderTypes() {
try {
const res = await getOrderType()
......@@ -971,42 +1344,111 @@ export default {
this.currentRowId = item.id
this.taskLeader = ''
this.assignVisible = true
this.user = ''
this.assignForm = JSON.parse(
JSON.stringify({
leaders: '',
participator: [],
acceptanceUserId: '',
}),
)
},
// 开始工单
async startWorkOrder(item) {
this.estimateCompleteTime = ''
this.completeVisible = true
this.rowId = item.id
this.currentItem = item
},
// 提交分派
async submitAssign() {
if (this.user.length === 0) {
return this.$message.warning('请选择负责人')
closeForPendingDialog() {
this.pendingVisible = true
if (this.$refs.pendingForm) {
this.$refs.pendingForm.resetFields()
}
const user = this.user.join(',')
try {
const res = await workAssigned(
this.currentRowId,
user,
)
if (res.code === 200) {
this.assignVisible = false
this.getOrderTree()
this.getlist()
},
submitPending() {
this.$refs.pendingForm.validate(v => {
if (v) {
try {
PendingWorkOrder({
id: this.detail.id,
...this.pendingForm,
}).then(res => {
if (res.code === 200) {
this.pendingVisible = false
this.detailVisible = false
this.getOrderTree()
this.getlist()
}
})
} catch (error) {
}
}
} catch (e) {
console.error(e)
})
},
// 待验收完成
anceing(item) {
this.acceptVisible = true
this.currentItem = item
if (this.$refs.acceptForm) {
this.$refs.acceptForm.resetFields()
}
},
// 完成验收
submitAccept() {
this.$refs.acceptForm.validate(v => {
if (v) {
try {
acceptanWorkOrder({
id: this.currentItem.id,
...this.acceptForm,
}).then(res => {
if (res.code === 200) {
this.acceptVisible = false
this.getOrderTree()
this.getlist()
}
})
} catch (error) {
}
}
})
},
// 提交分派
async submitAssign() {
this.$refs.assignForm.validate(v => {
if (v) {
try {
workAssigned({
id: this.currentRowId,
...this.assignForm,
participator: this.assignForm.participator.join(
',',
),
}).then(res => {
if (res.code === 200) {
this.assignVisible = false
this.getOrderTree()
this.getlist()
}
})
} catch (e) {
console.error(e)
}
}
})
},
handleNodeClick(data) {
if (data.statusCode === 'IN_PROGRESS') {
this.$set(this.searchForm, 'leaders', [
this.$set(
this.searchForm,
'leaders',
this.userInfo.id,
])
}
if (data.statusCode !== 'IN_PROGRESS') {
this.searchForm.leaders = []
)
this.$set(
this.searchForm,
'participator',
this.userInfo.id,
)
}
this.statusCode = data.statusCode
this.getlist()
......@@ -1023,9 +1465,6 @@ export default {
startTime: this.periodTime && this.periodTime[0],
endTime: this.periodTime && this.periodTime[1],
...this.searchForm,
leaders:
this.searchForm.leaders &&
this.searchForm.leaders.join(','),
})
.then((res) => {
if (res.code !== 200) return
......@@ -1083,15 +1522,26 @@ export default {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
closeForPending(v.id).then((res) => {
if (res.code === 200) {
this.$message.success('已关闭')
this.getlist()
this.getOrderTree()
}
})
if (this.statusCode === 'IN_COMPLETE') {
close(v.id).then(res => {
if (res.code === 200) {
this.$message.success('已关闭')
this.getlist()
this.getOrderTree()
}
})
} else {
closeForPending(v.id).then(res => {
if (res.code === 200) {
this.$message.success('已关闭')
this.getlist()
this.getOrderTree()
}
})
}
})
} catch {}
} catch {
}
},
async resume(v) {
try {
......@@ -1132,7 +1582,8 @@ export default {
}
})
})
} catch {}
} catch {
}
},
async submitTime() {
if (!this.estimateCompleteTime) {
......@@ -1174,17 +1625,24 @@ export default {
},
async showDetail(item) {
this.currentRowId = item.id
this.detail = item
this.detailLoading = true
axios
await axios.get(`platform/platformWorkOrder/get?id=${item.id}`,
).then(res => {
if (res.code === 200) {
this.detail = res.data
} else {
this.detailLoading = false
}
})
await axios
.get(
`platform/platformWorkOrderChat/getByWorkOrder?workOrderId=${item.id}`,
)
.then((res) => {
if (res.code === 200) {
this.chatRecord = res.data
} else {
this.detailLoading = false
}
this.detailLoading = false
})
this.detailVisible = true
this.textarea = ''
......@@ -1192,7 +1650,7 @@ export default {
},
}
</script>
<style lang="scss" scoped>
<style lang='scss' scoped>
.wraper {
height: 100%;
display: flex;
......@@ -1223,6 +1681,7 @@ export default {
background-color: #909399 !important;
color: #fff;
}
.el-icon-info::before {
position: absolute;
right: -13px;
......@@ -1231,17 +1690,21 @@ export default {
color: #f56c6c;
cursor: pointer;
}
.el-tree-node {
font-size: 14px;
}
.high-row {
background-color: #1565c0;
}
.el-tree-node__content {
height: 32px;
padding: 4px 0px;
padding-left: 10px !important;
}
.el-tree-node__children .el-tree-node.is-current {
.el-tree-node__content {
position: relative;
......@@ -1262,6 +1725,7 @@ export default {
}
}
}
.page_left {
width: 200px;
min-width: 200px;
......@@ -1269,6 +1733,7 @@ export default {
border-radius: 5px;
margin-right: 10px;
}
.page_right {
flex: 1;
display: flex;
......@@ -1277,27 +1742,33 @@ export default {
border-radius: 5px;
overflow: hidden;
}
.search_form {
margin-top: 5px;
margin-left: 10px;
}
.search_form >>> .el-form-item {
.search_form > > > .el-form-item {
margin-bottom: 5px;
}
.content {
max-height: 68vh;
overflow: auto;
}
.detail_list {
padding-top: 10px;
background-color: #efefef;
}
.detail_list .item {
display: inline-block;
width: 30%;
line-height: 24px;
margin-bottom: 10px;
}
.detail_list .item .label {
display: inline-block;
color: #999;
......@@ -1305,13 +1776,16 @@ export default {
text-align: right;
margin-right: 5px;
}
.detail_list .item .value {
color: #222;
}
.item_wrap {
background: #efefef;
padding-top: 10px;
}
.detail_list .item .label {
display: inline-block;
color: #999;
......@@ -1319,15 +1793,19 @@ export default {
text-align: right;
margin-right: 5px;
}
.detail_list .item .value {
color: #222;
}
.form_item::v-deep .el-radio {
margin-right: 13px;
}
.form_item::v-deep .el-radio svg {
vertical-align: text-bottom;
}
.detail_btn {
display: inline-block;
font-size: 14px;
......@@ -1338,9 +1816,11 @@ export default {
cursor: pointer;
vertical-align: bottom;
}
.detail_btn + .detail_btn {
margin-left: 10px;
}
.table-wrap {
background: #fff;
flex: 1;
......@@ -1352,6 +1832,7 @@ export default {
margin-bottom: 10px;
display: flex;
}
.step {
position: relative;
flex: 1;
......@@ -1383,6 +1864,7 @@ export default {
border-left: 16px solid transparent !important;
border-bottom: 16px solid #cacaca;
}
.step-after:after {
width: 22px;
height: 32px;
......@@ -1393,6 +1875,7 @@ export default {
border-bottom: 16px solid transparent !important;
background-color: #fff;
}
.step-after:after,
.step-before:before {
content: '';
......@@ -1401,16 +1884,20 @@ export default {
top: 0;
box-sizing: border-box;
}
.step-active {
background-color: #ff6a00;
}
.step-active:after,
.step-active:before {
border-color: #ff6a00;
}
.step-pass {
background-color: rgba(255, 106, 0, 0.5);
}
.step-pass:after,
.step-pass:before {
border-color: rgba(255, 106, 0, 0.5);
......@@ -1420,6 +1907,7 @@ export default {
border: 1px solid #efefef;
margin-top: 10px;
}
.record .title {
height: 40px;
line-height: 40px;
......@@ -1428,6 +1916,7 @@ export default {
background: #efefef;
border-left: 2px solid #ff6a00;
}
.chat_content {
padding: 10px;
}
......@@ -1435,15 +1924,19 @@ export default {
.chat_item {
margin-bottom: 10px;
}
.chat_item.chat_right {
text-align: right;
}
.chat_warp {
display: flex;
}
.chat_right .chat_warp {
justify-content: end;
}
.chat_icon {
width: 30px;
height: 30px;
......@@ -1460,6 +1953,7 @@ export default {
justify-content: center;
padding: 20px 0;
}
.detail_list {
&::v-deep {
table {
......@@ -1492,4 +1986,16 @@ export default {
margin-left: 6px;
}
}
.priorityStatus-select {
height: 30px;
&::v-deep .el-input__inner {
height: 30px;
}
&::v-deep .el-input__suffix {
top: 4px;
}
}
</style>
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