Commit 5cb33b906f4df395ba5c2f6cb179fe2757046c89

Authored by 刘淇
1 parent 83208d2e

完成巡查计划 详情

api/patrol-manage/patrol-plan.js
@@ -26,10 +26,20 @@ export const inspectionPlanDetail = (data) => { @@ -26,10 +26,20 @@ export const inspectionPlanDetail = (data) => {
26 return post('/app-api/app/garden/inspection-plan-detail/get-details',data); 26 return post('/app-api/app/garden/inspection-plan-detail/get-details',data);
27 }; 27 };
28 28
  29 +
  30 +// app-api/app/garden/inspection-plan-commit/get/by/plan_no?plan_no=P1765032669066674'
  31 +/**
  32 + * 巡查计划完成详情
  33 + * @returns {Promise}
  34 + */
  35 +export const inspectioDetailByPlanno = (params) => {
  36 + return get('/app-api/app/garden/inspection-plan-commit/get/by/plan_no',params);
  37 +};
  38 +
29 /** 39 /**
30 - * 模块列表用这个 40 + * 巡查计划完成详情
31 * @returns {Promise} 41 * @returns {Promise}
32 */ 42 */
33 -export const moduleList = () => {  
34 - return get('/app-api/member/app-module/list'); 43 +export const inspectionCreate = (data) => {
  44 + return post('/app-api/app/garden/inspection-plan-commit/create',data);
35 }; 45 };
common/utils/dict.js
@@ -68,4 +68,73 @@ export const getDictSimpleList = (dictType) => { @@ -68,4 +68,73 @@ export const getDictSimpleList = (dictType) => {
68 value: item.value || '', 68 value: item.value || '',
69 label: item.label || '' 69 label: item.label || ''
70 })); 70 }));
  71 +};
  72 +
  73 +/**
  74 + * 字典格式转换工具:{label, value} ↔ {name, value}(兼容笔误的vulue,同时支持正确value)
  75 + * 注:若需转换为 {name, vulue}(拼写错误),代码中已兼容,可按需切换
  76 + */
  77 +
  78 +/**
  79 + * 核心转换:将 {label, value} 数组转换为 {name, value} 数组(主流正确写法)
  80 + * @param {Array} list 源数组,例:[{label: "绿地卫生", value: "绿地卫生"}]
  81 + * @returns {Array} 转换后数组,例:[{name: "绿地卫生", value: "绿地卫生"}]
  82 + */
  83 +export const transformLabelValueToNameValue = (list) => {
  84 + // 空值保护:非数组直接返回空数组
  85 + if (!Array.isArray(list) || list.length === 0) return [];
  86 +
  87 + return list.map(item => {
  88 + // 兼容item为null/undefined的情况,兜底空字符串
  89 + const safeItem = item || {};
  90 + return {
  91 + name: safeItem.label || '',
  92 + value: safeItem.value || '' // 正确的value字段
  93 + // 若需转换为 vulue(拼写错误),替换为:vulue: safeItem.value || ''
  94 + };
  95 + });
  96 +};
  97 +
  98 +/**
  99 + * 单对象转换:将 {label, value} 转换为 {name, value}
  100 + * @param {Object} item 源对象,例:{label: "绿地卫生", value: "绿地卫生"}
  101 + * @returns {Object} 转换后对象,例:{name: "绿地卫生", value: "绿地卫生"}
  102 + */
  103 +export const transformSingleLabelValueToNameValue = (item) => {
  104 + const safeItem = item || {};
  105 + return {
  106 + name: safeItem.label || '',
  107 + value: safeItem.value || ''
  108 + // 若需 vulue:vulue: safeItem.value || ''
  109 + };
  110 +};
  111 +
  112 +/**
  113 + * 反向转换:{name, value} → {label, value}(可选,用于回显)
  114 + * @param {Array} list 源数组
  115 + * @returns {Array} 转换后数组
  116 + */
  117 +export const transformNameValueToLabelValue = (list) => {
  118 + if (!Array.isArray(list) || list.length === 0) return [];
  119 +
  120 + return list.map(item => {
  121 + const safeItem = item || {};
  122 + return {
  123 + label: safeItem.name || '',
  124 + value: safeItem.value || safeItem.vulue || '' // 兼容vulue拼写错误
  125 + };
  126 + });
  127 +};
  128 +
  129 +
  130 +
  131 +// 导出全部方法的集合(方便全局注册)
  132 +export default {
  133 + getDictList,
  134 + getDictLabel,
  135 + getDictValue,
  136 + getDictSimpleList,
  137 + transformLabelValueToNameValue,
  138 + transformSingleLabelValueToNameValue,
  139 + transformNameValueToLabelValue
71 }; 140 };
72 \ No newline at end of file 141 \ No newline at end of file
@@ -5,10 +5,11 @@ import uviewPlus from '@/uni_modules/uview-plus' @@ -5,10 +5,11 @@ import uviewPlus from '@/uni_modules/uview-plus'
5 import pinia from '@/pinia/index' 5 import pinia from '@/pinia/index'
6 import EmptyView from '@/components/empty-view/empty-view.vue'; 6 import EmptyView from '@/components/empty-view/empty-view.vue';
7 import UploadImage from '@/components/upload-image/upload-image.vue'; 7 import UploadImage from '@/components/upload-image/upload-image.vue';
8 - 8 +import dictUtils from '@/common/utils/dict';
9 // #ifdef VUE3 9 // #ifdef VUE3
10 import { createSSRApp } from 'vue' 10 import { createSSRApp } from 'vue'
11 - 11 +// 挂载到uni全局
  12 +uni.$dict = dictUtils;
