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 159 \ No newline at end of file
... ...
src/components/oa/WorkDetailTask.vue
... ... @@ -161,7 +161,7 @@ export default {
161 161 },
162 162 openWorkTaskDetail(work) {
163 163 this.$router.push({
164   - path: '/oa/workTaskDetail',
  164 + path: '/pages/oa/workTaskDetail',
165 165 query: {
166 166 workId: work.workId,
167 167 taskId: work.taskId
... ...
src/i18n/commonLang.js
... ... @@ -62,7 +62,8 @@ export const messages = {
62 62 file:'File',
63 63 hide:'Hide',
64 64 viewDetail:'View Detail',
65   - yuan:'yuan'
  65 + yuan:'yuan',
  66 + process:'Process'
66 67 }
67 68 },
68 69 zh: {
... ... @@ -128,7 +129,8 @@ export const messages = {
128 129 file:'附件',
129 130 hide:'隐藏',
130 131 viewDetail:'查看详情',
131   - yuan:'元'
  132 + yuan:'元',
  133 + process:'处理'
132 134 }
133 135 }
134 136 }
135 137 \ No newline at end of file
... ...
src/i18n/oaI18n.js
... ... @@ -56,6 +56,7 @@ import { messages as visitUndoMessages } from '../views/oa/visitUndoLang'
56 56 import { messages as doHistoryComplaintsMessages } from '../views/oa/doHistoryComplaintsLang'
57 57 import { messages as myAuditHistoryOrdersMessages } from '../views/resource/myAuditHistoryOrdersLang'
58 58 import { messages as visitFinishMessages } from '../views/oa/visitFinishLang'
  59 +import { messages as workTaskDetailMessages } from '../views/oa/workTaskDetailLang'
59 60  
60 61  
61 62 export const messages ={
... ... @@ -117,6 +118,7 @@ export const messages ={
117 118 ...doHistoryComplaintsMessages.en,
118 119 ...myAuditHistoryOrdersMessages.en,
119 120 ...visitFinishMessages.en,
  121 + ...workTaskDetailMessages.en,
120 122 },
121 123 zh:{
122 124 ...activitiesTypeManageMessages.zh,
... ... @@ -176,5 +178,6 @@ export const messages ={
176 178 ...doHistoryComplaintsMessages.zh,
177 179 ...myAuditHistoryOrdersMessages.zh,
178 180 ...visitFinishMessages.zh,
  181 + ...workTaskDetailMessages.zh,
179 182 }
180 183 }
181 184 \ No newline at end of file
... ...
src/router/oaRouter.js
... ... @@ -269,4 +269,9 @@ export default [
269 269 name:'/pages/property/visitFinish',
270 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 278 \ No newline at end of file
... ...
src/views/oa/doWorkList.vue
... ... @@ -4,12 +4,9 @@
4 4 <el-col :span="4">
5 5 <el-card class="tree-card">
6 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 10 </li>
14 11 </ul>
15 12 </el-card>
... ... @@ -21,31 +18,21 @@
21 18 </div>
22 19 <el-row :gutter="20">
23 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 23 </el-col>
29 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 27 </el-col>
35 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 31 </el-date-picker>
42 32 </el-col>
43 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 36 :disabled="!doWorkInfo.conditions.queryStartTime">
50 37 </el-date-picker>
51 38 </el-col>
... ... @@ -66,104 +53,53 @@
66 53 <div slot="header" class="flex justify-between">
67 54 <span>{{ $t('doWork.table.title') }}</span>
68 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 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 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 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 64 <template slot-scope="scope">
94 65 {{ scope.row.workCycle === '1001' ? $t('doWork.workCycle.once') : $t('doWork.workCycle.periodic') }}
95 66 </template>
96 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 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 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 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 75 <template slot-scope="scope">
117 76 {{ scope.row.curStaffName || '-' }}
118 77 </template>
119 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 80 <template slot-scope="scope">
125 81 {{ scope.row.curCopyName || '-' }}
126 82 </template>
127 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 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 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 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 91 @click="_openTodoTaskDetail(scope.row)">
148 92 {{ $t('common.process') }}
149 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 95 {{ $t('common.detail') }}
155 96 </el-button>
156 97 </template>
157 98 </el-table-column>
158 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 103 </el-pagination>
168 104 </el-card>
169 105 </el-col>
... ... @@ -272,7 +208,7 @@ export default {
272 208 },
273 209 _toWorkDetailPage(work) {
274 210 this.$router.push({
275   - path: '/pages/oa/workDetail',
  211 + path: '/views/oa/workDetail',
276 212 query: {
277 213 workId: work.workId
278 214 }
... ...
src/views/oa/workDetailList.vue
... ... @@ -14,7 +14,7 @@
14 14  
15 15 <!-- 业主信息 -->
16 16 <div class="margin-top">
17   - <el-row :gutter="20" >
  17 + <el-row :gutter="20">
18 18 <el-col :span="24" class="text-left">
19 19 <el-row :gutter="20">
20 20 <el-col :span="6">
... ... @@ -150,7 +150,7 @@
150 150 <div v-if="workDetailInfo._currentTab == 'workDetailContent'">
151 151 <div class="padding flex justify-start" v-for="(item, index) in workDetailInfo.contents" :key="index">
152 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 154 </div>
155 155 </div>
156 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 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 416 \ No newline at end of file
... ...