zck 9 hónapja
szülő
commit
f2e1896177

+ 1 - 1
src/pinia/modules/user.js

@@ -242,7 +242,7 @@ const LoginIn = async(loginInfo) => {
 	  text: '登录中,请稍候...',
 	})
     try {
-		const res = await login(loginInfo)
+		const res = await login2(loginInfo)
 		console.log(res)
       if (res.code === 0) {
         setUserInfo(res.data.user)

+ 50 - 13
src/view/inventory/ruku.vue

@@ -192,8 +192,8 @@
 				<el-table-column  align="left" label="定额门幅" prop="定额门幅" width="90" />
 				<el-table-column  align="left" label="实际门幅" prop="实际门幅" width="90"/>
 				<el-table-column  align="left" label="入库数量" prop="入库数量" width="90"/>
-				<el-table-column  align="left" label="累计入库数量" prop="入仓总数量" width="110"/>
-				<el-table-column  align="left" label="库存数量" prop="库存数量" width="90"/>
+				<!-- <el-table-column  align="left" label="累计入库数量" prop="入仓总数量" width="110"/>
+				<el-table-column  align="left" label="库存数量" prop="库存数量" width="90"/> -->
 				<!-- <el-table-column  align="left" label="领用数量" prop="领用数量" width="90"/> -->
 				<el-table-column  align="left" label="单位" prop="单位" width="60"/>
 				<el-table-column  align="left" label="关联订单" prop="关联订单" width="300"/>
@@ -438,6 +438,17 @@ const tableRowClick = async (row) => {
             单位:'米',
 			实际门幅:Detailres.data.实际门幅
         };
+		// 计算 danjutableData 中相同物料名称和颜色的入库数量总和
+		const { 物料名称, 颜色 } = mianliaotabData.value;
+    const totalOutbound = danjutableData.value
+      .filter(
+        (item) =>
+          item.物料名称 === 物料名称 && item.颜色 === 颜色
+      )
+      .reduce((sum, item) => sum + Number(item.入库数量), 0);
+
+    // 更新 mianliaotabData 的库存数量
+    mianliaotabData.value.库存数量 += totalOutbound;
     } else {
         console.error('获取详情数据失败:', Detailres.msg);
     }
@@ -446,18 +457,45 @@ const danjutableData = ref([]); // 使用 ref 定义响应式数组
 
 //添加按钮
 const dj_Dialog = () => {
-  if (mianliaotabData.value) {
-    // 判断实际门幅是否为空
-    const 实际门幅 = mianliaotabData.value.实际门幅 || mianliaotabData.value.定额门幅;
-
-    // 将 mianliaotabData 的数据添加到 danjutableData
-    danjutableData.value.push({
-      ...mianliaotabData.value, // 展开 mianliaotabData 的所有属性
-      实际门幅, // 使用计算后的实际门幅
-    });
-  } else {
+  // 确保 mianliaotabData 和 mianliaotabData.value 存在
+  if (!mianliaotabData || !mianliaotabData.value) {
     console.error('mianliaotabData 为空,无法添加到 danjutableData');
+    return;
   }
+
+  // 检查入库数量是否为空或无效
+  if (
+    mianliaotabData.value.入库数量 === '' ||
+    mianliaotabData.value.入库数量 === undefined ||
+    mianliaotabData.value.入库数量 === '0'
+  ) {
+    ElMessage({ type: 'warning', message: '请填写入库数量' });
+    return;
+  }
+
+  // 获取 mianliaotabData 的物料名称和颜色
+  const { 物料名称, 颜色, 入库数量, 库存数量 } = mianliaotabData.value;
+
+  // 计算 danjutableData 中相同物料名称和颜色的入库数量总和
+  const totalOutbound = danjutableData.value
+    .filter(
+      (item) =>
+        item.物料名称 === 物料名称 && item.颜色 === 颜色
+    )
+    .reduce((sum, item) => sum + Number(item.入库数量), 0);
+
+  // 计算总入库数量(danjutableData 中的总和 + mianliaotabData 中的入库数量)
+  const totalOutboundQuantity = totalOutbound + Number(入库数量);
+
+
+
+  // 如果通过检查,将数据添加到 danjutableData
+  danjutableData.value.push({
+    ...mianliaotabData.value,
+    实际门幅: mianliaotabData.value.实际门幅 || mianliaotabData.value.定额门幅,
+  });
+  mianliaotabData.value.入库数量 = '';
+  mianliaotabData.value.库存数量 = mianliaotabData.value.库存数量 + Number(入库数量);
 };
 
 //操作移除按钮
@@ -619,7 +657,6 @@ const res_bomenterDialog = async () => {
       ElMessage({ type: 'error', message: '入库失败' });
     }
   } catch (error) {
-    console.error('出库失败:', error);
     ElMessage({ type: 'error', message: '入库失败' });
   }
 }

