cz il y a 1 an
Parent
commit
2cc96e47fe

+ 60 - 40
src/views/JXSK/production/workOrder/index.vue

@@ -27,22 +27,22 @@
 
         <template #work="{ item }">
           <div style="width:100%">
-            <span style="padding: 4px" :class="[item.researchBomStatus == 1 ? 'active' : 'disActive']">
+            <span style="padding: 4px" :class="[item.researchStatus == 1 ? 'activea' : 'disActive']">
               【研】设计
             </span>
-            <span style="padding: 4px;margin-left:8px" :class="[item.researchBomStatus == 1 ? 'active' : 'disActive']">
+            <span style="padding: 4px;margin-left:8px" :class="[item.researchBomStatus == 1 ? 'activea' : 'disActive']">
               【研】BOM
             </span>
-            <span style="padding: 4px;margin-left:8px" :class="[item.electricianBomStatus == 1 ? 'active' : 'disActive']">
+            <span style="padding: 4px;margin-left:8px" :class="[item.electricianBomStatus == 1 ? 'activea' : 'disActive']">
               【电】BOM
             </span>
-            <span style="padding: 4px" :class="[item.technologyStatus == 1 ? 'active' : 'disActive']">
+            <span style="padding: 4px" :class="[item.technologyStatus == 1 ? 'activea' : 'disActive']">
               【制】工序
             </span>
-            <span style="padding: 4px;margin-left:8px" :class="[item.bomStatus == 1 ? 'active' : 'disActive']">
+            <span style="padding: 4px;margin-left:8px" :class="[item.bomStatus == 1 ? 'activea' : 'disActive']">
               【制】BOM
             </span>
-            <span style="padding: 4px;margin-left:8px" :class="[item.productionQuantity ? 'active' : 'disActive']">
+            <span style="padding: 4px;margin-left:8px" :class="[item.productionQuantity ? 'activea' : 'disActive']">
               【制】下发
             </span>
           </div>
@@ -181,7 +181,7 @@
       <template #footer>
         <el-button @click="dialogVisible = false" size="large">取 消</el-button>
         <el-button type="primary" @click="submitForm(0)" size="large" :loading="submitLoading">
-          
+          
         </el-button>
         <el-button type="primary" @click="submitForm(1)" size="large" :loading="submitLoading" v-if="!isDetail">
           提 交
@@ -263,7 +263,7 @@
       <template #footer>
         <el-button @click="dialogVisibleOne = false" size="large">取 消</el-button>
         <el-button type="primary" @click="submitFormOne(0)" size="large" :loading="loadingOne" v-if="!isDetailOne">
-          
+          
         </el-button>
         <el-button type="primary" @click="submitFormOne(1)" size="large" :loading="loadingOne" v-if="!isDetailOne">
           提 交
@@ -296,7 +296,7 @@
       <template #footer>
         <el-button @click="informationDialog = false" size="large">取 消</el-button>
         <el-button type="primary" @click="submitInformationForm(0)" size="large" :loading="submitLoading" v-if="!showUploadSubmitOne">
-          
+          
         </el-button>
         <el-button type="primary" @click="submitInformationForm(1)" size="large" :loading="submitLoading"
                    v-if="!showUploadSubmitOne && !showUploadSubmit">
