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/im/manager/channel/material/data.ts | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 232 insertions(+), 0 deletions(-)
diff --git a/src/views/im/manager/channel/material/data.ts b/src/views/im/manager/channel/material/data.ts
new file mode 100644
index 0000000..b10de49
--- /dev/null
+++ b/src/views/im/manager/channel/material/data.ts
@@ -0,0 +1,232 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+
+import { markRaw } from 'vue';
+
+import { DICT_TYPE } from '#/packages/constants/src';
+import { getDictOptions } from '#/packages/effects/hooks/src';
+
+import { z } from '#/adapter/form';
+import { getRangePickerDefaultProps } from '#/utils';
+import { ChannelSelect } from '#/views/im/manager/channel/list/components';
+
+/** 鏂板/淇敼鐨勮〃鍗� */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'id',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'channelId',
+ label: '鎵�灞為閬�',
+ component: markRaw(ChannelSelect),
+ rules: 'selectRequired',
+ },
+ {
+ fieldName: 'type',
+ label: '鍐呭绫诲瀷',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.IM_CHANNEL_MATERIAL_TYPE, 'number'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ rules: z.number().default(1),
+ },
+ {
+ fieldName: 'title',
+ label: '鏍囬',
+ component: 'Input',
+ componentProps: {
+ maxlength: 128,
+ placeholder: '璇疯緭鍏ユ爣棰�',
+ },
+ rules: 'required',
+ },
+ {
+ fieldName: 'coverUrl',
+ label: '灏侀潰鍥�',
+ component: 'ImageUpload',
+ },
+ {
+ fieldName: 'summary',
+ label: '鎽樿',
+ component: 'Textarea',
+ componentProps: {
+ maxlength: 255,
+ placeholder: '璇疯緭鍏ユ憳瑕�',
+ rows: 2,
+ },
+ },
+ {
+ fieldName: 'content',
+ label: '姝f枃',
+ component: 'RichTextarea',
+ dependencies: {
+ triggerFields: ['type'],
+ show: (values) => values.type === 1,
+ },
+ },
+ {
+ fieldName: 'url',
+ label: '璺宠浆閾炬帴',
+ component: 'Input',
+ componentProps: {
+ placeholder: 'https://example.com/...',
+ },
+ dependencies: {
+ triggerFields: ['type'],
+ show: (values) => values.type !== 1,
+ },
+ },
+ ];
+}
+
+/** 鍒楄〃鐨勬悳绱㈣〃鍗� */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'channelId',
+ label: '棰戦亾',
+ component: markRaw(ChannelSelect),
+ componentProps: {
+ placeholder: '鍏ㄩ儴',
+ },
+ },
+ {
+ fieldName: 'title',
+ label: '鏍囬',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '鏍囬鍏抽敭瀛�',
+ },
+ },
+ ];
+}
+
+/** 鍒楄〃鐨勫瓧娈� */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ {
+ field: 'id',
+ title: '缂栧彿',
+ width: 80,
+ },
+ {
+ field: 'coverUrl',
+ title: '灏侀潰',
+ width: 80,
+ slots: { default: 'cover' },
+ },
+ {
+ field: 'channelName',
+ title: '棰戦亾',
+ minWidth: 120,
+ },
+ {
+ field: 'type',
+ title: '鍐呭绫诲瀷',
+ width: 110,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.IM_CHANNEL_MATERIAL_TYPE },
+ },
+ },
+ {
+ field: 'title',
+ title: '鏍囬',
+ minWidth: 180,
+ },
+ {
+ field: 'summary',
+ title: '鎽樿',
+ minWidth: 180,
+ },
+ {
+ field: 'createTime',
+ title: '鍒涘缓鏃堕棿',
+ minWidth: 180,
+ formatter: 'formatDateTime',
+ },
+ {
+ title: '鎿嶄綔',
+ width: 160,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ ];
+}
+
+/** 棰戦亾娑堟伅鎼滅储琛ㄥ崟 */
+export function useMessageGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'channelId',
+ label: '棰戦亾',
+ component: markRaw(ChannelSelect),
+ componentProps: {
+ placeholder: '鍏ㄩ儴',
+ },
+ },
+ {
+ fieldName: 'sendTime',
+ label: '鍙戦�佹椂闂�',
+ component: 'RangePicker',
+ componentProps: {
+ ...getRangePickerDefaultProps(),
+ allowClear: true,
+ },
+ },
+ ];
+}
+
+/** 棰戦亾娑堟伅瀛楁 */
+export function useMessageGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ {
+ field: 'id',
+ title: '缂栧彿',
+ width: 80,
+ },
+ {
+ field: 'materialCoverUrl',
+ title: '灏侀潰',
+ width: 80,
+ slots: { default: 'cover' },
+ },
+ {
+ field: 'channelName',
+ title: '棰戦亾',
+ minWidth: 120,
+ },
+ {
+ field: 'materialTitle',
+ title: '绱犳潗鏍囬',
+ minWidth: 180,
+ },
+ {
+ field: 'receiverUserIds',
+ title: '鎺ユ敹浜�',
+ width: 120,
+ slots: { default: 'receivers' },
+ },
+ {
+ field: 'sendTime',
+ title: '鍙戦�佹椂闂�',
+ minWidth: 180,
+ formatter: 'formatDateTime',
+ },
+ {
+ title: '鎿嶄綔',
+ width: 100,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ ];
+}
--
Gitblit v1.9.3