+ 64 - 22
src/view/inventory/tuihuan.vue

@@ -198,8 +198,8 @@
                   <el-table-column  align="left" label="定额门幅" prop="定额门幅" width="90" />
                   <el-table-column  align="left" label="实际门幅" prop="实际门幅" width="90"/>
                   <el-table-column  align="left" label="退还数量" prop="退还数量" width="90"/>
-                  <el-table-column  align="left" label="累计退还数量" prop="入仓总数量" width="110"/>
-                  <el-table-column  align="left" label="库存数量" prop="库存数量" width="90"/>
+                  <!-- <el-table-column  align="left" label="累计退还数量" prop="入仓总数量" width="110"/>
+                  <el-table-column  align="left" label="库存数量" prop="库存数量" width="90"/> -->
                   <!-- <el-table-column  align="left" label="领用数量" prop="领用数量" width="90"/> -->
                   <el-table-column  align="left" label="单位" prop="单位" width="60"/>
                   <el-table-column  align="left" label="关联订单" prop="关联订单" width="300"/>
@@ -278,7 +278,7 @@
   import {ref, reactive} from 'vue'
   import {getInputDetail,
   TuihuoReport,
-  InputOrderSearch,outReport,FabricDetail,gitReceiptNumber,FabricDetaillist,FabricDetaildel,ReceiptList,ReceiptDetail} from '@/api/mes/job'
+  OutOrderSearch,outReport,FabricDetail,gitReceiptNumber,FabricDetaillist,FabricDetaildel,ReceiptList,ReceiptDetail} from '@/api/mes/job'
   import { ElMessage, ElMessageBox,ElUpload, ElButton } from 'element-plus';
   import { useUserStore } from '@/pinia/modules/user'
   // import { get } from 'scriptjs';