@@ -684,6 +684,7 @@ const submitForm = (flag) => {
         cancelButtonText: "取消",
         type: "warning",
       }).then(() => {
+        submitLoading.value = true;
         if (submitType.value == 1) {
           formData.data.bomStatus = 1;
         } else if (submitType.value == 2) {
@@ -695,9 +696,35 @@ const submitForm = (flag) => {
           ...formData.data.workOrderBomList,
           ...formData.data.workOrderBomListOne,
         ];
-        formData.data.workOrderBomList = arr;
-        submitLoading.value = true;
-        proxy.post("/workOrder/editBom", formData.data).then(
+        // formData.data.workOrderBomList = arr;
+        proxy
+          .post("/workOrder/editBom", {
+            ...formData.data,
+            workOrderBomList: arr,
+          })
+          .then(
+            (res) => {
+              ElMessage({
+                message: "操作成功",
+                type: "success",
+              });
+              dialogVisible.value = false;
+              submitLoading.value = false;
+              getList();
+            },
+            (err) => (submitLoading.value = false)
+          );
+      });
+    } else {
+      submitLoading.value = true;
+      const arr = [
+        ...formData.data.workOrderBomList,
+        ...formData.data.workOrderBomListOne,
+      ];
+      // formData.data.workOrderBomList = arr;
+      proxy
+        .post("/workOrder/editBom", { ...formData.data, workOrderBomList: arr })
+        .then(
           (res) => {
             ElMessage({
               message: "操作成功",
@@ -709,21 +736,6 @@ const submitForm = (flag) => {
           },
           (err) => (submitLoading.value = false)
         );
-      });
-    } else {
-      submitLoading.value = true;
-      proxy.post("/workOrder/editBom", formData.data).then(
-        (res) => {
-          ElMessage({
-            message: "操作成功",
-            type: "success",
-          });
-          dialogVisible.value = false;
-          submitLoading.value = false;
-          getList();
-        },
-        (err) => (submitLoading.value = false)
-      );
     }
   });
 };
@@ -795,17 +807,15 @@ const getDtl = (row, flag, submit) => {
   isDetail.value = flag;
   modalType.value = "edit";
   proxy.post("/workOrderBom/list", { workOrderId: row.id }).then((res) => {
-    if (res && res.length > 0) {
-      // 五金
-      let workOrderBomList = res.filter((x) => x.type == 1);
-      let workOrderBomListOne = res.filter((x) => x.type == 2);
-      formData.data = {
-        workOrderBomList: workOrderBomList,
-        workOrderBomListOne: workOrderBomListOne,
-        workOrderId: row.id,
-      };
-      dialogVisible.value = true;
-    }
+    // 五金
+    let workOrderBomList = res.filter((x) => x.type == 1);
+    let workOrderBomListOne = res.filter((x) => x.type == 2);
+    formData.data = {
+      workOrderBomList: workOrderBomList || [],
+      workOrderBomListOne: workOrderBomListOne || [],
+      workOrderId: row.id,
+    };
+    dialogVisible.value = true;
   });
 };
 
