Commit 68d3fcfe8914d0998ba1cf0daf8d4189c6befe3e

Authored by 刘淇
1 parent 1d77d32a

详细

pages-sub/daily/maintain-manage/finish-plan-detail.vue
@@ -85,11 +85,7 @@ @@ -85,11 +85,7 @@
85 </template> 85 </template>
86 </up-cell> --> 86 </up-cell> -->
87 87
88 - <up-cell  
89 - title="提交时间"  
90 - :value="i.createTime==null?'--':timeFormat(i.createTime,'yyyy-mm-dd hh:MM:ss')"  
91 - align="middle"  
92 - ></up-cell> 88 +
93 89
94 <up-cell 90 <up-cell
95 title="提交人" 91 title="提交人"
@@ -97,6 +93,12 @@ @@ -97,6 +93,12 @@
97 align="middle" 93 align="middle"
98 94
99 ></up-cell> 95 ></up-cell>
  96 +
  97 + <up-cell
  98 + title="提交时间"
  99 + :value="i.createTime==null?'--':timeFormat(i.createTime,'yyyy-mm-dd hh:MM:ss')"
  100 + align="middle"
  101 + ></up-cell>
100 </up-cell-group> 102 </up-cell-group>
101 103
102 <!-- 动态配置的养护字段填报值(garden_work_record/garden_work_field_value),未填报过则整段不显示 --> 104 <!-- 动态配置的养护字段填报值(garden_work_record/garden_work_field_value),未填报过则整段不显示 -->
@@ -108,6 +110,11 @@ @@ -108,6 +110,11 @@
108 title="" 110 title=""
109 > 111 >
110 <up-cell v-for="(f, fi) in i.fieldRows" :key="fi" align="middle"> 112 <up-cell v-for="(f, fi) in i.fieldRows" :key="fi" align="middle">
  113 + <!-- <up-cell
  114 + title="提交时间"
  115 + :value="i.createTime==null?'--':timeFormat(i.createTime,'yyyy-mm-dd hh:MM:ss')"
  116 + align="middle"
  117 + ></up-cell> -->