@@ -325,7 +325,7 @@
   const handleInput = async ()=>{
       restableData.splice(0, restableData.length);//清空表格
       //订单信息数据查询【接口】
-      const orderSearchdata = await InputOrderSearch({search:add_searchInfo.value});
+      const orderSearchdata = await OutOrderSearch({search:add_searchInfo.value});
       if(orderSearchdata.data.length === 1){
           _orderid.value = orderSearchdata.data[0]['订单编号']
           add_searchInfo.value = orderSearchdata.data[0]['订单编号']
@@ -335,7 +335,7 @@
           ddhformData.ks = orderSearchdata.data[0]['款式']
           add_lysearchInfo.value = add_searchInfo.value
           
-          const gitReceiptNumberdata = await gitReceiptNumber({number:'CK'});
+          const gitReceiptNumberdata = await gitReceiptNumber({number:'TH'});
           danhao.value = gitReceiptNumberdata.data.number
           chukuren.value = userStore.userInfo.nickName
           riqi.value = currentDates 
@@ -348,7 +348,7 @@
   const add_onSubmit = async ()=>{
       //清空表格
       restableData.splice(0, restableData.length);
-      const orderSearchdata = await InputOrderSearch({search:add_searchInfo.value});
+      const orderSearchdata = await OutOrderSearch({search:add_searchInfo.value});
       if(orderSearchdata.data.length === 1){
           res_bomdialogFormVisible.value = true
           _orderid.value = orderSearchdata.data[0]['订单编号']
@@ -359,7 +359,7 @@
           ddhformData.ks = orderSearchdata.data[0]['款式']
           add_lysearchInfo.value = add_searchInfo.value
           
-          const gitReceiptNumberdata = await gitReceiptNumber({number:'CK'});
+          const gitReceiptNumberdata = await gitReceiptNumber({number:'TH'});
           console.log(gitReceiptNumberdata)
           danhao.value = gitReceiptNumberdata.data.number
           chukuren.value = userStore.userInfo.nickName
@@ -437,7 +437,7 @@
               定额用料: Detailres.data.定额用料,
               定额门幅: Detailres.data.BOM_定额门幅,
               退还数量: Detailres.data.退还数量,
-              入仓总数量: Detailres.data.入仓总量?Detailres.data.入仓总量:0,
+              入仓总数量: Detailres.data.退还数量?Detailres.data.退还数量:0,
               库存数量: Detailres.data.库存数量?Detailres.data.库存数量:0,
               领用数量: Detailres.data.领用数量,
               关联订单: Detailres.data.关联订单,
@@ -445,6 +445,17 @@
               单位:'米',
               实际门幅:Detailres.data.实际门幅
           };
+           // 计算 danjutableData 中相同物料名称和颜色的退还数量总和
+    const { 物料名称, 颜色 } = mianliaotabData.value;
+    const totalOutbound = danjutableData.value
+      .filter(
+        (item) =>
+          item.物料名称 === 物料名称 && item.颜色 === 颜色
+      )
+      .reduce((sum, item) => sum + Number(item.退还数量), 0);
+
+    // 更新 mianliaotabData 的库存数量
+    mianliaotabData.value.库存数量 -= totalOutbound;
       } else {
           console.error('获取详情数据失败:', Detailres.msg);
       }
@@ -453,19 +464,50 @@
   
   //添加按钮
   const dj_Dialog = () => {
-    if (mianliaotabData.value) {
-      // 判断实际门幅是否为空
-      const 实际门幅 = mianliaotabData.value.实际门幅 || mianliaotabData.value.定额门幅;
-  
-      // 将 mianliaotabData 的数据添加到 danjutableData
-      danjutableData.value.push({
-        ...mianliaotabData.value, // 展开 mianliaotabData 的所有属性
-        实际门幅, // 使用计算后的实际门幅
-      });
-    } else {
-      console.error('mianliaotabData 为空,无法添加到 danjutableData');
-    }
-  };
+  // 确保 mianliaotabData 和 mianliaotabData.value 存在
+  if (!mianliaotabData || !mianliaotabData.value) {
+    console.error('mianliaotabData 为空,无法添加到 danjutableData');
+    return;
+  }
+
+  // 检查退还数量是否为空或无效
+  if (
+    mianliaotabData.value.退还数量 === '' ||
+    mianliaotabData.value.退还数量 === undefined ||
+    mianliaotabData.value.退还数量 === '0'
+  ) {
+    ElMessage({ type: 'warning', message: '请填写退还数量' });
+    return;
+  }
+
+  // 获取 mianliaotabData 的物料名称和颜色
+  const { 物料名称, 颜色, 退还数量, 库存数量 } = mianliaotabData.value;
+
+  // 计算 danjutableData 中相同物料名称和颜色的退还数量总和
+  const totalOutbound = danjutableData.value
+    .filter(
+      (item) =>
+        item.物料名称 === 物料名称 && item.颜色 === 颜色
+    )
+    .reduce((sum, item) => sum + Number(item.退还数量), 0);
+
+  // 计算总退还数量(danjutableData 中的总和 + mianliaotabData 中的退还数量)
+  const totalOutboundQuantity = totalOutbound + Number(退还数量);
+
+  // 判断总退还数量是否大于库存数量
+  if (totalOutboundQuantity > 库存数量) {
+    ElMessage({ type: 'warning', message: '退还数量不能大于库存数量' });
+    return;
+  }
+
+  // 如果通过检查,将数据添加到 danjutableData
+  danjutableData.value.push({
+    ...mianliaotabData.value,
+    实际门幅: mianliaotabData.value.实际门幅 || mianliaotabData.value.定额门幅,
+  });
+  mianliaotabData.value.退还数量 = '';
+  mianliaotabData.value.库存数量 = mianliaotabData.value.库存数量 - Number(退还数量);
+};
   
   //操作移除按钮
   const deleteRow = (index) => {
@@ -525,7 +567,7 @@
           }, 100);//100毫秒
           
           //获取单据编号接口