@@ -945,6 +955,7 @@ const handleSelect = (row) => {
       productSpec: row.spec,
       productUnit: row.unit,
       quantity: null,
+      type: "1",
     });
   } else {
     const flag = formData.data.workOrderBomListOne.some(
@@ -962,6 +973,7 @@ const handleSelect = (row) => {
       productSpec: row.spec,
       productUnit: row.unit,
       quantity: null,
+      type: "2",
     });
   }
   return ElMessage({
@@ -1154,10 +1166,18 @@ const handleSelectRow = (row) => {
   color: #fff;
   border-radius: 4px;
 }
+
+.activea {
+  background: #98db6b;
+  color: #fff;
+  border-radius: 4px;
+  border: 1px solid #98db6b;
+}
 .disActive {
   // background: #fa9841;
-  background: #c4c4c4;
+  // background: #c4c4c4;
+  border: 1px solid #1c1b1b;
   border-radius: 4px;
-  color: #fff;
+  color: #1c1b1b;
 }
 </style>

+ 140 - 0
src/views/JXSK/salesMange/contract/index.vue

@@ -224,6 +224,40 @@
         <el-button type="primary" @click="clickDownload()" size="large">下载PDF</el-button>
       </template>
     </el-dialog>
+
+    <el-dialog title="销售出库" v-if="outBoundDialog" v-model="outBoundDialog" width="80%">
+      <div v-loading="submitLoading">
+        <TitleInfo content="基本信息"></TitleInfo>
+        <div style="padding:20px 20px 20px 0 ;">
+          <span>合同号:{{outBoundData.code}}</span> <span style="margin-left:20px">客户名称:{{outBoundData.customerName}}</span>
+          <span style="margin-left:20px">合同金额:{{moneyFormat(outBoundData.contractAmount,2)}}</span>
+        </div>
+        <TitleInfo content="产品明细"></TitleInfo>
+        <div style="margin-top:15px;padding:20px ;border: 1px solid #000">
+          <el-collapse v-model="activeNames">
+            <el-collapse-item v-for="(item,index) in outBoundData.list" :key="item.id" :name="item.id">
+              <template #title>
+                <div style="width:100%">
+                  产品名称:{{item.productName}}({{item.productSpec}}) <span style="margin-left:20px"> 数量:{{item.quantity}}</span>
+                </div>
+              </template>
+              <div>
+                <el-checkbox-group v-model="item.checkList">
+                  <el-checkbox v-for="(check) in item.productionTaskDetailList" :key="check.id" :label="check.productSn"
+                               :disabled="check.stockStatus!=10" />
+                </el-checkbox-group>
+              </div>
+            </el-collapse-item>
+          </el-collapse>
+        </div>
+      </div>
+
+      <template #footer>
+        <el-button @click="outBoundDialog = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="clickOutBound()" size="large">出 库</el-button>
+      </template>
+    </el-dialog>
+
   </div>
 </template>
 
@@ -234,6 +268,7 @@ import byForm from "@/components/byForm/index";
 import SelectProduct from "@/components/product/SelectProduct";
 import ContractPDF from "@/components/PDF/jxstContractPDF.vue";
 import { computed } from "vue";
+import TitleInfo from "@/components/TitleInfo/index.vue";
 
 const { proxy } = getCurrentInstance();
 const loading = ref(false);
@@ -433,6 +468,17 @@ const config = computed(() => {
             : {},
           {
             attrs: {
+              label: "销售出库",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              outBound(row);
+            },
+          },
+          {
+            attrs: {
               label: "打印",
               type: "primary",
               text: true,
@@ -828,6 +874,100 @@ const printObj = ref({
 const clickDownload = () => {
   proxy.getPdf("购销合同PDF文件");
 };
+
+const outBoundData = ref({});
+const outBoundDialog = ref(false);
+const activeNames = ref([]);
+const outBound = (row) => {
+  proxy.post("/salesContract/salesDeliveryList", { id: row.id }).then((res) => {
+    // 产品数据
+    let list = res.map((x) => {
+      // 每个产品根据数量生成的sn列表
+      let productionTaskDetailList = [];
+      // 以sn为key的数据,以便提交的时候获取
+      let obj = {};
+      if (x.productionTaskDetailList && x.productionTaskDetailList.length > 0) {
+        productionTaskDetailList = x.productionTaskDetailList.map((y) => {
+          let data = {
+            productSn: y.productSn,
+            id: y.id,
+            productId: x.productId,
+            stockStatus: x.stockStatus,
+          };
+          obj[y.productSn] = data;
+          return data;
+        });
+      }
+      return {
+        id: x.id,
+        productId: x.productId,
+        productName: x.productName,
+        productSpec: x.productSpec,
+        quantity: x.quantity,
+        checkList: [],
+        productionTaskDetailList: productionTaskDetailList,
+        obj,
+      };
+    });
+    // 外层数据
+    outBoundData.value = {
+      id: row.id,
+      code: row.code,
+      customerName: row.customerName,
+      contractAmount: row.contractAmount,
+      list,
+    };
+    outBoundDialog.value = true;
+  });
+};
+const clickOutBound = () => {
+  let num = 0;
+  for (let i = 0; i < outBoundData.value.list.length; i++) {
+    const element = outBoundData.value.list[i];
+    if (element.checkList && element.checkList.length > 0) {
+      num += element.checkList.length;
+    }
+  }
+  if (num == 0) {
+    return ElMessage({
+      message: "你还未勾选任何数据",
+      type: "info",
+    });
+  }
+
+  submitLoading.value = true;
+  let productionTaskDetailList = [];
+  for (let i = 0; i < outBoundData.value.list.length; i++) {
+    const iele = outBoundData.value.list[i];
+    if (iele.checkList && iele.checkList.length > 0) {
+      for (let j = 0; j < iele.checkList.length; j++) {
+        const jele = iele.checkList[i];
+        productionTaskDetailList.push(iele.obj[jele]);
+      }
+    }
+  }
+  ElMessageBox.confirm(`你确定提交出库吗?`, "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+  }).then(() => {
+    proxy
+      .post("/salesContract/salesDelivery", {
+        id: outBoundData.value.id,
+        productionTaskDetailList,
+      })
+      .then(
+        (res) => {
+          ElMessage({
+            message: "操作成功",
+            type: "success",
+          });
+          submitLoading.value = false;
+        },
+        (err) => (submitLoading.value = false)
+      );
+  });
+};
 </script>
 
 <style lang="scss" scoped>

+ 8 - 1
src/views/product/material/index.vue

@@ -486,7 +486,14 @@ const getTreeList = () => {
   proxy
     .post("/productClassify/tree", { parentId: "", name: "", definition: "2" })
     .then((message) => {
-      treeListData.value = message;
+      treeListData.value = [
+        {
+          id: "",
+          label: "全部",
+          parentId: "",
+          children: message,
+        },
+      ];
       treeData.value = message;
     });
 };

+ 24 - 83
src/views/product/product/index.vue

@@ -1,30 +1,16 @@
 <template>
   <div class="user">
     <div class="tree">
-      <treeList
-        title="产品分类"
-        submitType="1"
-        :data="treeListData"
-        v-model="sourceList.pagination.productClassifyId"
-        @change="treeChange"
-        @changeTreeList="getTreeList"
-      >
+      <treeList title="产品分类" submitType="1" :data="treeListData" v-model="sourceList.pagination.productClassifyId" @change="treeChange"
+                @changeTreeList="getTreeList">
       </treeList>
     </div>
     <div class="content">
-      <byTable
-        :source="sourceList.data"
-        :pagination="sourceList.pagination"
-        :config="config"
-        :loading="loading"
-        highlight-current-row
-        :selectConfig="selectConfig"
-        :statConfig="statConfig"
-        :table-events="{
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row
+               :selectConfig="selectConfig" :statConfig="statConfig" :table-events="{
           //element talbe事件都能传
           select: select,
-        }"
-        :action-list="[
+        }" :action-list="[
           {
             text: 'Excel导入',
             action: () => openExcel(),
@@ -35,17 +21,10 @@
             action: () => openModal('add'),
             disabled: false,
           },
-        ]"
-        @get-list="getList"
-        @moreSearch="retrievalModal = true"
-      >
+        ]" @get-list="getList" @moreSearch="retrievalModal = true">
         <template #pic="{ item }">
           <div v-if="item.fileList.length > 0">
-            <img
-              :src="item.fileList[0].fileUrl"
-              class="pic"
-              @click="handleClickFile(item.fileList[0])"
-            />
+            <img :src="item.fileList[0].fileUrl" class="pic" @click="handleClickFile(item.fileList[0])" />
           </div>
           <div v-else></div>
         </template>
@@ -56,11 +35,7 @@
         <h4>高级检索</h4>
       </template>
       <template #default>
-        <byForm
-          :formConfig="formConfig2"
-          :formOption="formOption"
-          v-model="sourceList.pagination"
-        >
+        <byForm :formConfig="formConfig2" :formOption="formOption" v-model="sourceList.pagination">
           <template #slot> 可自定义所需功能 </template>
         </byForm>
       </template>
@@ -71,34 +46,17 @@
         </div>
       </template>
     </el-drawer>
-    <el-dialog
-      :title="modalType == 'add' ? '添加' : '编辑'"
-      v-model="dialogVisible"
-      width="500"
-      v-loading="loading"
-      destroy-on-close
-    >
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-model="dialogVisible" width="500" v-loading="loading" destroy-on-close>
       <div class="public_height_dialog">
-        <byForm
-          :formConfig="formConfig"
-          :formOption="formOption"
-          v-model="formData.data"
-          :rules="rules"
-          ref="byform"
-        >
+        <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform">
           <template #productPic>
             <div>
-              <el-upload
-                v-model:fileList="fileList"
-                action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
-                :data="uploadData"
-                list-type="picture-card"
-                :on-remove="handleRemove"
-                :on-success="handleSuccess"
-                :before-upload="handleBeforeUpload"
-                accept=".gif, .jpeg, .jpg, .png"
-              >
-                <el-icon><Plus /></el-icon>
+              <el-upload v-model:fileList="fileList" action="https://winfaster.obs.cn-south-1.myhuaweicloud.com" :data="uploadData"
+                         list-type="picture-card" :on-remove="handleRemove" :on-success="handleSuccess" :before-upload="handleBeforeUpload"
+                         accept=".gif, .jpeg, .jpg, .png">
+                <el-icon>
+                  <Plus />
+                </el-icon>
               </el-upload>
             </div>
           </template>
@@ -107,32 +65,15 @@
 
       <template #footer>
         <el-button @click="dialogVisible = false" size="large">取 消</el-button>
-        <el-button
-          type="primary"
-          v-no-double-click="submitForm"
-          size="large"
-          :loading="submitLoading"
-        >
+        <el-button type="primary" v-no-double-click="submitForm" size="large" :loading="submitLoading">
           确 定
         </el-button>
       </template>
     </el-dialog>
-    <el-dialog
-      title="Excel导入"
-      v-model="openExcelDialog"
-      width="400"
-      v-loading="loading"
-    >
+    <el-dialog title="Excel导入" v-model="openExcelDialog" width="400" v-loading="loading">
       <template #footer>
-        <el-button @click="openExcelDialog = false" size="large"
-          >取 消</el-button
-        >
-        <el-button
-          type="primary"
-          @click="submitExcel()"
-          size="large"
-          :loading="submitLoading"
-        >
+        <el-button @click="openExcelDialog = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitExcel()" size="large" :loading="submitLoading">
           确 定
         </el-button>
       </template>
@@ -528,7 +469,7 @@ const getList = async (req) => {
 };
 
 const treeChange = (e) => {
-  console.log(e,123123);
+  console.log(e, 123123);
   sourceList.value.pagination.productClassifyId = e.id;
   getList({ productClassifyId: e.id });
 };
@@ -690,9 +631,9 @@ const getDict = () => {
 };
 getDict();
 const clickSearch = () => {
-  sourceList.value.pagination.keyword = '';
-  getList()
-}
+  sourceList.value.pagination.keyword = "";
+  getList();
+};
 </script>
   
 <style lang="scss" scoped>

+ 27 - 73
src/views/product/product/index2.vue

@@ -1,29 +1,16 @@
 <template>
   <div class="user">
     <div class="tree">
-      <treeList
-        title="产品分类"
-        submitType="1"
-        :data="treeListData"
-        v-model="sourceList.pagination.productClassifyId"
-        @change="treeChange"
-        @changeTreeList="getTreeList"
-      >
+      <treeList title="产品分类" submitType="1" :data="treeListData" v-model="sourceList.pagination.productClassifyId" @change="treeChange"
+                @changeTreeList="getTreeList">
       </treeList>
     </div>
     <div class="content">
-      <byTable
-        :source="sourceList.data"
-        :pagination="sourceList.pagination"
-        :config="config"
-        :loading="loading"
-        highlight-current-row
-        :selectConfig="selectConfig"
-        :table-events="{
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row
+               :selectConfig="selectConfig" :table-events="{
           //element talbe事件都能传
           select: select,
-        }"
-        :action-list="[
+        }" :action-list="[
           {
             text: 'Excel导入',
             action: () => openExcel(),
@@ -34,49 +21,26 @@
             action: () => openModal('add'),
             disabled: false,
           },
-        ]"
-        @get-list="getList"
-      >
+        ]" @get-list="getList">
         <template #pic="{ item }">
           <div v-if="item.fileList.length > 0">
