diff --git a/api/regional-order-manage/regional-order-manage.js b/api/regional-order-manage/regional-order-manage.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/api/regional-order-manage/regional-order-manage.js
diff --git a/common/utils/common.js b/common/utils/common.js
index 8eb1718..97fde66 100644
--- a/common/utils/common.js
+++ b/common/utils/common.js
@@ -55,4 +55,111 @@ export const buzStatusMap = {
"230" : '养护组长验收不通过',
"140" : '巡查员验收通过',
"240" : '巡查员验收不通过',
-}
\ No newline at end of file
+}
+
+
+/**
+ * 计算两个时间的时间差,返回格式化字符串(天/小时/分钟/秒,按需显示,无无效单位)
+ * @param {string | Date | number} startTime - 开始时间(时间字符串/Date对象/10位/13位时间戳)
+ * @param {string | Date | number} endTime - 结束时间(时间字符串/Date对象/10位/13位时间戳)
+ * @returns {string} - 格式化时间差字符串(如:3天5小时2分钟30秒、3小时2分钟30秒、2分钟30秒、30秒)
+ */
+export const calculateFormatTimeDiff = (startTime, endTime) => {
+ // 辅助函数:将任意合法时间格式转换为13位毫秒级时间戳
+ const to13BitTimestamp = (time) => {
+ let timestamp = 0;
+
+ // 情况1:数字类型(时间戳)
+ if (typeof time === 'number') {
+ const timeStr = time.toString();
+ if (timeStr.length === 10) {
+ timestamp = time * 1000; // 10位秒级转13位毫秒级
+ } else if (timeStr.length === 13) {
+ timestamp = time; // 13位毫秒级直接使用
+ } else {
+ console.error('非法时间戳:仅支持10位/13位数字', time);
+ return 0;
+ }
+ return timestamp;
+ }
+
+ // 情况2:Date对象
+ if (time instanceof Date) {
+ timestamp = time.getTime();
+ if (isNaN(timestamp)) {
+ console.error('无效的Date对象', time);
+ return 0;
+ }
+ return timestamp;
+ }
+
+ // 情况3:字符串类型
+ if (typeof time === 'string') {
+ const timeStr = time.trim().replace(/\//g, '-'); // 统一分隔符,兼容YYYY/MM/DD
+ const date = new Date(timeStr);
+ timestamp = date.getTime();
+ if (isNaN(timestamp)) {
+ console.error('无效的时间字符串', time);
+ return 0;
+ }
+ return timestamp;
+ }
+
+ // 非法类型
+ console.error('不支持的时间类型:仅支持string/Date/number', time);
+ return 0;
+ };
+
+ // 1. 统一转换为13位时间戳
+ const startTimestamp = to13BitTimestamp(startTime);
+ const endTimestamp = to13BitTimestamp(endTime);
+
+ // 2. 校验时间戳有效性
+ if (startTimestamp === 0 || endTimestamp === 0) {
+ return '0秒';
+ }
+
+ // 3. 计算总毫秒差(取绝对值,确保时间差为正数,不影响单位计算)
+ const totalMsDiff = Math.abs(endTimestamp - startTimestamp);
+
+ // 4. 定义时间单位换算(毫秒)
+ const oneDayMs = 24 * 60 * 60 * 1000;
+ const oneHourMs = 60 * 60 * 1000;
+ const oneMinuteMs = 60 * 1000;
+ const oneSecondMs = 1000;
+
+ // 5. 计算各单位的差值(向下取整,获取整数单位)
+ const days = Math.floor(totalMsDiff / oneDayMs);
+ const remainingMsAfterDay = totalMsDiff % oneDayMs; // 扣除天数后剩余的毫秒数
+
+ const hours = Math.floor(remainingMsAfterDay / oneHourMs);
+ const remainingMsAfterHour = remainingMsAfterDay % oneHourMs; // 扣除小时后剩余的毫秒数
+
+ const minutes = Math.floor(remainingMsAfterHour / oneMinuteMs);
+ const remainingMsAfterMinute = remainingMsAfterHour % oneMinuteMs; // 扣除分钟后剩余的毫秒数
+
+ const seconds = Math.floor(remainingMsAfterMinute / oneSecondMs);
+
+ // 6. 组装格式化字符串(按需添加单位,无无效单位)
+ const timeParts = [];
+ if (days > 0) {
+ timeParts.push(`${days}天`);
+ }
+ if (hours > 0 || (days > 0 && hours === 0)) { // 有天数时,小时即使为0也可保留(可选:删除 || 后的条件则不显示0小时)
+ timeParts.push(`${hours}小时`);
+ }
+ if (minutes > 0 || (timeParts.length > 0 && minutes === 0)) { // 有天/小时时,分钟即使为0也可保留(可选:删除 || 后的条件则不显示0分钟)
+ timeParts.push(`${minutes}分钟`);
+ }
+ // 秒数始终保留(即使为0,保证最后有一个有效单位)
+ timeParts.push(`${seconds}秒`);
+
+ // 7. 过滤掉可能存在的「0单位」(可选优化:避免出现“0小时”等无效字段)
+ const validTimeParts = timeParts.filter(part => {
+ const num = parseInt(part);
+ return num > 0 || (timeParts.length === 1 && num === 0); // 仅当只有秒数时,允许0秒
+ });
+
+ // 8. 拼接并返回结果
+ return validTimeParts.join('');
+};
\ No newline at end of file
diff --git a/common/utils/useUploadImgs.js b/common/utils/useUploadImgs.js
index 638881c..384e229 100644
--- a/common/utils/useUploadImgs.js
+++ b/common/utils/useUploadImgs.js
@@ -17,6 +17,8 @@ export function useUploadImgs(config) {
// 核心修复:初始化为纯数组,且格式适配u-upload
const imgList = ref([])
+ // 确保 rawImgList 响应式对象的初始值也是空数组
+ // const rawImgList = ref([]);
/**
* 新增:清空所有图片
diff --git a/pages-sub/daily/patrol-manage/add-patrol-record.vue b/pages-sub/daily/patrol-manage/add-patrol-record.vue
index 0610b23..70b49b4 100644
--- a/pages-sub/daily/patrol-manage/add-patrol-record.vue
+++ b/pages-sub/daily/patrol-manage/add-patrol-record.vue
@@ -1,14 +1,14 @@
-
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -82,38 +129,59 @@
:style="{ width: '100%', height: '88rpx', fontSize: '32rpx', borderRadius: 0 }"
>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages-sub/daily/quick-order/add-order.vue b/pages-sub/daily/quick-order/add-order.vue
index 73cd81a..8dcbaaa 100644
--- a/pages-sub/daily/quick-order/add-order.vue
+++ b/pages-sub/daily/quick-order/add-order.vue
@@ -89,6 +89,8 @@
@after-read="(event) => uploadImgs(event, 'problemImgsList')"
@delete="(event) => deleteImg(event, 'problemImgsList')"
multiple
+ width="70"
+ height="70"
:max-count="3"
upload-text="选择问题照片"
>
@@ -101,6 +103,8 @@
@after-read="(event) => uploadImgs(event, 'completeImgsList')"
@delete="(event) => deleteImg(event, 'completeImgsList')"
multiple
+ width="70"
+ height="70"
:max-count="3"
:sizeType="['compressed']"
upload-text="选择完成照片"
diff --git a/pages-sub/daily/quick-order/order-detail.vue b/pages-sub/daily/quick-order/order-detail.vue
index 764e42f..0e626a7 100644
--- a/pages-sub/daily/quick-order/order-detail.vue
+++ b/pages-sub/daily/quick-order/order-detail.vue
@@ -65,11 +65,11 @@
暂无问题照片
@@ -81,9 +81,10 @@
@@ -131,8 +132,8 @@ const getOrderDetail = async (id: string) => {
// 优化:确保图片数组为数组类型,避免非数组导致渲染错误
orderDetail.value = {
...res,
- problemImgsList: Array.isArray(res.problemImgsList) ? res.problemImgsList : [],
- completeImgsList: Array.isArray(res.completeImgsList) ? res.completeImgsList : []
+ problemsImgs: Array.isArray(res.problemsImgs) ? res.problemsImgs : [],
+ endImgs: Array.isArray(res.endImgs) ? res.endImgs : []
};
} catch (error) {
console.error('获取工单详情失败:', error);
diff --git a/pages-sub/problem/regional-order-manage/add-order.vue b/pages-sub/problem/regional-order-manage/add-order.vue
new file mode 100644
index 0000000..9648f9a
--- /dev/null
+++ b/pages-sub/problem/regional-order-manage/add-order.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages-sub/problem/regional-order-manage/index.vue b/pages-sub/problem/regional-order-manage/index.vue
new file mode 100644
index 0000000..05657c9
--- /dev/null
+++ b/pages-sub/problem/regional-order-manage/index.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages-sub/problem/regional-order-manage/order-detail.vue b/pages-sub/problem/regional-order-manage/order-detail.vue
new file mode 100644
index 0000000..9cfba2b
--- /dev/null
+++ b/pages-sub/problem/regional-order-manage/order-detail.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages-sub/problem/work-order-manage/add-order.vue b/pages-sub/problem/work-order-manage/add-order.vue
index 6f72b6f..7e22adf 100644
--- a/pages-sub/problem/work-order-manage/add-order.vue
+++ b/pages-sub/problem/work-order-manage/add-order.vue
@@ -103,7 +103,7 @@
problemImgs.rawImgList.value, (newVal) => {
- problemImgs.imgList = newVal
-}, { deep: true })
+// 无需再手动初始化普通数组,直接使用 ref 响应式数据
+if (!Array.isArray(problemImgs.rawImgList.value)) {
+ problemImgs.rawImgList.value = [];
+}
+
// ========== 页面状态 ==========
// 通用弹窗控制
@@ -318,7 +319,7 @@ const echoOrderData = (orderItem) => {
workOrderForm.problemDesc = orderItem.remark || '';
workOrderForm.lat = orderItem.lat || 0;
workOrderForm.lon = orderItem.lon || 0;
- workOrderForm.expectedFinishDate = orderItem.expectedFinishDate || timeFormat(new Date(), 'yyyy-mm-dd hh:MM:ss');
+ workOrderForm.expectedFinishDate = timeFormat(orderItem.expectedFinishDate, 'yyyy-mm-dd hh:MM:ss') || timeFormat(new Date(), 'yyyy-mm-dd hh:MM:ss');
// 2. 上传图片回显(兼容useUploadImgs格式)
if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) {
@@ -327,7 +328,7 @@ const echoOrderData = (orderItem) => {
name: `renew_img_${index}`,
status: 'success' // 标记为已上传状态
}));
- problemImgs.imgList = imgList;
+ problemImgs.imgList.value = imgList;
problemImgs.rawImgList.value = imgList;
}
@@ -513,7 +514,8 @@ const submitWorkOrder = async () => {
lonLatAddress: workOrderForm.workLocation,
pressingType: workOrderForm.pressingType,
orderName: workOrderForm.orderName,
- expectedFinishDate: workOrderForm.expectedFinishDate,
+ // expectedFinishDate: workOrderForm.expectedFinishDate,
+ expectedFinishDate: new Date(workOrderForm.expectedFinishDate).getTime(),
sourceId: 1,
sourceName: '园林',
busiLine: 'yl'
diff --git a/pages-sub/problem/work-order-manage/order-detail.vue b/pages-sub/problem/work-order-manage/order-detail.vue
index 9df621f..a293f5a 100644
--- a/pages-sub/problem/work-order-manage/order-detail.vue
+++ b/pages-sub/problem/work-order-manage/order-detail.vue
@@ -80,7 +80,7 @@
>
-
+
处理结果
@@ -109,15 +109,17 @@
@@ -198,6 +200,11 @@
至 {{ timeFormat(item.endTime, 'yyyy-mm-dd hh:MM:ss') }}
(处理中)
+
+
+ 总耗时:{{ calculateFormatTimeDiff(item.startTime , item.endTime) }}
+
+
描述:{{ getLimitReason(item.tasks && item.tasks[0]?.reason) }}
@@ -321,7 +328,7 @@ import {
getApprovalDetail,
universalApproval
} from '@/api/work-order-manage/work-order-manage';
-import { nextStepMap, buzStatusMap } from '@/common/utils/common'
+import { nextStepMap, buzStatusMap, calculateFormatTimeDiff } from '@/common/utils/common'
// 引入图片上传组合式函数
import { useUploadImgs } from '@/common/utils/useUploadImgs'
diff --git a/pages.json b/pages.json
index 33bf4e7..9c99689 100644
--- a/pages.json
+++ b/pages.json
@@ -134,8 +134,6 @@
"style": { "navigationBarTitleText": "分配工单" }
},
-
-
{
"path": "work-order-manage/order-detail",
"style": { "navigationBarTitleText": "工单详情" }
@@ -145,11 +143,24 @@
"style": { "navigationBarTitleText": "养护任务" }
},
-
-
{
"path": "problem-allot/index",
"style": { "navigationBarTitleText": "问题分配" }
+ },
+
+ {
+ "path": "regional-order-manage/index",
+ "style": { "navigationBarTitleText": "工单管理" }
+ },
+
+ {
+ "path": "regional-order-manage/add-order",
+ "style": { "navigationBarTitleText": "待派单" }
+ },
+
+ {
+ "path": "regional-order-manage/order-detail",
+ "style": { "navigationBarTitleText": "工单详情" }
}
]
},