Commit 6cc0ab0effad7d563b2175719639ea6f8ccce4e9

Authored by 刘淇
1 parent 1d3624b0

养护任务

common/config/env.js
@@ -2,10 +2,10 @@ @@ -2,10 +2,10 @@
2 const env = { 2 const env = {
3 // 开发环境 3 // 开发环境
4 development: { 4 development: {
5 - baseUrl: 'https://test.jichengshanshui.com.cn:28302', 5 + // baseUrl: 'https://test.jichengshanshui.com.cn:28302',
6 // https://test.jichengshanshui.com.cn:28302 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 uploadUrl: 'https://test.jichengshanshui.com.cn:28302', 10 uploadUrl: 'https://test.jichengshanshui.com.cn:28302',
11 // baseApi:'admin-api', 11 // baseApi:'admin-api',
pages-sub/daily/quick-order/add-order.vue
@@ -191,11 +191,13 @@ export default { @@ -191,11 +191,13 @@ export default {
191 'wy': '物业', 191 'wy': '物业',
192 'zx': '秩序管理', 192 'zx': '秩序管理',
193 'hj': '环境卫生', 193 'hj': '环境卫生',
  194 + 'yw': '常规运维',
194 '园林': 'yl', 195 '园林': 'yl',
195 '市政': 'sz', 196 '市政': 'sz',
196 '物业': 'wy', 197 '物业': 'wy',
197 '秩序管理': 'zx', 198 '秩序管理': 'zx',
198 '环境卫生': 'hj', 199 '环境卫生': 'hj',
  200 + '常规运维' : 'yw'
199 }, 201 },
200 busiLineOptions: [], // 业务线选项列表 202 busiLineOptions: [], // 业务线选项列表
201 // 问题照片列表 203 // 问题照片列表
pages-sub/problem/regional-order-manage/add-patrol-order.vue
1 <template> 1 <template>
2 <view class="page-container"> 2 <view class="page-container">
3 <view class="work-order-form-content commonPageLRpadding"> 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 <!-- 1. 工单位置(地图选择) --> 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 </up-form-item> 10 </up-form-item>
26 11
27 <!-- 2. 问题类型(下拉框) --> 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 <template #right> 17 <template #right>
43 <up-icon name="arrow-right" size="16"></up-icon> 18 <up-icon name="arrow-right" size="16"></up-icon>
44 </template> 19 </template>
45 </up-form-item> 20 </up-form-item>
46 21
47 <!-- 3. 情况描述(文本域) --> 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 </up-form-item> 26 </up-form-item>
62 27
63 <!-- 4. 问题照片 --> 28 <!-- 4. 问题照片 -->
64 <up-form-item label="问题照片" prop="problemImgs" required> 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 </up-form-item> 34 </up-form-item>
77 35
78 </up-form> 36 </up-form>
@@ -80,21 +38,13 @@ @@ -80,21 +38,13 @@
80 38
81 <!-- 底部提交按钮 --> 39 <!-- 底部提交按钮 -->
82 <view class="fixed-bottom-btn-wrap"> 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 </view> 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 </view> 49 </view>
100 </template> 50 </template>
@@ -103,7 +53,7 @@ @@ -103,7 +53,7 @@
103 import { ref, reactive } from 'vue' 53 import { ref, reactive } from 'vue'
104 import { onReady, onShow, onLoad, onBackPress } from '@dcloudio/uni-app'; 54 import { onReady, onShow, onLoad, onBackPress } from '@dcloudio/uni-app';
105 import { useUploadImgs } from '@/common/utils/useUploadImgs' 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 import { timeFormat } from '@/uni_modules/uview-plus' 57 import { timeFormat } from '@/uni_modules/uview-plus'
108 import { nextStepMap } from '@/common/utils/common' 58 import { nextStepMap } from '@/common/utils/common'
109 import { useUserStore } from '@/pinia/user'; 59 import { useUserStore } from '@/pinia/user';
@@ -114,16 +64,18 @@ const userStore = useUserStore(); @@ -114,16 +64,18 @@ const userStore = useUserStore();
114 // ========== 业务线相关状态 ========== 64 // ========== 业务线相关状态 ==========
115 // 业务线映射表 65 // 业务线映射表
116 const busiLineMap = ref({ 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,7 +312,7 @@ const submitWorkOrder = async () =&gt; {
360 taskId: renewOrderData.value.taskId, 312 taskId: renewOrderData.value.taskId,
361 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '', 313 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '',
362 agree: 0, 314 agree: 0,
363 - reason: workOrderForm.problemDesc.trim(), 315 + reason: workOrderForm.problemDesc.trim(),
364 ...commonSubmitData 316 ...commonSubmitData
365 } 317 }
366 if (userStore.userInfo?.roles.includes('patrol_global')) { // 全域巡查员 318 if (userStore.userInfo?.roles.includes('patrol_global')) { // 全域巡查员
@@ -407,6 +359,4 @@ const submitWorkOrder = async () =&gt; { @@ -407,6 +359,4 @@ const submitWorkOrder = async () =&gt; {
407 .work-order-form-content { 359 .work-order-form-content {
408 background: #fff; 360 background: #fff;
409 } 361 }
410 -  
411 -  
412 </style> 362 </style>
413 \ No newline at end of file 363 \ No newline at end of file
pages-sub/problem/regional-order-manage/distribution-order.vue
1 <template> 1 <template>
2 <view class="page-container"> 2 <view class="page-container">
3 <view class="work-order-form-content commonPageLRpadding"> 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 <!-- 1. 工单位置(地图选择)【赋值回显 + 完全禁止修改】 --> 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 </up-form-item> 8 </up-form-item>
25 9
26 <!-- 2. 问题类型(下拉框)【赋值回显 + 完全禁止修改】 --> 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 </up-form-item> 13 </up-form-item>
41 14
42 <!-- 3. 情况描述(文本域)【赋值回显 + 完全禁止修改】 --> 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 </up-form-item> 19 </up-form-item>
58 20
59 <!-- 4. 问题照片【赋值回显 + 完全禁止修改/删除/新增】 --> 21 <!-- 4. 问题照片【赋值回显 + 完全禁止修改/删除/新增】 -->
60 <up-form-item label="问题照片" prop="problemImgs" required> 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 </up-form-item> 26 </up-form-item>
72 27
73 <!-- 派单情况分组(放在问题照片下方,增加间距) --> 28 <!-- 派单情况分组(放在问题照片下方,增加间距) -->
@@ -75,61 +30,28 @@ @@ -75,61 +30,28 @@
75 <view class="dispatch-title">派单情况</view> 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 </up-radio-group> 37 </up-radio-group>
96 </up-form-item> 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 <template #right> 45 <template #right>
114 - <up-icon name="arrow-right" size="16" ></up-icon> 46 + <up-icon name="arrow-right" size="16"></up-icon>
115 </template> 47 </template>
116 </up-form-item> 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 <template #right> 55 <template #right>
134 <up-icon name="arrow-right" size="16"></up-icon> 56 <up-icon name="arrow-right" size="16"></up-icon>
135 </template> 57 </template>
@@ -137,24 +59,11 @@ @@ -137,24 +59,11 @@
137 </view> 59 </view>
138 60
139 <!-- 5. 完成时间 --> 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 <template #right> 64 <template #right>
152 <view v-if="workOrderForm.expectedFinishDate" @click.stop> 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 </view> 67 </view>
159 <up-icon name="arrow-right" size="16" v-else></up-icon> 68 <up-icon name="arrow-right" size="16" v-else></up-icon>
160 </template> 69 </template>
@@ -164,31 +73,17 @@ @@ -164,31 +73,17 @@
164 73
165 <!-- 底部提交按钮 --> 74 <!-- 底部提交按钮 -->
166 <view class="fixed-bottom-btn-wrap"> 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 </view> 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 </view> 87 </view>
193 </template> 88 </template>
194 89
@@ -197,7 +92,7 @@ import { ref, reactive } from &#39;vue&#39; @@ -197,7 +92,7 @@ import { ref, reactive } from &#39;vue&#39;
197 import { onReady, onShow, onLoad, onBackPress } from '@dcloudio/uni-app'; 92 import { onReady, onShow, onLoad, onBackPress } from '@dcloudio/uni-app';
198 import { useUploadImgs } from '@/common/utils/useUploadImgs' 93 import { useUploadImgs } from '@/common/utils/useUploadImgs'
199 import { getRoadListByLatLng } from '@/api/common' 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 import { timeFormat } from '@/uni_modules/uview-plus' 96 import { timeFormat } from '@/uni_modules/uview-plus'
202 import { nextStepMap } from '@/common/utils/common' 97 import { nextStepMap } from '@/common/utils/common'
203 import { useUserStore } from '@/pinia/user'; 98 import { useUserStore } from '@/pinia/user';
@@ -209,15 +104,17 @@ const userStore = useUserStore(); @@ -209,15 +104,17 @@ const userStore = useUserStore();
209 // 业务线映射表 104 // 业务线映射表
210 const busiLineMap = ref({ 105 const busiLineMap = ref({
211 'yl': '园林', 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,7 +283,7 @@ const echoOrderData = (orderItem) =&gt; {
386 workOrderForm.problemDesc = orderItem.remark || ''; 283 workOrderForm.problemDesc = orderItem.remark || '';
387 workOrderForm.lat = orderItem.lat || 0; 284 workOrderForm.lat = orderItem.lat || 0;
388 workOrderForm.lon = orderItem.lon || 0; 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 if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) { 289 if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) {
@@ -518,12 +415,12 @@ const navigateBack = () =&gt; { @@ -518,12 +415,12 @@ const navigateBack = () =&gt; {
518 } 415 }
519 416
520 // 清除希望完成时间 417 // 清除希望完成时间
521 -const clearExpectedFinishDate = ()=> { 418 +const clearExpectedFinishDate = () => {
522 workOrderForm.expectedFinishDate = '' 419 workOrderForm.expectedFinishDate = ''
523 } 420 }
524 421
525 // 【注释无用方法:原选择工单位置方法,因为禁止修改,不需要点击触发】 422 // 【注释无用方法:原选择工单位置方法,因为禁止修改,不需要点击触发】
526 -const chooseWorkLocation = () => {} 423 +const chooseWorkLocation = () => { }
527 424
528 // 完成时间确认 425 // 完成时间确认
529 const expectedFinishDateConfirm = (e) => { 426 const expectedFinishDateConfirm = (e) => {
@@ -558,7 +455,7 @@ const submitWorkOrder = async () =&gt; { @@ -558,7 +455,7 @@ const submitWorkOrder = async () =&gt; {
558 lonLatAddress: workOrderForm.workLocation, 455 lonLatAddress: workOrderForm.workLocation,
559 pressingType: workOrderForm.pressingType, 456 pressingType: workOrderForm.pressingType,
560 orderName: workOrderForm.orderName, 457 orderName: workOrderForm.orderName,
561 - expectedFinishDate: workOrderForm.expectedFinishDate==""?"":new Date(workOrderForm.expectedFinishDate).getTime(), 458 + expectedFinishDate: workOrderForm.expectedFinishDate == "" ? "" : new Date(workOrderForm.expectedFinishDate).getTime(),
562 sourceId: 1, 459 sourceId: 1,
563 sourceName: workOrderForm.busiLineCn, 460 sourceName: workOrderForm.busiLineCn,
564 busiLine: busiLineEn, 461 busiLine: busiLineEn,
@@ -568,7 +465,7 @@ const submitWorkOrder = async () =&gt; { @@ -568,7 +465,7 @@ const submitWorkOrder = async () =&gt; {
568 taskId: renewOrderData.value.taskId, 465 taskId: renewOrderData.value.taskId,
569 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypePass || '', 466 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypePass || '',
570 agree: 0, 467 agree: 0,
571 - reason: workOrderForm.problemDesc.trim(), 468 + reason: workOrderForm.problemDesc.trim(),
572 } 469 }
573 470
574 uni.showLoading({ title: '提交中...' }) 471 uni.showLoading({ title: '提交中...' })
@@ -581,7 +478,7 @@ const submitWorkOrder = async () =&gt; { @@ -581,7 +478,7 @@ const submitWorkOrder = async () =&gt; {
581 taskId: renewOrderData.value.taskId, 478 taskId: renewOrderData.value.taskId,
582 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '', 479 operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '',
583 agree: 0, 480 agree: 0,
584 - reason: workOrderForm.problemDesc.trim(), 481 + reason: workOrderForm.problemDesc.trim(),
585 ...commonSubmitData 482 ...commonSubmitData
586 } 483 }
587 res = await qyUniversalApproval(renewSubmitData) 484 res = await qyUniversalApproval(renewSubmitData)
@@ -637,7 +534,7 @@ const submitWorkOrder = async () =&gt; { @@ -637,7 +534,7 @@ const submitWorkOrder = async () =&gt; {
637 .dispatch-title { 534 .dispatch-title {
638 font-size: 32rpx; 535 font-size: 32rpx;
639 font-weight: 600; 536 font-weight: 600;
640 - color:$u-primary; 537 + color: $u-primary;
641 margin-bottom: 20rpx; 538 margin-bottom: 20rpx;
642 padding-left: 10rpx; 539 padding-left: 10rpx;
643 } 540 }
pages-sub/problem/work-order-manage/add-order.vue
1 <template> 1 <template>
2 <view class="page-container"> 2 <view class="page-container">
3 <view class="work-order-form-content commonPageLRpadding"> 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 <!-- 业务线单选框:移入form内,作为第一个表单项(核心调整) --> 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 </up-form-item> 11 </up-form-item>
32 12
33 <!-- 1. 工单位置(地图选择) --> 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 </up-form-item> 18 </up-form-item>
49 19
50 <!-- 2. 道路名称(下拉框) --> 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 <template #right> 25 <template #right>
66 - <up-icon name="arrow-right" size="16" ></up-icon> 26 + <up-icon name="arrow-right" size="16"></up-icon>
67 </template> 27 </template>
68 </up-form-item> 28 </up-form-item>
69 29
70 <!-- 3. 问题类型(下拉框) --> 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 <template #right> 35 <template #right>
86 <up-icon name="arrow-right" size="16"></up-icon> 36 <up-icon name="arrow-right" size="16"></up-icon>
87 </template> 37 </template>
88 </up-form-item> 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 <template #right> 45 <template #right>
106 <up-icon name="arrow-right" size="16"></up-icon> 46 <up-icon name="arrow-right" size="16"></up-icon>
107 </template> 47 </template>
108 </up-form-item> 48 </up-form-item>
109 49
110 <!-- 4. 情况描述(文本域) --> 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 </up-form-item> 54 </up-form-item>
125 55
126 <!-- 问题照片(核心修复:绑定纯数组) --> 56 <!-- 问题照片(核心修复:绑定纯数组) -->
127 <up-form-item label="问题照片" prop="problemImgs" border-bottom required> 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 </up-form-item> 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 <template #right> 67 <template #right>
154 <!-- 核心修复:用view包裹图标,添加双重@click.stop --> 68 <!-- 核心修复:用view包裹图标,添加双重@click.stop -->
155 <view v-if="workOrderForm.expectedFinishDate" @click.stop> 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 </view> 71 </view>
162 <up-icon name="arrow-right" size="16" v-else></up-icon> 72 <up-icon name="arrow-right" size="16" v-else></up-icon>
163 </template> 73 </template>
@@ -167,31 +77,17 @@ @@ -167,31 +77,17 @@
167 77
168 <!-- 底部提交按钮 --> 78 <!-- 底部提交按钮 -->
169 <view class="fixed-bottom-btn-wrap"> 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 </view> 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 </view> 91 </view>
196 </template> 92 </template>
197 93
@@ -212,15 +108,17 @@ const userStore = useUserStore(); @@ -212,15 +108,17 @@ const userStore = useUserStore();
212 // 业务线映射表(键:英文标识,值:中文名称;新增反向映射:中文->英文) 108 // 业务线映射表(键:英文标识,值:中文名称;新增反向映射:中文->英文)
213 const busiLineMap = ref({ 109 const busiLineMap = ref({
214 'yl': '园林', 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 // 业务线选项列表(仅保留name字段=中文名称,适配单选框配置) 124 // 业务线选项列表(仅保留name字段=中文名称,适配单选框配置)
@@ -405,7 +303,7 @@ const echoOrderData = (orderItem) =&gt; { @@ -405,7 +303,7 @@ const echoOrderData = (orderItem) =&gt; {
405 workOrderForm.problemDesc = orderItem.remark || ''; 303 workOrderForm.problemDesc = orderItem.remark || '';
406 workOrderForm.lat = orderItem.lat || 0; 304 workOrderForm.lat = orderItem.lat || 0;
407 workOrderForm.lon = orderItem.lon || 0; 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 // 3. 上传图片回显(兼容useUploadImgs格式) 308 // 3. 上传图片回显(兼容useUploadImgs格式)
411 if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) { 309 if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) {
@@ -566,7 +464,7 @@ const navigateBack = () =&gt; { @@ -566,7 +464,7 @@ const navigateBack = () =&gt; {
566 } 464 }
567 465
568 // 新增:清除希望完成时间的方法 466 // 新增:清除希望完成时间的方法
569 -const clearExpectedFinishDate = ()=> { 467 +const clearExpectedFinishDate = () => {
570 workOrderForm.expectedFinishDate = '' 468 workOrderForm.expectedFinishDate = ''
571 // 清除后触发一次字段校验,确保校验状态更新 469 // 清除后触发一次字段校验,确保校验状态更新
572 // this.$refs.inspectFormRef.validateField('expectedFinishDate') 470 // this.$refs.inspectFormRef.validateField('expectedFinishDate')
@@ -629,7 +527,7 @@ const submitWorkOrder = async () =&gt; { @@ -629,7 +527,7 @@ const submitWorkOrder = async () =&gt; {
629 uni.showToast({ title: '业务线选择异常,请重新选择', icon: 'none' }); 527 uni.showToast({ title: '业务线选择异常,请重新选择', icon: 'none' });
630 return; 528 return;
631 } 529 }
632 - console.log('完成时间:'+workOrderForm.expectedFinishDate) 530 + console.log('完成时间:' + workOrderForm.expectedFinishDate)
633 // 构建公共提交数据 531 // 构建公共提交数据
634 const commonSubmitData = { 532 const commonSubmitData = {
635 roadId: workOrderForm.roadId, 533 roadId: workOrderForm.roadId,
@@ -642,13 +540,13 @@ const submitWorkOrder = async () =&gt; { @@ -642,13 +540,13 @@ const submitWorkOrder = async () =&gt; {
642 lonLatAddress: workOrderForm.workLocation, 540 lonLatAddress: workOrderForm.workLocation,
643 pressingType: workOrderForm.pressingType, 541 pressingType: workOrderForm.pressingType,
644 orderName: workOrderForm.orderName, 542 orderName: workOrderForm.orderName,
645 - expectedFinishDate:workOrderForm.expectedFinishDate=="" ?"": new Date(workOrderForm.expectedFinishDate).getTime(), 543 + expectedFinishDate: workOrderForm.expectedFinishDate == "" ? "" : new Date(workOrderForm.expectedFinishDate).getTime(),
646 sourceId: 1, 544 sourceId: 1,
647 sourceName: workOrderForm.busiLineCn, // 从form字段获取业务线中文名称 545 sourceName: workOrderForm.busiLineCn, // 从form字段获取业务线中文名称
648 busiLine: busiLineEn // 传递英文标识(yl/sz/wy),接口正常使用 546 busiLine: busiLineEn // 传递英文标识(yl/sz/wy),接口正常使用
649 } 547 }
650 console.log('工单数据') 548 console.log('工单数据')
651 - console.log('完成时间:'+workOrderForm.expectedFinishDate) 549 + console.log('完成时间:' + workOrderForm.expectedFinishDate)
652 console.log(commonSubmitData) 550 console.log(commonSubmitData)
653 // 显示加载中 551 // 显示加载中
654 uni.showLoading({ title: '提交中...' }) 552 uni.showLoading({ title: '提交中...' })
@@ -717,5 +615,4 @@ const submitWorkOrder = async () =&gt; { @@ -717,5 +615,4 @@ const submitWorkOrder = async () =&gt; {
717 .work-order-form-content { 615 .work-order-form-content {
718 background: #fff; 616 background: #fff;
719 } 617 }
720 -  
721 </style> 618 </style>
722 \ No newline at end of file 619 \ No newline at end of file
pages/index/index.vue
@@ -56,9 +56,9 @@ @@ -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 <text>{{ tipText }}</text> 60 <text>{{ tipText }}</text>
61 - </view> 61 + </view> -->
62 62
63 <!-- 顶部进度提示栏 --> 63 <!-- 顶部进度提示栏 -->
64 <view v-if="showTipHeader" class="tip-header"> 64 <view v-if="showTipHeader" class="tip-header">
@@ -97,7 +97,7 @@ @@ -97,7 +97,7 @@
97 <template v-else> 97 <template v-else>
98 <text>{{ item.distance }}m ·</text> 98 <text>{{ item.distance }}m ·</text>
99 <up-icon name="star-fill" color="#ffd21d" size="20"></up-icon> 99 <up-icon name="star-fill" color="#ffd21d" size="20"></up-icon>
100 - <text>历史完成率{{ item.efficiencyPercent }}%</text> 100 + <text>历史完成率{{ item.historyCompletionRate }}%</text>
101 </template> 101 </template>
102 </view> 102 </view>
103 </view> 103 </view>
@@ -124,28 +124,58 @@ import { @@ -124,28 +124,58 @@ import {
124 const userStore = useUserStore(); 124 const userStore = useUserStore();
125 const deptId = computed(() => String(userStore.userInfo?.user?.deptId ?? '')); 125 const deptId = computed(() => String(userStore.userInfo?.user?.deptId ?? ''));
126 126
127 -// ====================== 只需要在这里统一维护分组配置 ====================== 127 +// ====================== 分组配置(多部门归属同一组) ======================
128 type GroupItem = { 128 type GroupItem = {
129 - deptId: string; 129 + deptIds: string[]; // 多个部门ID数组
130 label: string; 130 label: string;
131 showTipHeader: boolean; // 是否展示顶部进度条 131 showTipHeader: boolean; // 是否展示顶部进度条
132 useWalkText: boolean; // 是否展示步行距离文案 132 useWalkText: boolean; // 是否展示步行距离文案
133 }; 133 };
134 const groupConfig: GroupItem[] = [ 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 const currentGroup = computed(() => { 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 const tipText = computed(() => currentGroup.value.label); 179 const tipText = computed(() => currentGroup.value.label);
150 const showTipHeader = computed(() => currentGroup.value.showTipHeader); 180 const showTipHeader = computed(() => currentGroup.value.showTipHeader);
151 const isWalkTextMode = computed(() => currentGroup.value.useWalkText); 181 const isWalkTextMode = computed(() => currentGroup.value.useWalkText);
@@ -308,6 +338,8 @@ const getCurrentLocation = (): Promise&lt;{ lon: string; lat: string }&gt; =&gt; { @@ -308,6 +338,8 @@ const getCurrentLocation = (): Promise&lt;{ lon: string; lat: string }&gt; =&gt; {
308 uni.getLocation({ 338 uni.getLocation({
309 type: 'gcj02', 339 type: 'gcj02',
310 success: (loc) => { 340 success: (loc) => {
  341 + console.log(loc.longitude)
  342 + console.log(loc.latitude)
311 resolve({ 343 resolve({
312 lon: loc.longitude.toFixed(6), 344 lon: loc.longitude.toFixed(6),
313 lat: loc.latitude.toFixed(6) 345 lat: loc.latitude.toFixed(6)
@@ -337,6 +369,8 @@ const getCurrentLocation = (): Promise&lt;{ lon: string; lat: string }&gt; =&gt; { @@ -337,6 +369,8 @@ const getCurrentLocation = (): Promise&lt;{ lon: string; lat: string }&gt; =&gt; {
337 uni.getLocation({ 369 uni.getLocation({
338 type: 'gcj02', 370 type: 'gcj02',
339 success: (loc) => { 371 success: (loc) => {
  372 + console.log(loc.longitude)
  373 + console.log(loc.latitude)
340 resolve({ 374 resolve({
341 lon: loc.longitude.toFixed(6), 375 lon: loc.longitude.toFixed(6),
342 lat: loc.latitude.toFixed(6) 376 lat: loc.latitude.toFixed(6)
@@ -694,14 +728,16 @@ $border-color: #e5e5e5; @@ -694,14 +728,16 @@ $border-color: #e5e5e5;
694 .task-item__name { 728 .task-item__name {
695 width: 60px; 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 &__name { 741 &__name {
706 font-size: 15px; 742 font-size: 15px;
707 color: $text-color; 743 color: $text-color;