Commit 6cc0ab0effad7d563b2175719639ea6f8ccce4e9

Authored by 刘淇
1 parent 1d3624b0

养护任务

common/config/env.js
... ... @@ -2,10 +2,10 @@
2 2 const env = {
3 3 // 开发环境
4 4 development: {
5   - baseUrl: 'https://test.jichengshanshui.com.cn:28302',
  5 + // baseUrl: 'https://test.jichengshanshui.com.cn:28302',
6 6 // https://test.jichengshanshui.com.cn:28302
7 7  
8   - // baseUrl: 'http://192.168.1.186:48081',
  8 + baseUrl: 'http://192.168.1.111:48081',
9 9  
10 10 uploadUrl: 'https://test.jichengshanshui.com.cn:28302',
11 11 // baseApi:'admin-api',
... ...
pages-sub/daily/quick-order/add-order.vue
... ... @@ -191,11 +191,13 @@ export default {
191 191 'wy': '物业',
192 192 'zx': '秩序管理',
193 193 'hj': '环境卫生',
  194 + 'yw': '常规运维',
194 195 '园林': 'yl',
195 196 '市政': 'sz',
196 197 '物业': 'wy',
197 198 '秩序管理': 'zx',
198 199 '环境卫生': 'hj',
  200 + '常规运维' : 'yw'
199 201 },
200 202 busiLineOptions: [], // 业务线选项列表
201 203 // 问题照片列表
... ...
pages-sub/problem/regional-order-manage/add-patrol-order.vue
1 1 <template>
2 2 <view class="page-container">
3 3 <view class="work-order-form-content commonPageLRpadding">
4   - <up-form
5   - label-position="left"
6   - :model="workOrderForm"
7   - ref="workOrderFormRef"
8   - labelWidth="200rpx"
9   - >
  4 + <up-form label-position="left" :model="workOrderForm" ref="workOrderFormRef" labelWidth="200rpx">
10 5 <!-- 1. 工单位置(地图选择) -->
11   - <up-form-item
12   - label="工单位置"
13   - prop="workLocation"
14   - border-bottom
15   - required
16   - @click="chooseWorkLocation(); hideKeyboard()"
17   - >
18   - <up-input
19   - v-model="workOrderForm.workLocation"
20   - border="none"
21   - readonly
22   - suffix-icon="map-fill"
23   - placeholder="点击选择工单位置"
24   - ></up-input>
  6 + <up-form-item label="工单位置" prop="workLocation" border-bottom required
  7 + @click="chooseWorkLocation(); hideKeyboard()">
  8 + <up-input v-model="workOrderForm.workLocation" border="none" readonly suffix-icon="map-fill"
  9 + placeholder="点击选择工单位置"></up-input>
25 10 </up-form-item>
26 11  
27 12 <!-- 2. 问题类型(下拉框) -->
28   - <up-form-item
29   - label="问题类型"
30   - prop="orderName"
31   - border-bottom
32   - required
33   - @click="handleActionSheetOpen('orderName'); hideKeyboard()"
34   - >
35   - <up-input
36   - v-model="workOrderForm.orderName"
37   - disabled
38   - disabled-color="#ffffff"
39   - placeholder="请选择问题类型"
40   - border="none"
41   - ></up-input>
  13 + <up-form-item label="问题类型" prop="orderName" border-bottom required
  14 + @click="handleActionSheetOpen('orderName'); hideKeyboard()">
  15 + <up-input v-model="workOrderForm.orderName" disabled disabled-color="#ffffff" placeholder="请选择问题类型"
  16 + border="none"></up-input>
42 17 <template #right>
43 18 <up-icon name="arrow-right" size="16"></up-icon>
44 19 </template>
45 20 </up-form-item>
46 21  
47 22 <!-- 3. 情况描述(文本域) -->
48   - <up-form-item
49   - label="情况描述"
50   - prop="problemDesc"
51   - required
52   - >
53   - <up-textarea
54   - placeholder="请输入情况描述(最多200字)"
55   - v-model.trim="workOrderForm.problemDesc"
56   - count
57   - maxlength="200"
58   - rows="4"
59   - @blur="() => workOrderFormRef.validateField('problemDesc')"
60   - ></up-textarea>
  23 + <up-form-item label="情况描述" prop="problemDesc" required>
  24 + <up-textarea placeholder="请输入情况描述(最多200字)" v-model.trim="workOrderForm.problemDesc" count maxlength="200"
  25 + rows="4" @blur="() => workOrderFormRef.validateField('problemDesc')"></up-textarea>
61 26 </up-form-item>
62 27  
63 28 <!-- 4. 问题照片 -->
64 29 <up-form-item label="问题照片" prop="problemImgs" required>
65   - <up-upload
66   - :file-list="problemImgs.imgList.value||[]"
67   - @after-read="problemImgs.uploadImgs"
68   - @delete="problemImgs.deleteImg"
69   - multiple
70   - :width="70"
71   - :height="70"
72   - :max-count="problemImgs.uploadConfig.maxCount"
73   - :upload-text="problemImgs.uploadConfig.uploadText"
74   - :size-type="problemImgs.uploadConfig.sizeType"
75   - ></up-upload>
  30 + <up-upload :file-list="problemImgs.imgList.value || []" @after-read="problemImgs.uploadImgs"
  31 + @delete="problemImgs.deleteImg" multiple :width="70" :height="70"
  32 + :max-count="problemImgs.uploadConfig.maxCount" :upload-text="problemImgs.uploadConfig.uploadText"
  33 + :size-type="problemImgs.uploadConfig.sizeType"></up-upload>
76 34 </up-form-item>
77 35  
78 36 </up-form>
... ... @@ -80,21 +38,13 @@
80 38  
81 39 <!-- 底部提交按钮 -->
82 40 <view class="fixed-bottom-btn-wrap">
83   - <up-button
84   - type="primary"
85   - text="提交工单"
86   - @click="submitWorkOrder"
87   - ></up-button>
  41 + <up-button type="primary" text="提交工单" @click="submitWorkOrder"></up-button>
88 42 </view>
89 43  
90 44 <!-- 合并后的通用下拉弹窗 -->
91   - <up-action-sheet
92   - :show="showActionSheet"
93   - :actions="currentActionSheetData.list"
94   - :title="currentActionSheetData.title"
95   - @close="handleActionSheetClose"
96   - @select="handleActionSheetSelect"
97   - ></up-action-sheet>
  45 + <up-action-sheet :show="showActionSheet" :actions="currentActionSheetData.list"
  46 + :title="currentActionSheetData.title" @close="handleActionSheetClose"
  47 + @select="handleActionSheetSelect"></up-action-sheet>
98 48  
99 49 </view>
100 50 </template>
... ... @@ -103,7 +53,7 @@
103 53 import { ref, reactive } from 'vue'
104 54 import { onReady, onShow, onLoad, onBackPress } from '@dcloudio/uni-app';
105 55 import { useUploadImgs } from '@/common/utils/useUploadImgs'
106   -import { qyUniversalApproval, qyWorkorderCreate } from '@/api/regional-order-manage/regional-order-manage'
  56 +import { qyUniversalApproval, qyWorkorderCreate } from '@/api/regional-order-manage/regional-order-manage'
107 57 import { timeFormat } from '@/uni_modules/uview-plus'
108 58 import { nextStepMap } from '@/common/utils/common'
109 59 import { useUserStore } from '@/pinia/user';
... ... @@ -114,16 +64,18 @@ const userStore = useUserStore();
114 64 // ========== 业务线相关状态 ==========
115 65 // 业务线映射表
116 66 const busiLineMap = ref({
117   - 'yl': '园林',
118   - 'sz': '市政',
119   - 'wy': '物业',
120   - 'zx': '秩序管理',
121   - 'hj': '环境卫生',
122   - '园林': 'yl',
123   - '市政': 'sz',
124   - '物业': 'wy',
125   - '秩序管理': 'zx',
126   - '环境卫生': 'hj',
  67 + 'yl': '园林',
  68 + 'sz': '市政',
  69 + 'wy': '物业',
  70 + 'zx': '秩序管理',
  71 + 'hj': '环境卫生',
  72 + 'yw': '常规运维',
  73 + '园林': 'yl',
  74 + '市政': 'sz',
  75 + '物业': 'wy',
  76 + '秩序管理': 'zx',
  77 + '环境卫生': 'hj',
  78 + '常规运维': 'yw'
127 79 });
128 80  
129 81 // 业务线选项列表
... ... @@ -360,7 +312,7 @@ const submitWorkOrder = async () =&gt; {
360 312 taskId: renewOrderData.value.taskId,
361 313 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '',
362 314 agree: 0,
363   - reason: workOrderForm.problemDesc.trim(),
  315 + reason: workOrderForm.problemDesc.trim(),
364 316 ...commonSubmitData
365 317 }
366 318 if (userStore.userInfo?.roles.includes('patrol_global')) { // 全域巡查员
... ... @@ -407,6 +359,4 @@ const submitWorkOrder = async () =&gt; {
407 359 .work-order-form-content {
408 360 background: #fff;
409 361 }
410   -
411   -
412 362 </style>
413 363 \ No newline at end of file
... ...
pages-sub/problem/regional-order-manage/distribution-order.vue
1 1 <template>
2 2 <view class="page-container">
3 3 <view class="work-order-form-content commonPageLRpadding">
4   - <up-form
5   - label-position="left"
6   - :model="workOrderForm"
7   - ref="workOrderFormRef"
8   - labelWidth="200rpx"
9   - >
  4 + <up-form label-position="left" :model="workOrderForm" ref="workOrderFormRef" labelWidth="200rpx">
10 5 <!-- 1. 工单位置(地图选择)【赋值回显 + 完全禁止修改】 -->
11   - <up-form-item
12   - label="工单位置"
13   - prop="workLocation"
14   - border-bottom
15   - required
16   - >
17   - <up-input
18   - v-model="workOrderForm.workLocation"
19   - border="none"
20   - disabled
21   -
22   - placeholder="暂无工单位置"
23   - ></up-input>
  6 + <up-form-item label="工单位置" prop="workLocation" border-bottom required>
  7 + <up-input v-model="workOrderForm.workLocation" border="none" disabled placeholder="暂无工单位置"></up-input>
24 8 </up-form-item>
25 9  
26 10 <!-- 2. 问题类型(下拉框)【赋值回显 + 完全禁止修改】 -->
27   - <up-form-item
28   - label="问题类型"
29   - prop="orderName"
30   - border-bottom
31   - required
32   - >
33   - <up-input
34   - v-model="workOrderForm.orderName"
35   - disabled
36   -
37   - placeholder="暂无问题类型"
38   - border="none"
39   - ></up-input>
  11 + <up-form-item label="问题类型" prop="orderName" border-bottom required>
  12 + <up-input v-model="workOrderForm.orderName" disabled placeholder="暂无问题类型" border="none"></up-input>
40 13 </up-form-item>
41 14  
42 15 <!-- 3. 情况描述(文本域)【赋值回显 + 完全禁止修改】 -->
43   - <up-form-item
44   - label="情况描述"
45   - prop="problemDesc"
46   - required
47   - >
48   - <up-textarea
49   - v-model.trim="workOrderForm.problemDesc"
50   - count
51   - maxlength="200"
52   - rows="4"
53   - disabled
54   - disabled-color="#333333"
55   - placeholder="暂无情况描述"
56   - ></up-textarea>
  16 + <up-form-item label="情况描述" prop="problemDesc" required>
  17 + <up-textarea v-model.trim="workOrderForm.problemDesc" count maxlength="200" rows="4" disabled
  18 + disabled-color="#333333" placeholder="暂无情况描述"></up-textarea>
57 19 </up-form-item>
58 20  
59 21 <!-- 4. 问题照片【赋值回显 + 完全禁止修改/删除/新增】 -->
60 22 <up-form-item label="问题照片" prop="problemImgs" required>
61   - <up-upload
62   - :file-list="problemImgs.imgList.value||[]"
63   - disabled
64   - multiple
65   - :width="70"
66   - :height="70"
67   - :max-count="problemImgs.uploadConfig.maxCount"
68   - :upload-text="problemImgs.uploadConfig.uploadText"
69   - :size-type="problemImgs.uploadConfig.sizeType"
70   - ></up-upload>
  23 + <up-upload :file-list="problemImgs.imgList.value || []" disabled multiple :width="70" :height="70"
  24 + :max-count="problemImgs.uploadConfig.maxCount" :upload-text="problemImgs.uploadConfig.uploadText"
  25 + :size-type="problemImgs.uploadConfig.sizeType"></up-upload>
71 26 </up-form-item>
72 27  
73 28 <!-- 派单情况分组(放在问题照片下方,增加间距) -->
... ... @@ -75,61 +30,28 @@
75 30 <view class="dispatch-title">派单情况</view>
76 31  
77 32 <!-- 业务线单选框 -->
78   - <up-form-item
79   - label="业务线"
80   - prop="busiLineCn"
81   - border-bottom
82   - required
83   - >
84   - <up-radio-group
85   - v-model="workOrderForm.busiLineCn"
86   - placement="row"
87   - @change="handleBusiLineChange"
88   - >
89   - <up-radio
90   - v-for="item in busiLineOptions"
91   - :key="item.name"
92   - :label="item.name"
93   - :name="item.name"
94   - ></up-radio>
  33 + <up-form-item label="业务线" prop="busiLineCn" border-bottom required>
  34 + <up-radio-group v-model="workOrderForm.busiLineCn" placement="row" @change="handleBusiLineChange">
  35 + <up-radio v-for="item in busiLineOptions" :key="item.name" :label="item.name"
  36 + :name="item.name"></up-radio>
95 37 </up-radio-group>
96 38 </up-form-item>
97 39  
98 40 <!-- 道路名称(下拉框) -->
99   - <up-form-item
100   - label="道路名称"
101   - prop="roadName"
102   - border-bottom
103   - required
104   - @click="handleActionSheetOpen('roadName'); hideKeyboard()"
105   - >
106   - <up-input
107   - v-model="workOrderForm.roadName"
108   - readonly
109   - disabled-color="#ffffff"
110   - placeholder="请先选择工单位置"
111   - border="none"
112   - ></up-input>
  41 + <up-form-item label="道路名称" prop="roadName" border-bottom required
  42 + @click="handleActionSheetOpen('roadName'); hideKeyboard()">
  43 + <up-input v-model="workOrderForm.roadName" readonly disabled-color="#ffffff" placeholder="请先选择工单位置"
  44 + border="none"></up-input>
113 45 <template #right>
114   - <up-icon name="arrow-right" size="16" ></up-icon>
  46 + <up-icon name="arrow-right" size="16"></up-icon>
115 47 </template>
116 48 </up-form-item>
117 49  
118 50 <!-- 紧急程度选择 -->
119   - <up-form-item
120   - label="紧急程度"
121   - prop="pressingTypeName"
122   - border-bottom
123   - required
124   - @click="handleActionSheetOpen('pressingType'); hideKeyboard()"
125   - >
126   - <up-input
127   - v-model="workOrderForm.pressingTypeName"
128   - disabled
129   - disabled-color="#ffffff"
130   - placeholder="请选择紧急程度"
131   - border="none"
132   - ></up-input>
  51 + <up-form-item label="紧急程度" prop="pressingTypeName" border-bottom required
  52 + @click="handleActionSheetOpen('pressingType'); hideKeyboard()">
  53 + <up-input v-model="workOrderForm.pressingTypeName" disabled disabled-color="#ffffff" placeholder="请选择紧急程度"
  54 + border="none"></up-input>
133 55 <template #right>
134 56 <up-icon name="arrow-right" size="16"></up-icon>
135 57 </template>
... ... @@ -137,24 +59,11 @@
137 59 </view>
138 60  
139 61 <!-- 5. 完成时间 -->
140   - <up-form-item
141   - label="希望完成时间"
142   - prop="expectedFinishDate"
143   - @click="show=true;hideKeyboard()"
144   - >
145   - <up-input
146   - v-model="workOrderForm.expectedFinishDate"
147   - border="none"
148   - readonly
149   - placeholder="点击选择时间"
150   - ></up-input>
  62 + <up-form-item label="希望完成时间" prop="expectedFinishDate" @click="show = true; hideKeyboard()">
  63 + <up-input v-model="workOrderForm.expectedFinishDate" border="none" readonly placeholder="点击选择时间"></up-input>
151 64 <template #right>
152 65 <view v-if="workOrderForm.expectedFinishDate" @click.stop>
153   - <up-icon
154   - name="close"
155   - size="16"
156   - @click.stop="clearExpectedFinishDate"
157   - ></up-icon>
  66 + <up-icon name="close" size="16" @click.stop="clearExpectedFinishDate"></up-icon>
158 67 </view>
159 68 <up-icon name="arrow-right" size="16" v-else></up-icon>
160 69 </template>
... ... @@ -164,31 +73,17 @@
164 73  
165 74 <!-- 底部提交按钮 -->
166 75 <view class="fixed-bottom-btn-wrap">
167   - <up-button
168   - type="primary"
169   - text="提交工单"
170   - @click="submitWorkOrder"
171   - ></up-button>
  76 + <up-button type="primary" text="提交工单" @click="submitWorkOrder"></up-button>
172 77 </view>
173 78  
174 79 <!-- 合并后的通用下拉弹窗 -->
175   - <up-action-sheet
176   - :show="showActionSheet"
177   - :actions="currentActionSheetData.list"
178   - :title="currentActionSheetData.title"
179   - @close="handleActionSheetClose"
180   - @select="handleActionSheetSelect"
181   - ></up-action-sheet>
  80 + <up-action-sheet :show="showActionSheet" :actions="currentActionSheetData.list"
  81 + :title="currentActionSheetData.title" @close="handleActionSheetClose"
  82 + @select="handleActionSheetSelect"></up-action-sheet>
182 83  
183 84 <!-- 完成时间选择器 -->
184   - <up-datetime-picker
185   - :show="show"
186   - v-model="expectedFinishDate"
187   - mode="datetime"
188   - :min-date="new Date()"
189   - @cancel="show = false"
190   - @confirm="expectedFinishDateConfirm"
191   - ></up-datetime-picker>
  85 + <up-datetime-picker :show="show" v-model="expectedFinishDate" mode="datetime" :min-date="new Date()"
  86 + @cancel="show = false" @confirm="expectedFinishDateConfirm"></up-datetime-picker>
192 87 </view>
193 88 </template>
194 89  
... ... @@ -197,7 +92,7 @@ import { ref, reactive } from &#39;vue&#39;
197 92 import { onReady, onShow, onLoad, onBackPress } from '@dcloudio/uni-app';
198 93 import { useUploadImgs } from '@/common/utils/useUploadImgs'
199 94 import { getRoadListByLatLng } from '@/api/common'
200   -import { daquUniversalApproval, daquWorkorderCreate, qyUniversalApproval } from '@/api/regional-order-manage/regional-order-manage'
  95 +import { daquUniversalApproval, daquWorkorderCreate, qyUniversalApproval } from '@/api/regional-order-manage/regional-order-manage'
201 96 import { timeFormat } from '@/uni_modules/uview-plus'
202 97 import { nextStepMap } from '@/common/utils/common'
203 98 import { useUserStore } from '@/pinia/user';
... ... @@ -209,15 +104,17 @@ const userStore = useUserStore();
209 104 // 业务线映射表
210 105 const busiLineMap = ref({
211 106 'yl': '园林',
212   - 'sz': '市政',
213   - 'wy': '物业',
214   - 'zx': '秩序管理',
215   - 'hj': '环境卫生',
216   - '园林': 'yl',
217   - '市政': 'sz',
218   - '物业': 'wy',
219   - '秩序管理': 'zx',
220   - '环境卫生': 'hj',
  107 + 'sz': '市政',
  108 + 'wy': '物业',
  109 + 'zx': '秩序管理',
  110 + 'hj': '环境卫生',
  111 + 'yw': '常规运维',
  112 + '园林': 'yl',
  113 + '市政': 'sz',
  114 + '物业': 'wy',
  115 + '秩序管理': 'zx',
  116 + '环境卫生': 'hj',
  117 + '常规运维': 'yw'
221 118 });
222 119  
223 120 // 业务线选项列表
... ... @@ -386,7 +283,7 @@ const echoOrderData = (orderItem) =&gt; {
386 283 workOrderForm.problemDesc = orderItem.remark || '';
387 284 workOrderForm.lat = orderItem.lat || 0;
388 285 workOrderForm.lon = orderItem.lon || 0;
389   - workOrderForm.expectedFinishDate = orderItem.expectedFinishDate? timeFormat(orderItem.expectedFinishDate, 'yyyy-mm-dd hh:MM:ss'):'' ;
  286 + workOrderForm.expectedFinishDate = orderItem.expectedFinishDate ? timeFormat(orderItem.expectedFinishDate, 'yyyy-mm-dd hh:MM:ss') : '';
390 287  
391 288 // 回显图片【核心:问题照片赋值】
392 289 if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) {
... ... @@ -518,12 +415,12 @@ const navigateBack = () =&gt; {
518 415 }
519 416  
520 417 // 清除希望完成时间
521   -const clearExpectedFinishDate = ()=> {
  418 +const clearExpectedFinishDate = () => {
522 419 workOrderForm.expectedFinishDate = ''
523 420 }
524 421  
525 422 // 【注释无用方法:原选择工单位置方法,因为禁止修改,不需要点击触发】
526   -const chooseWorkLocation = () => {}
  423 +const chooseWorkLocation = () => { }
527 424  
528 425 // 完成时间确认
529 426 const expectedFinishDateConfirm = (e) => {
... ... @@ -558,7 +455,7 @@ const submitWorkOrder = async () =&gt; {
558 455 lonLatAddress: workOrderForm.workLocation,
559 456 pressingType: workOrderForm.pressingType,
560 457 orderName: workOrderForm.orderName,
561   - expectedFinishDate: workOrderForm.expectedFinishDate==""?"":new Date(workOrderForm.expectedFinishDate).getTime(),
  458 + expectedFinishDate: workOrderForm.expectedFinishDate == "" ? "" : new Date(workOrderForm.expectedFinishDate).getTime(),
562 459 sourceId: 1,
563 460 sourceName: workOrderForm.busiLineCn,
564 461 busiLine: busiLineEn,
... ... @@ -568,7 +465,7 @@ const submitWorkOrder = async () =&gt; {
568 465 taskId: renewOrderData.value.taskId,
569 466 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypePass || '',
570 467 agree: 0,
571   - reason: workOrderForm.problemDesc.trim(),
  468 + reason: workOrderForm.problemDesc.trim(),
572 469 }
573 470  
574 471 uni.showLoading({ title: '提交中...' })
... ... @@ -581,7 +478,7 @@ const submitWorkOrder = async () =&gt; {
581 478 taskId: renewOrderData.value.taskId,
582 479 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '',
583 480 agree: 0,
584   - reason: workOrderForm.problemDesc.trim(),
  481 + reason: workOrderForm.problemDesc.trim(),
585 482 ...commonSubmitData
586 483 }
587 484 res = await qyUniversalApproval(renewSubmitData)
... ... @@ -637,7 +534,7 @@ const submitWorkOrder = async () =&gt; {
637 534 .dispatch-title {
638 535 font-size: 32rpx;
639 536 font-weight: 600;
640   - color:$u-primary;
  537 + color: $u-primary;
641 538 margin-bottom: 20rpx;
642 539 padding-left: 10rpx;
643 540 }
... ...
pages-sub/problem/work-order-manage/add-order.vue
1 1 <template>
2 2 <view class="page-container">
3 3 <view class="work-order-form-content commonPageLRpadding">
4   - <up-form
5   - label-position="left"
6   - :model="workOrderForm"
7   - ref="workOrderFormRef"
8   - labelWidth="200rpx"
9   - >
  4 + <up-form label-position="left" :model="workOrderForm" ref="workOrderFormRef" labelWidth="200rpx">
10 5 <!-- 业务线单选框:移入form内,作为第一个表单项(核心调整) -->
11   - <up-form-item
12   - label="业务线"
13   - prop="busiLineCn"
14   - border-bottom
15   - required
16   - >
17   - <up-radio-group
18   - v-model="workOrderForm.busiLineCn"
19   - placement="row"
20   - @change="handleBusiLineChange"
21   - >
22   - <up-radio
23   -
24   - v-for="item in busiLineOptions"
25   - :key="item.name"
26   - :label="item.name"
27   - :name="item.name"
28   - ></up-radio>
29   - </up-radio-group>
  6 + <up-form-item label="业务线" prop="busiLineCn" border-bottom required>
  7 + <up-radio-group v-model="workOrderForm.busiLineCn" placement="row" @change="handleBusiLineChange">
  8 + <up-radio v-for="item in busiLineOptions" :key="item.name" :label="item.name" :name="item.name"></up-radio>
  9 + </up-radio-group>
30 10  
31 11 </up-form-item>
32 12  
33 13 <!-- 1. 工单位置(地图选择) -->
34   - <up-form-item
35   - label="工单位置"
36   - prop="workLocation"
37   - border-bottom
38   - required
39   - @click="chooseWorkLocation(); hideKeyboard()"
40   - >
41   - <up-input
42   - v-model="workOrderForm.workLocation"
43   - border="none"
44   - readonly
45   - suffix-icon="map-fill"
46   - placeholder="点击选择工单位置"
47   - ></up-input>
  14 + <up-form-item label="工单位置" prop="workLocation" border-bottom required
  15 + @click="chooseWorkLocation(); hideKeyboard()">
  16 + <up-input v-model="workOrderForm.workLocation" border="none" readonly suffix-icon="map-fill"
  17 + placeholder="点击选择工单位置"></up-input>
48 18 </up-form-item>
49 19  
50 20 <!-- 2. 道路名称(下拉框) -->
51   - <up-form-item
52   - label="道路名称"
53   - prop="roadName"
54   - border-bottom
55   - required
56   - @click="handleActionSheetOpen('roadName'); hideKeyboard()"
57   - >
58   - <up-input
59   - v-model="workOrderForm.roadName"
60   - readonly
61   - disabled-color="#ffffff"
62   - placeholder="请先选择工单位置"
63   - border="none"
64   - ></up-input>
  21 + <up-form-item label="道路名称" prop="roadName" border-bottom required
  22 + @click="handleActionSheetOpen('roadName'); hideKeyboard()">
  23 + <up-input v-model="workOrderForm.roadName" readonly disabled-color="#ffffff" placeholder="请先选择工单位置"
  24 + border="none"></up-input>
65 25 <template #right>
66   - <up-icon name="arrow-right" size="16" ></up-icon>
  26 + <up-icon name="arrow-right" size="16"></up-icon>
67 27 </template>
68 28 </up-form-item>
69 29  
70 30 <!-- 3. 问题类型(下拉框) -->
71   - <up-form-item
72   - label="问题类型"
73   - prop="orderName"
74   - border-bottom
75   - required
76   - @click="handleActionSheetOpen('orderName'); hideKeyboard()"
77   - >
78   - <up-input
79   - v-model="workOrderForm.orderName"
80   - disabled
81   - disabled-color="#ffffff"
82   - placeholder="请选择问题类型"
83   - border="none"
84   - ></up-input>
  31 + <up-form-item label="问题类型" prop="orderName" border-bottom required
  32 + @click="handleActionSheetOpen('orderName'); hideKeyboard()">
  33 + <up-input v-model="workOrderForm.orderName" disabled disabled-color="#ffffff" placeholder="请选择问题类型"
  34 + border="none"></up-input>
85 35 <template #right>
86 36 <up-icon name="arrow-right" size="16"></up-icon>
87 37 </template>
88 38 </up-form-item>
89 39  
90 40 <!-- 新增:紧急程度选择 -->
91   - <up-form-item
92   - label="紧急程度"
93   - prop="pressingTypeName"
94   - border-bottom
95   - required
96   - @click="handleActionSheetOpen('pressingType'); hideKeyboard()"
97   - >
98   - <up-input
99   - v-model="workOrderForm.pressingTypeName"
100   - disabled
101   - disabled-color="#ffffff"
102   - placeholder="请选择紧急程度"
103   - border="none"
104   - ></up-input>
  41 + <up-form-item label="紧急程度" prop="pressingTypeName" border-bottom required
  42 + @click="handleActionSheetOpen('pressingType'); hideKeyboard()">
  43 + <up-input v-model="workOrderForm.pressingTypeName" disabled disabled-color="#ffffff" placeholder="请选择紧急程度"
  44 + border="none"></up-input>
105 45 <template #right>
106 46 <up-icon name="arrow-right" size="16"></up-icon>
107 47 </template>
108 48 </up-form-item>
109 49  
110 50 <!-- 4. 情况描述(文本域) -->
111   - <up-form-item
112   - label="情况描述"
113   - prop="problemDesc"
114   - required
115   - >
116   - <up-textarea
117   - placeholder="请输入情况描述(最多200字)"
118   - v-model.trim="workOrderForm.problemDesc"
119   - count
120   - maxlength="200"
121   - rows="4"
122   - @blur="() => workOrderFormRef.validateField('problemDesc')"
123   - ></up-textarea>
  51 + <up-form-item label="情况描述" prop="problemDesc" required>
  52 + <up-textarea placeholder="请输入情况描述(最多200字)" v-model.trim="workOrderForm.problemDesc" count maxlength="200"
  53 + rows="4" @blur="() => workOrderFormRef.validateField('problemDesc')"></up-textarea>
124 54 </up-form-item>
125 55  
126 56 <!-- 问题照片(核心修复:绑定纯数组) -->
127 57 <up-form-item label="问题照片" prop="problemImgs" border-bottom required>
128   - <up-upload
129   - :file-list="problemImgs.imgList.value||[]"
130   - @after-read="problemImgs.uploadImgs"
131   - @delete="problemImgs.deleteImg"
132   - multiple
133   - :width="70"
134   - :height="70"
135   - :max-count="problemImgs.uploadConfig.maxCount"
136   - :upload-text="problemImgs.uploadConfig.uploadText"
137   - :size-type="problemImgs.uploadConfig.sizeType"
138   - ></up-upload>
  58 + <up-upload :file-list="problemImgs.imgList.value || []" @after-read="problemImgs.uploadImgs"
  59 + @delete="problemImgs.deleteImg" multiple :width="70" :height="70"
  60 + :max-count="problemImgs.uploadConfig.maxCount" :upload-text="problemImgs.uploadConfig.uploadText"
  61 + :size-type="problemImgs.uploadConfig.sizeType"></up-upload>
139 62 </up-form-item>
140 63  
141 64 <!-- 完成时间 -->
142   - <up-form-item
143   - label="希望完成时间"
144   - prop="expectedFinishDate"
145   - @click="show=true;hideKeyboard()"
146   - >
147   - <up-input
148   - v-model="workOrderForm.expectedFinishDate"
149   - border="none"
150   - readonly
151   - placeholder="点击选择时间"
152   - ></up-input>
  65 + <up-form-item label="希望完成时间" prop="expectedFinishDate" @click="show = true; hideKeyboard()">
  66 + <up-input v-model="workOrderForm.expectedFinishDate" border="none" readonly placeholder="点击选择时间"></up-input>
153 67 <template #right>
154 68 <!-- 核心修复:用view包裹图标,添加双重@click.stop -->
155 69 <view v-if="workOrderForm.expectedFinishDate" @click.stop>
156   - <up-icon
157   - name="close"
158   - size="20"
159   - @click.stop="clearExpectedFinishDate"
160   - ></up-icon>
  70 + <up-icon name="close" size="20" @click.stop="clearExpectedFinishDate"></up-icon>
161 71 </view>
162 72 <up-icon name="arrow-right" size="16" v-else></up-icon>
163 73 </template>
... ... @@ -167,31 +77,17 @@
167 77  
168 78 <!-- 底部提交按钮 -->
169 79 <view class="fixed-bottom-btn-wrap">
170   - <up-button
171   - type="primary"
172   - text="提交工单"
173   - @click="submitWorkOrder"
174   - ></up-button>
  80 + <up-button type="primary" text="提交工单" @click="submitWorkOrder"></up-button>
175 81 </view>
176 82  
177 83 <!-- 合并后的通用下拉弹窗 -->
178   - <up-action-sheet
179   - :show="showActionSheet"
180   - :actions="currentActionSheetData.list"
181   - :title="currentActionSheetData.title"
182   - @close="handleActionSheetClose"
183   - @select="handleActionSheetSelect"
184   - ></up-action-sheet>
  84 + <up-action-sheet :show="showActionSheet" :actions="currentActionSheetData.list"
  85 + :title="currentActionSheetData.title" @close="handleActionSheetClose"
  86 + @select="handleActionSheetSelect"></up-action-sheet>
185 87  
186 88 <!-- 完成时间选择器 -->
187   - <up-datetime-picker
188   - :show="show"
189   - v-model="expectedFinishDate"
190   - mode="datetime"
191   - :min-date="new Date()"
192   - @cancel="show = false"
193   - @confirm="expectedFinishDateConfirm"
194   - ></up-datetime-picker>
  89 + <up-datetime-picker :show="show" v-model="expectedFinishDate" mode="datetime" :min-date="new Date()"
  90 + @cancel="show = false" @confirm="expectedFinishDateConfirm"></up-datetime-picker>
195 91 </view>
196 92 </template>
197 93  
... ... @@ -212,15 +108,17 @@ const userStore = useUserStore();
212 108 // 业务线映射表(键:英文标识,值:中文名称;新增反向映射:中文->英文)
213 109 const busiLineMap = ref({
214 110 'yl': '园林',
215   - 'sz': '市政',
216   - 'wy': '物业',
217   - 'zx': '秩序管理',
218   - 'hj': '环境卫生',
219   - '园林': 'yl',
220   - '市政': 'sz',
221   - '物业': 'wy',
222   - '秩序管理': 'zx',
223   - '环境卫生': 'hj',
  111 + 'sz': '市政',
  112 + 'wy': '物业',
  113 + 'zx': '秩序管理',
  114 + 'hj': '环境卫生',
  115 + 'yw': '常规运维',
  116 + '园林': 'yl',
  117 + '市政': 'sz',
  118 + '物业': 'wy',
  119 + '秩序管理': 'zx',
  120 + '环境卫生': 'hj',
  121 + '常规运维': 'yw'
224 122 });
225 123  
226 124 // 业务线选项列表(仅保留name字段=中文名称,适配单选框配置)
... ... @@ -405,7 +303,7 @@ const echoOrderData = (orderItem) =&gt; {
405 303 workOrderForm.problemDesc = orderItem.remark || '';
406 304 workOrderForm.lat = orderItem.lat || 0;
407 305 workOrderForm.lon = orderItem.lon || 0;
408   - workOrderForm.expectedFinishDate = orderItem.expectedFinishDate?timeFormat(orderItem.expectedFinishDate, 'yyyy-mm-dd hh:MM:ss') :'';
  306 + workOrderForm.expectedFinishDate = orderItem.expectedFinishDate ? timeFormat(orderItem.expectedFinishDate, 'yyyy-mm-dd hh:MM:ss') : '';
409 307  
410 308 // 3. 上传图片回显(兼容useUploadImgs格式)
411 309 if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) {
... ... @@ -566,7 +464,7 @@ const navigateBack = () =&gt; {
566 464 }
567 465  
568 466 // 新增:清除希望完成时间的方法
569   -const clearExpectedFinishDate = ()=> {
  467 +const clearExpectedFinishDate = () => {
570 468 workOrderForm.expectedFinishDate = ''
571 469 // 清除后触发一次字段校验,确保校验状态更新
572 470 // this.$refs.inspectFormRef.validateField('expectedFinishDate')
... ... @@ -629,7 +527,7 @@ const submitWorkOrder = async () =&gt; {
629 527 uni.showToast({ title: '业务线选择异常,请重新选择', icon: 'none' });
630 528 return;
631 529 }
632   - console.log('完成时间:'+workOrderForm.expectedFinishDate)
  530 + console.log('完成时间:' + workOrderForm.expectedFinishDate)
633 531 // 构建公共提交数据
634 532 const commonSubmitData = {
635 533 roadId: workOrderForm.roadId,
... ... @@ -642,13 +540,13 @@ const submitWorkOrder = async () =&gt; {
642 540 lonLatAddress: workOrderForm.workLocation,
643 541 pressingType: workOrderForm.pressingType,
644 542 orderName: workOrderForm.orderName,
645   - expectedFinishDate:workOrderForm.expectedFinishDate=="" ?"": new Date(workOrderForm.expectedFinishDate).getTime(),
  543 + expectedFinishDate: workOrderForm.expectedFinishDate == "" ? "" : new Date(workOrderForm.expectedFinishDate).getTime(),
646 544 sourceId: 1,
647 545 sourceName: workOrderForm.busiLineCn, // 从form字段获取业务线中文名称
648 546 busiLine: busiLineEn // 传递英文标识(yl/sz/wy),接口正常使用
649 547 }
650 548 console.log('工单数据')
651   - console.log('完成时间:'+workOrderForm.expectedFinishDate)
  549 + console.log('完成时间:' + workOrderForm.expectedFinishDate)
652 550 console.log(commonSubmitData)
653 551 // 显示加载中
654 552 uni.showLoading({ title: '提交中...' })
... ... @@ -717,5 +615,4 @@ const submitWorkOrder = async () =&gt; {
717 615 .work-order-form-content {
718 616 background: #fff;
719 617 }
720   -
721 618 </style>
722 619 \ No newline at end of file
... ...
pages/index/index.vue
... ... @@ -56,9 +56,9 @@
56 56  
57 57  
58 58 <!-- 动态组信息文案 -->
59   - <view class="tip-top" style="padding: 8px 0 0 70px;">
  59 + <!-- <view class="tip-top" style="padding: 8px 0 0 70px;">
60 60 <text>{{ tipText }}</text>
61   - </view>
  61 + </view> -->
62 62  
63 63 <!-- 顶部进度提示栏 -->
64 64 <view v-if="showTipHeader" class="tip-header">
... ... @@ -97,7 +97,7 @@
97 97 <template v-else>
98 98 <text>{{ item.distance }}m ·</text>
99 99 <up-icon name="star-fill" color="#ffd21d" size="20"></up-icon>
100   - <text>历史完成率{{ item.efficiencyPercent }}%</text>
  100 + <text>历史完成率{{ item.historyCompletionRate }}%</text>
101 101 </template>
102 102 </view>
103 103 </view>
... ... @@ -124,28 +124,58 @@ import {
124 124 const userStore = useUserStore();
125 125 const deptId = computed(() => String(userStore.userInfo?.user?.deptId ?? ''));
126 126  
127   -// ====================== 只需要在这里统一维护分组配置 ======================
  127 +// ====================== 分组配置(多部门归属同一组) ======================
128 128 type GroupItem = {
129   - deptId: string;
  129 + deptIds: string[]; // 多个部门ID数组
130 130 label: string;
131 131 showTipHeader: boolean; // 是否展示顶部进度条
132 132 useWalkText: boolean; // 是否展示步行距离文案
133 133 };
134 134 const groupConfig: GroupItem[] = [
135   - { deptId: '364', label: '[组2 A1B2 纯效率·有提醒]', showTipHeader: true, useWalkText: true },
136   - { deptId: '337', label: '[组3 A2B1 个性化·无提醒]', showTipHeader: false, useWalkText: false },
137   - { deptId: '338', label: '[组4 A2B2 个性化·有提醒]', showTipHeader: true, useWalkText: false },
  135 + // 组2 A1B2 纯效率·有提醒
  136 + {
  137 + deptIds: ['361', '363', '279', '277', '270'],
  138 + label: '[组2 A1B2 纯效率·有提醒]',
  139 + showTipHeader: true,
  140 + useWalkText: true
  141 + },
  142 + // 组3 A2B1 个性化·无提醒
  143 + {
  144 + deptIds: ['252', '273', '274', '337', '359', '360'],
  145 + label: '[组3 A2B1 个性化·无提醒]',
  146 + showTipHeader: false,
  147 + useWalkText: false
  148 + },
  149 + // 组4 A2B2 个性化·有提醒
  150 + {
  151 + deptIds: ['281', '272', '271', '338', '280'],
  152 + label: '[组4 A2B2 个性化·有提醒]',
  153 + showTipHeader: true,
  154 + useWalkText: false
  155 + },
138 156 ];
139   -// 默认组1配置
140   -const defaultGroup: GroupItem = { deptId: '', label: '[组1 A1B1 纯效率·无提醒]', showTipHeader: false, useWalkText: true };
  157 +// 默认组1:未匹配到的所有部门
  158 +const defaultGroup: GroupItem = {
  159 + deptIds: [],
  160 + label: '[组1 A1B1 纯效率·无提醒]',
  161 + showTipHeader: false,
  162 + useWalkText: true
  163 +};
141 164  
142   -// 获取当前部门配置对象
  165 +// 获取当前部门所属分组
143 166 const currentGroup = computed(() => {
144   - const target = groupConfig.find(item => item.deptId === deptId.value);
145   - return target ?? defaultGroup;
  167 + const targetDept = deptId.value;
  168 + // 遍历匹配部门ID
  169 + for (const group of groupConfig) {
  170 + if (group.deptIds.includes(targetDept)) {
  171 + return group;
  172 + }
  173 + }
  174 + // 无匹配返回默认组1
  175 + return defaultGroup;
146 176 });
147 177  
148   -// 下面全部自动读取配置,无需写if/switch
  178 +// 自动读取分组配置,无需修改其他业务代码
149 179 const tipText = computed(() => currentGroup.value.label);
150 180 const showTipHeader = computed(() => currentGroup.value.showTipHeader);
151 181 const isWalkTextMode = computed(() => currentGroup.value.useWalkText);
... ... @@ -308,6 +338,8 @@ const getCurrentLocation = (): Promise&lt;{ lon: string; lat: string }&gt; =&gt; {
308 338 uni.getLocation({
309 339 type: 'gcj02',
310 340 success: (loc) => {
  341 + console.log(loc.longitude)
  342 + console.log(loc.latitude)
311 343 resolve({
312 344 lon: loc.longitude.toFixed(6),
313 345 lat: loc.latitude.toFixed(6)
... ... @@ -337,6 +369,8 @@ const getCurrentLocation = (): Promise&lt;{ lon: string; lat: string }&gt; =&gt; {
337 369 uni.getLocation({
338 370 type: 'gcj02',
339 371 success: (loc) => {
  372 + console.log(loc.longitude)
  373 + console.log(loc.latitude)
340 374 resolve({
341 375 lon: loc.longitude.toFixed(6),
342 376 lat: loc.latitude.toFixed(6)
... ... @@ -694,14 +728,16 @@ $border-color: #e5e5e5;
694 728 .task-item__name {
695 729 width: 60px;
696 730 }
697   - .task-name-text {
698   - flex: 1;
699   - font-size: 14px;
700   - color: $text-color;
701   - overflow: hidden;
702   - white-space: nowrap;
703   - text-overflow: ellipsis;
704   - }
  731 + .task-name-text {
  732 + flex: 1;
  733 + font-size: 14px;
  734 + color: $text-color;
  735 + display: -webkit-box;
  736 + -webkit-line-clamp: 2;
  737 + -webkit-box-orient: vertical;
  738 + overflow: hidden;
  739 + text-overflow: ellipsis;
  740 +}
705 741 &__name {
706 742 font-size: 15px;
707 743 color: $text-color;
... ...