12 export function createApp() { 13 export function createApp() {
13 // 2. 创建 Vue 实例 14 // 2. 创建 Vue 实例
14 const app = createSSRApp(App) 15 const app = createSSRApp(App)
@@ -18,6 +19,8 @@ export function createApp() { @@ -18,6 +19,8 @@ export function createApp() {
18 19
19 // 4. 注册 Pinia(核心:在 app 挂载前注册) 20 // 4. 注册 Pinia(核心:在 app 挂载前注册)
20 app.use(pinia) 21 app.use(pinia)
  22 + // 全局注入字典工具(关键:provide需在app实例上注册)
  23 + // app.provide('$dict', dictUtils);
21 app.component('EmptyView', EmptyView) 24 app.component('EmptyView', EmptyView)
22 app.component('UploadImage', UploadImage) 25 app.component('UploadImage', UploadImage)
23 // 5. 返回 app + pinia(可选,便于调试) 26 // 5. 返回 app + pinia(可选,便于调试)
@@ -29,21 +32,3 @@ export function createApp() { @@ -29,21 +32,3 @@ export function createApp() {
29 // #endif 32 // #endif
30 33
31 34
32 -// 全局注册(可选):如果需要全局使用,可在 main.js 中注册为全局方法:  
33 -// javascript  
34 -// 运行  
35 -// import { createSSRApp } from 'vue';  
36 -// import * as dictUtils from '@/utils/dict';  
37 -//  
38 -// export function createApp() {  
39 -// const app = createSSRApp(App);  
40 -// // 注册全局字典方法  
41 -// app.config.globalProperties.$dict = dictUtils;  
42 -// return { app };  
43 -// }  
44 -// 组件中使用:  
45 -// javascript  
46 -// 运行  
47 -// import { getCurrentInstance } from 'vue';  
48 -// const { proxy } = getCurrentInstance();  
49 -// const label = proxy.$dict.getDictLabel('ai_image_status', 10);  
pages-sub/daily/patrol-manage/add-patrol-record/index.vue
@@ -40,7 +40,7 @@ @@ -40,7 +40,7 @@
40 del-color="#ff4d4f" 40 del-color="#ff4d4f"
41 class="upload-wrap" 41 class="upload-wrap"
42 ></up-upload> 42 ></up-upload>
43 - <view class="tips">(最少1张,最多3张)</view> 43 +<!-- <view class="tips">(最少1张,最多3张)</view>-->
44 </up-form-item> 44 </up-form-item>
45 45
46 <!-- 3. 转为工单(单选框) --> 46 <!-- 3. 转为工单(单选框) -->
@@ -92,6 +92,8 @@ const inspectFormRef = ref&lt;UniFormRef&gt;(null) @@ -92,6 +92,8 @@ const inspectFormRef = ref&lt;UniFormRef&gt;(null)
92 92
93 <script lang="ts"> 93 <script lang="ts">
94 import { uploadImages } from '@/common/utils/upload'; 94 import { uploadImages } from '@/common/utils/upload';
  95 +import { inspectionCreate } from "@/api/patrol-manage/patrol-plan";
  96 +
95 97
96 export default { 98 export default {
97 data() { 99 data() {
@@ -100,14 +102,15 @@ export default { @@ -100,14 +102,15 @@ export default {
100 imagesList: [], 102 imagesList: [],
101 // 单选列表 103 // 单选列表
102 radioList: [ 104 radioList: [
103 - { label: '是', value: '1' },  
104 - { label: '否', value: '2' } 105 + { label: '是', value: '2' },
  106 + { label: '否', value: '1' }
105 ], 107 ],
106 // 巡查表单数据 108 // 巡查表单数据
107 inspectForm: { 109 inspectForm: {
108 content: '', // 巡查描述 110 content: '', // 巡查描述
109 - isWorkOrder: '1' // 是否转为工单 1:是(默认) 2:否 111 + isWorkOrder: '2' // 是否转为工单 1:否(默认) 2:是
110 }, 112 },
  113 + paramsOptins:{},//接受参数
111 // 表单校验规则 114 // 表单校验规则
112 inspectFormRules: { 115 inspectFormRules: {
113 images: [ 116 images: [
@@ -136,6 +139,10 @@ export default { @@ -136,6 +139,10 @@ export default {
136 } 139 }
137 } 140 }
138 }, 141 },
  142 + onLoad(option){
  143 + console.log(option)
  144 + this.paramsOptins = option
  145 + },
139 onReady() { 146 onReady() {
140 // 兼容微信小程序,通过setRules设置校验规则 147 // 兼容微信小程序,通过setRules设置校验规则
141 this.$refs.inspectFormRef.setRules(this.inspectFormRules) 148 this.$refs.inspectFormRef.setRules(this.inspectFormRules)
@@ -246,39 +253,42 @@ export default { @@ -246,39 +253,42 @@ export default {
246 try { 253 try {
247 // 先执行表单校验 254 // 先执行表单校验
248 await this.$refs.inspectFormRef.validate() 255 await this.$refs.inspectFormRef.validate()
249 - 256 + console.log(this.imagesList)
250 // 构造提交数据 257 // 构造提交数据
251 const submitData = { 258 const submitData = {
252 - content: this.inspectForm.content,  
253 - images: this.getImgUrlList(this.imagesList),  
254 - isWorkOrder: this.inspectForm.isWorkOrder // 1=是,2=否 259 + // content: this.inspectForm.content,
  260 + // images: this.getImgUrlList(this.imagesList),
  261 + // isWorkOrder: this.inspectForm.isWorkOrder // 1=否,2=是
  262 +
  263 +
  264 + "batchNo": this.paramsOptins.batchNo,
  265 + "planNo":this.paramsOptins.planNo,
  266 + "imgHost": "1",
  267 + "imgList": this.getImgUrlList(this.imagesList),
  268 + "inspectionState": this.inspectForm.isWorkOrder,
  269 + "transState": this.inspectForm.isWorkOrder==1?'1':'2',
  270 + "transWorkNo": "default'",
  271 + "remark": this.inspectForm.isWorkOrder
255 } 272 }
256 273
257 // 显示加载中 274 // 显示加载中
258 uni.showLoading({ title: '提交中...' }) 275 uni.showLoading({ title: '提交中...' })
259 276
260 - // 这里替换为实际的接口调用  
261 - // const res = await yourSubmitApi(submitData)  
262 -  
263 - // 模拟接口调用延迟  
264 - await new Promise(resolve => setTimeout(resolve, 1500)) 277 + await inspectionCreate(submitData)
265 278
266 uni.hideLoading() 279 uni.hideLoading()
267 uni.showToast({ 280 uni.showToast({
268 title: '提交成功', 281 title: '提交成功',
269 icon: 'success', 282 icon: 'success',
270 - duration: 1500 283 + duration: 1000
271 }) 284 })
272 285
273 - // 重置表单(保留默认值:转为工单=是 286 + // // 延迟跳转(等待提示框显示完成
274 setTimeout(() => { 287 setTimeout(() => {
275 - this.$refs.inspectFormRef.resetFields()  
276 - this.imagesList = []  
277 - this.inspectForm = {  
278 - content: '',  
279 - isWorkOrder: '1' // 重置后仍默认选中“是”  
280 - }  
281 - }, 1500) 288 + uni.redirectTo({
  289 + url: '/pages-sub/patrol-manage/patrol-plan/index'
  290 + })
  291 + }, 1000)
282 292
283 } catch (error) { 293 } catch (error) {
284 // 隐藏加载框 294 // 隐藏加载框
pages-sub/daily/patrol-manage/finish-plan-detail/index.vue
1 -<script setup lang="ts"> 1 +<template>
  2 + <view class="u-page">
  3 + <!-- 页面级加载组件 -->
  4 + <up-loading-page
  5 + v-if="loading"
  6 + :loading="true"
  7 + title="加载中..."
  8 + color="#3c9cff"
  9 + ></up-loading-page>
2 10
3 -</script> 11 + <!-- 内容容器 -->
  12 + <view v-else class="content-wrap">
  13 +
  14 +
  15 + <template v-for="(i, index) in orderDetail" :key="index">
  16 + <!-- 工单详情内容 -->
  17 + <up-cell-group :border="false" inset style="margin: 20rpx;">
  18 + <!-- 1. 工单编号 -->
  19 + <up-cell
  20 + :title="i.planName"
  21 +
  22 + class="up-line-1"
  23 + align="middle"
  24 + ></up-cell>
  25 +
  26 + <!-- 2. 工单位置 -->
  27 + <up-cell
  28 + title="计划编码"
  29 + :value="i.planNo || '--'"
  30 + class="up-line-1"
  31 + align="middle"
  32 + ></up-cell>
  33 +
  34 + <!-- 3. 工单名称 -->
  35 + <up-cell
  36 + title="养护周期"
  37 + :value="`${i.rate}${uni.$dict.getDictLabel('cycle_id_type', i.cycleId)}`"
  38 + class="up-line-1"
  39 + align="middle"
  40 + ></up-cell>
  41 +
  42 + <!-- 4. 情况描述 -->
  43 + <up-cell
  44 + title="计划有效期"
  45 + :value="`${timeFormat(i.beginTime,'yy-mm-dd hh:MM:ss')} 至 ${timeFormat(i. endTime,'yy-mm-dd hh:MM:ss')}`"
  46 + class="up-line-1"
  47 + align="middle"
  48 + ></up-cell>
  49 +
  50 + <!-- 5. 问题照片(核心修复:判断条件+空值处理) -->
  51 + <up-cell title="照片" >
  52 + <template #value>
  53 + <view class="cell-content-wrap">
  54 +
  55 + <!-- 修复1:正确判断problemImgsList,补充空数组默认值 -->
  56 + <up-album
  57 + v-if="!!i.imgList?.length"
  58 + :urls="i.imgList || []"
  59 + singleSize="70"
  60 + :preview-full-image="true"
  61 +
  62 + ></up-album>
  63 + <text v-else class="empty-text">暂无问题照片</text>
  64 + </view>
  65 + </template>
  66 + </up-cell>
  67 +
  68 + <!-- 7. 处理结果 -->
  69 + <up-cell
  70 + title="巡查描述"
  71 + :value="i.remark || '--'"
  72 + class="up-line-1"
  73 + align="middle"
  74 + :border="false"
  75 + ></up-cell>
  76 +
  77 + <up-cell
  78 + title="提交时间"
  79 + :value="timeFormat(i.finishTime,'yy-mm-dd hh:MM:ss') || '--'"
  80 + class="up-line-1"
  81 + align="middle"
  82 + :border="false"
  83 + ></up-cell>
  84 +
  85 +
  86 + <up-cell
  87 + title="提交人"
  88 + :value="i.userName || '--'"
  89 + class="up-line-1"
  90 + align="middle"
  91 + :border="false"
  92 + ></up-cell>
  93 + </up-cell-group>
  94 + </template>
4 95
5 -<template>  
6 96
  97 + </view>
  98 + </view>
7 </template> 99 </template>
8 100
  101 +<script setup lang="ts">
  102 +import { ref, reactive } from 'vue';
  103 +import { inspectioDetailByPlanno } from "@/api/patrol-manage/patrol-plan";
  104 +import { onLoad, onShow } from '@dcloudio/uni-app';
  105 +import { timeFormat } from '@/uni_modules/uview-plus';
  106 +// 状态管理
  107 +const loading = ref(true);
  108 +const orderDetail = ref([]);
  109 +
  110 +
  111 +/**
  112 + * 获取工单详情
  113 + */
  114 +const getOrderDetail = async (plan_no: string) => {
  115 + try {
  116 + loading.value = true;
  117 + const res = await inspectioDetailByPlanno({ plan_no });
  118 + console.log('接口返回:', res);
  119 + // 优化:确保图片数组为数组类型,避免非数组导致渲染错误
  120 + orderDetail.value = {
  121 + ...res,
  122 + problemImgsList: Array.isArray(res.problemImgsList) ? res.problemImgsList : [],
  123 + completeImgsList: Array.isArray(res.completeImgsList) ? res.completeImgsList : []
  124 + };
  125 + } catch (error) {
  126 + console.error('获取工单详情失败:', error);
  127 + uni.showToast({ title: '加载失败,请重试', icon: 'none' });
  128 + } finally {
  129 + loading.value = false;
  130 + }
  131 +};
  132 +
  133 +// 页面加载
  134 +onLoad((options) => {
  135 + const { planNo } = options;
  136 + if (planNo) {
  137 + getOrderDetail(planNo);
  138 + } else {
  139 + loading.value = false;
  140 + uni.showToast({ title: '缺少工单ID', icon: 'none' });
  141 + }
  142 +});
  143 +</script>
  144 +
9 <style scoped lang="scss"> 145 <style scoped lang="scss">
  146 +// 页面基础样式
  147 +.u-page {
  148 + min-height: 100vh;
  149 + background-color: #f5f5f5;
  150 + box-sizing: border-box;
  151 +}
  152 +
  153 +// 内容容器
  154 +.content-wrap {
  155 + background: #fff;
  156 + width: 100%;
  157 + box-sizing: border-box;
  158 + overflow-y: auto;
  159 + min-height: calc(100vh - 40rpx);
  160 +}
  161 +
  162 +
  163 +
  164 +// 空文本样式
  165 +.empty-text {
  166 + color: #999;
  167 + font-size: 28rpx;
  168 + line-height: 80rpx;
  169 + display: block;
  170 + text-align: left;
  171 +}
  172 +
  173 +// 优化uview组件样式
  174 +:deep(.up-cell-group) {
  175 + --u-cell-group-background-color: #fff;
  176 + --u-cell-group-border-radius: 12rpx;
  177 + --u-cell-group-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
  178 +}
  179 +
  180 +:deep(.up-cell) {
  181 + --u-cell-title-font-size: 28rpx;
  182 + --u-cell-value-font-size: 28rpx;
  183 + --u-cell-title-color: #666;
  184 + --u-cell-value-color: #333;
  185 + --u-cell-padding: 20rpx 15rpx;
  186 + --u-cell-border-color: #f5f5f5;
  187 +}
  188 +
  189 +// 相册样式优化(关键:适配图片展示)
  190 +:deep(.up-album) {
  191 + width: 100%;
  192 + box-sizing: border-box;
  193 +}
  194 +
  195 +:deep(.up-album__list) {
  196 + display: flex;
  197 + flex-wrap: wrap;
  198 + padding: 0;
  199 + margin: 0;
  200 +}
  201 +
  202 +:deep(.up-album__item) {
  203 + width: calc(33.333% - 10rpx);
  204 + height: 200rpx; // 固定图片高度,避免变形
  205 + margin: 5rpx;
  206 + border-radius: 8rpx;
  207 + overflow: hidden;
  208 + background-color: #f8f8f8;
  209 +}
  210 +
  211 +:deep(.up-album__image) {
  212 + width: 100%;
  213 + height: 100%;
  214 + object-fit: cover; // 图片裁剪填充,避免拉伸
  215 +}
  216 +
10 217
11 </style> 218 </style>
12 \ No newline at end of file 219 \ No newline at end of file
pages-sub/daily/patrol-manage/patrol-plan/index.vue
@@ -58,13 +58,14 @@ @@ -58,13 +58,14 @@
58 <view class="row-item flex-between"> 58 <view class="row-item flex-between">
59 <view> 59 <view>
60 <text class="label">养护级别:</text> 60 <text class="label">养护级别:</text>
61 - <text class="value">{{ levelMap[item.levelId] || '未知级别' }}</text> 61 + <text class="value">{{uni.$dict.getDictLabel('conserve_level', item.levelId)}}</text>
62 </view> 62 </view>
63 <text class="detail-btn" @click="gotoDetail(item)">计划明细</text> 63 <text class="detail-btn" @click="gotoDetail(item)">计划明细</text>
64 </view> 64 </view>
65 <view class="row-item"> 65 <view class="row-item">
66 <text class="label">计划类型:</text> 66 <text class="label">计划类型:</text>
67 - <text class="value up-line-1">{{ planTypeMap[item.planTypeId] || '未知类型' }}</text> 67 +
  68 + <text class="value up-line-1"> {{uni.$dict.getDictLabel('inspection_maintain_type', item.planTypeId)}}</text>
68 </view> 69 </view>
69 <view class="row-item"> 70 <view class="row-item">
70 <text class="label">计划时间:</text> 71 <text class="label">计划时间:</text>
@@ -101,17 +102,7 @@ const pageSize = ref(10); @@ -101,17 +102,7 @@ const pageSize = ref(10);
101 102
102 const planList = ref([]); 103 const planList = ref([]);
103 const paging = ref(null); 104 const paging = ref(null);
104 -// 养护级别/计划类型映射  
105 -const levelMap = {  
106 - 11: '一级养护',  
107 - 12: '二级养护',  
108 - 13: '三级养护'  
109 -};  
110 -const planTypeMap = {  
111 - 3001: '日常养护',  
112 - 3002: '专项养护',  
113 - 3003: '应急养护'  
114 -}; 105 +
115 106
116 // Tab切换 107 // Tab切换
117 const handleTabChange = (val) => { 108 const handleTabChange = (val) => {
@@ -164,9 +155,6 @@ onLoad(() =&gt; { @@ -164,9 +155,6 @@ onLoad(() =&gt; {
164 }); 155 });
165 // 仅在页面从明细页返回时,若有数据则刷新当前tab数据(避免干扰上拉加载) 156 // 仅在页面从明细页返回时,若有数据则刷新当前tab数据(避免干扰上拉加载)
166 onShow(() => { 157 onShow(() => {
167 - if (planList.value.length > 0 && pageNo.value === 1) {  
168 - queryList();  
169 - }  
170 }); 158 });
171 </script> 159 </script>
172 160
pages-sub/daily/patrol-manage/pending-plan-detail/index.vue
1 <template> 1 <template>
2 <view class="pending-plan-detail"> 2 <view class="pending-plan-detail">
3 <!-- 计划详情卡片 --> 3 <!-- 计划详情卡片 -->
4 - <view class="detail-card"> 4 + <view class="detail-card" v-for="i in planInfo" :key="i.planNo">
5 <!-- 标题行 --> 5 <!-- 标题行 -->
6 <view class="detail-item"> 6 <view class="detail-item">
7 <text class="label">计划名称:</text> 7 <text class="label">计划名称:</text>
8 - <text class="value up-line-1">{{ planInfo && planInfo.title ? planInfo.title : '-' }}</text> 8 + <text class="value up-line-1">{{ i.planName || '-' }}</text>
9 </view> 9 </view>
10 10
11 <!-- 计划编码行 --> 11 <!-- 计划编码行 -->
12 <view class="detail-item"> 12 <view class="detail-item">
13 <text class="label">计划编码:</text> 13 <text class="label">计划编码:</text>
14 - <text class="value up-line-1">{{ planInfo.planNo ? planInfo.planNo : '-' }}</text> 14 + <text class="value up-line-1">{{ i.planNo || '-' }}</text>
15 </view> 15 </view>
16 16
17 <!-- 养护周期行 --> 17 <!-- 养护周期行 -->
18 <view class="detail-item"> 18 <view class="detail-item">
19 <text class="label">养护周期:</text> 19 <text class="label">养护周期:</text>
20 - <text class="value up-line-1">{{ planInfo && planInfo.rate ? planInfo.rate : '-' }}</text> 20 + <text class="value up-line-1">{{ i.rate || '-' }} {{ uni.$dict.getDictLabel('cycle_id_type', i.cycleId) }}
  21 + </text>
21 </view> 22 </view>
22 - 23 + <!-- cycle_id_type-->
23 <!-- 计划完成次数行 --> 24 <!-- 计划完成次数行 -->
24 <view class="detail-item"> 25 <view class="detail-item">
25 <text class="label">计划完成次数:</text> 26 <text class="label">计划完成次数:</text>
26 - <text class="value up-line-1">{{ planInfo && planInfo.planNum ? planInfo.planNum : 0 }} 次</text> 27 + <text class="value up-line-1">{{ i.planNum || 0 }} 次</text>
27 </view> 28 </view>
28 29
29 <!-- 已完成次数行 + 查看记录按钮 --> 30 <!-- 已完成次数行 + 查看记录按钮 -->
30 <view class="detail-item flex-between"> 31 <view class="detail-item flex-between">
31 <view class="left-wrap"> 32 <view class="left-wrap">
32 <text class="label">已完成次数:</text> 33 <text class="label">已完成次数:</text>
33 - <text class="value up-line-1">{{ planInfo && planInfo.planFinishNum ? planInfo.planFinishNum : 0 }} 次</text> 34 + <text class="value up-line-1">{{ planInfo.i || 0 }} 次</text>
34 </view> 35 </view>
35 <!-- 查看记录按钮(限制宽度+紧凑样式) --> 36 <!-- 查看记录按钮(限制宽度+紧凑样式) -->
  37 +
36 <up-button 38 <up-button
  39 + v-if="i.planFinishNum>0"
37 type="primary" 40 type="primary"
38 size="mini" 41 size="mini"
39 - @click="gotoFinishPlanDetail" 42 + @click="gotoFinishPlanDetail(i)"
40 :style="{ width: '80px', height: '28px', fontSize: '14px', borderRadius: 4 }" 43 :style="{ width: '80px', height: '28px', fontSize: '14px', borderRadius: 4 }"
41 > 44 >
42 查看记录 45 查看记录
@@ -46,17 +49,19 @@ @@ -46,17 +49,19 @@
46 <!-- 计划有效期行 --> 49 <!-- 计划有效期行 -->
47 <view class="detail-item"> 50 <view class="detail-item">
48 <text class="label">计划有效期:</text> 51 <text class="label">计划有效期:</text>
49 -<!-- <text class="value up-line-1">{{ planInfo && planInfo.validTime ? planInfo.validTime : '-' }}</text>-->  
50 - <text class="value up-line-1">{{ timeFormat(planInfo.beginTime,'yyyy-mm-dd')}} 至 {{ timeFormat(planInfo.endTime,'yyyy-mm-dd')}} </text> 52 + <!-- <text class="value up-line-1">{{ planInfo && planInfo.validTime ? planInfo.validTime : '-' }}</text>-->
  53 + <text class="value up-line-1">{{ timeFormat(i.beginTime, 'yyyy-mm-dd') }} 至
  54 + {{ timeFormat(i.endTime, 'yyyy-mm-dd') }}
  55 + </text>
51 </view> 56 </view>
52 </view> 57 </view>
53 58
54 - <!-- 底部新增记录按钮 -->  
55 - <view class="fixed-bottom-btn-wrap"> 59 + <!-- 底部新增记录按钮 status=3-->
  60 + <view class="fixed-bottom-btn-wrap" v-if="finishState==1">
56 <up-button 61 <up-button
57 type="primary" 62 type="primary"
58 size="default" 63 size="default"
59 - @click="submit" 64 + @click="addNewRecord"
60 :style="{ width: '100%', height: '88rpx', fontSize: '32rpx', borderRadius: 0 }" 65 :style="{ width: '100%', height: '88rpx', fontSize: '32rpx', borderRadius: 0 }"
61 > 66 >
62 新增记录 67 新增记录
@@ -71,13 +76,15 @@ import { ref } from &#39;vue&#39;; @@ -71,13 +76,15 @@ import { ref } from &#39;vue&#39;;
71 import { onLoad, onShow } from '@dcloudio/uni-app'; 76 import { onLoad, onShow } from '@dcloudio/uni-app';
72 import { inspectionPlanDetail } from "@/api/patrol-manage/patrol-plan"; 77 import { inspectionPlanDetail } from "@/api/patrol-manage/patrol-plan";
73 // 响应式数据定义 78 // 响应式数据定义
74 -const planInfo = ref({}); 79 +const planInfo = ref([]);
75 const batchNo = ref('') 80 const batchNo = ref('')
  81 +const planNo = ref('')
76 const finishState = ref('') 82 const finishState = ref('')
77 // 页面加载接收参数 83 // 页面加载接收参数
78 onLoad((options) => { 84 onLoad((options) => {
79 console.log('计划ID:', options.batchNo); 85 console.log('计划ID:', options.batchNo);
80 batchNo.value = options.batchNo; 86 batchNo.value = options.batchNo;
  87 + // planNo.value = options.planNo;
81 finishState.value = options.status 88 finishState.value = options.status
82 }); 89 });
83 // 页面显示时请求数据 90 // 页面显示时请求数据
@@ -98,46 +105,32 @@ const getPlanDetail = async () =&gt; { @@ -98,46 +105,32 @@ const getPlanDetail = async () =&gt; {
98 } 105 }
99 console.log(queryData) 106 console.log(queryData)
100 const planInfoRes = await inspectionPlanDetail(queryData) 107 const planInfoRes = await inspectionPlanDetail(queryData)
101 - planInfo.value = planInfoRes[0] 108 + planInfo.value = planInfoRes
102 console.log(planInfoRes) 109 console.log(planInfoRes)
103 }; 110 };
104 // 跳转到已完成计划明细 111 // 跳转到已完成计划明细
105 -const gotoFinishPlanDetail = () => {  
106 - 112 +const gotoFinishPlanDetail = (i) => {
107 uni.navigateTo({ 113 uni.navigateTo({
108 - url: `/pages-sub/daily/patrol-manage/finish-plan-detail/index?batchNo=${planInfo.value.code}` 114 + url: `/pages-sub/daily/patrol-manage/finish-plan-detail/index?planNo=${i.planNo}`
109 }); 115 });
110 }; 116 };
111 // 新增记录 117 // 新增记录
112 const addNewRecord = () => { 118 const addNewRecord = () => {
113 - if (!planInfo.value || !planInfo.value.code) {  
114 - uni.showToast({  
115 - title: '计划数据未加载完成',  
116 - icon: 'none'  
117 - });  
118 - return;  
119 - }  
120 uni.navigateTo({ 119 uni.navigateTo({
121 - url: `/pages-sub/daily/patrol-manage/add-patrol-record/index?batchNo=${planInfo.value.code}` 120 + url: `/pages-sub/daily/patrol-manage/add-patrol-record/index?planNo=${planInfo.value[0].planNo}&batchNo=${batchNo.value}`,
122 }); 121 });
123 }; 122 };
124 </script> 123 </script>
125 124
126 <style scoped lang="scss"> 125 <style scoped lang="scss">
127 .pending-plan-detail { 126 .pending-plan-detail {
128 - background-color: #f8f8f8;  
129 - display: flex;  
130 - flex-direction: column;  
131 - min-height: 100vh; // 恢复最小高度,保证页面占满屏幕  
132 - padding-bottom: 88rpx; // 给底部按钮留空间 127 +
133 } 128 }
134 129
135 .detail-card { 130 .detail-card {
136 padding: 20rpx; 131 padding: 20rpx;
137 background-color: #fff; 132 background-color: #fff;
138 - border-radius: 12rpx;  
139 - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.03);  
140 - flex: 1; 133 + margin-bottom: 20px;
141 } 134 }
142 135
143 .detail-item { 136 .detail-item {
pages-sub/daily/quick-order/add-order.vue
@@ -108,14 +108,14 @@ @@ -108,14 +108,14 @@
108 </up-form-item> 108 </up-form-item>
109 109
110 <!-- 处理结果(不必填) --> 110 <!-- 处理结果(不必填) -->
111 - <up-form-item label="处理结果" prop="handleResultDesc" class="mt-20"> 111 + <up-form-item label="处理结果" prop="handleResult" class="mt-20">
112 <up-textarea 112 <up-textarea
113 placeholder="请输入处理结果描述(最多200字,选填)" 113 placeholder="请输入处理结果描述(最多200字,选填)"
114 - v-model="workOrderForm.handleResultDesc" 114 + v-model="workOrderForm.handleResult"
115 count 115 count
116 maxlength="200" 116 maxlength="200"
117 rows="4" 117 rows="4"
118 - @blur="() => $refs.workOrderFormRef.validateField('handleResultDesc')" 118 + @blur="() => $refs.workOrderFormRef.validateField('handleResult')"
119 ></up-textarea> 119 ></up-textarea>
120 </up-form-item> 120 </up-form-item>
121 121
@@ -151,17 +151,30 @@ @@ -151,17 +151,30 @@
151 </template> 151 </template>
152 152
153 <script setup lang="ts"> 153 <script setup lang="ts">
154 -import {ref} from 'vue' 154 +import {ref, inject} from 'vue'
  155 +
155 import type {UniFormRef} from '@/uni_modules/uview-plus/types' 156 import type {UniFormRef} from '@/uni_modules/uview-plus/types'
156 // 定义ref供选项式API使用 157 // 定义ref供选项式API使用
157 const workOrderFormRef = ref<UniFormRef>(null) 158 const workOrderFormRef = ref<UniFormRef>(null)
  159 +//
  160 +// // 注入全局字典工具
  161 +// const $dict = inject('$dict');
  162 +// const dictLabel = ref('');
  163 +// const modeList = ref([]);
  164 +//
  165 +
  166 +
158 </script> 167 </script>
159 168
160 <script lang="ts"> 169 <script lang="ts">
161 import {getRoadListByLatLng} from '@/api/common' 170 import {getRoadListByLatLng} from '@/api/common'
162 import {uploadImages} from '@/common/utils/upload'; 171 import {uploadImages} from '@/common/utils/upload';
163 import {createQuick} from '@/api/quick-order/quick-order' 172 import {createQuick} from '@/api/quick-order/quick-order'
164 -import {toast} from '@/uni_modules/uview-plus' 173 +// import { getCurrentInstance } from 'vue';
  174 +// const { proxy } = getCurrentInstance();
  175 +// const label = $dict.getDictLabel('ai_image_status', 10);
  176 +// const opdata = $dict.getDictLabel('ai_image_status');
  177 +// console.log(opdata)
165 178
166 export default { 179 export default {
167 data() { 180 data() {
@@ -176,9 +189,9 @@ export default { @@ -176,9 +189,9 @@ export default {
176 // 下拉列表数据 189 // 下拉列表数据
177 roadNameList: [], 190 roadNameList: [],
178 orderNameList: [ 191 orderNameList: [
179 - {name: '绿地卫生', code: 'ORDER001'},  
180 - {name: '设施维修', code: 'ORDER002'},  
181 - {name: '垃圾清理', code: 'ORDER003'} 192 + // {name: '绿地卫生', code: 'ORDER001'},
  193 + // {name: '设施维修', code: 'ORDER002'},
  194 + // {name: '垃圾清理', code: 'ORDER003'}
182 ], 195 ],
183 // 工单表单数据 196 // 工单表单数据
184 workOrderForm: { 197 workOrderForm: {
@@ -187,7 +200,7 @@ export default { @@ -187,7 +200,7 @@ export default {
187 workLocation: '', // 工单位置 200 workLocation: '', // 工单位置
188 orderName: '', // 工单名称 201 orderName: '', // 工单名称
189 problemDesc: '', // 情况描述 202 problemDesc: '', // 情况描述
190 - handleResultDesc: '', // 处理结果描述(不必填) 203 + handleResult: '', // 处理结果描述(不必填)
191 lat: 0, // 纬度 204 lat: 0, // 纬度
192 lon: 0 // 经度 205 lon: 0 // 经度
193 }, 206 },
@@ -239,6 +252,12 @@ export default { @@ -239,6 +252,12 @@ export default {
239 this.$refs.workOrderFormRef.setRules(this.workOrderFormRules) 252 this.$refs.workOrderFormRef.setRules(this.workOrderFormRules)
240 console.log('工单表单规则初始化完成') 253 console.log('工单表单规则初始化完成')
241 }, 254 },
  255 + onShow(){
  256 + console.log(uni.$dict.getDictLabel('ai_image_status', 20))
  257 + console.log(uni.$dict.getDictSimpleList('work_name'))
  258 + this.orderNameList = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('work_name'))
  259 + console.log(this.orderNameList)
  260 + },
242 methods: { 261 methods: {
243 /** 262 /**
244 * 返回上一页 263 * 返回上一页
@@ -406,6 +425,7 @@ export default { @@ -406,6 +425,7 @@ export default {
406 * 选择工单名称 425 * 选择工单名称
407 */ 426 */
408 handleOrderNameSelect(e) { 427 handleOrderNameSelect(e) {
  428 + console.log(e)
409 this.workOrderForm.orderName = e.name 429 this.workOrderForm.orderName = e.name
410 this.showOrderName = false 430 this.showOrderName = false
411 this.$refs.workOrderFormRef.validateField('orderName') 431 this.$refs.workOrderFormRef.validateField('orderName')
@@ -439,7 +459,7 @@ export default { @@ -439,7 +459,7 @@ export default {
439 imgs: this.getImgUrlList(this.problemImgsList), 459 imgs: this.getImgUrlList(this.problemImgsList),
440 longRangeImgList: this.getImgUrlList(this.completeImgsList), 460 longRangeImgList: this.getImgUrlList(this.completeImgsList),
441 remark: this.workOrderForm.problemDesc, 461 remark: this.workOrderForm.problemDesc,
442 - handleResultDesc: this.workOrderForm.handleResultDesc, 462 + handleResult: this.workOrderForm.handleResult,
443 latLonType: 2, 463 latLonType: 2,
444 lat: this.workOrderForm.lat, 464 lat: this.workOrderForm.lat,
445 lon: this.workOrderForm.lon, 465 lon: this.workOrderForm.lon,
@@ -461,7 +481,7 @@ export default { @@ -461,7 +481,7 @@ export default {
461 uni.showToast({ 481 uni.showToast({
462 title: '工单提交成功', 482 title: '工单提交成功',
463 icon: 'success', 483 icon: 'success',
464 - duration: 1500 484 + duration: 1000
465 }) 485 })
466 486
467 // 延迟跳转(等待提示框显示完成) 487 // 延迟跳转(等待提示框显示完成)
@@ -469,7 +489,7 @@ export default { @@ -469,7 +489,7 @@ export default {
469 uni.redirectTo({ 489 uni.redirectTo({
470 url: '/pages-sub/daily/quick-order/index' 490 url: '/pages-sub/daily/quick-order/index'
471 }) 491 })
472 - }, 1500) 492 + }, 1000)
473 } catch (error) { 493 } catch (error) {
474 // 隐藏加载框 494 // 隐藏加载框
475 uni.hideLoading() 495 uni.hideLoading()
pages-sub/daily/quick-order/order-detail.vue
@@ -88,7 +88,7 @@ @@ -88,7 +88,7 @@
88 <!-- 7. 处理结果 --> 88 <!-- 7. 处理结果 -->
89 <up-cell 89 <up-cell
90 title="处理结果" 90 title="处理结果"
91 - :value="orderDetail.handleResultDesc || '--'" 91 + :value="orderDetail.handleResult || '--'"
92 class="up-line-1" 92 class="up-line-1"
93 align="middle" 93 align="middle"
94 :border="false" 94 :border="false"
pages-sub/daily/quick-order/order-list.vue deleted
1 -<script setup lang="ts">  
2 -  
3 -</script>  
4 -  
5 -<template>  
6 -  
7 -</template>  
8 -  
9 -<style scoped lang="scss">  
10 -  
11 -</style>  
12 \ No newline at end of file 0 \ No newline at end of file
pages.json
@@ -39,7 +39,7 @@ @@ -39,7 +39,7 @@
39 { 39 {
40 "path": "patrol-manage/pending-plan-detail/index", 40 "path": "patrol-manage/pending-plan-detail/index",
41 "style": { 41 "style": {
42 - "navigationBarTitleText": "待完成计划明细", 42 + "navigationBarTitleText": "计划明细",
43 "enablePullDownRefresh": false 43 "enablePullDownRefresh": false
44 } 44 }
45 }, 45 },
pages/workbench/index.vue
@@ -41,6 +41,7 @@ @@ -41,6 +41,7 @@
41 v-for="(listItem,listIndex) in parentModule.children" 41 v-for="(listItem,listIndex) in parentModule.children"
42 :key="listItem.id" 42 :key="listItem.id"
43 @click="handleMenuClick(listItem)" 43 @click="handleMenuClick(listItem)"
  44 + class="grid-item-wrap"
44 > 45 >
45 <u-image 46 <u-image
46 :src="listItem.icon " 47 :src="listItem.icon "
@@ -53,7 +54,7 @@ @@ -53,7 +54,7 @@
53 <text class="grid-text">{{ listItem.name }}</text> 54 <text class="grid-text">{{ listItem.name }}</text>
54 </up-grid-item> 55 </up-grid-item>
55 </up-grid> 56 </up-grid>
56 - <up-toast ref="uToastRef"/> 57 +
57 </view> 58 </view>
58 </template> 59 </template>
59 </up-card> 60 </up-card>
@@ -160,6 +161,9 @@ const handleMenuClick = (item: MenuItem) =&gt; { @@ -160,6 +161,9 @@ const handleMenuClick = (item: MenuItem) =&gt; {
160 position: relative; 161 position: relative;
161 background-color: #fff; 162 background-color: #fff;
162 } 163 }
  164 +.grid-item-wrap{
  165 + margin-top: 20px;
  166 +}
163 167
164 /* 蓝色块样式 */ 168 /* 蓝色块样式 */
165 .blue-decor-block { 169 .blue-decor-block {
@@ -179,18 +183,6 @@ const handleMenuClick = (item: MenuItem) =&gt; { @@ -179,18 +183,6 @@ const handleMenuClick = (item: MenuItem) =&gt; {
179 padding-top: 160px; 183 padding-top: 160px;
180 } 184 }
181 185
182 -/* 第一张卡片层级 */  
183 -.first-card-position {  
184 - position: relative;  
185 - z-index: 3;  
186 -}  
187 -  
188 -/* 仅补充标题文字基础样式(确保显示,不修改卡片其他样式) */  
189 -.card-title-text {  
190 - font-size: 32rpx;  
191 - color: #333;  
192 - font-weight: 600;  
193 -}  
194 186
195 /* 网格文字样式(保留原始) */ 187 /* 网格文字样式(保留原始) */
196 .grid-text { 188 .grid-text {
@@ -200,8 +192,5 @@ const handleMenuClick = (item: MenuItem) =&gt; { @@ -200,8 +192,5 @@ const handleMenuClick = (item: MenuItem) =&gt; {
200 margin-top: 10rpx; 192 margin-top: 10rpx;
201 } 193 }
202 194
203 -/* 加载页样式优化(可选) */  
204 -:deep(.up-loading-page) {  
205 - background-color: rgba(255, 255, 255, 0.9);  
206 -} 195 +
207 </style> 196 </style>
208 \ No newline at end of file 197 \ No newline at end of file