Commit c8479d2ed605d53e7b00cbed40e4120941d1a6bc

Authored by wuxw
1 parent 2061c5fb

优化工作单pc 端办理bug

src/api/oa/workTaskDetailApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +import { getCommunityId } from '@/api/community/communityApi'
  3 +
  4 +// 获取工单详情
  5 +export function getWorkDetail(params) {
  6 + return new Promise((resolve, reject) => {
  7 + request({
  8 + url: '/work.listWorkPool',
  9 + method: 'get',
  10 + params: {
  11 + ...params,
  12 + communityId: getCommunityId()
  13 + }
  14 + }).then(response => {
  15 + const res = response.data
  16 + resolve(res)
  17 + }).catch(error => {
  18 + reject(error)
  19 + })
  20 + })
  21 +}
  22 +
  23 +// 获取工单项列表
  24 +export function getWorkTaskItems(params) {
  25 + return new Promise((resolve, reject) => {
  26 + request({
  27 + url: '/task.listWorkTaskItem',
  28 + method: 'get',
  29 + params: {
  30 + ...params,
  31 + communityId: getCommunityId()
  32 + }
  33 + }).then(response => {
  34 + const res = response.data
  35 + resolve(res)
  36 + }).catch(error => {
  37 + reject(error)
  38 + })
  39 + })
  40 +}
  41 +
  42 +// 获取工单事件列表
  43 +export function getWorkEvents(params) {
  44 + return new Promise((resolve, reject) => {
  45 + request({
  46 + url: '/workEvent.listWorkEvent',
  47 + method: 'get',
  48 + params: {
  49 + ...params,
  50 + communityId: getCommunityId()
  51 + }
  52 + }).then(response => {
  53 + const res = response.data
  54 + resolve(res)
  55 + }).catch(error => {
  56 + reject(error)
  57 + })
  58 + })
  59 +}
  60 +
  61 +// 获取工单文件列表
  62 +export function getWorkFiles(params) {
  63 + return new Promise((resolve, reject) => {
  64 + request({
  65 + url: '/work.listWorkPoolFile',
  66 + method: 'get',
  67 + params: {
  68 + ...params,
  69 + communityId: getCommunityId()
  70 + }
  71 + }).then(response => {
  72 + const res = response.data
  73 + resolve(res)
  74 + }).catch(error => {
  75 + reject(error)
  76 + })
  77 + })
  78 +}
  79 +
  80 +// 完成工单任务
  81 +export function finishWorkTask(data) {
  82 + return new Promise((resolve, reject) => {
  83 + request({
  84 + url: '/work.finishWorkTask',
  85 + method: 'post',
  86 + data: {
  87 + ...data,
  88 + communityId: getCommunityId()
  89 + }
  90 + }).then(response => {
  91 + const res = response.data
  92 + resolve(res)
  93 + }).catch(error => {
  94 + reject(error)
  95 + })
  96 + })
  97 +}
  98 +
  99 +// 获取组织树
  100 +export function getOrgTree(params) {
  101 + return new Promise((resolve, reject) => {
  102 + request({
  103 + url: '/org.listOrgTree',
  104 + method: 'get',
  105 + params: {
  106 + ...params,
  107 + communityId: getCommunityId()
  108 + }
  109 + }).then(response => {
  110 + const res = response.data
  111 + resolve(res)
  112 + }).catch(error => {
  113 + reject(error)
  114 + })
  115 + })
  116 +}
  117 +
  118 +// 获取员工列表
  119 +export function getStaffList(params) {
  120 + return new Promise((resolve, reject) => {
  121 + request({
  122 + url: '/query.staff.infos',
  123 + method: 'get',
  124 + params: {
  125 + ...params,
  126 + communityId: getCommunityId()
  127 + }
  128 + }).then(response => {
  129 + const res = response.data
  130 + resolve(res)
  131 + }).catch(error => {
  132 + reject(error)
  133 + })
  134 + })
  135 +}
  136 +
  137 +// 上传文件
  138 +export function uploadFile(data, config) {
  139 + return new Promise((resolve, reject) => {
  140 + const formData = new FormData()
  141 + formData.append('uploadFile', data.get('uploadFile'))
  142 +
  143 + request({
  144 + url: '/uploadVedio/upload',
  145 + method: 'post',
  146 + data: formData,
  147 + headers: {
  148 + 'Content-Type': 'multipart/form-data'
  149 + },
  150 + ...config
  151 + }).then(response => {
  152 + const res = response.data
  153 + resolve(res)
  154 + }).catch(error => {
  155 + reject(error)
  156 + })
  157 + })
  158 +}
