From d1791f762791428af91467b8855de83d54f015f9 Mon Sep 17 00:00:00 2001
From: zhuguifei <312353457@qq.com>
Date: 星期五, 17 四月 2026 15:23:21 +0800
Subject: [PATCH] feat: 1.新增物料、物料类型、材料检验统计等表维护功能  2.完善判定依据-判断依据明细  3.新增判断依据、物料管理等字典翻译类  4.成品物料批次-原始数据维护页面

---
 ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue |  510 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 260 insertions(+), 250 deletions(-)

diff --git a/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue b/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue
old mode 100644
new mode 100755
index 501cb94..2af78f4
--- a/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue
+++ b/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue
@@ -1,7 +1,9 @@
 <script setup lang="ts">
-import { computed, ref, watch } from 'vue';
+import { computed, onMounted, ref, watch } from 'vue';
 import { jsonClone } from '@sa/utils';
 import { fetchCreateBatch, fetchUpdateBatch } from '@/service/api/qm/batch';
+import { fetchGetMatList } from '@/service/api/md/mat';
+import { fetchGetJudgeList } from '@/service/api/qm/judge';
 import { useFormRules, useNaiveForm } from '@/hooks/common/form';
 import { $t } from '@/locales';
 
@@ -31,27 +33,41 @@
 const { formRef, validate, restoreValidation } = useNaiveForm();
 const { createRequiredRule } = useFormRules();
 