-            <img
-              :src="item.fileList[0].fileUrl"
-              class="pic"
-              @click="handleClickFile(item.fileList[0])"
-            />
+            <img :src="item.fileList[0].fileUrl" class="pic" @click="handleClickFile(item.fileList[0])" />
           </div>
           <div v-else></div>
         </template>
       </byTable>
     </div>
-    <el-dialog
-      :title="modalType == 'add' ? '添加' : '编辑'"
-      v-model="dialogVisible"
-      width="500"
-      v-loading="loading"
-      destroy-on-close
-    >
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-model="dialogVisible" width="500" v-loading="loading" destroy-on-close>
       <div class="public_height_dialog">
-        <byForm
-          :formConfig="formConfig"
-          :formOption="formOption"
-          v-model="formData.data"
-          :rules="rules"
-          ref="byform"
-        >
+        <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform">
           <template #productPic>
             <div>
-              <el-upload
-                v-model:fileList="fileList"
-                action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
-                :data="uploadData"
-                list-type="picture-card"
-                :on-remove="handleRemove"
-                :on-success="handleSuccess"
-                :before-upload="handleBeforeUpload"
-                accept=".gif, .jpeg, .jpg, .png"
-              >
-                <el-icon><Plus /></el-icon>
+              <el-upload v-model:fileList="fileList" action="https://winfaster.obs.cn-south-1.myhuaweicloud.com" :data="uploadData"
+                         list-type="picture-card" :on-remove="handleRemove" :on-success="handleSuccess" :before-upload="handleBeforeUpload"
+                         accept=".gif, .jpeg, .jpg, .png">
+                <el-icon>
+                  <Plus />
+                </el-icon>
               </el-upload>
             </div>
           </template>