111 <template #title> 118 <template #title>
112 <view class="field-cell-title-multi">{{f.name}}</view> 119 <view class="field-cell-title-multi">{{f.name}}</view>
113 </template> 120 </template>
@@ -199,8 +206,8 @@ const previewImage = (currentUrl, allUrls) =&gt; { @@ -199,8 +206,8 @@ const previewImage = (currentUrl, allUrls) =&gt; {
199 /** 206 /**
200 * 获取工单详情 207 * 获取工单详情
201 */ 208 */
202 -const getOrderDetail = async (planNo: string, commitId?: string, workRecordIndex: number = 0) => {  
203 - console.log('===传入的workRecordIndex===', workRecordIndex) 209 +const getOrderDetail = async (planNo: string, commitId?: string) => {
  210 + console.log('getOrderDetail')
204 try { 211 try {
205 loading.value = true; 212 loading.value = true;
206 let queryData: any = { 213 let queryData: any = {
@@ -216,21 +223,13 @@ const getOrderDetail = async (planNo: string, commitId?: string, workRecordIndex @@ -216,21 +223,13 @@ const getOrderDetail = async (planNo: string, commitId?: string, workRecordIndex
216 const list = res.data?.list || res.list || []; 223 const list = res.data?.list || res.list || [];
217 224
218 orderDetail.value = list.map(item => { 225 orderDetail.value = list.map(item => {
219 - let useValues: any[] = []  
220 - // 取 workRecords 指定下标的 values  
221 - if (Array.isArray(item.workRecords) && item.workRecords.length > 0) {  
222 - const targetRecord = item.workRecords[workRecordIndex];  
223 - if (targetRecord && Array.isArray(targetRecord.values)) {  
224 - useValues = targetRecord.values  
225 - }  
226 - } 226 + // ✅直接使用接口返回的 item.fields,不再读取 workRecords
  227 + const useValues = Array.isArray(item.fields) ? item.fields : []
227 return { 228 return {
228 ...item, 229 ...item,
229 - // ✅这里直接拿 workRecords[index].values,传给buildFieldRow渲染  
230 fieldRows: useValues.map(buildFieldRow) 230 fieldRows: useValues.map(buildFieldRow)
231 } 231 }
232 }) 232 })
233 -  
234 } catch (error) { 233 } catch (error) {
235 console.error('获取工单详情失败:', error); 234 console.error('获取工单详情失败:', error);
236 uni.showToast({title: '加载失败,请重试', icon: 'none'}); 235 uni.showToast({title: '加载失败,请重试', icon: 'none'});
@@ -241,6 +240,7 @@ const getOrderDetail = async (planNo: string, commitId?: string, workRecordIndex @@ -241,6 +240,7 @@ const getOrderDetail = async (planNo: string, commitId?: string, workRecordIndex
241 240
242 241
243 242
  243 +
244 // ========== 动态配置字段(fieldValue)展示 ========== 244 // ========== 动态配置字段(fieldValue)展示 ==========
245 // 解析口径与 PC 端 FieldValueCell.vue + WorkRecordTab.vue 保持一致: 245 // 解析口径与 PC 端 FieldValueCell.vue + WorkRecordTab.vue 保持一致:
246 // 后端 valueText 是「类型无关直拷、提交无校验」,历史格式与脏数据都可能出现,故所有解析一律降级、不抛异常。 246 // 后端 valueText 是「类型无关直拷、提交无校验」,历史格式与脏数据都可能出现,故所有解析一律降级、不抛异常。
@@ -540,16 +540,15 @@ const openGeo = (geo) =&gt; { @@ -540,16 +540,15 @@ const openGeo = (geo) =&gt; {
540 // const workRecordIndex = ref(0) 540 // const workRecordIndex = ref(0)
541 // 页面加载 541 // 页面加载
542 onLoad((options) => { 542 onLoad((options) => {
543 - const {planNo, commitId ,index} = options;  
544 - console.log("load:"+index)  
545 - const workRecordIndex= Number(index) 543 + const {planNo, commitId } = options;
546 if (planNo) { 544 if (planNo) {
547 - getOrderDetail(planNo, commitId,workRecordIndex); 545 + getOrderDetail(planNo, commitId);
548 } else { 546 } else {
549 loading.value = false; 547 loading.value = false;
550 uni.showToast({title: '缺少工单ID', icon: 'none'}); 548 uni.showToast({title: '缺少工单ID', icon: 'none'});
551 } 549 }
552 }); 550 });
  551 +
553 </script> 552 </script>
554 553
555 <style scoped lang="scss"> 554 <style scoped lang="scss">
pages-sub/daily/maintain-manage/index.vue
@@ -81,7 +81,7 @@ @@ -81,7 +81,7 @@
81 <!-- </up-button>--> 81 <!-- </up-button>-->
82 <!-- </view>--> 82 <!-- </view>-->
83 83
84 - <view class="common-custom-btn" style="--btn-top: 18px;" @click="goToDetail(item)"> 84 + <view class="common-custom-btn" style="--btn-top: 48px;" @click="goToDetail(item)">
85 养护任务 85 养护任务
86 </view> 86 </view>
87 <!-- <view class="u-body-item u-flex">--> 87 <!-- <view class="u-body-item u-flex">-->
@@ -104,6 +104,12 @@ @@ -104,6 +104,12 @@
104 </view> 104 </view>
105 </view> --> 105 </view> -->
106 106
  107 + <view class="u-body-item u-flex">
  108 + <view class="u-body-item-title">业务线:</view>
  109 + <view class="u-line-1 u-body-value">{{ uni.$dict.getDictLabel('business_line', item.busiLine) || item.busiLine || '-' }}</view>
  110 +</view>
  111 +
  112 +
107 <view class="u-body-item u-flex common-item-center common-justify-between"> 113 <view class="u-body-item u-flex common-item-center common-justify-between">
108 <view class="u-body-item-title">养护级别: {{uni.$dict.getDictLabel('conserve_level', item.levelId) || '-'}}</view> 114 <view class="u-body-item-title">养护级别: {{uni.$dict.getDictLabel('conserve_level', item.levelId) || '-'}}</view>
109 115
@@ -302,14 +308,11 @@ const fetchData = async (pageNo, pageSize) =&gt; { @@ -302,14 +308,11 @@ const fetchData = async (pageNo, pageSize) =&gt; {
302 308
303 // 跳转到计划明细页面 309 // 跳转到计划明细页面
304 const goToDetail = (item) => { 310 const goToDetail = (item) => {
305 - // uni.navigateTo({  
306 - // url: `/pages-sub/daily/maintain-manage/road-detail-list?roadId=${item.roadId}&finish_state=${item.finishState || ''} &businessType=${item.busiLine}`  
307 - // })  
308 - 311 + // 存入完整对象给下一页
  312 + uni.setStorageSync('temp_maintain_item', item)
309 uni.navigateTo({ 313 uni.navigateTo({
310 - url: `/pages-sub/daily/maintain-manage/type-list?roadName=${encodeURIComponent(item.roadName)}&planTypeId=${item.planTypeId}`  
311 -})  
312 - 314 + url: `/pages-sub/daily/maintain-manage/type-list`
  315 + })
313 } 316 }
314 317
315 // 提交记录 318 // 提交记录
pages-sub/daily/maintain-manage/type-list-page.vue
@@ -48,14 +48,14 @@ @@ -48,14 +48,14 @@
48 <up-modal :show="invalidModalShow" title="提示" :closeOnClickOverlay="false" :showConfirmButton="true" 48 <up-modal :show="invalidModalShow" title="提示" :closeOnClickOverlay="false" :showConfirmButton="true"
49 :showCancelButton="true" @cancel="handleInvalidModalCancel" @confirm="confirmSetInvalid"> 49 :showCancelButton="true" @cancel="handleInvalidModalCancel" @confirm="confirmSetInvalid">
50 <view class="invalid-modal-content"> 50 <view class="invalid-modal-content">
51 - <text>确定要置为失效该任务吗?</text> 51 + <text>确定置为失效吗?</text>
52 </view> 52 </view>
53 </up-modal> 53 </up-modal>
54 <!-- ========== 结束任务二次确认弹窗 ========== --> 54 <!-- ========== 结束任务二次确认弹窗 ========== -->
55 <up-modal :show="endTaskModalShow" title="提示" :closeOnClickOverlay="false" :showConfirmButton="true" 55 <up-modal :show="endTaskModalShow" title="提示" :closeOnClickOverlay="false" :showConfirmButton="true"
56 :showCancelButton="true" @cancel="handleEndTaskModalCancel" @confirm="confirmEndTask"> 56 :showCancelButton="true" @cancel="handleEndTaskModalCancel" @confirm="confirmEndTask">
57 <view class="end-task-modal-content"> 57 <view class="end-task-modal-content">
58 - <text>确定要结束该任务吗?结束后将不可再去作业。</text> 58 + <text>确定要结束吗?</text>
59 </view> 59 </view>
60 </up-modal> 60 </up-modal>
61 </view> 61 </view>
pages-sub/daily/maintain-manage/type-list.vue
@@ -18,143 +18,41 @@ @@ -18,143 +18,41 @@
18 </template> 18 </template>
19 <script setup lang="ts"> 19 <script setup lang="ts">
20 import { ref } from 'vue' 20 import { ref } from 'vue'
21 -import { maintainPlan, maintainPlanNum } from "@/api/maintain-manage/maintain-manage";  
22 -import { getDictLabel } from '@/common/utils/dict';  
23 -import { useUserStore } from '@/pinia/user';  
24 -// 新增维护仓库  
25 -// import { useMaintainStore } from '@/pinia/maintain';  
26 -import { onLoad, onShow } from '@dcloudio/uni-app';  
27 -const userStore = useUserStore();  
28 -// const maintainStore = useMaintainStore();  
29 -// 标签列表,合并之后的数据结构  
30 -// rawList:保存该分类下全部原始数据,用于点击跳转 21 +import { onLoad, onShow, onUnload } from '@dcloudio/uni-app';
  22 +
31 const tagList = ref<Array<{ 23 const tagList = ref<Array<{
32 - label: string,  
33 - count: number,  
34 - rawList: any[],  
35 planTypeId: string | number 24 planTypeId: string | number
  25 + planTypeName: string
  26 + batchNos: string[]
  27 + todayPendingCount: number
36 }>>([]) 28 }>>([])
37 -const roadName = ref<string | null>(null)  
38 -const levelId = ref<string | null>(null)  
39 -onLoad((options) => {  
40 - roadName.value = decodeURIComponent(options.roadName)  
41 - // levelId.value = decodeURIComponent(options.levelId);  
42 -}); 29 +
43 onShow(() => { 30 onShow(() => {
44 - if (!roadName.value) { 31 + // 从storage拿上一页传过来完整对象
  32 + const item = uni.getStorageSync('temp_maintain_item')
  33 + if (!item) {
45 uni.showToast({ 34 uni.showToast({
46 - title: '道路不存在', 35 + title: '数据异常,请返回重试',
47 icon: 'none' 36 icon: 'none'
48 }); 37 });
49 return; 38 return;
50 } 39 }
51 - fetchData(); 40 + // 直接取planTypes
  41 + tagList.value = item.planTypes || []
52 }); 42 });
53 -// 第一步:获取plan列表  
54 -const fetchData = async () => {  
55 - try {  
56 - const res = await maintainPlan({  
57 - roadName: roadName.value,  
58 - // roadName: '月坛南街',  
59 - pageNo:1,  
60 - pageSize:100,  
61 - finishState:1  
62 - // levelId: levelId.value  
63 - })  
64 - console.log('maintainPlan返回', res)  
65 - if (res.list.length == 0) {  
66 - tagList.value = []  
67 - uni.showToast({  
68 - title: '暂无养护类型',  
69 - icon: 'none'  
70 - });  
71 - return  
72 - }  
73 - tagList.value = res.list[0].planTypes  
74 - // await requestBatchList(res.list)  
75 - } catch (error) {  
76 - console.error('请求失败:', error)  
77 - uni.showToast({ title: '网络异常,请重试', icon: 'none' })  
78 - }  
79 -}  
80 -// 串行遍历所有batchNo,逐个调用第二个接口  
81 -const requestBatchList = async (list: any[]) => {  
82 - const resultTags: any[] = []  
83 - for (const item of list) {  
84 - try {  
85 - const numRes = await maintainPlanNum({  
86 - pageNo: 1,  
87 - pageSize: 10,  
88 - planNo: '',  
89 - planAttr: item.planAttr ?? '',  
90 - finishState: 1,  
91 - batchNo: item.batchNo  
92 - })  
93 - const total = numRes?.total || 0  
94 - // 字典转换,把planTypeId转为养护类型名称  
95 - const typeLabel = getDictLabel('maintain_type', item.planTypeId)  
96 - resultTags.push({  
97 - label: typeLabel,  
98 - planTypeId: item.planTypeId,  
99 - count: total,  
100 - // 保留原始整条数据  
101 - originItem: item  
102 - })  
103 - } catch (err) {  
104 - console.error('batch请求异常', item.batchNo, err)  
105 - const typeLabel = getDictLabel('maintain_type', item.planTypeId)  
106 - resultTags.push({  
107 - label: typeLabel,  
108 - planTypeId: item.planTypeId,  
109 - count: 0,  
110 - originItem: item  
111 - })  
112 - }  
113 - }  
114 - console.log(resultTags)  
115 - // ========== 分组合并相同养护类型,count累加,保存原始数组 ==========  
116 - const groupMap = new Map<string, {  
117 - count: number,  
118 - rawList: any[],  
119 - planTypeId: string | number  
120 - }>()  
121 - for (const item of resultTags) {  
122 - console.log(item);  
123 - const name = item.label  
124 - if (!name) continue // 过滤字典为空的脏数据  
125 - if (groupMap.has(name)) {  
126 - const groupData = groupMap.get(name)!  
127 - groupData.count += item.count  
128 - groupData.rawList.push(item.originItem)  
129 - } else {  
130 - groupMap.set(name, {  
131 - count: item.count,  
132 - rawList: [item.originItem],  
133 - planTypeId: item.planTypeId  
134 - })  
135 - }  
136 - }  
137 - // map转为数组给页面渲染  
138 - const groupList: any[] = []  
139 - groupMap.forEach((group, label) => {  
140 - groupList.push({  
141 - label,  
142 - count: group.count,  
143 - rawList: group.rawList,  
144 - planTypeId: group.planTypeId  
145 - })  
146 - })  
147 - tagList.value = groupList  
148 - console.log(tagList.value)  
149 -}  
150 -// 标签点击跳转,rawList存入storage,并且把planTypeId拼到url传给下一页 43 +
  44 +// 标签点击跳转,batchNos存入storage,并且把planTypeId拼到url传给下一页
151 const toNextPage = (item: any) => { 45 const toNextPage = (item: any) => {
152 - // maintainStore.setRawList(item.rawList)  
153 uni.setStorageSync('temp_maintain_rawList', item.batchNos) 46 uni.setStorageSync('temp_maintain_rawList', item.batchNos)
154 uni.navigateTo({ 47 uni.navigateTo({
155 url: `/pages-sub/daily/maintain-manage/type-list-page?planTypeId=${item.planTypeId}` 48 url: `/pages-sub/daily/maintain-manage/type-list-page?planTypeId=${item.planTypeId}`
156 }) 49 })
157 } 50 }
  51 +
  52 +// 页面卸载清理缓存,防止脏数据
  53 +onUnload(()=>{
  54 + uni.removeStorageSync('temp_maintain_item')
  55 +})
158 </script> 56 </script>
159 <style scoped lang="scss"> 57 <style scoped lang="scss">
160 .tag-wrap { 58 .tag-wrap {
@@ -163,7 +61,6 @@ const toNextPage = (item: any) =&gt; { @@ -163,7 +61,6 @@ const toNextPage = (item: any) =&gt; {
163 gap: 24rpx; 61 gap: 24rpx;
164 padding: 30rpx; 62 padding: 30rpx;
165 } 63 }
166 -  
167 .tag-item { 64 .tag-item {
168 display: inline-flex; 65 display: inline-flex;
169 align-items: center; 66 align-items: center;
@@ -171,39 +68,29 @@ const toNextPage = (item: any) =&gt; { @@ -171,39 +68,29 @@ const toNextPage = (item: any) =&gt; {
171 border: 1rpx solid #94c5ff; 68 border: 1rpx solid #94c5ff;
172 border-radius: 8rpx; 69 border-radius: 8rpx;
173 padding: 16rpx 24rpx; 70 padding: 16rpx 24rpx;
174 - max-width: 320rpx; // 限制标签最大宽度,超出自动省略 71 + max-width: 320rpx;
175 transition: all 0.2s; 72 transition: all 0.2s;
176 -  
177 &--hover { 73 &--hover {
178 background: #d8eaff; 74 background: #d8eaff;
179 } 75 }
180 } 76 }
181 -  
182 .tag-text { 77 .tag-text {
183 display: flex; 78 display: flex;
184 align-items: center; 79 align-items: center;
185 flex: 1; 80 flex: 1;
186 overflow: hidden; 81 overflow: hidden;
187 } 82 }
188 -  
189 .tag-name { 83 .tag-name {
190 - // 核心:文字超长省略,只对名称生效  
191 white-space: nowrap; 84 white-space: nowrap;
192 overflow: hidden; 85 overflow: hidden;
193 text-overflow: ellipsis; 86 text-overflow: ellipsis;
194 color: #1677ff; 87 color: #1677ff;
195 font-size: 28rpx; 88 font-size: 28rpx;
196 } 89 }
197 -  
198 .tag-count { 90 .tag-count {
199 color: #1677ff; 91 color: #1677ff;
200 font-size: 28rpx; 92 font-size: 28rpx;
201 - flex-shrink: 0; // 重点!禁止压缩,保证(数字)永远显示  
202 - margin-left: 4rpx;  
203 -}  
204 -  
205 -.tag-icon {  
206 flex-shrink: 0; 93 flex-shrink: 0;
207 - margin-left: 12rpx; 94 + margin-left: 4rpx;
208 } 95 }
209 </style> 96 </style>