-// 绫诲瀷閫夐」锛欰-鍒朵笣 B-鎴愬瀷 C-鍗峰寘 D-灏佺 E-绯栭鏂�
-const typOptions = [
-  { label: '鍒朵笣', value: 'A' },
-  { label: '鎴愬瀷', value: 'B' },
-  { label: '鍗峰寘', value: 'C' },
-  { label: '灏佺', value: 'D' },
-  { label: '绯栭鏂�', value: 'E' }
+const matOptions = ref<CommonType.Option[]>([]);
+const judgeOptions = ref<CommonType.Option[]>([]);
+const stateOptions = [
+  { label: '姝e父', value: '0' },
+  { label: '鍋滅敤', value: '1' }
 ];
 
-// 鍙嶉MES閫夐」锛�0-鏈笂浼爉es 1-宸蹭笂浼� 3-浠嶮ES涓嬭浇
-const flagOptions = [
-  { label: '鏈笂浼爉es', value: '0' },
-  { label: '宸蹭笂浼�', value: '1' },
-  { label: '浠嶮ES涓嬭浇', value: '3' }
-];
+async function getMatOptions() {
+  const { data, error } = await fetchGetMatList({ tid: '1' as any, pageSize: 1000 });
+  if (!error) {
+    matOptions.value = data.rows.map(item => ({
+      label: item.name,
+      value: item.code
+    }));
+  }
+}
 
-// 绫诲埆閫夐」锛�0-鎴愬搧 1-杈呮潗
-const categoryOptions = [
-  { label: '鎴愬搧', value: '0' },
-  { label: '杈呮潗', value: '1' }
-];
+async function getJudgeOptions(matCode?: string | null) {
+  if (!matCode) {
+    judgeOptions.value = [];
+    return;
+  }
+  const params: Api.Qm.JudgeSearchParams = { category: 0, pageSize: 1000, matCode };
+  const { data, error } = await fetchGetJudgeList(params);
+  if (!error) {
+    judgeOptions.value = data.rows.map(item => ({
+      label: item.judgeName,
+      value: String(item.id)
+    })) as CommonType.Option[];
+  }
+}
+
+onMounted(() => {
+  getMatOptions();
+});
 
 const title = computed(() => {
   const titles: Record<NaiveUI.TableOperateType, string> = {
@@ -67,63 +83,61 @@
 
 function createDefaultModel(): Model {
   return {
-      id: '',
-      batchCode: '',
-      batchName: '',
-      typ: '',
-      eqpCode: '',
-      matCode: '',
-      judgeCode: '',
-      batchDate: null,
-      isflag: '',
-      enabled: '',
-      totalNum: null,
-      results: '',
-      approver: '',
-      auditor: '',
-      creater: '',
-      tabDate: null,
-      verName: '',
-      verCode: '',
-      archDate: '',
-      flag: '',
-      toMesDate: null,
-      fromMesDate: null,
-      deleted: null,
-      batchDes: '',
-      category: '',
-      makeno: '',
-      shifteqpno: '',
-      boxno: '',
-      pid: '',
-      reviewer: '',
-      rvcount: null,
-      state: '',
-      reviewTime: null,
-      auditTime: null,
-      spec: '',
-      approveTime: null,
-      unit: '',
-      arrivalTime: null,
-      storagePlace: '',
-      checker: '',
-      receiveTime: null,
-      inspTime: null,
-      storer: '',
-      isverify: '',
-      ischk: '',
-      bak1: '',
-      bak2: ''
+    id: '',
+    batchCode: '',
+    batchName: '',
+    typ: '0',
+    eqpCode: '',
+    matCode: null,
+    judgeCode: '',
+    batchDate: null,
+    isflag: '0',
+    enabled: '1',
+    totalNum: null,
+    results: '',
+    approver: '',
+    auditor: '',
+    creater: '',
+    tabDate: null,
+    verName: '',
+    verCode: '',
+    archDate: '',
+    flag: '0',
+    toMesDate: null,
+    fromMesDate: null,
+    deleted: 0,
+    batchDes: '',
+    category: '0',
+    makeno: '',
+    shifteqpno: '',
+    boxno: '',
+    pid: '',
+    reviewer: '',
+    rvcount: null,
+    state: '0',
+    reviewTime: null,
+    auditTime: null,
+    spec: '',
+    approveTime: null,
+    unit: '',
+    arrivalTime: null,
+    storagePlace: '',
+    checker: '',
+    receiveTime: null,
+    inspTime: null,
+    storer: '',
+    isverify: '',
+    ischk: '',
+    bak1: '',
+    bak2: ''
   };
 }
 
-type RuleKey = Extract<
-  keyof Model,
-  | 'id'
->;
+type RuleKey = Extract<keyof Model, 'batchCode' | 'matCode'>;
 
 const rules: Record<RuleKey, App.Global.FormRule> = {
-  id: createRequiredRule('缂栫爜涓嶈兘涓虹┖'),
+  batchCode: createRequiredRule('鎵规鍙蜂笉鑳戒负绌�'),
+  matCode: createRequiredRule('鐗屽彿涓嶈兘涓虹┖')
 };
 
 function handleUpdateModelWhenEdit() {
@@ -141,16 +155,159 @@
 async function handleSubmit() {
   await validate();
 
-  const { id, batchCode, batchName, typ, eqpCode, matCode, judgeCode, batchDate, isflag, enabled, totalNum, results, approver, auditor, creater, tabDate, verName, verCode, archDate, flag, toMesDate, fromMesDate, deleted, batchDes, category, makeno, shifteqpno, boxno, pid, reviewer, rvcount, state, reviewTime, auditTime, spec, approveTime, unit, arrivalTime, storagePlace, checker, receiveTime, inspTime, storer, isverify, ischk, bak1, bak2 } = model.value;
+  const {
+    id,
+    batchCode,
+    batchName,
+    typ,
+    eqpCode,
+    matCode,
+    judgeCode,
+    batchDate,
+    isflag,
+    enabled,
+    totalNum,
+    results,
+    approver,
+    auditor,
+    creater,
+    tabDate,
+    verName,
+    verCode,
+    archDate,
+    flag,
+    toMesDate,
+    fromMesDate,
+    deleted,
+    batchDes,
+    category,
+    makeno,
+    shifteqpno,
+    boxno,
+    pid,
+    reviewer,
+    rvcount,
+    state,
+    reviewTime,
+    auditTime,
+    spec,
+    approveTime,
+    unit,
+    arrivalTime,
+    storagePlace,
+    checker,
+    receiveTime,
+    inspTime,
+    storer,
+    isverify,
+    ischk,
+    bak1,
+    bak2
+  } = model.value;
 
   // request
   if (props.operateType === 'add') {
-    const { error } = await fetchCreateBatch({ batchCode, batchName, typ, eqpCode, matCode, judgeCode, batchDate, isflag, enabled, totalNum, results, approver, auditor, creater, tabDate, verName, verCode, archDate, flag, toMesDate, fromMesDate, deleted, batchDes, category, makeno, shifteqpno, boxno, pid, reviewer, rvcount, state, reviewTime, auditTime, spec, approveTime, unit, arrivalTime, storagePlace, checker, receiveTime, inspTime, storer, isverify, ischk, bak1, bak2 });
+    const { error } = await fetchCreateBatch({
+      batchCode,
+      batchName,
+      typ,
+      eqpCode,
+      matCode,
+      judgeCode,
+      batchDate,
+      isflag,
+      enabled,
+      totalNum,
+      results,
+      approver,
+      auditor,
+      creater,
+      tabDate,
+      verName,
+      verCode,
+      archDate,
+      flag,
+      toMesDate,
+      fromMesDate,
+      deleted,
+      batchDes,
+      category,
+      makeno,
+      shifteqpno,
+      boxno,
+      pid,
+      reviewer,
+      rvcount,
+      state,
+      reviewTime,
+      auditTime,
+      spec,
+      approveTime,
+      unit,
+      arrivalTime,
+      storagePlace,
+      checker,
+      receiveTime,
+      inspTime,
+      storer,
+      isverify,
+      ischk,
+      bak1,
+      bak2
+    });
     if (error) return;
   }
 
   if (props.operateType === 'edit') {
-    const { error } = await fetchUpdateBatch({ id, batchCode, batchName, typ, eqpCode, matCode, judgeCode, batchDate, isflag, enabled, totalNum, results, approver, auditor, creater, tabDate, verName, verCode, archDate, flag, toMesDate, fromMesDate, deleted, batchDes, category, makeno, shifteqpno, boxno, pid, reviewer, rvcount, state, reviewTime, auditTime, spec, approveTime, unit, arrivalTime, storagePlace, checker, receiveTime, inspTime, storer, isverify, ischk, bak1, bak2 });
+    const { error } = await fetchUpdateBatch({
+      id,
+      batchCode,
+      batchName,
+      typ,
+      eqpCode,
+      matCode,
+      judgeCode,
+      batchDate,
+      isflag,
+      enabled,
+      totalNum,
+      results,
+      approver,
+      auditor,
+      creater,
+      tabDate,
+      verName,
+      verCode,
+      archDate,
+      flag,
+      toMesDate,
+      fromMesDate,
+      deleted,
+      batchDes,
+      category,
+      makeno,
+      shifteqpno,
+      boxno,
+      pid,
+      reviewer,
+      rvcount,
+      state,
+      reviewTime,
+      auditTime,
+      spec,
+      approveTime,
+      unit,
+      arrivalTime,
+      storagePlace,
+      checker,
+      receiveTime,
+      inspTime,
+      storer,
+      isverify,
+      ischk,
+      bak1,
+      bak2
+    });
     if (error) return;
   }
 
@@ -163,201 +320,54 @@
   if (visible.value) {
     handleUpdateModelWhenEdit();
     restoreValidation();
+    getJudgeOptions(model.value.matCode);
   }
 });
+
+watch(
+  () => model.value.matCode,
+  newVal => {
+    if (visible.value) {
+      model.value.judgeCode = '';
+      getJudgeOptions(newVal);
+    }
+  }
+);
 </script>
 
 <template>
   <NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
     <NDrawerContent :title="title" :native-scrollbar="false" closable>
-      <NForm ref="formRef" :model="model" :rules="rules">
-        <NFormItem label="鎵规浠g爜" path="batchCode">
-          <NInput v-model:value="model.batchCode" placeholder="璇疯緭鍏ユ壒娆′唬鐮�" />
-        </NFormItem>
-        <NFormItem label="鎵规鍚嶇О" path="batchName">
-          <NInput v-model:value="model.batchName" placeholder="璇疯緭鍏ユ壒娆″悕绉�" />
-        </NFormItem>
-        <NFormItem label="绫诲瀷" path="typ">
-          <NSelect v-model:value="model.typ" :options="typOptions" placeholder="璇烽�夋嫨绫诲瀷" clearable />
-        </NFormItem>
-        <NFormItem label="鏈哄彴浠g爜" path="eqpCode">
-          <NInput v-model:value="model.eqpCode" placeholder="璇疯緭鍏ユ満鍙颁唬鐮�" />
+      <NForm ref="formRef" :model="model" :rules="rules" label-placement="left" :label-width="100">
+        <NFormItem label="鎵规鍙�" path="batchCode">
+          <NInput v-model:value="model.batchCode" placeholder="璇疯緭鍏ユ壒娆″彿" />
         </NFormItem>
         <NFormItem label="鐗屽彿" path="matCode">
-          <NInput v-model:value="model.matCode" placeholder="璇疯緭鍏ョ墝鍙�" />
+          <NSelect v-model:value="model.matCode" :options="matOptions" placeholder="璇烽�夋嫨鐗屽彿" clearable filterable />
         </NFormItem>
-        <NFormItem label="鍒ゅ畾渚濇嵁浠g爜" path="judgeCode">
-          <NInput v-model:value="model.judgeCode" placeholder="璇疯緭鍏ュ垽瀹氫緷鎹唬鐮�" />
-        </NFormItem>
-        <NFormItem label="鎵规鐢熸垚鏃ユ湡" path="batchDate">
-          <NDatePicker
-            v-model:formatted-value="model.batchDate"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
+        <NFormItem label="鍒ゅ畾渚濇嵁" path="judgeCode">
+          <NSelect
+            v-model:value="model.judgeCode"
+            :options="judgeOptions"
+            placeholder="璇烽�夋嫨鍒ゅ畾渚濇嵁"
             clearable
-          />
-        </NFormItem>
-        <NFormItem label="浣跨敤鏍囧織" path="isflag">
-          <NInput v-model:value="model.isflag" placeholder="璇疯緭鍏ヤ娇鐢ㄦ爣蹇�" />
-        </NFormItem>
-        <NFormItem label="鍚敤鏍囧織" path="enabled">
-          <NInput v-model:value="model.enabled" placeholder="璇疯緭鍏ュ惎鐢ㄦ爣蹇�" />
-        </NFormItem>
-        <NFormItem label="鍒拌揣鎬婚噺" path="totalNum">
-          <NInput v-model:value="model.totalNum" placeholder="璇疯緭鍏ュ埌璐ф�婚噺" />
-        </NFormItem>
-        <NFormItem label="缁煎悎鍒ゅ畾" path="results">
-          <NInput v-model:value="model.results" placeholder="璇疯緭鍏ョ患鍚堝垽瀹�" />
-        </NFormItem>
-        <NFormItem label="鎵瑰噯浜�" path="approver">
-          <NInput v-model:value="model.approver" placeholder="璇疯緭鍏ユ壒鍑嗕汉" />
-        </NFormItem>
-        <NFormItem label="瀹℃牳浜�" path="auditor">
-          <NInput v-model:value="model.auditor" placeholder="璇疯緭鍏ュ鏍镐汉" />
-        </NFormItem>
-        <NFormItem label="鍒涘缓浜�" path="creater">
-          <NInput v-model:value="model.creater" placeholder="璇疯緭鍏ュ垱寤轰汉" />
-        </NFormItem>
-        <NFormItem label="鍒惰〃鏃ユ湡" path="tabDate">
-          <NDatePicker
-            v-model:formatted-value="model.tabDate"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
-        </NFormItem>
-        <NFormItem label="鐗堟湰鍚嶇О" path="verName">
-          <NInput v-model:value="model.verName" placeholder="璇疯緭鍏ョ増鏈悕绉�" />
-        </NFormItem>
-        <NFormItem label="鐗堟湰缂栧彿" path="verCode">
-          <NInput v-model:value="model.verCode" placeholder="璇疯緭鍏ョ増鏈紪鍙�" />
-        </NFormItem>
-        <NFormItem label="淇濆瓨鏈�" path="archDate">
-          <NInput v-model:value="model.archDate" placeholder="璇疯緭鍏ヤ繚瀛樻湡" />
-        </NFormItem>
-        <NFormItem label="鍙嶉MES" path="flag">
-          <NSelect v-model:value="model.flag" :options="flagOptions" placeholder="璇烽�夋嫨鍙嶉MES" clearable />
-        </NFormItem>
-        <NFormItem label="涓婁紶MES鏃堕棿" path="toMesDate">
-          <NDatePicker
-            v-model:formatted-value="model.toMesDate"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
-        </NFormItem>
-        <NFormItem label="浠嶮ES鏃堕棿涓嬭浇" path="fromMesDate">
-          <NDatePicker
-            v-model:formatted-value="model.fromMesDate"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
-        </NFormItem>
-        <NFormItem label="鍒犻櫎鏍囧織" path="deleted">
-          <NInput v-model:value="model.deleted" placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇�" />
-        </NFormItem>
-        <NFormItem label="鎵规鎻忚堪" path="batchDes">
-          <NInput v-model:value="model.batchDes" placeholder="璇疯緭鍏ユ壒娆℃弿杩�" />
-        </NFormItem>
-        <NFormItem label="绫诲埆" path="category">
-          <NSelect v-model:value="model.category" :options="categoryOptions" placeholder="璇烽�夋嫨绫诲埆" clearable />
-        </NFormItem>
-        <NFormItem label="鍗峰埗宸ュ彿" path="makeno">
-          <NInput v-model:value="model.makeno" placeholder="璇疯緭鍏ュ嵎鍒跺伐鍙�" />
-        </NFormItem>
-        <NFormItem label="鐝鏈哄彿" path="shifteqpno">
-          <NInput v-model:value="model.shifteqpno" placeholder="璇疯緭鍏ョ彮娆℃満鍙�" />
-        </NFormItem>
-        <NFormItem label="瑁呯鍙�" path="boxno">
-          <NInput v-model:value="model.boxno" placeholder="璇疯緭鍏ヨ绠卞彿" />
-        </NFormItem>
-        <NFormItem label="鐖舵壒娆″彿" path="pid">
-          <NInput v-model:value="model.pid" placeholder="璇疯緭鍏ョ埗鎵规鍙�" />
-        </NFormItem>
-        <NFormItem label="澶嶆牳浜�" path="reviewer">
-          <NInput v-model:value="model.reviewer" placeholder="璇疯緭鍏ュ鏍镐汉" />
-        </NFormItem>
-        <NFormItem label="澶嶆娆℃暟" path="rvcount">
-          <NInput v-model:value="model.rvcount" placeholder="璇疯緭鍏ュ妫�娆℃暟" />
-        </NFormItem>
-        <NFormItem label="鎵规鐘舵��" path="state">
-          <NInput v-model:value="model.state" placeholder="璇疯緭鍏ユ壒娆$姸鎬�" />
-        </NFormItem>
-        <NFormItem label="澶嶆牳鏃ユ湡" path="reviewTime">
-          <NDatePicker
-            v-model:formatted-value="model.reviewTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
-        </NFormItem>
-        <NFormItem label="瀹℃牳鏃ユ湡" path="auditTime">
-          <NDatePicker
-            v-model:formatted-value="model.auditTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
+            filterable
           />
         </NFormItem>
         <NFormItem label="瑙勬牸" path="spec">
           <NInput v-model:value="model.spec" placeholder="璇疯緭鍏ヨ鏍�" />
         </NFormItem>
-        <NFormItem label="鎵瑰噯鏃堕棿" path="approveTime">
-          <NDatePicker
-            v-model:formatted-value="model.approveTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
+        <NFormItem label="瑁呯鍙�" path="boxno">
+          <NInput v-model:value="model.boxno" placeholder="璇疯緭鍏ヨ绠卞彿" />
         </NFormItem>
-        <NFormItem label="鍒拌揣鍗曚綅" path="unit">
-          <NInput v-model:value="model.unit" placeholder="璇疯緭鍏ュ埌璐у崟浣�" />
+        <NFormItem label="鐝鏈哄彿" path="shifteqpno">
+          <NInput v-model:value="model.shifteqpno" placeholder="璇疯緭鍏ョ彮娆℃満鍙�" />
         </NFormItem>
-        <NFormItem label="鍒拌揣鏃ユ湡" path="arrivalTime">
-          <NDatePicker
-            v-model:formatted-value="model.arrivalTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
+        <NFormItem label="鎻忚堪" path="batchDes">
+          <NInput v-model:value="model.batchDes" placeholder="璇疯緭鍏ユ弿杩�" />
         </NFormItem>
-        <NFormItem label="瀛樻斁鍦扮偣" path="storagePlace">
-          <NInput v-model:value="model.storagePlace" placeholder="璇疯緭鍏ュ瓨鏀惧湴鐐�" />
-        </NFormItem>
-        <NFormItem label="妫�楠屽憳" path="checker">
-          <NInput v-model:value="model.checker" placeholder="璇疯緭鍏ユ楠屽憳" />
-        </NFormItem>
-        <NFormItem label="鎺ュ崟鏃ユ湡" path="receiveTime">
-          <NDatePicker
-            v-model:formatted-value="model.receiveTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
-        </NFormItem>
-        <NFormItem label="鎶ユ鏃ユ湡" path="inspTime">
-          <NDatePicker
-            v-model:formatted-value="model.inspTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            clearable
-          />
-        </NFormItem>
-        <NFormItem label="浠撳簱淇濈鍛�" path="storer">
-          <NInput v-model:value="model.storer" placeholder="璇疯緭鍏ヤ粨搴撲繚绠″憳" />
-        </NFormItem>
-        <NFormItem label="鏄惁楠岃瘉" path="isverify">
-          <NInput v-model:value="model.isverify" placeholder="璇疯緭鍏ユ槸鍚﹂獙璇�" />
-        </NFormItem>
-        <NFormItem label="鏄惁妫�楠�" path="ischk">
-          <NInput v-model:value="model.ischk" placeholder="璇疯緭鍏ユ槸鍚︽楠�" />
-        </NFormItem>
-        <NFormItem label="澶囩敤1" path="bak1">
-          <NInput v-model:value="model.bak1" placeholder="璇疯緭鍏ュ鐢�1" />
-        </NFormItem>
-        <NFormItem label="澶囩敤2" path="bak2">
-          <NInput v-model:value="model.bak2" placeholder="璇疯緭鍏ュ鐢�2" />
+        <NFormItem label="鐘舵��" path="state">
+          <NSelect v-model:value="model.state" :options="stateOptions" placeholder="璇烽�夋嫨鐘舵��" clearable />
         </NFormItem>
       </NForm>
       <template #footer>

--
Gitblit v1.9.3