Procházet zdrojové kódy

Merge branch 'dev0.3' of http://36.137.93.232:3000/hf/byte-sailing-new into dev0.3

cz před 1 rokem
rodič
revize
42ba6bc5e8

+ 35 - 10
src/components/process/Contract.vue

@@ -127,11 +127,12 @@
               </template>
             </el-table-column>
             <el-table-column prop="code" label="商品编码" width="120" />
-            <el-table-column label="商品名称" min-width="200">
+            <el-table-column prop="name" label="商品中文名" width="160" />
+            <el-table-column label="商品英文名" min-width="200">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'contractProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true">
-                    <el-input v-model="row.productName" placeholder="请输入商品名" />
+                    <el-input v-model="row.productName" placeholder="请输入商品英文名" />
                   </el-form-item>
                 </div>
               </template>
@@ -139,7 +140,6 @@
             <el-table-column label="规格型号" width="180">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <!-- :rules="rules.productModel" -->
                   <el-form-item :prop="'contractProductList.' + $index + '.productModel'" :inline-message="true">
                     <el-input v-model="row.productModel" placeholder="请输入规格型号" />
                   </el-form-item>
@@ -147,7 +147,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="unit" label="单位" width="100" :formatter="(row) => dictValueLabel(row.unit, productUnit)" />
-            <el-table-column label="数量" width="160">
+            <el-table-column label="数量" width="150">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'contractProductList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true">
@@ -181,7 +181,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="amount" label="金额" width="140" />
+            <el-table-column prop="amount" label="金额" width="100" />
             <el-table-column align="center" label="操作" width="120" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleHandover(row, $index)">交接单</el-button>
@@ -434,8 +434,8 @@
       </template>
     </byForm>
 
-    <el-dialog v-model="openProduct" title="选择商品" width="70%" append-to-body>
-      <SelectGoods @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择商品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
 
     <el-dialog title="交接单" v-if="openHandover" v-model="openHandover" width="800">
@@ -595,7 +595,7 @@ const rules = ref({
   buyAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }],
   buyContactName: [{ required: true, message: "请输入联系人", trigger: ["change", "blur"] }],
   buyContactNumber: [{ required: true, message: "请输入联系电话", trigger: "blur" }],
-  productName: [{ required: true, message: "请输入商品名", trigger: "blur" }],
+  productName: [{ required: true, message: "请输入商品英文名", trigger: "blur" }],
   productModel: [{ required: true, message: "请输入规格型号", trigger: "blur" }],
   quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
   price: [{ required: true, message: "请输入单价", trigger: "blur" }],
