From 3c4d241b9ef0d14a0cea5cd69b7919dfba1d14c5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 24 七月 2026 16:17:15 +0800
Subject: [PATCH] 银川 1.销售订单生产状态不匹配, 2.采购订单中没有退货状态字段,筛选项有退货状态 3.采购申请添加查看订单、查看审批功能 4.物料管理与mes产品管理的联动逻辑修改
---
src/views/erp/purchase/order/index.vue | 12 ++
src/views/mes/pro/task/data.ts | 7 +
src/components/file-preview/file-preview-modal.vue | 3
src/views/mes/qc/iqc/index.vue | 14 +++
src/api/mes/pro/task/index.ts | 1
src/views/wls/arrivalnotice/modules/line-list.vue | 2
src/views/erp/sale/order/data.ts | 15 ---
src/views/mes/pro/task/modules/task-list.vue | 2
src/views/mes/workbench/components/TaskListPanel.vue | 9 ++
src/views/mes/pro/workorder-center/index.vue | 4
src/views/erp/purchase/order/data.ts | 14 ---
src/views/erp/purchase/request/index.vue | 25 ++++++
src/views/erp/sale/order/index.vue | 11 ++
src/views/mes/pro/task/index.vue | 7 -
src/views/mes/pro/workorder/modules/form.vue | 4
src/views/mes/pro/task/modules/schedule-form.vue | 1
src/views/basicData/mdm/data.ts | 50 ++++++------
src/views/basicData/mdm/index.vue | 4 +
src/api/erp/purchase/request/index.ts | 1
src/views/mes/pro/task/modules/task-form.vue | 7 +
src/api/mdm/item/index.ts | 1
21 files changed, 121 insertions(+), 73 deletions(-)
diff --git a/src/api/erp/purchase/request/index.ts b/src/api/erp/purchase/request/index.ts
index f2c50e7..c446da4 100644
--- a/src/api/erp/purchase/request/index.ts
+++ b/src/api/erp/purchase/request/index.ts
@@ -25,6 +25,7 @@
productNames?: string; // 浜у搧鍚嶇О鍒楄〃
orderId?: number; // 鐢熸垚鐨勯噰璐鍗曠紪鍙�
orderNo?: string; // 鐢熸垚鐨勯噰璐鍗曞彿
+ processInstanceId?: number; // 瀹℃壒娴佺▼瀹炰緥缂栧彿
items?: PurchaseRequestItem[]; // 鐢宠鏄庣粏
createTime?: string; // 鍒涘缓鏃堕棿
}
diff --git a/src/api/mdm/item/index.ts b/src/api/mdm/item/index.ts
index 564287f..2f40e36 100644
--- a/src/api/mdm/item/index.ts
+++ b/src/api/mdm/item/index.ts
@@ -39,6 +39,7 @@
createTime?: string;
// 鍚屾鐩稿叧瀛楁
syncMes?: boolean;
+ syncedMes?: boolean; // 鏄惁宸插悓姝ュ埌 MES
// 鎵规灞炴�ч厤缃瓧娈�
produceDateFlag?: boolean;
expireDateFlag?: boolean;
diff --git a/src/api/mes/pro/task/index.ts b/src/api/mes/pro/task/index.ts
index f710da5..2e36c40 100644
--- a/src/api/mes/pro/task/index.ts
+++ b/src/api/mes/pro/task/index.ts
@@ -39,6 +39,7 @@
colorCode?: string; // 鐢樼壒鍥炬樉绀洪鑹�
status?: number; // 浠诲姟鐘舵��
checkFlag?: boolean; // 鏄惁璐ㄦ锛堟淳鐢熻嚜宸ヨ壓璺嚎宸ュ簭锛�
+ backflushFlag?: boolean; // 鏄惁鍊掑啿锛堟淳鐢熻嚜宸ヨ壓璺嚎宸ュ簭锛�
remark?: string; // 澶囨敞
}
diff --git a/src/components/file-preview/file-preview-modal.vue b/src/components/file-preview/file-preview-modal.vue
index 118d4d9..8ede19c 100644
--- a/src/components/file-preview/file-preview-modal.vue
+++ b/src/components/file-preview/file-preview-modal.vue
@@ -14,8 +14,7 @@
const VueOfficeExcel = defineAsyncComponent(() => import('@vue-office/excel'));
const VueOfficePptx = defineAsyncComponent(() => import('@vue-office/pptx'));
-// @vue-office/excel 闇�瑕侀澶栧鍏� CSS
-import '@vue-office/excel/lib/v3/style.css';
+// @vue-office/excel CSS 閫氳繃 vite.config.ts 鐨� css.preprocessorOptions 娉ㄥ叆
const props = withDefaults(
defineProps<{
diff --git a/src/views/basicData/mdm/data.ts b/src/views/basicData/mdm/data.ts
index 29076e7..953b9f2 100644
--- a/src/views/basicData/mdm/data.ts
+++ b/src/views/basicData/mdm/data.ts
@@ -282,17 +282,6 @@
rules: z.boolean().default(false),
},
{
- component: "Switch",
- fieldName: "syncMes",
- label: "鍚屾鍒� MES",
- componentProps: {
- class: "w-auto",
- checkedChildren: "鏄�",
- unCheckedChildren: "鍚�",
- },
- rules: z.boolean().default(false),
- },
- {
component: "InputNumber",
fieldName: "expiryDay",
label: "鏈夋晥鏈�(澶�)",
@@ -552,27 +541,36 @@
},
},
{
- field: "isBatchManaged",
- title: "鎵规绠$悊",
- minWidth: 80,
- slots: { default: "isBatchManaged" },
- },
- {
- field: "status",
- title: "鐘舵��",
- minWidth: 80,
- cellRender: {
- name: "CellDict",
- props: { type: DICT_TYPE.COMMON_STATUS },
- },
- },
- {
field: "createTime",
title: "鍒涘缓鏃堕棿",
minWidth: 180,
formatter: "formatDateTime",
},
{
+ field: "isBatchManaged",
+ title: "鎵规绠$悊",
+ width: 80,
+ fixed: "right",
+ slots: { default: "isBatchManaged" },
+ },
+ {
+ field: "syncedMes",
+ title: "鍚屾鐘舵��",
+ width: 90,
+ fixed: "right",
+ slots: { default: "syncedMes" },
+ },
+ {
+ field: "status",
+ title: "鐘舵��",
+ width: 80,
+ fixed: "right",
+ cellRender: {
+ name: "CellDict",
+ props: { type: DICT_TYPE.COMMON_STATUS },
+ },
+ },
+ {
title: "鎿嶄綔",
width: 180,
fixed: "right",
diff --git a/src/views/basicData/mdm/index.vue b/src/views/basicData/mdm/index.vue
index 4cc1c42..e59b39f 100644
--- a/src/views/basicData/mdm/index.vue
+++ b/src/views/basicData/mdm/index.vue
@@ -231,6 +231,10 @@
<Tag v-if="row.isBatchManaged" color="success">鏄�</Tag>
<Tag v-else>鍚�</Tag>
</template>
+ <template #syncedMes="{ row }">
+ <Tag v-if="row.syncedMes" color="success">宸插悓姝�</Tag>
+ <Tag v-else color="default">鏈悓姝�</Tag>
+ </template>
<template #actions="{ row }">
<TableAction
:actions="[
diff --git a/src/views/erp/purchase/order/data.ts b/src/views/erp/purchase/order/data.ts
index 9ff3b0d..0aa5868 100644
--- a/src/views/erp/purchase/order/data.ts
+++ b/src/views/erp/purchase/order/data.ts
@@ -330,20 +330,6 @@
allowClear: true,
},
},
- {
- fieldName: 'returnStatus',
- label: '閫�璐х姸鎬�',
- component: 'Select',
- componentProps: {
- options: [
- { label: '鏈��璐�', value: 0 },
- { label: '閮ㄥ垎閫�璐�', value: 1 },
- { label: '鍏ㄩ儴閫�璐�', value: 2 },
- ],
- placeholder: '璇烽�夋嫨閫�璐х姸鎬�',
- allowClear: true,
- },
- },
];
}
diff --git a/src/views/erp/purchase/order/index.vue b/src/views/erp/purchase/order/index.vue
index cc275a3..c56c84d 100644
--- a/src/views/erp/purchase/order/index.vue
+++ b/src/views/erp/purchase/order/index.vue
@@ -2,7 +2,8 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { ErpPurchaseOrderApi } from '#/api/erp/purchase/order';
-import { ref } from 'vue';
+import { onMounted, ref } from 'vue';
+import { useRoute } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
@@ -24,6 +25,8 @@
/** ERP 閲囪喘璁㈠崟鍒楄〃 */
defineOptions({ name: 'ErpPurchaseOrder' });
+
+const route = useRoute();
const [FormModal, formModalApi] = useVbenModal({
connectedComponent: Form,
@@ -146,6 +149,13 @@
checkboxChange: handleRowCheckboxChange,
},
});
+
+onMounted(() => {
+ const id = route.query.id;
+ if (id) {
+ formModalApi.setData({ formType: 'detail', id: Number(id) }).open();
+ }
+});
</script>
<template>
diff --git a/src/views/erp/purchase/request/index.vue b/src/views/erp/purchase/request/index.vue
index fb964be..27336e9 100644
--- a/src/views/erp/purchase/request/index.vue
+++ b/src/views/erp/purchase/request/index.vue
@@ -3,6 +3,7 @@
import type { ErpPurchaseRequestApi } from '#/api/erp/purchase/request';
import { ref } from 'vue';
+import { useRouter } from 'vue-router';
import { confirm, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
@@ -26,6 +27,8 @@
/** ERP 閲囪喘鐢宠鍒楄〃 */
defineOptions({ name: 'ErpPurchaseRequest' });
+
+const router = useRouter();
const [FormModal, formModalApi] = useVbenModal({
connectedComponent: Form,
@@ -115,6 +118,16 @@
/** 鏌ョ湅璇︽儏 */
function handleDetail(row: ErpPurchaseRequestApi.PurchaseRequest) {
formModalApi.setData({ formType: 'detail', id: row.id }).open();
+}
+
+/** 鏌ョ湅瀹℃壒璇︽儏 */
+function handleViewProcess(row: ErpPurchaseRequestApi.PurchaseRequest) {
+ router.push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } });
+}
+
+/** 鏌ョ湅閲囪喘璁㈠崟 */
+function handleViewOrder(row: ErpPurchaseRequestApi.PurchaseRequest) {
+ router.push({ name: 'ErpPurchaseOrder', query: { id: row.orderId } });
}
const [Grid, gridApi] = useVbenVxeGrid({
@@ -234,6 +247,18 @@
onClick: handleGenerateOrder.bind(null, row),
},
{
+ label: '鏌ョ湅瀹℃壒',
+ type: 'link',
+ ifShow: () => row.status !== 0,
+ onClick: handleViewProcess.bind(null, row),
+ },
+ {
+ label: '鏌ョ湅璁㈠崟',
+ type: 'link',
+ ifShow: () => !!row.orderId,
+ onClick: handleViewOrder.bind(null, row),
+ },
+ {
label: $t('common.delete'),
type: 'link',
danger: true,
diff --git a/src/views/erp/sale/order/data.ts b/src/views/erp/sale/order/data.ts
index 75bb9de..254f22a 100644
--- a/src/views/erp/sale/order/data.ts
+++ b/src/views/erp/sale/order/data.ts
@@ -399,24 +399,11 @@
component: 'Select',
componentProps: {
options: [
+ { label: '鏃犻渶鐢熶骇', value: -1 },
{ label: '鏈畬鎴�', value: 0 },
{ label: '宸插畬鎴�', value: 1 },
],
placeholder: '璇烽�夋嫨鐢熶骇鐘舵��',
- allowClear: true,
- },
- },
- {
- fieldName: 'returnStatus',
- label: '閫�璐х姸鎬�',
- component: 'Select',
- componentProps: {
- options: [
- { label: '鏈��璐�', value: 0 },
- { label: '閮ㄥ垎閫�璐�', value: 1 },
- { label: '鍏ㄩ儴閫�璐�', value: 2 },
- ],
- placeholder: '璇烽�夋嫨閫�璐х姸鎬�',
allowClear: true,
},
},
diff --git a/src/views/erp/sale/order/index.vue b/src/views/erp/sale/order/index.vue
index 2df5b89..0b3c24f 100644
--- a/src/views/erp/sale/order/index.vue
+++ b/src/views/erp/sale/order/index.vue
@@ -174,10 +174,19 @@
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
+ // 鐢熶骇鐘舵�佹悳绱㈠弬鏁拌浆鎹細-1(鏃犻渶鐢熶骇) 鈫� needProduction=0
+ const { productionStatus, ...rest } = formValues;
+ const params: Record<string, any> = { ...rest };
+ if (productionStatus === -1) {
+ params.needProduction = 0;
+ } else if (productionStatus != null) {
+ params.productionStatus = productionStatus;
+ params.needProduction = 1;
+ }
return await getSaleOrderPage({
pageNo: page.currentPage,
pageSize: page.pageSize,
- ...formValues,
+ ...params,
});
},
},
diff --git a/src/views/mes/pro/task/data.ts b/src/views/mes/pro/task/data.ts
index 605cd9c..30470f0 100644
--- a/src/views/mes/pro/task/data.ts
+++ b/src/views/mes/pro/task/data.ts
@@ -3,6 +3,8 @@
import type { MesProTaskApi } from '#/api/mes/pro/task';
import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder';
+import type { Ref } from 'vue';
+
import { markRaw } from 'vue';
import { DICT_TYPE } from '@vben/constants';
@@ -166,7 +168,7 @@
},
{
title: '鎿嶄綔',
- width: 100,
+ width: 160,
fixed: 'right',
slots: { default: 'actions' },
},
@@ -376,7 +378,7 @@
}
/** 鐢熶骇浠诲姟鏂板/淇敼鐨勮〃鍗� */
-export function useTaskFormSchema(formApi?: VbenFormApi): VbenFormSchema[] {
+export function useTaskFormSchema(formApi?: VbenFormApi, workOrderQuantity?: Ref<number | undefined>): VbenFormSchema[] {
return [
{
fieldName: 'workstationId',
@@ -391,6 +393,7 @@
fieldName: 'quantity',
label: '鎺掍骇鏁伴噺',
component: 'InputNumber',
+ description: () => workOrderQuantity?.value != null ? `璁㈠崟鏁伴噺锛�${workOrderQuantity.value}` : '',
componentProps: {
class: '!w-full',
min: 0.01,
diff --git a/src/views/mes/pro/task/index.vue b/src/views/mes/pro/task/index.vue
index cb0bb3a..f062c80 100644
--- a/src/views/mes/pro/task/index.vue
+++ b/src/views/mes/pro/task/index.vue
@@ -166,13 +166,6 @@
ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
onClick: handleSchedule.bind(null, row),
},
- {
- label: '涓�閿帓浜�',
- type: 'link',
- auth: ['mes:pro-task:create'],
- ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
- onClick: handleAutoSchedulePreview.bind(null, row),
- },
]"
/>
</template>
diff --git a/src/views/mes/pro/task/modules/schedule-form.vue b/src/views/mes/pro/task/modules/schedule-form.vue
index e51d7b7..8f67bd3 100644
--- a/src/views/mes/pro/task/modules/schedule-form.vue
+++ b/src/views/mes/pro/task/modules/schedule-form.vue
@@ -144,6 +144,7 @@
:process-id="rp.processId!"
:route-id="currentRouteId"
:work-order-id="workOrder.id!"
+ :work-order-quantity="workOrder.quantity"
/>
</Card>
</template>
diff --git a/src/views/mes/pro/task/modules/task-form.vue b/src/views/mes/pro/task/modules/task-form.vue
index d2cab18..fd83dcd 100644
--- a/src/views/mes/pro/task/modules/task-form.vue
+++ b/src/views/mes/pro/task/modules/task-form.vue
@@ -15,6 +15,7 @@
const emit = defineEmits(['success']);
const formData = ref<MesProTaskApi.Task>();
+const workOrderQuantity = ref<number>(); // 璁㈠崟鏁伴噺锛堢敤浜庢彁绀猴級
const context = ref<{
colorCode?: string;
itemId?: number;
@@ -67,16 +68,18 @@
async onOpenChange(isOpen: boolean) {
if (!isOpen) {
formData.value = undefined;
+ workOrderQuantity.value = undefined;
context.value = {};
return;
}
- formApi.setState({ schema: useTaskFormSchema(formApi) });
+ formApi.setState({ schema: useTaskFormSchema(formApi, workOrderQuantity) });
// 鍔犺浇鏁版嵁
const data = modalApi.getData<{
colorCode?: string;
id?: number;
itemId?: number;
processId?: number;
+ quantity?: number;
routeId?: number;
workOrderId?: number;
}>();
@@ -98,9 +101,11 @@
routeId: data.routeId,
workOrderId: data.workOrderId,
};
+ workOrderQuantity.value = data.quantity;
await formApi.setValues({
colorCode: data.colorCode || '#00AEF3',
duration: 1,
+ quantity: data.quantity,
});
},
});
diff --git a/src/views/mes/pro/task/modules/task-list.vue b/src/views/mes/pro/task/modules/task-list.vue
index 0cd3b46..d126366 100644
--- a/src/views/mes/pro/task/modules/task-list.vue
+++ b/src/views/mes/pro/task/modules/task-list.vue
@@ -22,6 +22,7 @@
processId: number;
routeId: number;
workOrderId: number;
+ workOrderQuantity?: number;
}>();
const editable = computed(() => !props.disabled); // 鏄惁鍙淮鎶や换鍔�
@@ -43,6 +44,7 @@
colorCode: props.colorCode,
itemId: props.itemId,
processId: props.processId,
+ quantity: props.workOrderQuantity,
routeId: props.routeId,
workOrderId: props.workOrderId,
})
diff --git a/src/views/mes/pro/workorder-center/index.vue b/src/views/mes/pro/workorder-center/index.vue
index b90ebb8..74b05b7 100644
--- a/src/views/mes/pro/workorder-center/index.vue
+++ b/src/views/mes/pro/workorder-center/index.vue
@@ -35,7 +35,7 @@
destroyOnClose: true,
});
-const [SchedulePreviewModal, schedulePreviewModalApi] = useVbenModal({
+const [SchedulePreviewModalWrap, schedulePreviewModalApi] = useVbenModal({
connectedComponent: SchedulePreviewModal,
destroyOnClose: true,
});
@@ -164,7 +164,7 @@
<template>
<Page auto-content-height>
<QuickFeedbackModal @success="handleFeedbackSuccess" />
- <SchedulePreviewModal @success="handleRefresh" />
+ <SchedulePreviewModalWrap @success="handleRefresh" />
<Grid table-title="宸ュ崟涓績">
<template #toolbar-tools>
diff --git a/src/views/mes/pro/workorder/modules/form.vue b/src/views/mes/pro/workorder/modules/form.vue
index 891a31e..5bedf66 100644
--- a/src/views/mes/pro/workorder/modules/form.vue
+++ b/src/views/mes/pro/workorder/modules/form.vue
@@ -110,7 +110,9 @@
? '纭'
: isFinish.value
? '瀹屾垚'
- : undefined,
+ : isCreateMode.value
+ ? '鏂板'
+ : undefined,
});
}
diff --git a/src/views/mes/qc/iqc/index.vue b/src/views/mes/qc/iqc/index.vue
index 9f766ca..44e0901 100644
--- a/src/views/mes/qc/iqc/index.vue
+++ b/src/views/mes/qc/iqc/index.vue
@@ -2,6 +2,9 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesQcIqcApi } from '#/api/mes/qc/iqc';
+import { onMounted } from 'vue';
+import { useRoute } from 'vue-router';
+
import { Page, useVbenModal } from '@vben/common-ui';
import { MesQcStatusEnum } from '@vben/constants';
import { downloadFileFromBlobPart } from '@vben/utils';
@@ -14,6 +17,10 @@
import { useGridColumns, useGridFormSchema } from './data';
import Form from './modules/form.vue';
+
+defineOptions({ name: 'MesQcIqc' });
+
+const route = useRoute();
const [FormModal, formModalApi] = useVbenModal({
connectedComponent: Form,
@@ -90,6 +97,13 @@
},
} as VxeTableGridOptions<MesQcIqcApi.Iqc>,
});
+
+onMounted(() => {
+ const id = route.query.id;
+ if (id) {
+ formModalApi.setData({ formType: 'detail', id: Number(id) }).open();
+ }
+});
</script>
<template>
diff --git a/src/views/mes/workbench/components/TaskListPanel.vue b/src/views/mes/workbench/components/TaskListPanel.vue
index 908292a..6530d39 100644
--- a/src/views/mes/workbench/components/TaskListPanel.vue
+++ b/src/views/mes/workbench/components/TaskListPanel.vue
@@ -19,13 +19,13 @@
const searchKeyword = ref('');
-/** 鍏堟寜宸ヤ綔绔欏伐搴忚繃婊わ紝鍐嶆寜鎼滅储鍏抽敭瀛楀尮閰� */
const filteredList = computed(() => {
const kw = searchKeyword.value.trim().toLowerCase();
if (!kw) return props.list;
return props.list.filter((row) => {
const fields = [
row.code,
+ row.name,
row.workOrderCode,
row.workOrderName,
row.itemCode,
@@ -86,6 +86,13 @@
>
璐ㄦ
</Tag>
+ <Tag
+ v-if="item.backflushFlag"
+ color="purple"
+ class="task-card__check-tag"
+ >
+ 鍊掑啿
+ </Tag>
<span
class="task-card__rate"
:style="{ color: getProgressColor(item.feedbackRate) }"
diff --git a/src/views/wls/arrivalnotice/modules/line-list.vue b/src/views/wls/arrivalnotice/modules/line-list.vue
index 78617a6..be40c57 100644
--- a/src/views/wls/arrivalnotice/modules/line-list.vue
+++ b/src/views/wls/arrivalnotice/modules/line-list.vue
@@ -72,7 +72,7 @@
/** 璺宠浆 IQC 妫�楠屽崟璇︽儏 */
function handleOpenIqc(row: MesWmArrivalNoticeLineApi.ArrivalNoticeLine) {
if (row.iqcId) {
- router.push({ path: '/mes/qc/iqc', query: { id: row.iqcId } });
+ router.push({ name: 'MesQcIqc', query: { id: row.iqcId } });
}
}
--
Gitblit v1.9.3