Commit 4fa8cf1240ee3948c9e8e08feaa3ee8426820f51

Authored by 刘淇
1 parent cf0c3fb3

巡查员结束工单

common/utils/common.js
@@ -40,4 +40,29 @@ export const nextStepMap = { @@ -40,4 +40,29 @@ export const nextStepMap = {
40 backShow: false, 40 backShow: false,
41 renewShow: true 41 renewShow: true
42 }, 42 },
  43 +}
  44 +
  45 +// ylTeamLeader 养护组长退回:210
  46 +// ylTeamLeader 养护组长分配:110
  47 +// ylInspectorStart 巡查员结束工单:200
  48 +// ylInspectorStart 巡查员重新发起:100
  49 +// ylWorker 养护员退回 :220
  50 +// ylWorker 养护员实施 :120
  51 +// ylTeamLeaderConfirm 养护组长验收通过: 130
  52 +// ylTeamLeaderConfirm 养护组长验收不通过:230
  53 +// ylInspector 巡查员验收通过:140
  54 +// ylInspector 巡查员验收不通过:240
  55 +
  56 +export const buzStatusMap = {
  57 + '000' :'巡查员发起',
  58 + "210" : '养护组长退回',
  59 + "110" : '养护组长分配',
  60 + "200" : '巡查员结束工单',
  61 + "100" : '巡查员重新发起',
  62 + "220" : '养护员退回',
  63 + "120" : '养护员实施',
  64 + "130" : '养护组长验收通过',
  65 + "230" : '养护组长验收不通过',
  66 + "140" : '巡查员验收通过',
  67 + "240" : '巡查员验收不通过',
43 } 68 }
44 \ No newline at end of file 69 \ No newline at end of file
pages-sub/daily/maintain-manage/add-record.vue
@@ -302,7 +302,7 @@ export default { @@ -302,7 +302,7 @@ export default {
302 }) 302 })
303 303
304 setTimeout(() => { 304 setTimeout(() => {
305 - uni.redirectTo({ 305 + uni.reLaunch({
306 url: '/pages-sub/daily/maintain-manage/index' 306 url: '/pages-sub/daily/maintain-manage/index'
307 }) 307 })
308 }, 1000) 308 }, 1000)
pages-sub/daily/patrol-manage/add-patrol-record.vue
@@ -291,7 +291,7 @@ export default { @@ -291,7 +291,7 @@ export default {
291 291
292 // // 延迟跳转(等待提示框显示完成) 292 // // 延迟跳转(等待提示框显示完成)
293 setTimeout(() => { 293 setTimeout(() => {
294 - uni.redirectTo({ 294 + uni.reLaunch({
295 url: '/pages-sub/daily/patrol-manage/index' 295 url: '/pages-sub/daily/patrol-manage/index'
296 }) 296 })
297 }, 1000) 297 }, 1000)
pages-sub/daily/quick-order/add-order.vue
@@ -476,7 +476,7 @@ export default { @@ -476,7 +476,7 @@ export default {
476 476
477 // 延迟跳转(等待提示框显示完成) 477 // 延迟跳转(等待提示框显示完成)
478 setTimeout(() => { 478 setTimeout(() => {
479 - uni.redirectTo({ 479 + uni.reLaunch({
480 url: '/pages-sub/daily/quick-order/index' 480 url: '/pages-sub/daily/quick-order/index'
481 }) 481 })
482 }, 1000) 482 }, 1000)
pages-sub/problem/work-order-manage/add-maintain-order.vue
@@ -770,7 +770,7 @@ const submitWorkOrder = async () => { @@ -770,7 +770,7 @@ const submitWorkOrder = async () => {
770 770
771 // 延迟跳转 771 // 延迟跳转
772 setTimeout(() => { 772 setTimeout(() => {
773 - uni.redirectTo({ 773 + uni.reLaunch({
774 url: '/pages-sub/problem/work-order-manage/index' 774 url: '/pages-sub/problem/work-order-manage/index'
775 }) 775 })
776 }, 1000) 776 }, 1000)
pages-sub/problem/work-order-manage/add-order.vue
@@ -552,7 +552,7 @@ const submitWorkOrder = async () => { @@ -552,7 +552,7 @@ const submitWorkOrder = async () => {
552 552
553 // 延迟跳转回列表页 553 // 延迟跳转回列表页
554 setTimeout(() => { 554 setTimeout(() => {
555 - uni.redirectTo({ 555 + uni.reLaunch({
556 url: '/pages-sub/problem/work-order-manage/index' 556 url: '/pages-sub/problem/work-order-manage/index'
557 }) 557 })
558 }, 1000) 558 }, 1000)
pages-sub/problem/work-order-manage/index.vue
@@ -92,6 +92,10 @@ @@ -92,6 +92,10 @@
92 </view> 92 </view>
93 </view> 93 </view>
94 <view class="u-body-item u-flex"> 94 <view class="u-body-item u-flex">
  95 + <view class="u-body-item-title">工单状态:</view>
  96 + <view class="u-line-1 u-body-value">{{buzStatusMap[item.buzStatus] }}</view>
  97 + </view>
  98 + <view class="u-body-item u-flex">
95 <view class="u-body-item-title">提交时间:</view> 99 <view class="u-body-item-title">提交时间:</view>
96 <view class="u-line-1 u-body-value">{{ timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }}</view> 100 <view class="u-line-1 u-body-value">{{ timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }}</view>
97 </view> 101 </view>
@@ -153,6 +157,10 @@ @@ -153,6 +157,10 @@
153 </view> 157 </view>
154 </view> 158 </view>
155 <view class="u-body-item u-flex"> 159 <view class="u-body-item u-flex">
  160 + <view class="u-body-item-title">工单状态:</view>
  161 + <view class="u-line-1 u-body-value">{{buzStatusMap[item.buzStatus] }}</view>
  162 + </view>
  163 + <view class="u-body-item u-flex">
156 <view class="u-body-item-title">提交时间:</view> 164 <view class="u-body-item-title">提交时间:</view>
157 <view class="u-line-1 u-body-value">{{ timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }}</view> 165 <view class="u-line-1 u-body-value">{{ timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }}</view>
158 </view> 166 </view>
@@ -189,23 +197,23 @@ @@ -189,23 +197,23 @@
189 maxlength="200" 197 maxlength="200"
190 class="reject-textarea" 198 class="reject-textarea"
191 /> 199 />
192 - <!-- 上传图片(选填)- 按照参考页面改造 -->  
193 - <view class="upload-wrap mt-20">  
194 - <view class="upload-title">上传图片(选填)</view>  
195 - <up-upload  
196 - :file-list="rejectImgs.imgList"  
197 - @after-read="rejectImgs.uploadImgs"  
198 - @delete="rejectImgs.deleteImg"  
199 - multiple  
200 - :max-count="rejectImgs.uploadConfig.maxCount"  
201 - :upload-text="rejectImgs.uploadConfig.uploadText"  
202 - :size-type="rejectImgs.uploadConfig.sizeType"  
203 - />  
204 - </view> 200 +<!-- &lt;!&ndash; 上传图片(选填)- 按照参考页面改造 &ndash;&gt;-->
  201 +<!-- <view class="upload-wrap mt-20">-->
  202 +<!-- <view class="upload-title">上传图片(选填)</view>-->
  203 +<!-- <up-upload-->
  204 +<!-- :file-list="rejectImgs.imgList"-->
  205 +<!-- @after-read="rejectImgs.uploadImgs"-->
  206 +<!-- @delete="rejectImgs.deleteImg"-->
  207 +<!-- multiple-->
  208 +<!-- :max-count="rejectImgs.uploadConfig.maxCount"-->
  209 +<!-- :upload-text="rejectImgs.uploadConfig.uploadText"-->
  210 +<!-- :size-type="rejectImgs.uploadConfig.sizeType"-->
  211 +<!-- />-->
  212 +<!-- </view>-->
205 </view> 213 </view>
206 </up-modal> 214 </up-modal>
207 215
208 - <!-- 养护组长验收弹窗 up-modal --> 216 + <!-- 验收弹窗 up-modal -->
209 <up-modal 217 <up-modal
210 :show="acceptModalShow" 218 :show="acceptModalShow"
211 title="验收" 219 title="验收"
@@ -252,7 +260,7 @@ import { @@ -252,7 +260,7 @@ import {
252 } from '@/api/work-order-manage/work-order-manage' 260 } from '@/api/work-order-manage/work-order-manage'
253 // 假设从用户store获取角色信息 261 // 假设从用户store获取角色信息
254 import { useUserStore } from '@/pinia/user'; 262 import { useUserStore } from '@/pinia/user';
255 -import { nextStepMap } from '@/common/utils/common' 263 +import { nextStepMap, buzStatusMap } from '@/common/utils/common'
256 // 引入图片上传组合式函数(与参考页面一致) 264 // 引入图片上传组合式函数(与参考页面一致)
257 import { useUploadImgs } from '@/common/utils/useUploadImgs' 265 import { useUploadImgs } from '@/common/utils/useUploadImgs'
258 266
@@ -453,9 +461,9 @@ const handleProcess = async (item) =&gt; { @@ -453,9 +461,9 @@ const handleProcess = async (item) =&gt; {
453 const requestData = { 461 const requestData = {
454 "returnImgs": rejectImgs.getSuccessImgUrls(), // 改造后:获取上传成功的图片URL 462 "returnImgs": rejectImgs.getSuccessImgUrls(), // 改造后:获取上传成功的图片URL
455 "workerDataId": item.id, 463 "workerDataId": item.id,
456 - "taskKey": item.taskKey, 464 + "taskKey":'ylInspectorStart',
457 "taskId": item.taskId, 465 "taskId": item.taskId,
458 - "operateType": nextStepMap[item.taskKey].operateTypeNoPass, 466 + "operateType": 200,
459 "agree": 1, 467 "agree": 1,
460 "reason": '结束工单' 468 "reason": '结束工单'
461 }; 469 };
@@ -546,7 +554,7 @@ const handleAddOrder = () =&gt; { @@ -546,7 +554,7 @@ const handleAddOrder = () =&gt; {
546 }); 554 });
547 }; 555 };
548 556
549 -// ========== 新增:养护组长验收弹窗事件 ========== 557 +// ========== 验收弹窗事件 ==========
550 // 验收弹窗 - 确定按钮(含表单校验) 558 // 验收弹窗 - 确定按钮(含表单校验)
551 const handleAcceptModalConfirm = async () => { 559 const handleAcceptModalConfirm = async () => {
552 // 1. 校验验收原因是否为空 560 // 1. 校验验收原因是否为空
@@ -565,19 +573,19 @@ const handleAcceptModalConfirm = async () =&gt; { @@ -565,19 +573,19 @@ const handleAcceptModalConfirm = async () =&gt; {
565 let postData = {} 573 let postData = {}
566 if (currentAcceptItem.value?.taskKey == 'ylTeamLeaderConfirm') { // 养护组长验收 574 if (currentAcceptItem.value?.taskKey == 'ylTeamLeaderConfirm') { // 养护组长验收
567 postData = { 575 postData = {
568 - "taskKey": "ylTeamLeaderConfirm", 576 + "taskKey": currentAcceptItem.value.taskKey, // ylTeamLeaderConfirm
569 "workerDataId": currentAcceptItem.value.id, 577 "workerDataId": currentAcceptItem.value.id,
570 "taskId": currentAcceptItem.value.taskId, 578 "taskId": currentAcceptItem.value.taskId,
571 - "operateType": acceptRadioValue.value == 0 ? nextStepMap['ylTeamLeaderConfirm'].operateTypePass : nextStepMap['ylTeamLeaderConfirm'].operateTypeNoPass, 579 + "operateType": acceptRadioValue.value == 0 ? nextStepMap[currentAcceptItem.value.taskKey].operateTypePass : nextStepMap[currentAcceptItem.value.taskKey].operateTypeNoPass,
572 "reason": acceptReason.value.trim() 580 "reason": acceptReason.value.trim()
573 } 581 }
574 } 582 }
575 if (currentAcceptItem.value?.taskKey == 'ylInspector') { // 巡查员验收 583 if (currentAcceptItem.value?.taskKey == 'ylInspector') { // 巡查员验收
576 postData = { 584 postData = {
577 - "taskKey": "ylTeamLeaderConfirm", 585 + "taskKey": currentAcceptItem.value.taskKey, //ylInspector
578 "taskId": currentAcceptItem.value.taskId, 586 "taskId": currentAcceptItem.value.taskId,
579 "workerDataId": currentAcceptItem.value.id, 587 "workerDataId": currentAcceptItem.value.id,
580 - "operateType": acceptRadioValue.value == 0 ? nextStepMap['ylTeamLeaderConfirm'].operateTypePass : nextStepMap['ylTeamLeaderConfirm'].operateTypeNoPass, 588 + "operateType": acceptRadioValue.value == 0 ? nextStepMap[currentAcceptItem.value.taskKey].operateTypePass : nextStepMap[currentAcceptItem.value.taskKey].operateTypeNoPass,
581 "reason": acceptReason.value.trim(), 589 "reason": acceptReason.value.trim(),
582 "agree": acceptRadioValue.value 590 "agree": acceptRadioValue.value
583 } 591 }
pages-sub/problem/work-order-manage/order-detail.vue
@@ -43,7 +43,14 @@ @@ -43,7 +43,14 @@
43 </up-cell> 43 </up-cell>
44 44
45 <!-- 工单名称 --> 45 <!-- 工单名称 -->
46 - <up-cell title="工单名称" :value="orderDetail.orderName || '--'" align="middle"></up-cell> 46 + <up-cell align="middle">
  47 + <template #title>
  48 + <view style="min-width: 200rpx">工单名称</view>
  49 + </template>
  50 + <template #value>
  51 + <view class="common-text-color up-line-1">{{ orderDetail.orderName || '--' }}</view>
  52 + </template>
  53 + </up-cell>
47 54
48 <!-- 情况描述 --> 55 <!-- 情况描述 -->
49 <up-cell> 56 <up-cell>
@@ -107,6 +114,13 @@ @@ -107,6 +114,13 @@
107 align="middle" 114 align="middle"
108 :border="false" 115 :border="false"
109 ></up-cell> 116 ></up-cell>
  117 +
  118 + <up-cell
  119 + title="工单完结时间"
  120 + :value="orderDetail.finishDate === 0 ? '暂无' : timeFormat(orderDetail.finishDate, 'yyyy-mm-dd hh:MM:ss')"
  121 + align="middle"
  122 + :border="false"
  123 + ></up-cell>
110 </up-cell-group> 124 </up-cell-group>
111 125
112 <!-- 图片分类Tabs区块 --> 126 <!-- 图片分类Tabs区块 -->
@@ -117,7 +131,7 @@ @@ -117,7 +131,7 @@
117 <view style="min-width: 200rpx">共同处理人</view> 131 <view style="min-width: 200rpx">共同处理人</view>
118 </template> 132 </template>
119 <template #value> 133 <template #value>
120 - <view class="common-text-color up-line-1">{{ orderDetail.coHandlersName || '--' }}</view> 134 + <view class="common-text-color up-line-1">{{ orderDetail.coHandlersName.join(',') || '--' }}</view>
121 </template> 135 </template>
122 </up-cell> 136 </up-cell>
123 </up-cell-group> 137 </up-cell-group>
@@ -158,49 +172,52 @@ @@ -158,49 +172,52 @@
158 inactive-color="#999" 172 inactive-color="#999"
159 class="vertical-steps" 173 class="vertical-steps"
160 > 174 >
161 - <up-steps-item  
162 - v-for="(item, index) in processData.activityNodes"  
163 - :key="`${item.id}_${index}`"  
164 - >  
165 - <!-- 唯一自定义模板:content,包含标题、描述、相册所有内容 -->  
166 - <template #content>  
167 - <view class="step-content-wrap">  
168 - <!-- 1. 原标题内容:节点名称 + 操作人 -->  
169 - <view class="step-title">  
170 - {{ item.name }}  
171 - <text class="operator-name">  
172 - {{ item.tasks && item.tasks[0]?.assigneeUser?.nickname ? '(' + item.tasks[0].assigneeUser.nickname + ')' : '(未知操作人)' }}  
173 - </text>  
174 - </view>  
175 -  
176 - <!-- 2. 原描述内容:时间 + 处理说明(最多200字) -->  
177 - <view class="step-desc">  
178 - <!-- 时间行 -->  
179 - <view class="time-line">  
180 - 处理时间:{{ timeFormat(item.startTime, 'yyyy-mm-dd hh:MM:ss') }}  
181 - <text v-if="item.endTime"> - {{ timeFormat(item.endTime, 'yyyy-mm-dd hh:MM:ss') }}</text>  
182 - <text v-else class="processing-tag">(处理中)</text>  
183 - </view>  
184 - <!-- 原因行 -->  
185 - <view class="reason-line up-line-2" v-if="item.tasks && item.tasks[0]?.reason">  
186 - 描述:{{ getLimitReason(item.tasks && item.tasks[0]?.reason) }} 175 + <template >
  176 + <up-steps-item
  177 + v-for="(item, index) in processData.activityNodes"
  178 + :key="`${item.id}_${index}`"
  179 + >
  180 + <!-- 唯一自定义模板:content,包含标题、描述、相册所有内容 -->
  181 + <template #content>
  182 + <view class="step-content-wrap" >
  183 + <!-- 1. 原标题内容:节点名称 + 操作人 -->
  184 + <view class="step-title">
  185 + {{ item.name }}
  186 + <text class="operator-name">
  187 + {{ item.tasks && item.tasks[0]?.assigneeUser?.nickname ? '(' + item.tasks[0].assigneeUser.nickname + ')' : '(未知操作人)' }}
  188 + </text>
  189 + </view>
  190 +
  191 + <!-- 2. 原描述内容:时间 + 处理说明(最多200字) -->
  192 + <view class="step-desc">
  193 + <!-- 时间行 -->
  194 + <view class="time-line">
  195 + 处理时间:{{ timeFormat(item.startTime, 'yyyy-mm-dd hh:MM:ss') }}
  196 + <text v-if="item.endTime"> - {{ timeFormat(item.endTime, 'yyyy-mm-dd hh:MM:ss') }}</text>
  197 + <text v-else class="processing-tag">(处理中)</text>
  198 + </view>
  199 + <!-- 原因行 -->
  200 + <view class="reason-line up-line-2" v-if="item.tasks && item.tasks[0]?.reason">
  201 + 描述:{{ getLimitReason(item.tasks && item.tasks[0]?.reason) }}
  202 + </view>
  203 + </view>
  204 +
  205 + <!-- 3. 原相册内容:预留up-album -->
  206 + <view class="step-album-wrap">
  207 + <up-album
  208 + v-if="item.tasks && item.tasks[0]?.returnImgs && item.tasks[0].returnImgs.length"
  209 + :urls="item.tasks[0].returnImgs.slice(0, 3)"
  210 + singleSize="70"
  211 + multipleSize="70"
  212 + :preview-full-image="true"
  213 + class="step-album"
  214 + ></up-album>
  215 + </view>
187 </view> 216 </view>
188 - </view>  
189 -  
190 - <!-- 3. 原相册内容:预留up-album -->  
191 - <view class="step-album-wrap">  
192 - <up-album  
193 - v-if="item.tasks && item.tasks[0]?.returnImgs && item.tasks[0].returnImgs.length"  
194 - :urls="item.tasks[0].returnImgs.slice(0, 3)"  
195 - singleSize="70"  
196 - multipleSize="70"  
197 - :preview-full-image="true"  
198 - class="step-album"  
199 - ></up-album>  
200 - </view>  
201 - </view> 217 + </template>
  218 + </up-steps-item>
202 </template> 219 </template>
203 - </up-steps-item> 220 +
204 </up-steps> 221 </up-steps>
205 222
206 <!-- 流程节点为空时的提示 --> 223 <!-- 流程节点为空时的提示 -->
@@ -257,7 +274,12 @@ const activeTopTabClick = async (item: any) =&gt; { @@ -257,7 +274,12 @@ const activeTopTabClick = async (item: any) =&gt; {
257 console.log(res) 274 console.log(res)
258 // 关键:格式化数据,补充up-steps要求的title字段 275 // 关键:格式化数据,补充up-steps要求的title字段
259 if (res && res.activityNodes && res.activityNodes.length) { 276 if (res && res.activityNodes && res.activityNodes.length) {
260 - const formatActivityNodes = res.activityNodes.map(node => ({ 277 + // 1. 先过滤:剔除 name 为 "结束" 的节点
  278 + const filteredActivityNodes = res.activityNodes.filter(node => {
  279 + // 返回 true 保留节点,返回 false 剔除节点
  280 + return node.name !== '结束';
  281 + });
  282 + const formatActivityNodes = filteredActivityNodes.map(node => ({
261 ...node, 283 ...node,
262 title: node.name // 补充强制字段,满足3.3.48版本组件要求 284 title: node.name // 补充强制字段,满足3.3.48版本组件要求
263 })); 285 }));
@@ -367,11 +389,15 @@ const getCurrentStepIndex = () =&gt; { @@ -367,11 +389,15 @@ const getCurrentStepIndex = () =&gt; {
367 const { activityNodes } = processData.value; 389 const { activityNodes } = processData.value;
368 if (!activityNodes || !activityNodes.length) return 0; 390 if (!activityNodes || !activityNodes.length) return 0;
369 391
  392 + // item.tasks && item.tasks[0]?.assigneeUser?.nickname
370 // 1. 查找第一个状态为1(处理中)的节点,即为当前步骤 393 // 1. 查找第一个状态为1(处理中)的节点,即为当前步骤
371 - const processingNodeIndex = activityNodes.findIndex(node => node.status === 1);  
372 - if (processingNodeIndex !== -1) {  
373 - return processingNodeIndex;  
374 - } 394 + // const processingNodeIndex = activityNodes.findIndex(node => node.name === '结束');
  395 + // console.log(processingNodeIndex)
  396 + // if (processingNodeIndex !== -1) {
  397 + // return activityNodes.length - 2
  398 + // }else{
  399 + // return activityNodes.length - 1
  400 + // }
375 401
376 // 2. 若没有处理中的节点(全部已完成),则激活最后一个节点 402 // 2. 若没有处理中的节点(全部已完成),则激活最后一个节点
377 return activityNodes.length - 1; 403 return activityNodes.length - 1;