-          const gitReceiptNumberdata = await gitReceiptNumber({number:'CK'});
+          const gitReceiptNumberdata = await gitReceiptNumber({number:'TH'});
           danhao.value = gitReceiptNumberdata.data.number
           chukuren.value = userStore.userInfo.nickName
           riqi.value = currentDates

+ 76 - 111
src/view/login/index.vue

@@ -46,7 +46,7 @@
                   placeholder="请输入密码"
                 />
               </el-form-item>
-              <el-form-item
+              <!-- <el-form-item
                 v-if="loginFormData.openCaptcha"
                 prop="captcha"
                 class="mb-6"
@@ -68,7 +68,7 @@
                     />
                   </div>
                 </div>
-              </el-form-item>
+              </el-form-item> -->
               <el-form-item class="mb-6">
                 <el-button
                   class="shadow shadow-blue-600 h-11 w-full"
@@ -120,7 +120,7 @@
   </div>
 </template>
 <script setup>
-import { captcha } from "@/api/user";
+// import { captcha } from "@/api/user";
 import { checkDB } from "@/api/initdb";
 import BottomInfo from "@/view/layout/bottomInfo/bottomInfo.vue";
 import { reactive, ref } from "vue";
@@ -151,42 +151,44 @@ const checkPassword = (rule, value, callback) => {
 
 // 获取验证码
 const loginVerify = () => {
-  captcha({}).then(async (ele) => {
-    rules.captcha.push({
-      max: ele.data.captchaLength,
-      min: ele.data.captchaLength,
-      message: `请输入${ele.data.captchaLength}位验证码`,
-      trigger: "blur",
-    });
-    picPath.value = ele.data.picPath;
-    loginFormData.captchaId = ele.data.captchaId;
-    loginFormData.openCaptcha = ele.data.openCaptcha;
-    // console.log();
-  });
+  // captcha({}).then(async (ele) => {
+  //   rules.captcha.push({
+  //     max: ele.data.captchaLength,
+  //     min: ele.data.captchaLength,
+  //     message: `请输入${ele.data.captchaLength}位验证码`,
+  //     trigger: "blur",
+  //   });
+  //   picPath.value = ele.data.picPath;
+  //   loginFormData.captchaId = ele.data.captchaId;
+  //   loginFormData.openCaptcha = ele.data.openCaptcha;
+  //   // console.log();
+  // });
 };
 loginVerify();
 
+
 // 登录相关操作
 const loginForm = ref(null);
 const picPath = ref("");
 const loginFormData = reactive({
   username: "",
   password: "",
-  captcha: "",
-  captchaId: "",
+  captcha: "443188",
+  captchaId: "0FZfnUtAOrdXvTETkJRc",
   openCaptcha: false,
 });
 const rules = reactive({
   username: [{ validator: checkUsername, trigger: "blur" }],
   password: [{ validator: checkPassword, trigger: "blur" }],
-  captcha: [
-    {
-      message: "验证码格式不正确",
-      trigger: "blur",
-    },
-  ],
+  // captcha: [
+  //   {
+  //     message: "验证码格式不正确",
+  //     trigger: "blur",
+  //   },
+  // ],
 });
 
+
 const userStore = useUserStore();
 const login = async () => {
   return await userStore.LoginIn(loginFormData);
@@ -210,103 +212,66 @@ const submitForm = () => {
   });
 };
 
-// const LoginIn2 = reactive({
-// 	username: "CF01",
-// 	password: "123456",
-// 	captcha: "443188",
-// 	captchaId: "0FZfnUtAOrdXvTETkJRc",
-// 	openCaptcha: false,
-// });
+
 
 // 跳转初始化
-// const checkInit = async () => {
-// 	console.log("跳转初始化")
-//   const res = await checkDB();
-//   // console.log(res)
-//   if (res.code === 0) {
-//     if (res.data?.needInit) {
-//       userStore.NeedInit();
-//       router.push({ name: "Init" });
-//     } else {
-//       ElMessage({
-//         type: "info",
-//         message: "已配置数据库信息,无法初始化",
-//       });
-//     }
-//   }
-// };
+const checkInit = async () => {
+  const res = await checkDB();
+  if (res.code === 0) {
+    if (res.data?.needInit) {
+      userStore.NeedInit();
+      router.push({ name: "Init" });
+    } else {
+      ElMessage({
+        type: "info",
+        message: "已配置数据库信息,无法初始化",
+      });
+    }
+  }
+};
 