@@ -823,8 +823,20 @@ const handlePerson = (item) => {
 };
 const pushGoods = (goods) => {
   if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.contractProductList && formData.data.contractProductList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.contractProductList.filter((itemProduct) => itemProduct.productId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
     formData.data.contractProductList = formData.data.contractProductList.concat(
-      goods.map((item) => {
+      afterFiltering.map((item) => {
         let fileUrl = "";
         if (item.fileList && item.fileList.length > 0) {
           fileUrl = item.fileList[0].fileUrl;
@@ -840,6 +852,7 @@ const pushGoods = (goods) => {
           fileUrl: fileUrl,
           code: item.code,
           productId: item.id,
+          name: item.name,
           productName: name,
           productModel: item.spec,
           unit: item.unit,
@@ -852,7 +865,7 @@ const pushGoods = (goods) => {
       })
     );
     formData.data.contractShipmentList = formData.data.contractShipmentList.concat(
-      goods.map((item) => {
+      afterFiltering.map((item) => {
         let name = item.name;
         if (item.standardJson) {
           let standardJson = JSON.parse(item.standardJson);
@@ -1147,6 +1160,18 @@ watch(
     deep: true,
   }
 );
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.contractProductList && formData.data.contractProductList.length > 0) {
+    data = formData.data.contractProductList.map((item) => {
+      return {
+        id: item.productId,
+        name: item.name,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped>

+ 36 - 11
src/components/process/PriceSheet.vue

@@ -127,11 +127,12 @@
               </template>
             </el-table-column>
             <el-table-column prop="code" label="商品编码" width="120" />
-            <el-table-column label="商品名称" min-width="200">
+            <el-table-column prop="name" label="商品中文名" width="160" />
+            <el-table-column label="商品英文名" min-width="200">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'quotationProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true">
-                    <el-input v-model="row.productName" placeholder="请输入商品名" />
+                    <el-input v-model="row.productName" placeholder="请输入商品英文名" />
                   </el-form-item>
                 </div>
               </template>
@@ -139,7 +140,6 @@
             <el-table-column label="规格型号" width="180">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <!-- :rules="rules.productModel" -->
                   <el-form-item :prop="'quotationProductList.' + $index + '.productModel'" :inline-message="true">
                     <el-input v-model="row.productModel" placeholder="请输入规格型号" />
                   </el-form-item>
@@ -147,7 +147,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="unit" label="单位" width="100" />
-            <el-table-column label="数量" width="160">
+            <el-table-column label="数量" width="150">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'quotationProductList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true">
@@ -181,9 +181,9 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="amount" label="金额" width="140" />
-            <el-table-column label="操作" width="80" fixed="right">
-              <template #default="{ row, $index }">
+            <el-table-column prop="amount" label="金额" width="100" />
+            <el-table-column align="center" label="操作" width="80" fixed="right">
+              <template #default="{ $index }">
                 <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
               </template>
             </el-table-column>
@@ -339,8 +339,8 @@
       </template>
     </byForm>
 
-    <el-dialog v-model="openProduct" title="选择商品" width="70%" append-to-body>
-      <SelectGoods @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择商品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
@@ -448,7 +448,7 @@ const rules = ref({
   buyAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }],
   buyContactName: [{ required: true, message: "请输入联系人", trigger: ["change", "blur"] }],
   buyContactNumber: [{ required: true, message: "请输入联系电话", trigger: "blur" }],
-  productName: [{ required: true, message: "请输入商品名", trigger: "blur" }],
+  productName: [{ required: true, message: "请输入商品英文名", trigger: "blur" }],
   productModel: [{ required: true, message: "请输入规格型号", trigger: "blur" }],
   quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
   price: [{ required: true, message: "请输入单价", trigger: "blur" }],
@@ -649,8 +649,20 @@ const handlePerson = (item) => {
 };
 const pushGoods = (goods) => {
   if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.quotationProductList && formData.data.quotationProductList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.quotationProductList.filter((itemProduct) => itemProduct.productId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
     formData.data.quotationProductList = formData.data.quotationProductList.concat(
-      goods.map((item) => {
+      afterFiltering.map((item) => {
         let fileUrl = "";
         if (item.fileList && item.fileList.length > 0) {
           fileUrl = item.fileList[0].fileUrl;
@@ -659,6 +671,7 @@ const pushGoods = (goods) => {
           fileUrl: fileUrl,
           code: item.code,
           productId: item.id,
+          name: item.name,
           productName: item.name,
           productModel: item.spec,
           unit: item.unit,
@@ -846,6 +859,18 @@ defineExpose({
   getFormData,
   handleSubmit,
 });
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.quotationProductList && formData.data.quotationProductList.length > 0) {
+    data = formData.data.quotationProductList.map((item) => {
+      return {
+        id: item.productId,
+        name: item.name,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped>

+ 57 - 79
src/components/process/ReturnGood.vue

@@ -1,90 +1,46 @@
 <template>
   <div style="width: 100%; padding: 0px 15px">
-    <byForm
-      :formConfig="formConfig"
-      :formOption="formOption"
-      v-model="formData.data"
-      :rules="rules"
-      ref="formDom"
-    >
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom">
       <template #details>
         <div style="width: 100%">
-          <el-button
-            type="primary"
-            @click="openProduct = true"
-            style="margin-bottom: 10px"
-          >
-            添加物品
-          </el-button>
+          <el-button type="primary" @click="openProduct = true" style="margin-bottom: 10px"> 添加物品 </el-button>
           <el-table :data="formData.data.salesReturnDetailList">
             <el-table-column prop="productCode" label="货品编码" />
             <el-table-column prop="productName" label="货品名称" />
             <el-table-column prop="productSpec" label="规格型号" />
-            <el-table-column
-              prop="productUnit"
-              label="单位"
-              :formatter="(row) => dictValueLabel(row.productUnit, productUnit)"
-            />
+            <el-table-column prop="productUnit" label="单位" :formatter="(row) => dictValueLabel(row.productUnit, productUnit)" />
             <el-table-column prop="count" label="退货数量" min-width="150">
               <template #default="{ row, $index }">
-                <el-form-item
-                  :prop="'salesReturnDetailList.' + $index + '.count'"
-                  :rules="rules.count"
-                  :inline-message="true"
-                >
-                  <el-input-number
-                    onmousewheel="return false;"
-                    v-model="row.count"
-                    :precision="4"
-                    :controls="false"
-                    :min="0"
-                  />
+                <el-form-item :prop="'salesReturnDetailList.' + $index + '.count'" :rules="rules.count" :inline-message="true">
+                  <el-input-number onmousewheel="return false;" v-model="row.count" :precision="4" :controls="false" :min="0" />
                 </el-form-item>
               </template>
             </el-table-column>
             <el-table-column prop="remark" label="退货原因" min-width="150">
               <template #default="{ row, $index }">
-                <el-form-item
-                  :prop="'salesReturnDetailList.' + $index + '.remark'"
-                  :rules="rules.remark"
-                  :inline-message="true"
-                >
-                  <el-input
-                    v-model="row.remark"
-                    placeholder="请输入"
-                    type="textarea"
-                  />
+                <el-form-item :prop="'salesReturnDetailList.' + $index + '.remark'" :rules="rules.remark" :inline-message="true">
+                  <el-input v-model="row.remark" placeholder="请输入" type="textarea" />
                 </el-form-item>
               </template>
             </el-table-column>
             <el-table-column prop="zip" label="操作" width="100">
               <template #default="{ $index }">
-                <el-button type="primary" link @click="handleRemove($index)"
-                  >删除</el-button
-                >
+                <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
               </template>
             </el-table-column>
           </el-table>
         </div>
       </template>
     </byForm>
-    <el-dialog
-      v-model="openProduct"
-      title="选择货品"
-      width="70%"
-      append-to-body
-    >
-      <SelectGoods
-        @cancel="openProduct = false"
-        @pushGoods="pushGoods"
-      ></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择货品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
 
 <script setup>
 import byForm from "@/components/byForm/index";
-import { ElMessage, ElMessageBox } from "element-plus";
+import { ElMessage } from "element-plus";
 import SelectGoods from "@/components/product/SelectGoods";
 import useUserStore from "@/store/modules/user";
 const { proxy } = getCurrentInstance();
@@ -197,23 +153,38 @@ const handleRemove = (index) => {
   });
 };
 const pushGoods = (goods) => {
-  const arr = goods.map((x) => ({
-    goodType: x.goodType,
-    productCode: x.code,
-    productName: x.name,
-    productSpec: x.spec,
-    productUnit: x.unit,
-    count: 0,
-    bussinessId: x.id,
-    remark: "",
-  }));
-  formData.data.salesReturnDetailList =
-    formData.data.salesReturnDetailList.concat(arr);
-  openProduct.value = false;
-  return ElMessage({
-    message: "添加成功!",
-    type: "success",
-  });
+  if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.salesReturnDetailList && formData.data.salesReturnDetailList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.salesReturnDetailList.filter((itemProduct) => itemProduct.bussinessId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
+    const arr = afterFiltering.map((x) => ({
+      goodType: x.goodType,
+      productCode: x.code,
+      productName: x.name,
+      productSpec: x.spec,
+      productUnit: x.unit,
+      count: 0,
+      bussinessId: x.id,
+      remark: "",
+    }));
+    formData.data.salesReturnDetailList = formData.data.salesReturnDetailList.concat(arr);
+    openProduct.value = false;
+    return ElMessage({
+      message: "添加成功!",
+      type: "success",
+    });
+  } else {
+    ElMessage("请选择至少一件物品");
+  }
 };
 
 // 接收父组件的传值
@@ -233,9 +204,7 @@ onMounted(() => {
 
 const judgeStatus = () => {
   if (props.queryData.recordList && props.queryData.recordList.length > 0) {
-    let data = props.queryData.recordList.filter(
-      (item) => item.status === 2 && item.nodeType !== 1
-    );
+    let data = props.queryData.recordList.filter((item) => item.status === 2 && item.nodeType !== 1);
     if (data && data.length > 0) {
       return true;
     }
@@ -247,10 +216,7 @@ watch(
   props.queryData,
   () => {
     formOption.disabled = judgeStatus();
-    if (
-      props.queryData &&
-      (route.query.processType == 10 || route.query.processType == 20)
-    ) {
+    if (props.queryData && (route.query.processType == 10 || route.query.processType == 20)) {
       for (const key in props.queryData) {
         formData.data[key] = props.queryData[key];
       }
@@ -280,6 +246,18 @@ defineExpose({
   getFormData,
   handleSubmit,
 });
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.salesReturnDetailList && formData.data.salesReturnDetailList.length > 0) {
+    data = formData.data.salesReturnDetailList.map((item) => {
+      return {
+        id: item.bussinessId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped></style>

+ 83 - 191
src/components/process/SendPurchase.vue

@@ -1,144 +1,65 @@
 <template>
   <div style="width: 100%; padding: 0px 15px">
-    <el-form
-      :model="formData.data"
-      :rules="rules"
-      ref="formDom"
-      label-position="top"
-      :disabled="judgeStatus()"
-    >
+    <el-form :model="formData.data" :rules="rules" ref="formDom" label-position="top" :disabled="judgeStatus()">
       <div class="_t">基础信息</div>
       <el-row :gutter="10">
         <el-col :span="6">
           <el-form-item label="采购部门" prop="deptName">
-            <el-input v-model="formData.data.deptName" placeholder="请输入">
-            </el-input>
+            <el-input v-model="formData.data.deptName" placeholder="请输入"> </el-input>
           </el-form-item>
         </el-col>
         <el-col :span="6">
           <el-form-item label="采购人" prop="purchaseName">
-            <el-input v-model="formData.data.purchaseName" placeholder="请输入">
-            </el-input>
+            <el-input v-model="formData.data.purchaseName" placeholder="请输入"> </el-input>
           </el-form-item>
         </el-col>
         <el-col :span="6">
           <el-form-item label="采购时间" prop="purchaseTime">
-            <el-date-picker
-              v-model="formData.data.purchaseTime"
-              type="datetime"
-              placeholder="请选择"
-            />
+            <el-date-picker v-model="formData.data.purchaseTime" type="datetime" placeholder="请选择" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="10">
         <el-col :span="8">
           <el-form-item label="供应商" prop="supplyId">
-            <el-select
-              v-model="formData.data.supplyId"
-              placeholder="请选择"
-              @change="handleChangeSupplier"
-              filterable
-              style="width: 100%"
-            >
-              <el-option
-                v-for="item in supplierData"
-                :label="item.name"
-                :value="item.id"
-              >
-              </el-option>
+            <el-select v-model="formData.data.supplyId" placeholder="请选择" @change="handleChangeSupplier" filterable style="width: 100%">
+              <el-option v-for="item in supplierData" :label="item.name" :value="item.id"> </el-option>
             </el-select>
           </el-form-item>
         </el-col>
       </el-row>
       <el-form-item label="采购说明" prop="purchaseContent">
-        <el-input
-          v-model="formData.data.purchaseContent"
-          placeholder="请输入"
-          type="textarea"
-        >
-        </el-input>
+        <el-input v-model="formData.data.purchaseContent" placeholder="请输入" type="textarea"> </el-input>
       </el-form-item>
       <div class="_t">采购明细</div>
       <el-form-item>
-        <el-button
-          type="primary"
-          @click="openProduct = true"
-          style="margin: 10px 0"
-          v-if="ids.length == 0"
-        >
-          添加货品
-        </el-button>
+        <el-button type="primary" @click="openProduct = true" style="margin: 10px 0" v-if="ids.length == 0"> 添加货品 </el-button>
         <el-table :data="formData.data.purchaseDetailList">
-          <el-table-column
-            prop="goodType"
-            label="货品类型"
-            :formatter="(row) => (row.goodType == 1 ? '产品' : '物料')"
-          />
+          <el-table-column prop="goodType" label="货品类型" :formatter="(row) => (row.goodType == 1 ? '产品' : '物料')" />
           <el-table-column prop="productCode" label="货品编码" />
           <el-table-column prop="productName" label="货品名称" />
           <el-table-column prop="productSpec" label="规格型号" />
-          <el-table-column
-            prop="productUnit"
-            label="单位"
-            :formatter="(row) => dictValueLabel(row.productUnit, productUnit)"
-          />
-          <el-table-column
-            prop="subscribeCount"
-            label="申购数量"
-            v-if="ids.length > 0"
-          />
-          <el-table-column
-            prop="purchaseCount"
-            label="已采购数量"
-            v-if="ids.length > 0"
-          />
+          <el-table-column prop="productUnit" label="单位" :formatter="(row) => dictValueLabel(row.productUnit, productUnit)" />
+          <el-table-column prop="subscribeCount" label="申购数量" v-if="ids.length > 0" />
+          <el-table-column prop="purchaseCount" label="已采购数量" v-if="ids.length > 0" />
           <el-table-column prop="count" label="本次采购" min-width="150">
             <template #default="{ row, $index }">
-              <el-form-item
-                :prop="'purchaseDetailList.' + $index + '.count'"
-                :rules="rules.count"
-                :inline-message="true"
-              >
-                <el-input-number
-                  onmousewheel="return false;"
-                  v-model="row.count"
-                  :precision="4"
-                  :controls="false"
-                  :min="0"
-                  @change="handleChangeAmount"
-                />
+              <el-form-item :prop="'purchaseDetailList.' + $index + '.count'" :rules="rules.count" :inline-message="true">
+                <el-input-number onmousewheel="return false;" v-model="row.count" :precision="4" :controls="false" :min="0" @change="handleChangeAmount" />
               </el-form-item>
             </template>
           </el-table-column>
           <el-table-column prop="price" label="单价" min-width="150">
             <template #default="{ row, $index }">
-              <el-form-item
-                :prop="'purchaseDetailList.' + $index + '.price'"
-                :rules="rules.price"
-                :inline-message="true"
-              >
-                <el-input-number
-                  onmousewheel="return false;"
-                  v-model="row.price"
-                  :precision="4"
-                  :controls="false"
-                  :min="0"
-                  @change="handleChangeAmount"
-                />
+              <el-form-item :prop="'purchaseDetailList.' + $index + '.price'" :rules="rules.price" :inline-message="true">
+                <el-input-number onmousewheel="return false;" v-model="row.price" :precision="4" :controls="false" :min="0" @change="handleChangeAmount" />
               </el-form-item>
             </template>
           </el-table-column>
           <el-table-column prop="amount" label="金额" />
           <el-table-column prop="zip" label="操作" width="100">
             <template #default="{ $index }">
-              <el-button
-                type="primary"
-                link
-                @click="handleRemove($index, 20)"
-                :disabled="formData.data.purchaseDetailList.length === 1"
-                >删除</el-button
-              >
+              <el-button type="primary" link @click="handleRemove($index, 20)" :disabled="formData.data.purchaseDetailList.length === 1">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -146,71 +67,46 @@
       <el-row>
         <el-col :span="4">
           <el-form-item label="商品金额小计" prop="productAmount">
-            <el-input
-              v-model="formData.data.productAmount"
-              placeholder="请输入"
-              disabled
-            />
+            <el-input v-model="formData.data.productAmount" placeholder="请输入" disabled />
           </el-form-item>
         </el-col>
       </el-row>
       <div class="_t">其他收费项目</div>
       <el-form-item>
-        <el-button type="primary" style="margin: 10px 0" @click="handleAdd">
-          添加
-        </el-button>
+        <el-button type="primary" style="margin: 10px 0" @click="handleAdd"> 添加 </el-button>
         <el-table :data="formData.data.otherFeeList">
           <el-table-column prop="name" label="收费项目" min-width="150">
             <template #default="{ row, $index }">
-              <el-form-item
-                :prop="'otherFeeList.' + $index + '.name'"
-                :rules="rulesOne.name"
-                :inline-message="true"
-              >
+              <el-form-item :prop="'otherFeeList.' + $index + '.name'" :rules="rulesOne.name" :inline-message="true">
                 <el-autocomplete
                   v-model="row.name"
                   :fetch-suggestions="querySearchPerson"
                   clearable
                   class="inline-input w-50"
                   placeholder="请输入"
-                  @select="(val) => handlePerson(val, $index)"
-                >
+                  @select="(val) => handlePerson(val, $index)">
                 </el-autocomplete>
               </el-form-item>
             </template>
           </el-table-column>
           <el-table-column prop="price" label="金额" min-width="150">
             <template #default="{ row, $index }">
-              <el-form-item
-                :prop="'otherFeeList.' + $index + '.price'"
-                :rules="rulesOne.price"
-                :inline-message="true"
-              >
-                <el-input-number
-                  v-model="row.price"
-                  :precision="4"
-                  :controls="false"
-                  @change="handleChangeAmount"
-                />
+              <el-form-item :prop="'otherFeeList.' + $index + '.price'" :rules="rulesOne.price" :inline-message="true">
+                <el-input-number v-model="row.price" :precision="4" :controls="false" @change="handleChangeAmount" />
               </el-form-item>
             </template>
           </el-table-column>
 
           <el-table-column prop="remark" label="备注" min-width="150">
             <template #default="{ row, $index }">
-              <el-form-item
-                :prop="'otherFeeList.' + $index + '.remark'"
-                :inline-message="true"
-              >
+              <el-form-item :prop="'otherFeeList.' + $index + '.remark'" :inline-message="true">
                 <el-input v-model="row.remark" placeholder="请输入" />
               </el-form-item>
             </template>
           </el-table-column>
           <el-table-column prop="zip" label="操作" width="100">
             <template #default="{ $index }">
-              <el-button type="primary" link @click="handleRemove($index, 10)"
-                >删除</el-button
-              >
+              <el-button type="primary" link @click="handleRemove($index, 10)">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -218,11 +114,7 @@
       <el-row>
         <el-col :span="4">
           <el-form-item label="其他收费小计" prop="otherAmount">
-            <el-input
-              v-model="formData.data.otherAmount"
-              placeholder="请输入"
-              disabled
-            />
+            <el-input v-model="formData.data.otherAmount" placeholder="请输入" disabled />
           </el-form-item>
         </el-col>
       </el-row>
@@ -230,25 +122,13 @@
       <el-row>
         <el-col :span="4">
           <el-form-item label="采购总金额" prop="amount">
-            <el-input
-              v-model="formData.data.amount"
-              placeholder="请输入"
-              disabled
-            />
+            <el-input v-model="formData.data.amount" placeholder="请输入" disabled />
           </el-form-item>
         </el-col>
       </el-row>
     </el-form>
-    <el-dialog
-      v-model="openProduct"
-      title="选择货品"
-      width="70%"
-      append-to-body
-    >
-      <SelectGoods
-        @cancel="openProduct = false"
-        @pushGoods="pushGoods"
-      ></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择货品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
@@ -275,12 +155,8 @@ let formData = reactive({
 });
 let rules = ref({
   deptName: [{ required: true, message: "请输入采购部门", trigger: "blur" }],
-  purchaseName: [
-    { required: true, message: "请输入采购人名称", trigger: "blur" },
-  ],
-  purchaseTime: [
-    { required: true, message: "请选择采购时间", trigger: "change" },
-  ],
+  purchaseName: [{ required: true, message: "请输入采购人名称", trigger: "blur" }],
+  purchaseTime: [{ required: true, message: "请选择采购时间", trigger: "change" }],
   supplyId: [{ required: true, message: "请选择供应商", trigger: "change" }],
   count: [{ required: true, message: "请输入本次采购数量", trigger: "blur" }],
   price: [{ required: true, message: "请输入单价", trigger: "blur" }],
@@ -315,24 +191,39 @@ const handleAdd = () => {
 };
 
 const pushGoods = (goods) => {
-  const arr = goods.map((x) => ({
-    goodType: x.goodType,
-    productCode: x.code,
-    productName: x.name,
-    productSpec: x.spec,
-    productUnit: x.unit,
-    count: 0,
-    price: 0,
-    bussinessId: x.id,
-    amount: 0,
-  }));
-  formData.data.purchaseDetailList =
-    formData.data.purchaseDetailList.concat(arr);
-  openProduct.value = false;
-  return ElMessage({
-    message: "添加成功!",
-    type: "success",
-  });
+  if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.purchaseDetailList && formData.data.purchaseDetailList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.purchaseDetailList.filter((itemProduct) => itemProduct.bussinessId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
+    const arr = afterFiltering.map((x) => ({
+      goodType: x.goodType,
+      productCode: x.code,
+      productName: x.name,
+      productSpec: x.spec,
+      productUnit: x.unit,
+      count: 0,
+      price: 0,
+      bussinessId: x.id,
+      amount: 0,
+    }));
+    formData.data.purchaseDetailList = formData.data.purchaseDetailList.concat(arr);
+    openProduct.value = false;
+    return ElMessage({
+      message: "添加成功!",
+      type: "success",
+    });
+  } else {
+    ElMessage("请选择至少一件物品");
+  }
 };
 // 提交方法
 const formDom = ref(null);
@@ -456,11 +347,9 @@ const getDetails = () => {
 const supplierData = ref([]);
 const otherFeeListData = ref([]);
 const getSupplierList = async (req) => {
-  proxy
-    .post("/supplierInfo/page", { pageNum: 1, pageSize: 9999 })
-    .then((res) => {
-      supplierData.value = res.rows;
-    });
+  proxy.post("/supplierInfo/page", { pageNum: 1, pageSize: 9999 }).then((res) => {
+    supplierData.value = res.rows;
+  });
 };
 // 供应商改变逻辑
 const handleChangeSupplier = (val) => {
@@ -541,16 +430,12 @@ getDict();
 
 const createFilter = (queryString) => {
   return (restaurant) => {
-    return (
-      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
-    );
+    return restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0;
   };
 };
 
 const querySearchPerson = (queryString, callback) => {
-  const results = queryString
-    ? otherFeeListData.value.filter(createFilter(queryString))
-    : otherFeeListData.value;
+  const results = queryString ? otherFeeListData.value.filter(createFilter(queryString)) : otherFeeListData.value;
   callback(results);
 };
 
@@ -563,10 +448,7 @@ const handlePerson = (item, index) => {
 watch(
   props.queryData,
   () => {
-    if (
-      props.queryData &&
-      (route.query.processType == 10 || route.query.processType == 20)
-    ) {
+    if (props.queryData && (route.query.processType == 10 || route.query.processType == 20)) {
       for (const key in props.queryData) {
         formData.data[key] = props.queryData[key];
       }
@@ -578,9 +460,7 @@ watch(
 );
 const judgeStatus = () => {
   if (props.queryData.recordList && props.queryData.recordList.length > 0) {
-    let data = props.queryData.recordList.filter(
-      (item) => item.status === 2 && item.nodeType !== 1
-    );
+    let data = props.queryData.recordList.filter((item) => item.status === 2 && item.nodeType !== 1);
     if (data && data.length > 0) {
       return true;
     }
@@ -596,6 +476,18 @@ defineExpose({
   getFormData,
   handleSubmit,
 });
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.purchaseDetailList && formData.data.purchaseDetailList.length > 0) {
+    data = formData.data.purchaseDetailList.map((item) => {
+      return {
+        id: item.bussinessId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped>

+ 63 - 109
src/components/process/SendSubscribe.vue

@@ -1,12 +1,6 @@
 <template>
   <div style="width: 100%; padding: 0px 15px">
-    <el-form
-      :model="formData.data"
-      :rules="rules"
-      ref="formDom"
-      label-position="top"
-      :disabled="judgeStatus()"
-    >
+    <el-form :model="formData.data" :rules="rules" ref="formDom" label-position="top" :disabled="judgeStatus()">
       <div class="_t">申购信息</div>
       <el-row :gutter="10">
         <el-col :span="6">
@@ -30,121 +24,63 @@
       <el-row :gutter="10">
         <el-col :span="6">
           <el-form-item label="申购部门" prop="deptName">
-            <el-input
-              v-model="formData.data.deptName"
-              placeholder="请输入"
-              disabled
-            >
-            </el-input>
+            <el-input v-model="formData.data.deptName" placeholder="请输入" disabled> </el-input>
           </el-form-item>
         </el-col>
         <el-col :span="6">
           <el-form-item label="申购人" prop="subcribeName">
-            <el-input
-              v-model="formData.data.subcribeName"
-              placeholder="请输入"
-              disabled
-            >
-            </el-input>
+            <el-input v-model="formData.data.subcribeName" placeholder="请输入" disabled> </el-input>
           </el-form-item>
         </el-col>
         <el-col :span="6">
           <el-form-item label="申购时间" prop="subcribeTime">
-            <el-date-picker
-              v-model="formData.data.subcribeTime"
-              type="datetime"
-              placeholder="请选择"
-              disabled
-            />
+            <el-date-picker v-model="formData.data.subcribeTime" type="datetime" placeholder="请选择" disabled />
           </el-form-item>
         </el-col>
       </el-row>
       <el-form-item label="申购说明" prop="subcribeContent">
-        <el-input
-          v-model="formData.data.subcribeContent"
-          placeholder="请输入"
-          type="textarea"
-        >
-        </el-input>
+        <el-input v-model="formData.data.subcribeContent" placeholder="请输入" type="textarea"> </el-input>
       </el-form-item>
       <div class="_t">申购明细</div>
       <el-form-item>
-        <el-button
-          type="primary"
-          @click="openProduct = true"
-          style="margin: 10px 0"
-        >
-          添加货品
-        </el-button>
+        <el-button type="primary" @click="openProduct = true" style="margin: 10px 0"> 添加货品 </el-button>
         <el-table :data="formData.data.subscribeDetailList">
-          <el-table-column
-            prop="goodType"
-            label="货品类型"
-            :formatter="(row) => (row.goodType == 1 ? '产品' : '物料')"
-          />
+          <el-table-column prop="goodType" label="货品类型" :formatter="(row) => (row.goodType == 1 ? '产品' : '物料')" />
           <el-table-column prop="code" label="货品编码" />
           <el-table-column prop="name" label="货品名称" min-width="150" />
           <el-table-column prop="spec" label="规格型号" />
-          <el-table-column
-            prop="unit"
-            label="单位"
-            :formatter="(row) => dictValueLabel(row.unit, productUnit)"
-          />
+          <el-table-column prop="unit" label="单位" :formatter="(row) => dictValueLabel(row.unit, productUnit)" />
           <el-table-column prop="count" label="申购数量" min-width="150">
             <template #default="{ row, $index }">
-              <el-form-item
-                :prop="'subscribeDetailList.' + $index + '.count'"
-                :rules="rules.count"
-                :inline-message="true"
-              >
-                <el-input-number
-                  onmousewheel="return false;"
-                  v-model="row.count"
-                  :precision="4"
-                  :controls="false"
-                  :min="1"
-                />
+              <el-form-item :prop="'subscribeDetailList.' + $index + '.count'" :rules="rules.count" :inline-message="true">
+                <el-input-number onmousewheel="return false;" v-model="row.count" :precision="4" :controls="false" :min="1" />
               </el-form-item>
             </template>
           </el-table-column>
           <el-table-column prop="remark" label="备注" min-width="150">
             <template #default="{ row, $index }">
-              <el-form-item
-                :prop="'subscribeDetailList.' + $index + '.remark'"
-                :rules="rules.remark"
-                :inline-message="true"
-              >
+              <el-form-item :prop="'subscribeDetailList.' + $index + '.remark'" :rules="rules.remark" :inline-message="true">
                 <el-input v-model="row.remark" placeholder="请输入" />
               </el-form-item>
             </template>
           </el-table-column>
           <el-table-column prop="zip" label="操作" width="100">
             <template #default="{ $index }">
-              <el-button type="primary" link @click="handleRemove($index)"
-                >删除</el-button
-              >
+              <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
       </el-form-item>
     </el-form>
-    <el-dialog
-      v-model="openProduct"
-      title="选择货品"
-      width="70%"
-      append-to-body
-    >
-      <SelectGoods
-        @cancel="openProduct = false"
-        @pushGoods="pushGoods"
-      ></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择货品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
 
 <script setup>
 import SelectGoods from "@/components/product/SelectGoods";
-import { ElMessage, ElMessageBox } from "element-plus";
+import { ElMessage } from "element-plus";
 import useUserStore from "@/store/modules/user";
 const route = useRoute();
 const { proxy } = getCurrentInstance();
@@ -162,12 +98,8 @@ let formData = reactive({
 let rules = ref({
   corporationId: [{ required: true, message: "请选择归属公司", trigger: "change" }],
   deptName: [{ required: true, message: "请输入申购部门", trigger: "blur" }],
-  subcribeName: [
-    { required: true, message: "请输入申购人名称", trigger: "blur" },
-  ],
-  subcribeTime: [
-    { required: true, message: "请选择申购时间", trigger: "change" },
-  ],
+  subcribeName: [{ required: true, message: "请输入申购人名称", trigger: "blur" }],
+  subcribeTime: [{ required: true, message: "请选择申购时间", trigger: "change" }],
   // subcribeContent: [
   //   { required: true, message: "请输入申购事由", trigger: "blur" },
   // ],
@@ -186,23 +118,38 @@ const handleRemove = (index) => {
 };
 
 const pushGoods = (goods) => {
-  const arr = goods.map((x) => ({
-    goodType: x.goodType,
-    code: x.code,
-    name: x.name,
-    spec: x.spec,
-    unit: x.unit,
-    bussinessId: x.id,
-    count: "",
-    remark: "",
-  }));
-  formData.data.subscribeDetailList =
-    formData.data.subscribeDetailList.concat(arr);
-  openProduct.value = false;
-  return ElMessage({
-    message: "添加成功!",
-    type: "success",
-  });
+  if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.subscribeDetailList && formData.data.subscribeDetailList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.subscribeDetailList.filter((itemProduct) => itemProduct.bussinessId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
+    const arr = afterFiltering.map((x) => ({
+      goodType: x.goodType,
+      code: x.code,
+      name: x.name,
+      spec: x.spec,
+      unit: x.unit,
+      bussinessId: x.id,
+      count: "",
+      remark: "",
+    }));
+    formData.data.subscribeDetailList = formData.data.subscribeDetailList.concat(arr);
+    openProduct.value = false;
+    return ElMessage({
+      message: "添加成功!",
+      type: "success",
+    });
+  } else {
+    ElMessage("请选择至少一件物品");
+  }
 };
 
 const formDom = ref(null);
@@ -234,9 +181,7 @@ onMounted(() => {
 
 const judgeStatus = () => {
   if (props.queryData.recordList && props.queryData.recordList.length > 0) {
-    let data = props.queryData.recordList.filter(
-      (item) => item.status === 2 && item.nodeType !== 1
-    );
+    let data = props.queryData.recordList.filter((item) => item.status === 2 && item.nodeType !== 1);
     if (data && data.length > 0) {
       return true;
     }
@@ -247,10 +192,7 @@ const judgeStatus = () => {
 watch(
   props.queryData,
   () => {
-    if (
-      props.queryData &&
-      (route.query.processType == 10 || route.query.processType == 20)
-    ) {
+    if (props.queryData && (route.query.processType == 10 || route.query.processType == 20)) {
       for (const key in props.queryData) {
         formData.data[key] = props.queryData[key];
       }
@@ -285,6 +227,18 @@ defineExpose({
   getFormData,
   handleSubmit,
 });
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.subscribeDetailList && formData.data.subscribeDetailList.length > 0) {
+    data = formData.data.subscribeDetailList.map((item) => {
+      return {
+        id: item.bussinessId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped>

+ 42 - 9
src/components/process/ServiceContract.vue

@@ -135,11 +135,12 @@
               </template>
             </el-table-column>
             <el-table-column prop="code" label="商品编码" width="120" />
-            <el-table-column label="商品名称" min-width="200">
+            <el-table-column prop="name" label="商品中文名" width="160" />
+            <el-table-column label="商品英文名" min-width="200">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'serviceContractProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true">
-                    <el-input v-model="row.productName" placeholder="请输入商品名" />
+                    <el-input v-model="row.productName" placeholder="请输入商品英文名" />
                   </el-form-item>
                 </div>
               </template>
@@ -154,7 +155,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="unit" label="单位" width="100" />
-            <el-table-column label="数量" width="160">
+            <el-table-column label="数量" width="150">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'serviceContractProductList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true">
@@ -188,7 +189,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="amount" label="金额" width="140" />
+            <el-table-column prop="amount" label="金额" width="100" />
             <el-table-column align="center" label="操作" width="120" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleHandover(row, $index)">交接单</el-button>
@@ -294,8 +295,8 @@
       </template>
     </byForm>
 
-    <el-dialog v-model="openProduct" title="选择商品" width="70%" append-to-body>
-      <SelectGoods @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择商品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
 
     <el-dialog title="交接单" v-if="openHandover" v-model="openHandover" width="800">
@@ -436,7 +437,7 @@ const rules = ref({
   buyAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }],
   buyContactName: [{ required: true, message: "请输入联系人", trigger: ["change", "blur"] }],
   buyContactNumber: [{ required: true, message: "请输入联系电话", trigger: "blur" }],
-  productName: [{ required: true, message: "请输入商品名", trigger: "blur" }],
+  productName: [{ required: true, message: "请输入商品英文名", trigger: "blur" }],
   productModel: [{ required: true, message: "请输入规格型号", trigger: "blur" }],
   quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
   price: [{ required: true, message: "请输入单价", trigger: "blur" }],
@@ -632,17 +633,37 @@ const handlePerson = (item) => {
 };
 const pushGoods = (goods) => {
   if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.serviceContractProductList && formData.data.serviceContractProductList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.serviceContractProductList.filter((itemProduct) => itemProduct.productId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
     formData.data.serviceContractProductList = formData.data.serviceContractProductList.concat(
-      goods.map((item) => {
+      afterFiltering.map((item) => {
         let fileUrl = "";
         if (item.fileList && item.fileList.length > 0) {
           fileUrl = item.fileList[0].fileUrl;
         }
+        let name = item.name;
+        if (item.standardJson) {
+          let standardJson = JSON.parse(item.standardJson);
+          if (standardJson && standardJson.englishName) {
+            name = standardJson.englishName;
+          }
+        }
         return {
           fileUrl: fileUrl,
           code: item.code,
           productId: item.id,
-          productName: item.name,
+          name: item.name,
+          productName: name,
           productModel: item.spec,
           unit: item.unit,
           quantity: undefined,
@@ -896,6 +917,18 @@ watch(
     deep: true,
   }
 );
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.serviceContractProductList && formData.data.serviceContractProductList.length > 0) {
+    data = formData.data.serviceContractProductList.map((item) => {
+      return {
+        id: item.productId,
+        name: item.name,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped>

+ 39 - 202
src/components/product/SelectGoods.vue

@@ -8,46 +8,30 @@
       :loading="loading"
       highlight-current-row
       :selectConfig="selectConfig"
-      :table-events="{
-        //element talbe事件都能传
-        select: select,
-      }"
       :action-list="[]"
-      @get-list="getList"
-    >
+      @get-list="getList">
     </byTable>
     <div>
       <div>已选择货品</div>
       <div style="margin: 10px 0px">
-        <el-tag
-          style="margin-right: 10px"
-          type="info"
-          closable
-          v-for="(good, index) in goodList"
-          :key="good.id"
-          @close="handleRemove(index)"
-          >{{ good.name }}</el-tag
-        >
+        <el-tag style="margin-right: 10px" type="info" closable v-for="(good, index) in goodList" :key="good.id" @close="handleRemove(index)">
+          {{ good.name }}
+        </el-tag>
       </div>
       <div style="text-align: center">
-        <el-button @click="handleCancel" size="large">取消</el-button>
-        <el-button type="primary" @click="handleSubmit" size="large">
-          确 定
-        </el-button>
+        <el-button @click="handleCancel" size="large">取 消</el-button>
+        <el-button type="primary" @click="handleSubmit" size="large">确 定</el-button>
       </div>
     </div>
   </div>
 </template>
-  
+
 <script setup>
-/* eslint-disable vue/no-unused-components */
-import { ElMessage, ElMessageBox } from "element-plus";
+import { ElMessage } from "element-plus";
 import byTable from "@/components/byTable/index";
-import byForm from "@/components/byForm/index";
-import treeList from "@/components/product/treeList";
-import { computed, defineComponent, ref, watch } from "vue";
+import { computed, ref } from "vue";
+
 const loading = ref(false);
-const submitLoading = ref(false);
 const sourceList = ref({
   data: [],
   pagination: {
@@ -60,24 +44,12 @@ const sourceList = ref({
     definition: "1",
   },
 });
-let dialogVisible = ref(false);
-let openExcelDialog = ref(false);
-
-let modalType = ref("add");
-let rules = ref({
-  productClassifyId: [
-    { required: true, message: "请选择产品分类", trigger: "change" },
-  ],
-  type: [{ required: true, message: "请选择产品类型", trigger: "change" }],
-  name: [{ required: true, message: "请输入产品名称", trigger: "blur" }],
-  unit: [{ required: true, message: "请选择单位", trigger: "change" }],
-});
 const { proxy } = getCurrentInstance();
 const selectConfig = reactive([
   {
     label: "物品类型",
     prop: "definition",
-    isShowAll: false, //不显示全部搜索
+    isShowAll: false,
     data: [
       {
         label: "产品",
@@ -89,11 +61,6 @@ const selectConfig = reactive([
       },
     ],
   },
-  {
-    label: "所属分类",
-    prop: "productClassifyId",
-    data: [],
-  },
 ]);
 const config = computed(() => {
   return [
@@ -147,7 +114,6 @@ const config = computed(() => {
         align: "center",
         fixed: "right",
       },
-      // 渲染 el-button,一般用在最后一列。
       renderHTML(row) {
         return [
           {
@@ -166,145 +132,40 @@ const config = computed(() => {
     },
   ];
 });
-
-let formData = reactive({
-  data: {},
-});
-const formOption = reactive({
-  inline: true,
-  labelWidth: 100,
-  itemWidth: 100,
-  rules: [],
-});
-const byform = ref(null);
-const treeListData = ref([]);
-const formConfig = computed(() => {
-  return [
-    {
-      type: "treeSelect",
-      prop: "productClassifyId",
-      label: "产品分类",
-      data: [],
-    },
-    {
-      type: "select",
-      prop: "type",
-      label: "产品类型",
-      required: true,
-      data: [
-        {
-          label: "成品",
-          id: "1",
-        },
-        {
-          label: "半成品",
-          id: "2",
-        },
-      ],
-    },
-    {
-      type: "input",
-      prop: "name",
-      label: "产品名称",
-    },
-    {
-      type: "input",
-      prop: "spec",
-      label: "规格型号",
-    },
-    {
-      type: "select",
-      prop: "unit",
-      label: "单位",
-      required: true,
-      data: [
-        {
-          label: "个",
-          id: "个",
-        },
-        {
-          label: "双",
-          id: "双",
-        },
-      ],
-    },
-    {
-      type: "slot",
-      slotName: "productPic",
-      prop: "fileList",
-      label: "产品图片",
-    },
-    {
-      type: "input",
-      prop: "remark",
-      label: "备注",
-      itemType: "textarea",
-    },
-  ];
-});
-
-const lastDefinition = ref("");
+const table = ref(null);
+const productUnit = ref([]);
+const getDict = () => {
+  proxy.getDictOne(["unit"]).then((res) => {
+    productUnit.value = res["unit"].map((x) => ({
+      label: x.dictValue,
+      value: x.dictKey,
+    }));
+  });
+};
+getDict();
 const getList = async (req = {}) => {
-  for (const key in req) {
-    sourceList.value.pagination[key] = req[key];
-    if (key === "definition") {
-      if (lastDefinition.value !== req[key]) {
-        getTreeList();
-        lastDefinition.value = req[key];
-        // 如果选择的物品分类不一致,则分类默认选中全部
-        return table.value.searchItemSelct("all", selectConfig[1]);
-      }
-    }
-  }
   sourceList.value.pagination = {
     ...sourceList.value.pagination,
     ...req,
   };
   loading.value = true;
-  proxy
-    .post("/productInfo/page", sourceList.value.pagination)
-    .then((message) => {
-      sourceList.value.data = message.rows.map((x) => ({ ...x, fileList: [] }));
-      sourceList.value.pagination.total = message.total;
-      setTimeout(() => {
-        loading.value = false;
-      }, 200);
-
-      const productIdList = message.rows.map((x) => x.id);
-      // 请求文件数据并回显
-      if (productIdList.length > 0) {
-        proxy
-          .post("/fileInfo/getList", { businessIdList: productIdList })
-          .then((fileObj) => {
-            for (let i = 0; i < sourceList.value.data.length; i++) {
-              const e = sourceList.value.data[i];
-              for (const key in fileObj) {
-                if (e.id === key) {
-                  e.fileList = fileObj[key];
-                }
-              }
-            }
-          });
-      }
-    });
-};
-
-const getTreeList = () => {
-  proxy
-    .post("/productClassify/tree", {
-      parentId: "",
-      name: "",
-      definition: sourceList.value.pagination.definition,
-    })
-    .then((message) => {
-      selectConfig[1].data = message.map((x) => ({
-        label: x.label,
-        value: x.id,
-      }));
-    });
+  proxy.post("/productInfo/page", sourceList.value.pagination).then((message) => {
+    sourceList.value.data = message.rows.map((x) => ({ ...x, fileList: [] }));
+    sourceList.value.pagination.total = message.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
 };
-
+getList();
+// 接收父组件的传值
+const props = defineProps({
+  selectList: Array,
+});
 const goodList = ref([]);
+onMounted(() => {
+  goodList.value = proxy.deepClone(props.selectList);
+});
 const handleSelect = (row) => {
   const flag = goodList.value.some((x) => x.id === row.id);
   if (flag)
@@ -321,7 +182,6 @@ const handleSelect = (row) => {
     type: "success",
   });
 };
-
 const handleRemove = (index) => {
   goodList.value.splice(index, 1);
   return ElMessage({
@@ -329,7 +189,6 @@ const handleRemove = (index) => {
     type: "success",
   });
 };
-
 const handleSubmit = () => {
   if (!goodList.value.length > 0)
     return ElMessage({
@@ -339,34 +198,12 @@ const handleSubmit = () => {
   proxy.$emit("pushGoods", goodList.value);
   goodList.value = [];
 };
-
 const handleCancel = () => {
   goodList.value = [];
   proxy.$emit("cancel");
 };
-
-const table = ref(null);
-
-const searchItemSelct = () => {
-  // 默认选中的方法
-  table.value.searchItemSelct(selectConfig[0].data[0], selectConfig[0]);
-};
-const productUnit = ref([]);
-const getDict = () => {
-  proxy.getDictOne(["unit"]).then((res) => {
-    productUnit.value = res["unit"].map((x) => ({
-      label: x.dictValue,
-      value: x.dictKey,
-    }));
-  });
-};
-getDict();
-
-onMounted(() => {
-  searchItemSelct();
-});
 </script>
-  
+
 <style lang="scss" scoped>
 .user {
   padding: 20px;
@@ -386,4 +223,4 @@ onMounted(() => {
   cursor: pointer;
   vertical-align: middle;
 }
-</style>
+</style>

+ 1 - 0
src/views/finance/fundManage/funds/index.vue

@@ -392,6 +392,7 @@ const openModal = () => {
     path: "/platform_manage/process/processApproval",
     query: {
       flowKey: "account_request_funds_flow",
+      random: proxy.random(),
       flowName,
     },
   });

+ 1 - 0
src/views/purchaseManage/purchaseManage/alreadyPurchase/index.vue

@@ -497,6 +497,7 @@ const start = () => {
       flowKey: "purchase_flow",
       ids: "",
       flowName: "采购申请",
+      random: proxy.random(),
     },
   });
 };

+ 1 - 0
src/views/purchaseManage/purchaseManage/handoverSlip/index.vue

@@ -364,6 +364,7 @@ const start = (type, row) => {
       query: {
         flowKey: "purchase_flow",
         type: "handoverSlip",
+        random: proxy.random(),
         ids,
       },
     });

+ 1 - 0
src/views/purchaseManage/purchaseManage/returnGoods/index.vue

@@ -460,6 +460,7 @@ const start = () => {
     path: "/platform_manage/process/processApproval",
     query: {
       flowKey: "sales_return_flow",
+      random: proxy.random(),
     },
   });
 };

+ 1 - 0
src/views/purchaseManage/purchaseManage/subscribe/index.vue

@@ -395,6 +395,7 @@ const openModal = () => {
     path: "/platform_manage/process/processApproval",
     query: {
       flowKey: "subscribe_flow",
+      random: proxy.random(),
     },
   });
 };

+ 1 - 0
src/views/purchaseManage/purchasePayment/payment/index.vue

@@ -410,6 +410,7 @@ const purchasePayment = () => {
     query: {
       flowKey: "pay_flow",
       flowName: "采购付款申请",
+      random: proxy.random(),
     },
   });
 };

+ 1 - 0
src/views/purchaseManage/purchasePayment/refund/index.vue

@@ -245,6 +245,7 @@ const applyForRefund = () => {
     query: {
       flowKey: "refund_flow",
       flowName: "退款申请",
+      random: proxy.random(),
     },
   });
 };

+ 95 - 156
src/views/purchaseManage/supplier/supplyPrice/index.vue

@@ -19,83 +19,37 @@
             action: () => openModal('add'),
           },
         ]"
-        @get-list="getList"
-      >
+        @get-list="getList">
         <template #fileSlot="{ item }">
-          <div
-            style="cursor: pointer; color: #409eff"
-            @click="handleClickFile(item)"
-          >
+          <div style="cursor: pointer; color: #409eff" @click="handleClickFile(item)">
             {{ item.fileName }}
           </div>
         </template>
       </byTable>
     </div>
-    <el-dialog
-      :title="modalType == 'add' ? '添加供应价格' : '编辑供应价格'"
-      v-model="dialogVisible"
-      width="800"
-      v-loading="loading"
-    >
-      <byForm
-        :formConfig="formConfig"
-        :formOption="formOption"
-        v-model="formData.data"
-        :rules="rules"
-        ref="byform"
-      >
+    <el-dialog :title="modalType == 'add' ? '添加供应价格' : '编辑供应价格'" v-model="dialogVisible" width="800" v-loading="loading">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform">
         <template #details>
           <div style="width: 100%">
-            <el-button
-              type="primary"
-              @click="openProduct = true"
-              :disabled="modalType == 'edit'"
-            >
-              选择
-            </el-button>
+            <el-button type="primary" @click="openProduct = true" :disabled="modalType == 'edit'"> 选择 </el-button>
 
-            <el-form
-              ref="tableForm"
-              :model="formData.data"
-              :rules="rules"
-              label-width="0px"
-              style="margin-top: 15px"
-            >
+            <el-form ref="tableForm" :model="formData.data" :rules="rules" label-width="0px" style="margin-top: 15px">
               <el-table :data="formData.data.supplierPriceList">
                 <el-table-column prop="code" label="货品编码" />
                 <el-table-column prop="name" label="货品名称" min-width="150" />
                 <el-table-column prop="spec" label="规格型号" />
-                <el-table-column
-                  prop="unit"
-                  label="单位"
-                  :formatter="(row) => dictValueLabel(row.unit, productUnit)"
-                />
+                <el-table-column prop="unit" label="单位" :formatter="(row) => dictValueLabel(row.unit, productUnit)" />
                 <el-table-column prop="price" label="供应单价" min-width="150">
                   <template #default="{ row, $index }">
-                    <el-form-item
-                      :prop="'supplierPriceList.' + $index + '.price'"
-                      :rules="rules.price"
-                      :inline-message="true"
-                    >
-                      <el-input-number
-                        v-model="row.price"
-                        :precision="4"
-                        :controls="false"
-                        :min="1"
-                      />
+                    <el-form-item :prop="'supplierPriceList.' + $index + '.price'" :rules="rules.price" :inline-message="true">
+                      <el-input-number v-model="row.price" :precision="4" :controls="false" :min="1" />
                     </el-form-item>
                   </template>
                 </el-table-column>
 
                 <el-table-column prop="zip" label="操作" width="100">
                   <template #default="{ $index }">
-                    <el-button
-                      type="primary"
-                      link
-                      @click="handleRemove($index)"
-                      :disabled="modalType == 'edit'"
-                      >删除</el-button
-                    >
+                    <el-button type="primary" link @click="handleRemove($index)" :disabled="modalType == 'edit'">删除</el-button>
                   </template>
                 </el-table-column>
               </el-table>
@@ -105,31 +59,16 @@
       </byForm>
       <template #footer>
         <el-button @click="dialogVisible = false" size="large">取 消</el-button>
-        <el-button
-          type="primary"
-          @click="submitForm('byform')"
-          size="large"
-          :loading="submitLoading"
-        >
-          确 定
-        </el-button>
+        <el-button type="primary" @click="submitForm('byform')" size="large" :loading="submitLoading"> 确 定 </el-button>
       </template>
     </el-dialog>
 
-    <el-dialog
-      v-model="openProduct"
-      title="选择货品"
-      width="70%"
-      append-to-body
-    >
-      <SelectGoods
-        @cancel="openProduct = false"
-        @pushGoods="pushGoods"
-      ></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择货品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
-  
+
 <script setup>
 /* eslint-disable vue/no-unused-components */
 import { ElMessage, ElMessageBox } from "element-plus";
@@ -159,9 +98,7 @@ let openProduct = ref(false);
 let modalType = ref("add");
 let fileList = ref([]);
 let rules = ref({
-  supplierInfoId: [
-    { required: true, message: "请选择供应商", trigger: "change" },
-  ],
+  supplierInfoId: [{ required: true, message: "请选择供应商", trigger: "change" }],
   price: [{ required: true, message: "请输入供应单价", trigger: "blur" }],
 });
 const { proxy } = getCurrentInstance();
@@ -289,15 +226,11 @@ const config = computed(() => {
             el: "button",
             click() {
               // 弹窗提示是否删除
-              ElMessageBox.confirm(
-                "此操作将永久删除该数据, 是否继续?",
-                "提示",
-                {
-                  confirmButtonText: "确定",
-                  cancelButtonText: "取消",
-                  type: "warning",
-                }
-              ).then(() => {
+              ElMessageBox.confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+              }).then(() => {
                 // 删除
                 proxy
                   .post("/supplierPrice/delete", {
@@ -362,16 +295,14 @@ const formConfig = reactive([
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
-  proxy
-    .post("/supplierPrice/page", sourceList.value.pagination)
-    .then((message) => {
-      console.log(message);
-      sourceList.value.data = message.rows;
-      sourceList.value.pagination.total = message.total;
-      setTimeout(() => {
-        loading.value = false;
-      }, 200);
-    });
+  proxy.post("/supplierPrice/page", sourceList.value.pagination).then((message) => {
+    console.log(message);
+    sourceList.value.data = message.rows;
+    sourceList.value.pagination.total = message.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
 };
 const openModal = () => {
   dialogVisible.value = true;
@@ -412,28 +343,16 @@ const submitForm = () => {
                     message: `已存在供应价格,价格为${res.existSupplierPriceList[0].price}`,
                     type: "info",
                   });
-                  ElMessageBox.confirm(
-                    "继续提交将修改已存在的单价数据, 是否继续?",
-                    "提示",
-                    {
-                      confirmButtonText: "确定",
-                      cancelButtonText: "取消",
-                      type: "warning",
-                    }
-                  )
+                  ElMessageBox.confirm("继续提交将修改已存在的单价数据, 是否继续?", "提示", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning",
+                  })
                     .then(() => {
                       const arr = [];
-                      for (
-                        let i = 0;
-                        i < formData.data.supplierPriceList.length;
-                        i++
-                      ) {
+                      for (let i = 0; i < formData.data.supplierPriceList.length; i++) {
                         const iele = formData.data.supplierPriceList[i];
-                        for (
-                          let j = 0;
-                          j < res.existSupplierPriceList.length;
-                          j++
-                        ) {
+                        for (let j = 0; j < res.existSupplierPriceList.length; j++) {
                           const jele = res.existSupplierPriceList[j];
                           if (iele.productInfoId === jele.productInfoId) {
                             jele.price = iele.price;
@@ -446,22 +365,17 @@ const submitForm = () => {
                         price: x.price,
                       }));
                       formData.data.renewWhileItExists = true;
-                      proxy
-                        .post(
-                          "/supplierPrice/" + modalType.value,
-                          formData.data
-                        )
-                        .then((res) => {
-                          if (res.addSuccess) {
-                            ElMessage({
-                              message: "修改成功",
-                              type: "success",
-                            });
-                            getList();
-                            dialogVisible.value = false;
-                            submitLoading.value = false;
-                          }
-                        });
+                      proxy.post("/supplierPrice/" + modalType.value, formData.data).then((res) => {
+                        if (res.addSuccess) {
+                          ElMessage({
+                            message: "修改成功",
+                            type: "success",
+                          });
+                          getList();
+                          dialogVisible.value = false;
+                          submitLoading.value = false;
+                        }
+                      });
                     })
                     .catch(() => {});
                 }
@@ -472,22 +386,19 @@ const submitForm = () => {
             );
           } else {
             formData.data.supplierInfoId = formData.data.supplierInfoIdCopy;
-            formData.data.productInfoId =
-              formData.data.supplierPriceList[0].productInfoId;
+            formData.data.productInfoId = formData.data.supplierPriceList[0].productInfoId;
             formData.data.price = formData.data.supplierPriceList[0].price;
             delete formData.data.supplierPriceList;
             delete formData.data.supplierInfoIdCopy;
-            proxy
-              .post("/supplierPrice/" + modalType.value, formData.data)
-              .then((res) => {
-                ElMessage({
-                  message: "修改成功",
-                  type: "success",
-                });
-                getList();
-                dialogVisible.value = false;
-                submitLoading.value = false;
+            proxy.post("/supplierPrice/" + modalType.value, formData.data).then((res) => {
+              ElMessage({
+                message: "修改成功",
+                type: "success",
               });
+              getList();
+              dialogVisible.value = false;
+              submitLoading.value = false;
+            });
           }
         }
       });
@@ -542,17 +453,33 @@ const handleRemove = (index) => {
 };
 
 const pushGoods = (goods) => {
-  const arr = goods.map((x) => ({ ...x, productInfoId: x.id, price: "" }));
-  arr.forEach((item) => {
-    if (!formData.data.supplierPriceList.some((e) => e.id === item.id)) {
-      formData.data.supplierPriceList.push(item);
+  if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.supplierPriceList && formData.data.supplierPriceList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.supplierPriceList.filter((itemProduct) => itemProduct.productInfoId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
     }
-  });
-  openProduct.value = false;
-  return ElMessage({
-    message: "添加成功!",
-    type: "success",
-  });
+    const arr = afterFiltering.map((x) => ({ ...x, productInfoId: x.id, price: "" }));
+    arr.forEach((item) => {
+      if (!formData.data.supplierPriceList.some((e) => e.id === item.id)) {
+        formData.data.supplierPriceList.push(item);
+      }
+    });
+    openProduct.value = false;
+    return ElMessage({
+      message: "添加成功!",
+      type: "success",
+    });
+  } else {
+    ElMessage("请选择至少一件物品");
+  }
 };
 const supplierType = ref([]);
 const productUnit = ref([]);
@@ -571,10 +498,22 @@ const getDict = () => {
 };
 getDict();
 getList();
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.supplierPriceList && formData.data.supplierPriceList.length > 0) {
+    data = formData.data.supplierPriceList.map((item) => {
+      return {
+        id: item.productInfoId,
+        name: item.name,
+      };
+    });
+  }
+  return data;
+};
 </script>
-  
+
 <style lang="scss" scoped>
 .tenant {
   padding: 20px;
 }
-</style>
+</style>

+ 27 - 3
src/views/purchaseSales/outAndInWarehouse/manualWarehousing/index.vue

@@ -52,8 +52,8 @@
       </template>
     </el-dialog>
 
-    <el-dialog v-model="openProduct" title="选择商品" width="70%" append-to-body>
-      <SelectGoods @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择商品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
@@ -218,8 +218,20 @@ const openModal = () => {
 };
 const pushGoods = (goods) => {
   if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.list && formData.data.list.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.list.filter((itemProduct) => itemProduct.productId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
     formData.data.list = formData.data.list.concat(
-      goods.map((item) => {
+      afterFiltering.map((item) => {
         return {
           productCode: item.code,
           productId: item.id,
@@ -261,6 +273,18 @@ const submitForm = () => {
 const handleDelete = (index) => {
   formData.data.list.splice(index, 1);
 };
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.list && formData.data.list.length > 0) {
+    data = formData.data.list.map((item) => {
+      return {
+        id: item.productId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped>

+ 60 - 103
src/views/purchaseSales/outAndInWarehouse/warehouseAdjustment/index.vue

@@ -14,82 +14,32 @@
             action: () => openModal(),
           },
         ]"
-        @get-list="getList"
-      >
+        @get-list="getList">
       </byTable>
     </div>
 
-    <el-dialog
-      title="新增调仓"
-      v-if="dialogVisible"
-      v-model="dialogVisible"
-      width="1000"
-      v-loading="loadingDialog"
-    >
-      <byForm
-        :formConfig="formConfig"
-        :formOption="formOption"
-        v-model="formData.data"
-        :rules="rules"
-        ref="submit"
-      >
+    <el-dialog title="新增调仓" v-if="dialogVisible" v-model="dialogVisible" width="1000" v-loading="loadingDialog">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
         <template #details>
           <div style="width: 100%">
-            <el-button type="primary" @click="openProduct = true"
-              >添加明细</el-button
-            >
-            <el-table
-              :data="formData.data.stockTransferDetailsList"
-              style="width: 100%; margin-top: 16px"
-            >
-              <el-table-column
-                prop="productCode"
-                label="物品编码"
-                width="140"
-              />
-              <el-table-column
-                prop="productName"
-                label="物品名称"
-                min-width="220"
-              />
-              <el-table-column
-                prop="productSpec"
-                label="规格型号"
-                min-width="220"
-              />
+            <el-button type="primary" @click="openProduct = true">添加明细</el-button>
+            <el-table :data="formData.data.stockTransferDetailsList" style="width: 100%; margin-top: 16px">
+              <el-table-column prop="productCode" label="物品编码" width="140" />
+              <el-table-column prop="productName" label="物品名称" min-width="220" />
+              <el-table-column prop="productSpec" label="规格型号" min-width="220" />
               <!-- <el-table-column prop="productUnit" label="单位" width="100" /> -->
               <el-table-column label="调仓数量" width="160">
                 <template #default="{ row, $index }">
                   <div style="width: 100%">
-                    <el-form-item
-                      :prop="
-                        'stockTransferDetailsList.' + $index + '.outQuantity'
-                      "
-                      :rules="rules.outQuantity"
-                      :inline-message="true"
-                    >
-                      <el-input-number
-                        v-model="row.outQuantity"
-                        placeholder="请输入数量"
-                        style="width: 100%"
-                        :precision="0"
-                        :controls="false"
-                        :min="0"
-                      />
+                    <el-form-item :prop="'stockTransferDetailsList.' + $index + '.outQuantity'" :rules="rules.outQuantity" :inline-message="true">
+                      <el-input-number v-model="row.outQuantity" placeholder="请输入数量" style="width: 100%" :precision="0" :controls="false" :min="0" />
                     </el-form-item>
                   </div>
                 </template>
               </el-table-column>
-              <el-table-column
-                align="center"
-                label="操作"
-                width="80"
-                fixed="right"
-              >
+              <el-table-column align="center" label="操作" width="80" fixed="right">
                 <template #default="{ row, $index }">
-                  <el-button type="primary" link @click="handleDelete($index)"
-                    >删除</el-button
-                  >
+                  <el-button type="primary" link @click="handleDelete($index)">删除</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -98,22 +48,12 @@
       </byForm>
       <template #footer>
         <el-button @click="dialogVisible = false" size="large">取 消</el-button>
-        <el-button type="primary" @click="submitForm()" size="large"
-          >确 定</el-button
-        >
+        <el-button type="primary" @click="submitForm()" size="large">确 定</el-button>
       </template>
     </el-dialog>
 
-    <el-dialog
-      v-model="openProduct"
-      title="选择商品"
-      width="70%"
-      append-to-body
-    >
-      <SelectGoods
-        @cancel="openProduct = false"
-        @pushGoods="pushGoods"
-      ></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择商品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
@@ -249,15 +189,13 @@ const getDict = () => {
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
-  proxy
-    .post("stockTransferDetails/page", sourceList.value.pagination)
-    .then((res) => {
-      sourceList.value.data = res.rows;
-      sourceList.value.pagination.total = res.total;
-      setTimeout(() => {
-        loading.value = false;
-      }, 200);
-    });
+  proxy.post("stockTransferDetails/page", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
 };
 getDict();
 getList();
@@ -309,12 +247,8 @@ const formConfig = computed(() => {
   ];
 });
 const rules = ref({
-  outWarehouseId: [
-    { required: true, message: "请选择调出仓库", trigger: "change" },
-  ],
-  inWarehouseId: [
-    { required: true, message: "请选择调入仓库", trigger: "change" },
-  ],
+  outWarehouseId: [{ required: true, message: "请选择调出仓库", trigger: "change" }],
+  inWarehouseId: [{ required: true, message: "请选择调入仓库", trigger: "change" }],
   outQuantity: [{ required: true, message: "请输入调仓数量", trigger: "blur" }],
 });
 const openModal = () => {
@@ -327,19 +261,30 @@ const openModal = () => {
 };
 const pushGoods = (goods) => {
   if (goods && goods.length > 0) {
-    formData.data.stockTransferDetailsList =
-      formData.data.stockTransferDetailsList.concat(
-        goods.map((item) => {
-          return {
-            productCode: item.code,
-            productId: item.id,
-            productName: item.name,
-            productSpec: item.spec,
-            productUnit: item.unit,
-            outQuantity: undefined,
-          };
-        })
-      );
+    let afterFiltering = [];
+    if (formData.data.stockTransferDetailsList && formData.data.stockTransferDetailsList.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.stockTransferDetailsList.filter((itemProduct) => itemProduct.productId === item.id);
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
+    formData.data.stockTransferDetailsList = formData.data.stockTransferDetailsList.concat(
+      afterFiltering.map((item) => {
+        return {
+          productCode: item.code,
+          productId: item.id,
+          productName: item.name,
+          productSpec: item.spec,
+          productUnit: item.unit,
+          outQuantity: undefined,
+        };
+      })
+    );
     ElMessage({
       message: "添加成功!",
       type: "success",
@@ -382,6 +327,18 @@ const submitForm = () => {
 const handleDelete = (index) => {
   formData.data.stockTransferDetailsList.splice(index, 1);
 };
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.stockTransferDetailsList && formData.data.stockTransferDetailsList.length > 0) {
+    data = formData.data.stockTransferDetailsList.map((item) => {
+      return {
+        id: item.productId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
 </script>
 
 <style lang="scss" scoped>

+ 89 - 137
src/views/purchaseSales/stockManage/inventory/index.vue

@@ -19,86 +19,37 @@
             action: () => openModal('add'),
           },
         ]"
-        @get-list="getList"
-      >
+        @get-list="getList">
         <template #code="{ item }">
-          <div
-            style="cursor: pointer; color: #409eff"
-            @click="handleClickCode(item)"
-          >
+          <div style="cursor: pointer; color: #409eff" @click="handleClickCode(item)">
             {{ item.code }}
           </div>
         </template>
       </byTable>
     </div>
-    <el-dialog
-      :title="modalType == 'add' ? '发起盘点' : '盘点详情'"
-      v-model="dialogVisible"
-      width="800"
-      v-loading="loading"
-      destroy-on-close
-    >
-      <byForm
-        :formConfig="formConfig"
-        :formOption="formOption"
-        v-model="formData.data"
-        :rules="rules"
-        ref="byform"
-      >
+    <el-dialog :title="modalType == 'add' ? '发起盘点' : '盘点详情'" v-model="dialogVisible" width="800" v-loading="loading" destroy-on-close>
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform">
         <template #products>
           <div style="width: 100%">
-            <el-button
-              type="primary"
-              @click="openProduct = true"
-              style="margin-bottom: 10px"
-              v-if="modalType == 'add'"
-              :disabled="!formData.data.warehouseId"
-            >
+            <el-button type="primary" @click="openProduct = true" style="margin-bottom: 10px" v-if="modalType == 'add'" :disabled="!formData.data.warehouseId">
               添加物品
             </el-button>
             <el-table :data="formData.data.list" :row-class-name="changeClass">
               <el-table-column prop="productCode" label="物品编码" />
               <el-table-column prop="productName" label="物品名称" />
-              <el-table-column
-                prop="productUnit"
-                label="单位"
-                :formatter="
-                  (row) => dictValueLabel(row.productUnit, productUnit)
-                "
-              />
+              <el-table-column prop="productUnit" label="单位" :formatter="(row) => dictValueLabel(row.productUnit, productUnit)" />
               <el-table-column prop="quantity" label="库存数量" />
-              <el-table-column
-                prop="checkQuantity"
-                label="盘点数量"
-                min-width="150"
-              >
+              <el-table-column prop="checkQuantity" label="盘点数量" min-width="150">
                 <template #default="{ row, $index }">
-                  <el-form-item
-                    :prop="'list.' + $index + '.checkQuantity'"
-                    :rules="rules.checkQuantity"
-                    :inline-message="true"
-                  >
-                    <el-input-number
-                      v-model="row.checkQuantity"
-                      :precision="4"
-                      :controls="false"
-                      :min="0"
-                      @change="() => handleChange($index)"
-                    />
+                  <el-form-item :prop="'list.' + $index + '.checkQuantity'" :rules="rules.checkQuantity" :inline-message="true">
+                    <el-input-number v-model="row.checkQuantity" :precision="4" :controls="false" :min="0" @change="() => handleChange($index)" />
                   </el-form-item>
                 </template>
               </el-table-column>
               <el-table-column prop="result" label="盘点结果" />
-              <el-table-column
-                prop="zip"
-                label="操作"
-                width="100"
-                v-if="modalType == 'add'"
-              >
+              <el-table-column prop="zip" label="操作" width="100" v-if="modalType == 'add'">
                 <template #default="{ $index }">
-                  <el-button type="primary" link @click="handleRemove($index)"
-                    >删除</el-button
-                  >
+                  <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -107,30 +58,15 @@
       </byForm>
       <template #footer v-if="modalType == 'add'">
         <el-button @click="dialogVisible = false" size="large">取 消</el-button>
-        <el-button
-          type="primary"
-          @click="submitForm('byform')"
-          size="large"
-          :loading="submitLoading"
-        >
-          确 定
-        </el-button>
+        <el-button type="primary" @click="submitForm('byform')" size="large" :loading="submitLoading"> 确 定 </el-button>
       </template>
     </el-dialog>
-    <el-dialog
-      v-model="openProduct"
-      title="选择物品"
-      width="70%"
-      append-to-body
-    >
-      <SelectGoods
-        @cancel="openProduct = false"
-        @pushGoods="pushGoods"
-      ></SelectGoods>
+    <el-dialog v-if="openProduct" v-model="openProduct" title="选择物品" width="70%" append-to-body>
+      <SelectGoods :selectList="acquireSelectList()" @cancel="openProduct = false" @pushGoods="pushGoods"></SelectGoods>
     </el-dialog>
   </div>
 </template>
-  
+
 <script setup>
 /* eslint-disable vue/no-unused-components */
 import { ElMessage, ElMessageBox } from "element-plus";
@@ -156,12 +92,8 @@ let openProduct = ref(false);
 let roomDialogVisible = ref(false);
 let modalType = ref("add");
 let rules = ref({
-  checkQuantity: [
-    { required: true, message: "请输入盘点数量", trigger: "blur" },
-  ],
-  warehouseId: [
-    { required: true, message: "请选择盘点仓库", trigger: "change" },
-  ],
+  checkQuantity: [{ required: true, message: "请输入盘点数量", trigger: "blur" }],
+  warehouseId: [{ required: true, message: "请选择盘点仓库", trigger: "change" }],
 });
 const { proxy } = getCurrentInstance();
 const selectConfig = reactive([
@@ -316,16 +248,14 @@ const formConfig = reactive([
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
-  proxy
-    .post("/stockCheck/page", sourceList.value.pagination)
-    .then((message) => {
-      console.log(message);
-      sourceList.value.data = message.rows;
-      sourceList.value.pagination.total = message.total;
-      setTimeout(() => {
-        loading.value = false;
-      }, 200);
-    });
+  proxy.post("/stockCheck/page", sourceList.value.pagination).then((message) => {
+    console.log(message);
+    sourceList.value.data = message.rows;
+    sourceList.value.pagination.total = message.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
 };
 const openModal = () => {
   dialogVisible.value = true;
@@ -406,38 +336,55 @@ const handleSelect = (row) => {
 };
 
 const pushGoods = (goods) => {
-  const arr = goods.map((x) => ({
-    productId: x.id,
-    quantity: "",
-    checkQuantity: "",
-    productName: x.name,
-    productCode: x.code,
-    productUnit: x.unit,
-  }));
-  const ids = arr.map((x) => x.productId);
-  if (formData.data.warehouseId) {
-    proxy
-      .post("/stock/pageByWarehouse", {
-        id: formData.data.warehouseId,
-        productIds: ids,
-      })
-      .then((res) => {
-        const productList = res.rows;
-        for (let i = 0; i < productList.length; i++) {
-          const e = productList[i];
-          for (let j = 0; j < arr.length; j++) {
-            const jele = arr[j];
-            if (e.productId === jele.productId) {
-              formData.data.list.push({ ...jele, quantity: e.quantity });
-            }
-          }
+  if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.list && formData.data.list.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.list.filter((itemProduct) => itemProduct.productId === item.id);
+        if (data && data.length > 0) {
+          return false;
         }
+        return true;
       });
+    } else {
+      afterFiltering = goods;
+    }
+    const arr = afterFiltering.map((x) => ({
+      productId: x.id,
+      quantity: "",
+      checkQuantity: "",
+      productName: x.name,
+      productCode: x.code,
+      productUnit: x.unit,
+    }));
+    const ids = arr.map((x) => x.productId);
+    if (formData.data.warehouseId) {
+      proxy
+        .post("/stock/pageByWarehouse", {
+          id: formData.data.warehouseId,
+          productIds: ids,
+        })
+        .then((res) => {
+          const productList = res.rows;
+          for (let i = 0; i < productList.length; i++) {
+            const e = productList[i];
+            for (let j = 0; j < arr.length; j++) {
+              const jele = arr[j];
+              if (e.productId === jele.productId) {
+                formData.data.list.push({ ...jele, quantity: e.quantity });
+              }
+            }
+          }
+        });
+    }
+    openProduct.value = false;
+    return ElMessage({
+      message: "添加成功,已为你自动过滤库存数量为0的数据 !",
+      type: "success",
+    });
+  } else {
+    ElMessage("请选择至少一件物品");
   }
-  return ElMessage({
-    message: "添加成功,已为你自动过滤库存数量为0的数据 !",
-    type: "success",
-  });
 };
 
 const handleRemove = (index) => {
@@ -478,20 +425,13 @@ const handleRemove = (index) => {
 
 const handleChange = (index) => {
   if (!formData.data.list[index].quantity) return;
-  if (
-    formData.data.list[index].quantity > formData.data.list[index].checkQuantity
-  ) {
+  if (formData.data.list[index].quantity > formData.data.list[index].checkQuantity) {
     formData.data.list[index].result = "盘亏";
   }
-  if (
-    formData.data.list[index].quantity ==
-    formData.data.list[index].checkQuantity
-  ) {
+  if (formData.data.list[index].quantity == formData.data.list[index].checkQuantity) {
     formData.data.list[index].result = "正常";
   }
-  if (
-    formData.data.list[index].quantity < formData.data.list[index].checkQuantity
-  ) {
+  if (formData.data.list[index].quantity < formData.data.list[index].checkQuantity) {
     formData.data.list[index].result = "盘盈";
   }
 };
@@ -526,18 +466,30 @@ const handleClickCode = (row) => {
     dialogVisible.value = true;
   });
 };
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.list && formData.data.list.length > 0) {
+    data = formData.data.list.map((item) => {
+      return {
+        id: item.productId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
 </script>
-  
+
 <style lang="scss" scoped>
 .tenant {
   padding: 20px;
 }
 </style>
-<style >
+<style>
 .redClass {
   color: #f54a45 !important;
 }
 .greenClass {
   color: #39c55a !important;
 }
-</style>
+</style>