From 14817696a26eb142ccae03fa7c43050840e057f5 Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期一, 17 八月 2026 09:35:03 +0800
Subject: [PATCH] feat(mes): 优化生产订单与排产任务列表显示,新增启停工及校验逻辑 1. 生产订单列表展示优化 (WorkOrder) - 新增「生产状态」列,全局注册 `ORDER_PRODUCTION_STATUS` 常量并绑定系统动态字典。 - 彻底重构「工序生产进度」单元格显示:弃用臃肿的 Steps 组件,改为极简横向布局(彩色状态圆点 + 进度百分比),解决表格行高被强行撑开及内容截断问题,支持横向滚动。 - 优化「完成进度」列宽及展示样式,将百分比数值外置同行显示,更加直观。 2. 排产任务列表改造 (Task) - 顶部表头重构,由单一标题重构为「全部 / 未完成 / 已完成」的 Tabs 标签页切换结构。 - 重写数据过滤逻辑,剥离写死的 status 查询,改为使用 `scheduleStatus` 字段动态响应 Tabs 切换 (0: 未完成, 1: 已完成)。 3. 工单业务逻辑增强与状态流转 - 落实「工单查询逻辑设计方案」,优化底层的工单条件检索逻辑。 - 实现「添加工单启停功能」与「停工状态」,支持工单在执行过程中的暂停与恢复业务流转。 - 强化容错与防呆设计:操作「完成订单」时增加前置校验 `handleCheckFinish`,若生产状态为未完成,强制弹出二次确认 Modal,避免误操作。 # 相关讨论/参考方案 # - 添加工单启停功能 # - 停工状态功能设计方案 # - 工单查询逻辑设计方案 # - 工单完成进度显示优化
---
src/views/mes/pro/workorder/modules/form.vue | 96 +++++++++++++++++++++++++++++++-----------------
1 files changed, 62 insertions(+), 34 deletions(-)
diff --git a/src/views/mes/pro/workorder/modules/form.vue b/src/views/mes/pro/workorder/modules/form.vue
index c998ef8..2a51ec9 100644
--- a/src/views/mes/pro/workorder/modules/form.vue
+++ b/src/views/mes/pro/workorder/modules/form.vue
@@ -8,7 +8,6 @@
import { confirm, useVbenModal } from "@vben/common-ui";
import {
- BarcodeBizTypeEnum,
MesProWorkOrderStatusEnum,
} from "@vben/constants";
@@ -24,9 +23,13 @@
} from "#/api/mes/pro/workorder";
import { batchSaveWorkOrderProcess, getWorkOrderProcessListByWorkOrderId } from "#/api/mes/pro/workorder/process";
import { $t } from "#/locales";
- import { BarcodeDetail } from "#/views/wls/barcode/components";
+ // import { BarcodeDetail } from "#/views/wls/barcode/components";
import { useFormSchema } from "../data";
+ import PredictDelivery from "./ai/predict-delivery.vue";
+ import PredictDuration from "./ai/predict-duration.vue";
+ import PredictMaterial from "./ai/predict-material.vue";
+ import PredictRisk from "./ai/predict-risk.vue";
import ItemList from "./item-list.vue";
import ProcessList from "./process-list.vue";
@@ -35,7 +38,7 @@
const formData = ref<MesProWorkOrderApi.WorkOrder>();
const originalSnapshot = ref("");
const subTabsName = ref("process");
- const barcodeDetailRef = ref<InstanceType<typeof BarcodeDetail>>();
+ // const barcodeDetailRef = ref<InstanceType<typeof BarcodeDetail>>();
const processListRef = ref<InstanceType<typeof ProcessList>>();
const currentProductId = ref<number>(); // 褰撳墠閫変腑鐨勪骇鍝� ID锛堢敤浜庡伐搴忓姞杞斤級
const tempProcessList = ref<MesProWorkOrderProcessApi.WorkOrderProcess[]>([]); // 涓存椂宸ュ簭鍒楄〃
@@ -50,6 +53,12 @@
() =>
formType.value === "update" &&
formData.value?.status === MesProWorkOrderStatusEnum.PREPARE
+ );
+ const canUseAi = computed(
+ () =>
+ formData.value?.id &&
+ (formData.value?.status === MesProWorkOrderStatusEnum.PREPARE ||
+ formData.value?.status === MesProWorkOrderStatusEnum.CONFIRMED)
);
const getTitle = computed(() => {
const isChild = !!formData.value?.parentId;
@@ -99,19 +108,17 @@
});
/** 閲嶆柊鎸傝浇 schema 骞舵寜琛ㄥ崟鎬佹帶鍒跺簳閮ㄦ寜閽� */
+ const mainActionText = computed(() => {
+ if (isConfirm.value) return '纭';
+ if (isFinish.value) return '瀹屾垚';
+ return '鎻愪氦';
+ });
+
+ const showMainBtn = computed(() => isEditable.value || isConfirm.value || isFinish.value);
+
function applySchema() {
formApi.setState({ schema: useFormSchema(formType.value, formApi) });
- const showBtn = isEditable.value || isConfirm.value || isFinish.value;
- modalApi.setState({
- showConfirmButton: showBtn,
- confirmText: isConfirm.value || canConfirm.value
- ? '纭'
- : isFinish.value
- ? '瀹屾垚'
- : isCreateMode.value
- ? '鏂板'
- : '淇濆瓨',
- });
+ modalApi.setState({ showCancelButton: false, showConfirmButton: false });
}
/** 浠呬繚瀛橈紙涓嶆敼鍙樼姸鎬侊級 */
@@ -139,17 +146,17 @@
}
/** 鏌ョ湅璁㈠崟鏉$爜 */
- function handleBarcode() {
- if (!formData.value?.id) {
- return;
- }
- barcodeDetailRef.value?.openByBusiness(
- formData.value.id,
- BarcodeBizTypeEnum.WORKORDER,
- formData.value.code,
- formData.value.name
- );
- }
+ // function handleBarcode() {
+ // if (!formData.value?.id) {
+ // return;
+ // }
+ // barcodeDetailRef.value?.openByBusiness(
+ // formData.value.id,
+ // BarcodeBizTypeEnum.WORKORDER,
+ // formData.value.code,
+ // formData.value.name
+ // );
+ // }
/** 宸ュ簭鍒楄〃鍙樺寲鍥炶皟 */
function handleProcessListChange(list: MesProWorkOrderProcessApi.WorkOrderProcess[]) {
@@ -353,15 +360,36 @@
</Tabs>
</template>
<template #prepend-footer>
- <Button v-if="canConfirm"
- @click="handleSave">
- 淇濆瓨
- </Button>
- <Button v-if="formType === 'detail' && formData?.id"
- @click="handleBarcode">
- 鏌ョ湅鏉$爜
- </Button>
+ <div class="flex flex-auto flex-col gap-2">
+ <div v-if="canUseAi" class="flex items-center gap-2">
+ <PredictMaterial :work-order-id="formData!.id" />
+ <PredictDuration :work-order-id="formData!.id" />
+ <PredictRisk :work-order-id="formData!.id" />
+ <PredictDelivery :work-order-id="formData!.id" />
+ </div>
+ <div v-if="canUseAi && showMainBtn" class="border-t border-gray-200" />
+ <div class="flex items-center">
+ <Button v-if="showMainBtn"
+ type="primary"
+ @click="modalApi.onConfirm()">
+ {{ mainActionText }}
+ </Button>
+ </div>
+ </div>
+ </template>
+ <template #append-footer>
+ <div class="flex gap-2">
+ <Button v-if="canConfirm"
+ @click="handleSave">
+ 淇濆瓨淇敼
+ </Button>
+ <!-- <Button v-if="formType === 'detail' && formData?.id"
+ @click="handleBarcode">
+ 鏌ョ湅鏉$爜
+ </Button> -->
+ <Button @click="modalApi.close()">鍙栨秷</Button>
+ </div>
</template>
</Modal>
- <BarcodeDetail ref="barcodeDetailRef" />
+ <!-- <BarcodeDetail ref="barcodeDetailRef" /> -->
</template>
--
Gitblit v1.9.3