-// userStore.LoginIn2({
-//    username: "",
-//    password: "123456",
-//    captcha: "443188",
-//    captchaId: "0FZfnUtAOrdXvTETkJRc",
-//    openCaptcha: false,
-//  });
+const GetAddr = () => {
+  var xmlhttp = null;
+  var res;
+  if (window.XMLHttpRequest) {
+    xmlhttp = new XMLHttpRequest();
+  } else if (window.ActiveXObject) {
+    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+  }
+  // 设置回调函数
+  xmlhttp.onreadystatechange = function () {
+    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
+      res = eval("(" + xmlhttp.response + ")");
+      let result = "";
+      for (let i = 0; i < res.macAddress.length; i++) {
+        if (i % 2 === 0 && i !== 0) {
+          result += "-"; // 根据实际需求修改分隔符
+        }
+        result += res.macAddress[i];
+      }
+
+    }
+  };
+  // 打开一个连接
+  xmlhttp.open("get", "http://127.0.0.1:8090/init");
+  // 发送请求
+  xmlhttp.send();
+};
+// 在页面加载时获取MAC地址并进行自动登录
+GetAddr();
 
 
-// const MAC = ref()
-//  const GetAddr = () => {
-//  var xmlhttp = null;
-//  var res;
-//  if (window.XMLHttpRequest) {
-//    xmlhttp = new XMLHttpRequest();
-//  } else if (window.ActiveXObject) {
-//    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
-//  }
-//  // 设置回调函数
-//  xmlhttp.onreadystatechange = function () {
-//    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
-//  	res = eval("(" + xmlhttp.response + ")");
-//  	let result = "";
-//  	for (let i = 0; i < res.macAddress.length; i++) {
-//  	  if (i % 2 === 0 && i !== 0) {
-//  		result += "-"; // 根据实际需求修改分隔符
-//  	  }
-//  	  result += res.macAddress[i];
-//  	}
-//  	MAC = result
-// 		console.log(23,MAC)
-//    }
-//  };
-//  // 打开一个连接
-//  xmlhttp.open("get", "http://127.0.0.1:8090/init");
-//  // 发送请求
-//  xmlhttp.send();
-//  };
-//  // 在页面加载时获取MAC地址并进行自动登录
-//  GetAddr();
 
-// const Machine = ref('')
-// const MachineMac = async () => {
-	
-	
-// 	console.log(MAC)
-//   const response = await getMachineMac({sys_sbID:MAC});
-//   console.log("通过MAC地址获取机台",response.data.机台号)
-//   Machine.value = response.data.机台号
-  
- 
- 
 
-// };
-// MachineMac();
 
- // userStore.LoginIn2({
- //    username: "username",
- //    password: "123456",
- //    captcha: "443188",
- //    captchaId: "0FZfnUtAOrdXvTETkJRc",
- //    openCaptcha: false,
- //  }); 
 
-// userStore.LoginIn2({
-//    username: "username",
-//    password: "123456",
-//    captcha: "443188",
-//    captchaId: "0FZfnUtAOrdXvTETkJRc",
-//    openCaptcha: false,
-//  });
+userStore.LoginIn2({
+	   username: "CF01#",
+	   password: "123456",
+	   captcha: "443188",
+	   captchaId: "0FZfnUtAOrdXvTETkJRc",
+	   openCaptcha: false,
+	 });
 </script>
 
 

+ 120 - 75
src/view/performance/chukubaogong.vue

@@ -192,8 +192,8 @@
 				  <el-table-column  align="left" label="定额门幅" prop="定额门幅" width="90" />
 				  <el-table-column  align="left" label="实际门幅" prop="实际门幅" width="90"/>
 				  <el-table-column  align="left" label="出库数量" prop="出库数量" width="90"/>
-				  <el-table-column  align="left" label="累计出库数量" prop="入仓总数量" width="110"/>
-				  <el-table-column  align="left" label="库存数量" prop="库存数量" width="90"/>
+				  <!-- <el-table-column  align="left" label="累计出库数量" prop="入仓总数量" width="110"/>
+				  <el-table-column  align="left" label="库存数量" prop="库存数量" width="90"/> -->
 				  <!-- <el-table-column  align="left" label="领用数量" prop="领用数量" width="90"/> -->
 				  <el-table-column  align="left" label="单位" prop="单位" width="60"/>
 				  <el-table-column  align="left" label="关联订单" prop="关联订单" width="300"/>
