Commit 6cc0ab0effad7d563b2175719639ea6f8ccce4e9
1 parent
1d3624b0
养护任务
Showing
6 changed files
with
202 additions
and
420 deletions
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 () => { | @@ -360,7 +312,7 @@ const submitWorkOrder = async () => { | ||
| 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 () => { | @@ -407,6 +359,4 @@ const submitWorkOrder = async () => { | ||
| 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 'vue' | @@ -197,7 +92,7 @@ import { ref, reactive } from 'vue' | ||
| 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) => { | @@ -386,7 +283,7 @@ const echoOrderData = (orderItem) => { | ||
| 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 = () => { | @@ -518,12 +415,12 @@ const navigateBack = () => { | ||
| 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 () => { | @@ -558,7 +455,7 @@ const submitWorkOrder = async () => { | ||
| 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 () => { | @@ -568,7 +465,7 @@ const submitWorkOrder = async () => { | ||
| 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 () => { | @@ -581,7 +478,7 @@ const submitWorkOrder = async () => { | ||
| 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 () => { | @@ -637,7 +534,7 @@ const submitWorkOrder = async () => { | ||
| 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) => { | @@ -405,7 +303,7 @@ const echoOrderData = (orderItem) => { | ||
| 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 = () => { | @@ -566,7 +464,7 @@ const navigateBack = () => { | ||
| 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 () => { | @@ -629,7 +527,7 @@ const submitWorkOrder = async () => { | ||
| 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 () => { | @@ -642,13 +540,13 @@ const submitWorkOrder = async () => { | ||
| 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 () => { | @@ -717,5 +615,4 @@ const submitWorkOrder = async () => { | ||
| 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<{ lon: string; lat: string }> => { | @@ -308,6 +338,8 @@ const getCurrentLocation = (): Promise<{ lon: string; lat: string }> => { | ||
| 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<{ lon: string; lat: string }> => { | @@ -337,6 +369,8 @@ const getCurrentLocation = (): Promise<{ lon: string; lat: string }> => { | ||
| 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; |