0 \ No newline at end of file 159 \ No newline at end of file
src/components/oa/WorkDetailTask.vue
@@ -161,7 +161,7 @@ export default { @@ -161,7 +161,7 @@ export default {
161 }, 161 },
162 openWorkTaskDetail(work) { 162 openWorkTaskDetail(work) {
163 this.$router.push({ 163 this.$router.push({
164 - path: '/oa/workTaskDetail', 164 + path: '/pages/oa/workTaskDetail',
165 query: { 165 query: {
166 workId: work.workId, 166 workId: work.workId,
167 taskId: work.taskId 167 taskId: work.taskId
src/i18n/commonLang.js
@@ -62,7 +62,8 @@ export const messages = { @@ -62,7 +62,8 @@ export const messages = {
62 file:'File', 62 file:'File',
63 hide:'Hide', 63 hide:'Hide',
64 viewDetail:'View Detail', 64 viewDetail:'View Detail',
65 - yuan:'yuan' 65 + yuan:'yuan',
  66 + process:'Process'
66 } 67 }
67 }, 68 },
68 zh: { 69 zh: {
@@ -128,7 +129,8 @@ export const messages = { @@ -128,7 +129,8 @@ export const messages = {
128 file:'附件', 129 file:'附件',
129 hide:'隐藏', 130 hide:'隐藏',
130 viewDetail:'查看详情', 131 viewDetail:'查看详情',
131 - yuan:'元' 132 + yuan:'元',
  133 + process:'处理'
132 } 134 }
133 } 135 }
134 } 136 }
135 \ No newline at end of file 137 \ No newline at end of file
src/i18n/oaI18n.js
@@ -56,6 +56,7 @@ import { messages as visitUndoMessages } from '../views/oa/visitUndoLang' @@ -56,6 +56,7 @@ import { messages as visitUndoMessages } from '../views/oa/visitUndoLang'
56 import { messages as doHistoryComplaintsMessages } from '../views/oa/doHistoryComplaintsLang' 56 import { messages as doHistoryComplaintsMessages } from '../views/oa/doHistoryComplaintsLang'
57 import { messages as myAuditHistoryOrdersMessages } from '../views/resource/myAuditHistoryOrdersLang' 57 import { messages as myAuditHistoryOrdersMessages } from '../views/resource/myAuditHistoryOrdersLang'
58 import { messages as visitFinishMessages } from '../views/oa/visitFinishLang' 58 import { messages as visitFinishMessages } from '../views/oa/visitFinishLang'
  59 +import { messages as workTaskDetailMessages } from '../views/oa/workTaskDetailLang'
59 60
60 61
61 export const messages ={ 62 export const messages ={
@@ -117,6 +118,7 @@ export const messages ={ @@ -117,6 +118,7 @@ export const messages ={
117 ...doHistoryComplaintsMessages.en, 118 ...doHistoryComplaintsMessages.en,
118 ...myAuditHistoryOrdersMessages.en, 119 ...myAuditHistoryOrdersMessages.en,
119 ...visitFinishMessages.en, 120 ...visitFinishMessages.en,
  121 + ...workTaskDetailMessages.en,
120 }, 122 },
121 zh:{ 123 zh:{
122 ...activitiesTypeManageMessages.zh, 124 ...activitiesTypeManageMessages.zh,
@@ -176,5 +178,6 @@ export const messages ={ @@ -176,5 +178,6 @@ export const messages ={
176 ...doHistoryComplaintsMessages.zh, 178 ...doHistoryComplaintsMessages.zh,
177 ...myAuditHistoryOrdersMessages.zh, 179 ...myAuditHistoryOrdersMessages.zh,
178 ...visitFinishMessages.zh, 180 ...visitFinishMessages.zh,
  181 + ...workTaskDetailMessages.zh,
179 } 182 }
180 } 183 }
181 \ No newline at end of file 184 \ No newline at end of file
src/router/oaRouter.js
@@ -269,4 +269,9 @@ export default [ @@ -269,4 +269,9 @@ export default [
269 name:'/pages/property/visitFinish', 269 name:'/pages/property/visitFinish',
270 component: () => import('@/views/oa/visitFinishList.vue') 270 component: () => import('@/views/oa/visitFinishList.vue')
271 }, 271 },
  272 + {
  273 + path:'/pages/oa/workTaskDetail',
  274 + name:'/pages/oa/workTaskDetail',
  275 + component: () => import('@/views/oa/workTaskDetailList.vue')
  276 + },
272 ] 277 ]
273 \ No newline at end of file 278 \ No newline at end of file
src/views/oa/doWorkList.vue
@@ -4,12 +4,9 @@ @@ -4,12 +4,9 @@
4 <el-col :span="4"> 4 <el-col :span="4">
5 <el-card class="tree-card"> 5 <el-card class="tree-card">
6 <ul class="state-list"> 6 <ul class="state-list">
7 - <li  
8 - v-for="(item,index) in doWorkInfo.states"  
9 - :key="index"  
10 - @click="swatchWorkState(item)"  
11 - :class="{'active-state':doWorkInfo.conditions.state === item.state}">  
12 - {{item.name}} 7 + <li v-for="(item, index) in doWorkInfo.states" :key="index" @click="swatchWorkState(item)"
  8 + :class="{ 'active-state': doWorkInfo.conditions.state === item.state }">
  9 + {{ item.name }}
13 </li> 10 </li>
14 </ul> 11 </ul>
15 </el-card> 12 </el-card>
@@ -21,31 +18,21 @@ @@ -21,31 +18,21 @@
21 </div> 18 </div>
22 <el-row :gutter="20"> 19 <el-row :gutter="20">
23 <el-col :span="4"> 20 <el-col :span="4">
24 - <el-input  
25 - v-model.trim="doWorkInfo.conditions.workNameLike"  
26 - :placeholder="$t('doWork.search.workNameLike')"  
27 - clearable /> 21 + <el-input v-model.trim="doWorkInfo.conditions.workNameLike"
  22 + :placeholder="$t('doWork.search.workNameLike')" clearable />
28 </el-col> 23 </el-col>
29 <el-col :span="4"> 24 <el-col :span="4">
30 - <el-input  
31 - v-model.trim="doWorkInfo.conditions.staffNameLike"  
32 - :placeholder="$t('doWork.search.staffNameLike')"  
33 - clearable /> 25 + <el-input v-model.trim="doWorkInfo.conditions.staffNameLike"
  26 + :placeholder="$t('doWork.search.staffNameLike')" clearable />
34 </el-col> 27 </el-col>
35 <el-col :span="4"> 28 <el-col :span="4">
36 - <el-date-picker  
37 - v-model="doWorkInfo.conditions.queryStartTime"  
38 - type="datetime"  
39 - :placeholder="$t('doWork.search.queryStartTime')"  
40 - value-format="yyyy-MM-dd HH:mm:ss"> 29 + <el-date-picker v-model="doWorkInfo.conditions.queryStartTime" type="datetime"
  30 + :placeholder="$t('doWork.search.queryStartTime')" value-format="yyyy-MM-dd HH:mm:ss">
41 </el-date-picker> 31 </el-date-picker>
42 </el-col> 32 </el-col>
43 <el-col :span="4"> 33 <el-col :span="4">
44 - <el-date-picker  
45 - v-model="doWorkInfo.conditions.queryEndTime"  
46 - type="datetime"  
47 - :placeholder="$t('doWork.search.queryEndTime')"  
48 - value-format="yyyy-MM-dd HH:mm:ss" 34 + <el-date-picker v-model="doWorkInfo.conditions.queryEndTime" type="datetime"
  35 + :placeholder="$t('doWork.search.queryEndTime')" value-format="yyyy-MM-dd HH:mm:ss"
49 :disabled="!doWorkInfo.conditions.queryStartTime"> 36 :disabled="!doWorkInfo.conditions.queryStartTime">
50 </el-date-picker> 37 </el-date-picker>
51 </el-col> 38 </el-col>
@@ -66,104 +53,53 @@ @@ -66,104 +53,53 @@
66 <div slot="header" class="flex justify-between"> 53 <div slot="header" class="flex justify-between">
67 <span>{{ $t('doWork.table.title') }}</span> 54 <span>{{ $t('doWork.table.title') }}</span>
68 </div> 55 </div>
69 - <el-table  
70 - :data="doWorkInfo.works"  
71 - border  
72 - style="width: 100%"  
73 - v-loading="loading">  
74 - <el-table-column  
75 - prop="workId"  
76 - :label="$t('doWork.table.workId')"  
77 - align="center"> 56 + <el-table :data="doWorkInfo.works" border style="width: 100%" v-loading="loading">
  57 + <el-table-column prop="workId" :label="$t('doWork.table.workId')" align="center">
78 </el-table-column> 58 </el-table-column>
79 - <el-table-column  
80 - prop="workName"  
81 - :label="$t('doWork.table.workName')"  
82 - align="center"> 59 + <el-table-column prop="workName" :label="$t('doWork.table.workName')" align="center">
83 </el-table-column> 60 </el-table-column>
84 - <el-table-column  
85 - prop="typeName"  
86 - :label="$t('doWork.table.typeName')"  
87 - align="center"> 61 + <el-table-column prop="typeName" :label="$t('doWork.table.typeName')" align="center">
88 </el-table-column> 62 </el-table-column>
89 - <el-table-column  
90 - prop="workCycle"  
91 - :label="$t('doWork.table.workCycle')"  
92 - align="center"> 63 + <el-table-column prop="workCycle" :label="$t('doWork.table.workCycle')" align="center">
93 <template slot-scope="scope"> 64 <template slot-scope="scope">
94 {{ scope.row.workCycle === '1001' ? $t('doWork.workCycle.once') : $t('doWork.workCycle.periodic') }} 65 {{ scope.row.workCycle === '1001' ? $t('doWork.workCycle.once') : $t('doWork.workCycle.periodic') }}
95 </template> 66 </template>
96 </el-table-column> 67 </el-table-column>
97 - <el-table-column  
98 - prop="startTime"  
99 - :label="$t('doWork.table.startTime')"  
100 - align="center"> 68 + <el-table-column prop="startTime" :label="$t('doWork.table.startTime')" align="center">
101 </el-table-column> 69 </el-table-column>
102 - <el-table-column  
103 - prop="endTime"  
104 - :label="$t('doWork.table.endTime')"  
105 - align="center"> 70 + <el-table-column prop="endTime" :label="$t('doWork.table.endTime')" align="center">
106 </el-table-column> 71 </el-table-column>
107 - <el-table-column  
108 - prop="createUserName"  
109 - :label="$t('doWork.table.createUserName')"  
110 - align="center"> 72 + <el-table-column prop="createUserName" :label="$t('doWork.table.createUserName')" align="center">
111 </el-table-column> 73 </el-table-column>
112 - <el-table-column  
113 - prop="curStaffName"  
114 - :label="$t('doWork.table.curStaffName')"  
115 - align="center"> 74 + <el-table-column prop="curStaffName" :label="$t('doWork.table.curStaffName')" align="center">
116 <template slot-scope="scope"> 75 <template slot-scope="scope">
117 {{ scope.row.curStaffName || '-' }} 76 {{ scope.row.curStaffName || '-' }}
118 </template> 77 </template>
119 </el-table-column> 78 </el-table-column>
120 - <el-table-column  
121 - prop="curCopyName"  
122 - :label="$t('doWork.table.curCopyName')"  
123 - align="center"> 79 + <el-table-column prop="curCopyName" :label="$t('doWork.table.curCopyName')" align="center">
124 <template slot-scope="scope"> 80 <template slot-scope="scope">
125 {{ scope.row.curCopyName || '-' }} 81 {{ scope.row.curCopyName || '-' }}
126 </template> 82 </template>
127 </el-table-column> 83 </el-table-column>
128 - <el-table-column  
129 - prop="stateName"  
130 - :label="$t('doWork.table.stateName')"  
131 - align="center"> 84 + <el-table-column prop="stateName" :label="$t('doWork.table.stateName')" align="center">
132 </el-table-column> 85 </el-table-column>
133 - <el-table-column  
134 - prop="createTime"  
135 - :label="$t('doWork.table.createTime')"  
136 - align="center"> 86 + <el-table-column prop="createTime" :label="$t('doWork.table.createTime')" align="center">
137 </el-table-column> 87 </el-table-column>
138 - <el-table-column  
139 - :label="$t('common.operation')"  
140 - align="center"  
141 - width="180"> 88 + <el-table-column :label="$t('common.operation')" align="center" width="180">
142 <template slot-scope="scope"> 89 <template slot-scope="scope">
143 - <el-button  
144 - v-if="scope.row.state === 'W' || scope.row.state === 'D'"  
145 - type="text"  
146 - size="small" 90 + <el-button v-if="scope.row.state === 'W' || scope.row.state === 'D'" type="text" size="small"
147 @click="_openTodoTaskDetail(scope.row)"> 91 @click="_openTodoTaskDetail(scope.row)">
148 {{ $t('common.process') }} 92 {{ $t('common.process') }}
149 </el-button> 93 </el-button>
150 - <el-button  
151 - type="text"  
152 - size="small"  
153 - @click="_toWorkDetailPage(scope.row)"> 94 + <el-button type="text" size="small" @click="_toWorkDetailPage(scope.row)">
154 {{ $t('common.detail') }} 95 {{ $t('common.detail') }}
155 </el-button> 96 </el-button>
156 </template> 97 </template>
157 </el-table-column> 98 </el-table-column>
158 </el-table> 99 </el-table>
159 - <el-pagination  
160 - @size-change="handleSizeChange"  
161 - @current-change="handleCurrentChange"  
162 - :current-page="pagination.current"  
163 - :page-sizes="[10, 20, 30, 50]"  
164 - :page-size="pagination.size"  
165 - layout="total, sizes, prev, pager, next, jumper"  
166 - :total="pagination.total"> 100 + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
  101 + :current-page="pagination.current" :page-sizes="[10, 20, 30, 50]" :page-size="pagination.size"
  102 + layout="total, sizes, prev, pager, next, jumper" :total="pagination.total">
167 </el-pagination> 103 </el-pagination>
168 </el-card> 104 </el-card>
169 </el-col> 105 </el-col>
@@ -272,7 +208,7 @@ export default { @@ -272,7 +208,7 @@ export default {
272 }, 208 },
273 _toWorkDetailPage(work) { 209 _toWorkDetailPage(work) {
274 this.$router.push({ 210 this.$router.push({
275 - path: '/pages/oa/workDetail', 211 + path: '/views/oa/workDetail',
276 query: { 212 query: {
277 workId: work.workId 213 workId: work.workId
278 } 214 }
src/views/oa/workDetailList.vue
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 14
15 <!-- 业主信息 --> 15 <!-- 业主信息 -->
16 <div class="margin-top"> 16 <div class="margin-top">
17 - <el-row :gutter="20" > 17 + <el-row :gutter="20">
18 <el-col :span="24" class="text-left"> 18 <el-col :span="24" class="text-left">
19 <el-row :gutter="20"> 19 <el-row :gutter="20">
20 <el-col :span="6"> 20 <el-col :span="6">
@@ -150,7 +150,7 @@ @@ -150,7 +150,7 @@
150 <div v-if="workDetailInfo._currentTab == 'workDetailContent'"> 150 <div v-if="workDetailInfo._currentTab == 'workDetailContent'">
151 <div class="padding flex justify-start" v-for="(item, index) in workDetailInfo.contents" :key="index"> 151 <div class="padding flex justify-start" v-for="(item, index) in workDetailInfo.contents" :key="index">
152 <div>{{ item.seqNum }}、</div> 152 <div>{{ item.seqNum }}、</div>
153 - <div v-html="item.content" style="width: 80%;"></div> 153 + <div v-html="item.content" style="width: 80%;" class="text-left"></div>
154 </div> 154 </div>
155 </div> 155 </div>
156 <div v-if="workDetailInfo._currentTab == 'workDetailTask'"> 156 <div v-if="workDetailInfo._currentTab == 'workDetailTask'">
src/views/oa/workTaskDetailLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + workTaskDetail: {
  4 + title: 'Work Task Detail',
  5 + workId: 'Work ID',
  6 + workName: 'Work Name',
  7 + typeName: 'Type Name',
  8 + workCycle: 'Work Cycle',
  9 + once: 'One-time',
  10 + periodic: 'Periodic',
  11 + startTime: 'Start Time',
  12 + endTime: 'End Time',
  13 + createUserName: 'Creator',
  14 + curStaffName: 'Handler',
  15 + curCopyName: 'CC',
  16 + stateName: 'Status',
  17 + createTime: 'Create Time',
  18 + attachment: 'Attachment',
  19 + select: 'Select',
  20 + content: 'Content',
  21 + status: 'Status',
  22 + pending: 'Pending',
  23 + processed: 'Processed',
  24 + flow: 'Work Flow',
  25 + preStaff: 'Previous Handler',
  26 + staff: 'Handler',
  27 + validTime: 'Valid Time',
  28 + time: 'Time',
  29 + type: 'Type',
  30 + handler: 'Handler Process',
  31 + copy: 'CC Process',
  32 + process: 'Process',
  33 + remark: 'Remark',
  34 + attachmentList: 'Attachments',
  35 + action: 'Action',
  36 + pleaseSelect: 'Please Select',
  37 +
  38 + transfer: 'Transfer',
  39 + nextHandler: 'Next Handler',
  40 + selectNextHandler: 'Please select next handler',
  41 + inputRemark: 'Please input remark',
  42 + submitSuccess: 'Submit success',
  43 + submitFailed: 'Submit failed'
  44 + }
  45 + },
  46 + zh: {
  47 + workTaskDetail: {
  48 + title: '任务单详情',
  49 + workId: '工单编号',
  50 + workName: '工单名称',
  51 + typeName: '类型名称',
  52 + workCycle: '标识',
  53 + once: '一次性工单',
  54 + periodic: '周期性工单',
  55 + startTime: '开始时间',
  56 + endTime: '结束时间',
  57 + createUserName: '发起人',
  58 + curStaffName: '处理人',
  59 + curCopyName: '抄送人',
  60 + stateName: '状态',
  61 + createTime: '创建时间',
  62 + attachment: '附件',
  63 + select: '选择',
  64 + content: '工作单内容',
  65 + status: '状态',
  66 + pending: '待处理',
  67 + processed: '已处理',
  68 + flow: '工作单流转',
  69 + preStaff: '前处理人',
  70 + staff: '处理人',
  71 + validTime: '任务有效期',
  72 + time: '时间',
  73 + type: '类型',
  74 + handler: '处理人办理',
  75 + copy: '抄送人办理',
  76 + remark: '意见',
  77 + attachmentList: '工作单附件',
  78 + action: '动作',
  79 + pleaseSelect: '请选择',
  80 + process: '办理',
  81 + transfer: '转单',
  82 + nextHandler: '下一处理人',
  83 + selectNextHandler: '必填,请选择下一处理人',
  84 + inputRemark: '必填,请填写工单说明',
  85 + submitSuccess: '办理成功',
  86 + submitFailed: '办理失败'
  87 + }
  88 + }
  89 +}
0 \ No newline at end of file 90 \ No newline at end of file
src/views/oa/workTaskDetailList.vue 0 → 100644
  1 +<template>
  2 + <div class="work-task-detail-container">
  3 + <el-card class="box-card">
  4 + <div class="flex justify-between">
  5 + <div class="text-title">{{ $t('workTaskDetail.title') }}</div>
  6 + <div>
  7 + <el-button type="primary" size="small" style="margin-left:10px" @click="goBack">
  8 + <i class="el-icon-close"></i>{{ $t('common.back') }}
  9 + </el-button>
  10 + </div>
  11 + </div>
  12 +
  13 + <!-- 基本信息 -->
  14 + <div class="margin-top">
  15 + <el-row :gutter="20">
  16 + <el-col :span="6">
  17 + <div class="form-group">
  18 + <label class="col-form-label">
  19 + {{ $t('workTaskDetail.workId') }}:
  20 + </label>
  21 + <label>{{ workTaskDetailInfo.workId }}</label>
  22 + </div>
  23 + </el-col>
  24 + <el-col :span="6">
  25 + <div class="form-group">
  26 + <label class="col-form-label">
  27 + {{ $t('workTaskDetail.workName') }}:
  28 + </label>
  29 + <label>{{ workTaskDetailInfo.workName }}</label>
  30 + </div>
  31 + </el-col>
  32 + <el-col :span="6">
  33 + <div class="form-group">
  34 + <label class="col-form-label">
  35 + {{ $t('workTaskDetail.typeName') }}:
  36 + </label>
  37 + <label>{{ workTaskDetailInfo.typeName }}</label>
  38 + </div>
  39 + </el-col>
  40 + <el-col :span="6">
  41 + <div class="form-group">
  42 + <label class="col-form-label">
  43 + {{ $t('workTaskDetail.workCycle') }}:
  44 + </label>
  45 + <label>{{ workTaskDetailInfo.workCycle == '1001' ? $t('workTaskDetail.once') :
  46 + $t('workTaskDetail.periodic') }}</label>
  47 + </div>
  48 + </el-col>
  49 + </el-row>
  50 +
  51 + <el-row :gutter="20">
  52 + <el-col :span="6">
  53 + <div class="form-group">
  54 + <label class="col-form-label">
  55 + {{ $t('workTaskDetail.startTime') }}:
  56 + </label>
  57 + <label>{{ workTaskDetailInfo.startTime }}</label>
  58 + </div>
  59 + </el-col>
  60 + <el-col :span="6">
  61 + <div class="form-group">
  62 + <label class="col-form-label">
  63 + {{ $t('workTaskDetail.endTime') }}:
  64 + </label>
  65 + <label>{{ workTaskDetailInfo.endTime }}</label>
  66 + </div>
  67 + </el-col>
  68 + <el-col :span="6">
  69 + <div class="form-group">
  70 + <label class="col-form-label">
  71 + {{ $t('workTaskDetail.createUserName') }}:
  72 + </label>
  73 + <label>{{ workTaskDetailInfo.createUserName }}</label>
  74 + </div>
  75 + </el-col>
  76 + <el-col :span="6">
  77 + <div class="form-group">
  78 + <label class="col-form-label">
  79 + {{ $t('workTaskDetail.curStaffName') }}:
  80 + </label>
  81 + <label>{{ workTaskDetailInfo.curStaffName || '-' }}</label>
  82 + </div>
  83 + </el-col>
  84 + </el-row>
  85 +
  86 + <el-row :gutter="20">
  87 + <el-col :span="6">
  88 + <div class="form-group">
  89 + <label class="col-form-label">
  90 + {{ $t('workTaskDetail.curCopyName') }}:
  91 + </label>
  92 + <label>{{ workTaskDetailInfo.curCopyName || '-' }}</label>
  93 + </div>
  94 + </el-col>
  95 + <el-col :span="6">
  96 + <div class="form-group">
  97 + <label class="col-form-label">
  98 + {{ $t('workTaskDetail.stateName') }}:
  99 + </label>
  100 + <label>{{ workTaskDetailInfo.stateName }}</label>
  101 + </div>
  102 + </el-col>
  103 + <el-col :span="6">
  104 + <div class="form-group">
  105 + <label class="col-form-label">
  106 + {{ $t('workTaskDetail.createTime') }}:
  107 + </label>
  108 + <label>{{ workTaskDetailInfo.createTime }}</label>
  109 + </div>
  110 + </el-col>
  111 + <el-col :span="6">
  112 + <div class="form-group">
  113 + <label class="col-form-label">
  114 + {{ $t('workTaskDetail.attachment') }}:
  115 + </label>
  116 + <label>
  117 + <el-link v-if="workTaskDetailInfo.pathUrl" :href="workTaskDetailInfo.pathUrl" target="_blank">
  118 + {{ $t('common.download') }}
  119 + </el-link>
  120 + <span v-else>-</span>
  121 + </label>
  122 + </div>
  123 + </el-col>
  124 + </el-row>
  125 + </div>
  126 + </el-card>
  127 +
  128 + <!-- 工作单内容 -->
  129 + <el-card class="margin-top">
  130 + <el-table :data="workTaskDetailInfo.items" border style="width: 100%">
  131 + <el-table-column v-if="workTaskDetailInfo.todo == 'ON'" :label="$t('workTaskDetail.select')" width="250"
  132 + align="center">
  133 + <template slot-scope="{row}">
  134 + <el-radio v-if="row.state == 'W'" v-model="workTaskDetailInfo.audit.itemId" :label="row.itemId"
  135 + @change="selectContent(row)"></el-radio>
  136 + <span v-else>-</span>
  137 + </template>
  138 + </el-table-column>
  139 + <el-table-column :label="$t('workTaskDetail.content')" prop="content">
  140 + <template slot-scope="{row, $index}">
  141 + <div class="flex justify-start">
  142 + <div>{{ $index + 1 }}、</div>
  143 + <div v-html="row.content"></div>
  144 + </div>
  145 + </template>
  146 + </el-table-column>
  147 + <el-table-column :label="$t('workTaskDetail.status')" width="100" align="center">
  148 + <template slot-scope="{row}">
  149 + {{ row.state == 'W' ? $t('workTaskDetail.pending') : $t('workTaskDetail.processed') }}
  150 + </template>
  151 + </el-table-column>
  152 + </el-table>
  153 + </el-card>
  154 +
  155 + <!-- 工作单流转 -->
  156 + <el-card v-if="workTaskDetailInfo.todo != 'ON' && workTaskDetailInfo.events && workTaskDetailInfo.events.length > 0"
  157 + class="margin-top ">
  158 + <div slot="header" class="text-left">
  159 + <span>{{ $t('workTaskDetail.flow') }}</span>
  160 + </div>
  161 + <el-table :data="workTaskDetailInfo.events" border style="width: 100%">
  162 + <el-table-column :label="$t('workTaskDetail.preStaff')" align="center" prop="preStaffName"></el-table-column>
  163 + <el-table-column :label="$t('workTaskDetail.staff')" align="center" prop="staffName"></el-table-column>
  164 + <el-table-column :label="$t('workTaskDetail.validTime')" align="center" prop="startTime">
  165 + <template slot-scope="{row}">
  166 + {{ row.startTime }}<br>~{{ row.endTime }}
  167 + </template>
  168 + </el-table-column>
  169 + <el-table-column :label="$t('workTaskDetail.time')" align="center" prop="endTime"></el-table-column>
  170 + <el-table-column :label="$t('workTaskDetail.type')" align="center" prop="eventType">
  171 + <template slot-scope="{row}">
  172 + <span v-if="row.eventType == '1001'">{{ $t('workTaskDetail.handler') }}</span>
  173 + <span v-else-if="row.eventType == '2002'">{{ $t('workTaskDetail.copy') }}</span>
  174 + <span v-else>{{ $t('workTaskDetail.process') }}</span>
  175 + </template>
  176 + </el-table-column>
  177 + <el-table-column :label="$t('workTaskDetail.remark')" align="center" prop="remark"></el-table-column>
  178 + </el-table>
  179 + </el-card>
  180 +
  181 + <!-- 工作单附件 -->
  182 + <el-card v-if="workTaskDetailInfo.todo != 'ON' && workTaskDetailInfo.files && workTaskDetailInfo.files.length > 0"
  183 + class="margin-top">
  184 + <div slot="header" class="text-left">
  185 + <span>{{ $t('workTaskDetail.attachmentList') }}</span>
  186 + </div>
  187 + <el-table :data="workTaskDetailInfo.files" border style="width: 100%">
  188 + <el-table-column :label="$t('workTaskDetail.staff')" align="center"></el-table-column>
  189 + <el-table-column :label="$t('workTaskDetail.attachment')" align="center">
  190 + <template slot-scope="{row}">
  191 + <el-link :href="row.pathUrl" target="_blank">{{ $t('common.download') }}</el-link>
  192 + </template>
  193 + </el-table-column>
  194 + </el-table>
  195 + </el-card>
  196 +
  197 + <!-- 工单办理 -->
  198 + <el-card v-if="workTaskDetailInfo.todo == 'ON' && workTaskDetailInfo.audit.itemId" class="margin-top text-left">
  199 + <div slot="header" class="text-left">
  200 + <span>{{ $t('workTaskDetail.process') }}</span>
  201 + </div>
  202 + <el-form label-width="120px">
  203 + <el-form-item :label="$t('workTaskDetail.action')">
  204 + <el-select v-model="workTaskDetailInfo.audit.auditCode" style="width:100%">
  205 + <el-option :label="$t('workTaskDetail.pleaseSelect')" value="" disabled></el-option>
  206 + <el-option :label="$t('workTaskDetail.process')" value="C"></el-option>
  207 + <el-option :label="$t('workTaskDetail.transfer')" value="T"></el-option>
  208 + </el-select>
  209 + </el-form-item>
  210 +
  211 + <el-form-item v-if="workTaskDetailInfo.audit.auditCode == 'T'" :label="$t('workTaskDetail.nextHandler')">
  212 + <el-input v-model="workTaskDetailInfo.audit.staffName" :placeholder="$t('workTaskDetail.selectNextHandler')"
  213 + disabled>
  214 + <el-button slot="append" icon="el-icon-search" @click="chooseStaff"></el-button>
  215 + </el-input>
  216 + </el-form-item>
  217 +
  218 + <el-form-item :label="$t('workTaskDetail.attachment')">
  219 + <upload-file ref="uploadFile" @notify="handleNotifyFile"></upload-file>
  220 + </el-form-item>
  221 +
  222 + <el-form-item :label="$t('workTaskDetail.remark')">
  223 + <el-input type="textarea" :placeholder="$t('workTaskDetail.inputRemark')"
  224 + v-model="workTaskDetailInfo.audit.auditMessage"></el-input>
  225 + </el-form-item>
  226 +
  227 + <el-form-item class="text-right">
  228 + <el-button type="primary" @click="auditSubmit">{{ $t('common.submit') }}</el-button>
  229 + </el-form-item>
  230 + </el-form>
  231 + </el-card>
  232 +
  233 + <select-staff ref="selectStaff" @selectStaff="handleStaffChange"></select-staff>
  234 + </div>
  235 +</template>
  236 +
  237 +<script>
  238 +import { getWorkDetail, getWorkTaskItems, getWorkEvents, getWorkFiles, finishWorkTask } from '@/api/oa/workTaskDetailApi'
  239 +import UploadFile from '@/components/upload/uploadFile'
  240 +import SelectStaff from '@/components/staff/SelectStaff'
  241 +
  242 +export default {
  243 + name: 'WorkTaskDetailList',
  244 + components: {
  245 + UploadFile,
  246 + SelectStaff
  247 + },
  248 + data() {
  249 + return {
  250 + workTaskDetailInfo: {
  251 + viewWorkFlag: '',
  252 + workId: "",
  253 + wtId: '',
  254 + workName: '',
  255 + typeName: "",
  256 + workCycle: "",
  257 + startTime: "",
  258 + endTime: "",
  259 + createUserName: "",
  260 + curStaffName: "",
  261 + curCopyName: "",
  262 + stateName: "",
  263 + createTime: '',
  264 + items: [],
  265 + pathUrl: '',
  266 + taskId: '',
  267 + todo: 'OFF',
  268 + events: [],
  269 + files: [],
  270 + audit: {
  271 + taskId: '',
  272 + auditCode: 'C',
  273 + auditMessage: this.$t('workTaskDetail.processed'),
  274 + staffId: '',
  275 + staffName: '',
  276 + pathUrl: '',
  277 + itemId: '',
  278 + }
  279 + }
  280 + }
  281 + },
  282 + created() {
  283 + this.workTaskDetailInfo.workId = this.$route.query.workId
  284 + this.workTaskDetailInfo.taskId = this.$route.query.taskId
  285 + const todo = this.$route.query.todo
  286 + if (todo) {
  287 + this.workTaskDetailInfo.todo = todo
  288 + this.workTaskDetailInfo.audit.taskId = this.$route.query.taskId
  289 + }
  290 + if (!this.workTaskDetailInfo.workId) return
  291 +
  292 + this.loadWorkInfo()
  293 + this.loadWorkTaskItem()
  294 + this.loadWorkEventData()
  295 + this.loadWorkFileData()
  296 + },
  297 + methods: {
  298 + async loadWorkInfo() {
  299 + try {
  300 + const params = {
  301 + workId: this.workTaskDetailInfo.workId,
  302 + page: 1,
  303 + row: 1,
  304 + }
  305 + const { data } = await getWorkDetail(params)
  306 + Object.assign(this.workTaskDetailInfo, data[0])
  307 + } catch (error) {
  308 + console.error('获取工单详情失败:', error)
  309 + }
  310 + },
  311 + async loadWorkTaskItem() {
  312 + try {
  313 + const params = {
  314 + taskId: this.workTaskDetailInfo.taskId,
  315 + page: 1,
  316 + row: 100,
  317 + }
  318 + const { data } = await getWorkTaskItems(params)
  319 + this.workTaskDetailInfo.items = data
  320 + } catch (error) {
  321 + console.error('获取工单项失败:', error)
  322 + }
  323 + },
  324 + async loadWorkEventData() {
  325 + try {
  326 + const params = {
  327 + taskId: this.workTaskDetailInfo.taskId,
  328 + workId: this.workTaskDetailInfo.workId,
  329 + page: 1,
  330 + row: 100
  331 + }
  332 + const { data } = await getWorkEvents(params)
  333 + this.workTaskDetailInfo.events = data
  334 + } catch (error) {
  335 + console.error('获取工单事件失败:', error)
  336 + }
  337 + },
  338 + async loadWorkFileData() {
  339 + try {
  340 + const params = {
  341 + taskId: this.workTaskDetailInfo.taskId,
  342 + workId: this.workTaskDetailInfo.workId,
  343 + page: 1,
  344 + row: 100
  345 + }
  346 + const { data } = await getWorkFiles(params)
  347 + this.workTaskDetailInfo.files = data
  348 + } catch (error) {
  349 + console.error('获取工单文件失败:', error)
  350 + }
  351 + },
  352 + selectContent(item) {
  353 + if (item.state == 'C') return
  354 + this.workTaskDetailInfo.audit.itemId = item.itemId
  355 + },
  356 + chooseStaff() {
  357 + this.$refs.selectStaff.open(this.workTaskDetailInfo.audit)
  358 + },
  359 + handleStaffChange(staff) {
  360 + this.workTaskDetailInfo.audit.staffId = staff.staffId
  361 + this.workTaskDetailInfo.audit.staffName = staff.staffName
  362 + },
  363 + handleNotifyFile(file) {
  364 + this.workTaskDetailInfo.audit.pathUrl = file.realFileName
  365 + },
  366 + async auditSubmit() {
  367 + try {
  368 + await finishWorkTask(this.workTaskDetailInfo.audit)
  369 + this.$message.success(this.$t('workTaskDetail.submitSuccess'))
  370 + this.goBack()
  371 + } catch (error) {
  372 + this.$message.error(error.message || this.$t('workTaskDetail.submitFailed'))
  373 + }
  374 + },
  375 + goBack() {
  376 + this.$router.go(-1)
  377 + }
  378 + }
  379 +}
  380 +</script>
  381 +
  382 +<style scoped>
  383 +.work-task-detail-container {
  384 + padding: 20px;
  385 +}
  386 +
  387 +.margin-top {
  388 + margin-top: 20px;
  389 +}
  390 +
  391 +.flex {
  392 + display: flex;
  393 +}
  394 +
  395 +.justify-between {
  396 + justify-content: space-between;
  397 +}
  398 +
  399 +.justify-start {
  400 + justify-content: flex-start;
  401 +}
  402 +
  403 +.text-title {
  404 + font-size: 18px;
  405 +}
  406 +
  407 +.form-group {
  408 + margin-bottom: 15px;
  409 + text-align: left;
  410 +}
  411 +
  412 +.col-form-label {
  413 + margin-right: 10px;
  414 +}
  415 +</style>
0 \ No newline at end of file 416 \ No newline at end of file