@@ -85,32 +49,15 @@
 
       <template #footer>
         <el-button @click="dialogVisible = false" size="large">取 消</el-button>
-        <el-button
-          type="primary"
-          v-no-double-click="submitForm"
-          size="large"
-          :loading="submitLoading"
-        >
+        <el-button type="primary" v-no-double-click="submitForm" size="large" :loading="submitLoading">
           确 定
         </el-button>
       </template>
     </el-dialog>
-    <el-dialog
-      title="Excel导入"
-      v-model="openExcelDialog"
-      width="400"
-      v-loading="loading"
-    >
+    <el-dialog title="Excel导入" v-model="openExcelDialog" width="400" v-loading="loading">
       <template #footer>
-        <el-button @click="openExcelDialog = false" size="large"
-          >取 消</el-button
-        >
-        <el-button
-          type="primary"
-          @click="submitExcel()"
-          size="large"
-          :loading="submitLoading"
-        >
+        <el-button @click="openExcelDialog = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitExcel()" size="large" :loading="submitLoading">
           确 定
         </el-button>
       </template>
@@ -475,7 +422,14 @@ const getTreeList = () => {
   proxy
     .post("/productClassify/tree", { parentId: "", name: "", definition: "1" })
     .then((message) => {
-      treeListData.value = message;
+      treeListData.value = [
+        {
+          id: "",
+          label: "全部",
+          parentId: "",
+          children: message,
+        },
+      ];
       formConfig.value[0].data = message;
     });
 };

+ 4 - 0
src/views/purchaseSales/outAndInWarehouse/record/index.vue

@@ -184,6 +184,10 @@ const typeList = ref([
     label: "库存盘点修正出库",
     value: "23",
   },
+  {
+    label: "销售合同出库",
+    value: "24",
+  },
 ]);
 const warehouseList = ref([]);
 const productUnit = ref([]);

+ 4 - 0
src/views/purchaseSales/outAndInWarehouse/waitingForDelivery/index.vue

@@ -190,6 +190,10 @@ const businessType = ref([
     label: "工单出库",
     value: 11,
   },
+  {
+    label: "销售合同出库",
+    value: 12,
+  },
 ]);
 const sourceList = ref({
   data: [],