@@ -382,83 +382,128 @@
   });
   //表格行点击
   const tableRowClick = async (row) => {
-	  setTimeout(() => {
-			const inputElement = document.getElementById('rksl');
-			if (inputElement) {
-				inputElement.focus();		
-			}
-	  }, 100);//100毫秒
-	  
-	  add_searchInfo.value = row.订单编号;
-	  _orderid.value = row.订单编号;
-	  _kh.value = row.生产款号;
-  
-	  ddhformData.glbh = row['关联编号'];
-	  ddhformData.ddh = row['订单编号'];
-	  ddhformData.kh = row['客户编号'];
-	  ddhformData.sckh = row['生产款号'];
-	  ddhformData.wlbh = row['物料编码'];
-	  ddhformData.ks = row['款式'];
-  
-	  console.log(row.value);
-	  console.log(row.关联编号);
-	  console.log(row.订单编号);
-	  console.log(row.物料编码);
-  
-	  // 获取详情数据
-	  const Detailres = await getInputDetail({
-		  关联编号: row.关联编号,
-		  订单编号: row.订单编号,
-		  物料编码: row.物料编码
-	  });
-  
-	  console.log(Detailres);
-  
-	  // 将 Detailres.data 中的数据赋值给 mianliaotabData
-	  if (Detailres.code === 0 && Detailres.data) {
-		  mianliaotabData.value = {
-			  订单编号: row.订单编号,
-			  客户编号: row.客户编号,
-			  生产款号: row.生产款号,
-			  款式: row.款式,
-			  物料编号: Detailres.data.BOM_物料编码,
-			  物料名称: Detailres.data.BOM_物料名称,
-			  关联号: Detailres.data.关联编号,
-			  批次号: Detailres.data.批次号,
-			  计划用料: Detailres.data.计划用料,
-			  计划门幅: Detailres.data.BOM_计划门幅,
-			  定额用料: Detailres.data.定额用料,
-			  定额门幅: Detailres.data.BOM_定额门幅,
-			  出库数量: Detailres.data.出库数量,
-			  入仓总数量: Detailres.data.入仓总量?Detailres.data.入仓总量:0,
-			  库存数量: Detailres.data.库存数量?Detailres.data.库存数量:0,
-			  领用数量: Detailres.data.领用数量,
-			  关联订单: Detailres.data.关联订单,
-			  颜色: Detailres.data.BOM_颜色,
-			  单位:'米',
-			  实际门幅:Detailres.data.实际门幅
-		  };
-	  } else {
-		  console.error('获取详情数据失败:', Detailres.msg);
-	  }
-  };
+  // 延迟 100 毫秒后聚焦输入框
+  setTimeout(() => {
+    const inputElement = document.getElementById('rksl');
+    if (inputElement) {
+      inputElement.focus();
+    }
+  }, 100);
+
+  // 更新表单数据
+  add_searchInfo.value = row.订单编号;
+  _orderid.value = row.订单编号;
+  _kh.value = row.生产款号;
+
+  ddhformData.glbh = row['关联编号'];
+  ddhformData.ddh = row['订单编号'];
+  ddhformData.kh = row['客户编号'];
+  ddhformData.sckh = row['生产款号'];
+  ddhformData.wlbh = row['物料编码'];
+  ddhformData.ks = row['款式'];
+
+  console.log(row.value);
+  console.log(row.关联编号);
+  console.log(row.订单编号);
+  console.log(row.物料编码);
+
+  // 获取详情数据
+  const Detailres = await getInputDetail({
+    关联编号: row.关联编号,
+    订单编号: row.订单编号,
+    物料编码: row.物料编码,
+  });
+
+  console.log(Detailres);
+
+  // 如果获取详情数据成功
+  if (Detailres.code === 0 && Detailres.data) {
+    // 初始化 mianliaotabData
+    mianliaotabData.value = {
+      订单编号: row.订单编号,
+      客户编号: row.客户编号,
+      生产款号: row.生产款号,
+      款式: row.款式,
+      物料编号: Detailres.data.BOM_物料编码,
+      物料名称: Detailres.data.BOM_物料名称,
+      关联号: Detailres.data.关联编号,
+      批次号: Detailres.data.批次号,
+      计划用料: Detailres.data.计划用料,
+      计划门幅: Detailres.data.BOM_计划门幅,
+      定额用料: Detailres.data.定额用料,
+      定额门幅: Detailres.data.BOM_定额门幅,
+      出库数量: Detailres.data.出库数量,
+      入仓总数量: Detailres.data.领用数量 ? Detailres.data.领用数量 : 0,
+      库存数量: Detailres.data.库存数量 ? Detailres.data.库存数量 : 0,
+      关联订单: Detailres.data.关联订单,
+      颜色: Detailres.data.BOM_颜色,
+      单位: '米',
+      实际门幅: Detailres.data.实际门幅,
+    };
+
+    // 计算 danjutableData 中相同物料名称和颜色的出库数量总和
+    const { 物料名称, 颜色 } = mianliaotabData.value;
+    const totalOutbound = danjutableData.value
+      .filter(
+        (item) =>
+          item.物料名称 === 物料名称 && item.颜色 === 颜色
+      )
+      .reduce((sum, item) => sum + Number(item.出库数量), 0);
+
+    // 更新 mianliaotabData 的库存数量
+    mianliaotabData.value.库存数量 -= totalOutbound;
+  } else {
+    console.error('获取详情数据失败:', Detailres.msg);
+  }
+};
   const danjutableData = ref([]); // 使用 ref 定义响应式数组
   
   //添加按钮
   const dj_Dialog = () => {
-	if (mianliaotabData.value) {
-	  // 判断实际门幅是否为空
-	  const 实际门幅 = mianliaotabData.value.实际门幅 || mianliaotabData.value.定额门幅;
-  
-	  // 将 mianliaotabData 的数据添加到 danjutableData
-	  danjutableData.value.push({
-		...mianliaotabData.value, // 展开 mianliaotabData 的所有属性
-		实际门幅, // 使用计算后的实际门幅
-	  });
-	} else {
-	  console.error('mianliaotabData 为空,无法添加到 danjutableData');
-	}
-  };
+  // 确保 mianliaotabData 和 mianliaotabData.value 存在
+  if (!mianliaotabData || !mianliaotabData.value) {
+    console.error('mianliaotabData 为空,无法添加到 danjutableData');
+    return;
+  }
+
+  // 检查出库数量是否为空或无效
+  if (
+    mianliaotabData.value.出库数量 === '' ||
+    mianliaotabData.value.出库数量 === undefined ||
+    mianliaotabData.value.出库数量 === '0'
+  ) {
+    ElMessage({ type: 'warning', message: '请填写出库数量' });
+    return;
+  }
+
+  // 获取 mianliaotabData 的物料名称和颜色
+  const { 物料名称, 颜色, 出库数量, 库存数量 } = mianliaotabData.value;
+
+  // 计算 danjutableData 中相同物料名称和颜色的出库数量总和
+  const totalOutbound = danjutableData.value
+    .filter(
+      (item) =>
+        item.物料名称 === 物料名称 && item.颜色 === 颜色
+    )
+    .reduce((sum, item) => sum + Number(item.出库数量), 0);
+
+  // 计算总出库数量(danjutableData 中的总和 + mianliaotabData 中的出库数量)
+  const totalOutboundQuantity = totalOutbound + Number(出库数量);
+
+  // 判断总出库数量是否大于库存数量
+  if (totalOutboundQuantity > 库存数量) {
+    ElMessage({ type: 'warning', message: '出库数量不能大于库存数量' });
+    return;
+  }
+
+  // 如果通过检查,将数据添加到 danjutableData
+  danjutableData.value.push({
+    ...mianliaotabData.value,
+    实际门幅: mianliaotabData.value.实际门幅 || mianliaotabData.value.定额门幅,
+  });
+  mianliaotabData.value.出库数量 = '';
+  mianliaotabData.value.库存数量 = mianliaotabData.value.库存数量 - Number(出库数量);
+};
   
   //操作移除按钮
   const deleteRow = (index) => {