Jelajahi Sumber

新增客户退货单模块
合同生成销售订单、采购订单修改

Z 2 tahun lalu
induk
melakukan
293d1606d4
31 mengubah file dengan 2321 tambahan dan 103 penghapusan
  1. 28 1
      src/api/saleManage/returnGoods.js
  2. 1 1
      src/enum/dict.js
  3. 75 3
      src/views/contractManage/contractBook/components/inventoryTable.vue
  4. 1 1
      src/views/contractManage/contractBook/index.vue
  5. 1 1
      src/views/purchasingManage/inquiryManage/index.vue
  6. 1 1
      src/views/purchasingManage/purchaseNeedManage/index.vue
  7. 1 1
      src/views/purchasingManage/purchaseOrder/accountstatement/index.vue
  8. 10 3
      src/views/purchasingManage/purchaseOrder/components/addDialog.vue
  9. 35 0
      src/views/purchasingManage/purchaseOrder/components/inventoryTable.vue
  10. 1 1
      src/views/purchasingManage/purchaseOrder/index.vue
  11. 1 1
      src/views/purchasingManage/purchaseOrder/invoice/index.vue
  12. 1 1
      src/views/purchasingManage/purchaseOrder/returnGoods/index.vue
  13. 1 1
      src/views/purchasingManage/purchasePlanManage/index.vue
  14. 1 1
      src/views/saleManage/businessOpportunity/index.vue
  15. 1 1
      src/views/saleManage/quotation/index.vue
  16. 1 1
      src/views/saleManage/saleOrder/accountstatement/index.vue
  17. 27 13
      src/views/saleManage/saleOrder/components/addDialog.vue
  18. 15 8
      src/views/saleManage/saleOrder/components/detailDialog.vue
  19. 649 0
      src/views/saleManage/saleOrder/customerReturnOrder/addOrEditDialog.vue
  20. 538 0
      src/views/saleManage/saleOrder/customerReturnOrder/detailDialog.vue
  21. 360 0
      src/views/saleManage/saleOrder/customerReturnOrder/index.vue
  22. 176 0
      src/views/saleManage/saleOrder/customerReturnOrder/returnOrderDialog.vue
  23. 124 0
      src/views/saleManage/saleOrder/customerReturnOrder/searchTable-page.vue
  24. 105 0
      src/views/saleManage/saleOrder/customerReturnOrder/searchTable.vue
  25. 8 2
      src/views/saleManage/saleOrder/index.vue
  26. 13 4
      src/views/saleManage/saleOrder/invoice/components/addInvoiceDialog.vue
  27. 1 1
      src/views/saleManage/saleOrder/invoice/index.vue
  28. 135 50
      src/views/saleManage/saleOrder/returnGoods/components/customerReturnOrderDetail.vue
  29. 5 2
      src/views/saleManage/saleOrder/returnGoods/components/customerReturnOrderDialog.vue
  30. 4 3
      src/views/saleManage/saleOrder/returnGoods/components/detailDialog.vue
  31. 1 1
      src/views/saleManage/saleOrder/returnGoods/index.vue

+ 28 - 1
src/api/saleManage/returnGoods.js

@@ -66,6 +66,13 @@ export async function submit(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+
+
+
+
+
+
 /**
  * 根据退货单编码获取出库单详情
  */
@@ -76,7 +83,16 @@ export async function getOutInBySourceBizNoAPI(id) {
   }
   return Promise.reject(new Error(res.data.message));
 }
-
+/**
+ * 获取客户退货列表
+ */
+export async function saleReturnPageList(params) {
+  const res = await request.get(`/eom/salereturnhandle/page`,{ params });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
 /**
  * 客户退货处理单-保存
  */
@@ -107,6 +123,17 @@ export async function saleReturnGetByIdAPI(id) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+/**
+ * 客户退货处理单-删除
+ */
+export async function deleteSaleReturnAPI(data) {
+  const res = await request.delete('/eom/salereturnhandle/delete', { data });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
 /**
  * 客户退货处理单-提交开启流程
  */

+ 1 - 1
src/enum/dict.js

@@ -91,7 +91,7 @@ export const payStatusOptions=[
 //发货审核状态
 export const reviewStatusEnum=[
   {value:0,label:'未提交'},
-  {value:1,label:'待审核'},
+  {value:1,label:'审核中'},
   {value:2,label:'已审核'},
   {value:3,label:'审核未通过'}
 ]

+ 75 - 3
src/views/contractManage/contractBook/components/inventoryTable.vue

@@ -18,6 +18,7 @@
             icon="el-icon-plus"
             class="ele-btn-icon"
             @click="handlAdd"
+            v-if="!isContractId"
           >
             新增
           </el-button>
@@ -59,6 +60,7 @@
           }"
         >
           <el-input
+            :disabled="isContractId"
             v-model="row.productName"
             placeholder="请输入"
             @click.native="handParent(row, $index)"
@@ -88,7 +90,7 @@
           style="margin-bottom: 20px"
           :prop="'datasource.' + scope.$index + '.productCode'"
         >
-          <el-input v-model="scope.row.productCode" disabled></el-input>
+          <el-input :disabled="isContractId" v-model="scope.row.productCode" disabled></el-input>
         </el-form-item>
       </template>
       <template v-slot:productCategoryName="scope">
@@ -111,6 +113,7 @@
           }"
         >
           <el-input
+            :disabled="isContractId"
             v-model="scope.row.totalCount"
             placeholder="请输入"
             @input="getTotalPrice(scope.row)"
@@ -168,6 +171,7 @@
           }"
         >
           <el-input
+            :disabled="isContractId"
             v-model="scope.row.deliveryDays"
             @change="setDeliveryDays(scope.row, scope.$index, 'deliveryDays')"
             placeholder="请输入"
@@ -187,6 +191,7 @@
               }"
             >
               <el-input
+                :disabled="isContractId"
                 v-model="scope.row.guaranteePeriod"
                 @change="
                   setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
@@ -200,6 +205,7 @@
               dictName="质保期单位"
               clearable
               v-model="scope.row.guaranteePeriodUnitCode"
+              :disabled="isContractId"
               @change="
                 setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
               "
@@ -227,6 +233,7 @@
           :prop="'datasource.' + scope.$index + '.remark'"
         >
           <el-input
+            :disabled="isContractId"
             v-model="scope.row.remark"
             type="textarea"
             placeholder="请输入"
@@ -245,6 +252,7 @@
           }"
         >
           <el-input
+            :disabled="isContractId"
             v-model="scope.row.singlePrice"
             placeholder="请输入"
             @input="getTotalPrice"
@@ -271,6 +279,7 @@
           <el-input
             v-model="row.technicalAnswerName"
             placeholder="请输入"
+            :disabled="isContractId"
             @click.native="handHead(row, $index)"
           ></el-input>
         </el-form-item>
@@ -283,6 +292,7 @@
           <el-input
             type="textarea"
             v-model="scope.row.technicalParams"
+            :disabled="isContractId"
             placeholder="请输入"
           ></el-input>
         </el-form-item>
@@ -293,11 +303,24 @@
           :prop="'datasource.' + scope.$index + '.technicalDrawings'"
         >
           <fileUpload
+            v-if="!isContractId"
             v-model="scope.row.technicalDrawings"
+            :disabled="isContractId"
             module="main"
             :showLib="false"
             :limit="5"
           />
+          <div v-else v-if="scope.row.technicalDrawings && scope.row.technicalDrawings?.length">
+            <el-link
+              v-for="link in scope.row.technicalDrawings"
+              :key="link.id"
+              type="primary"
+              :underline="false"
+              @click="downloadFile(link)"
+            >
+              {{ link.name }}</el-link
+            >
+          </div>
         </el-form-item>
       </template>
       <template v-slot:customerReqFiles="scope">
@@ -307,10 +330,22 @@
         >
           <fileUpload
             v-model="scope.row.customerReqFiles"
+            v-if="!isContractId"
             module="main"
             :showLib="false"
             :limit="5"
           />
+          <div v-else v-if="scope.row.customerReqFiles && scope.row.customerReqFiles?.length">
+            <el-link
+              v-for="link in scope.row.customerReqFiles"
+              :key="link.id"
+              type="primary"
+              :underline="false"
+              @click="downloadFile(link)"
+            >
+              {{ link.name }}</el-link
+            >
+          </div>
         </el-form-item>
       </template>
       <template v-slot:industryArtFiles="scope">
@@ -326,9 +361,21 @@
           <fileUpload
             v-model="scope.row.industryArtFiles"
             module="main"
+            v-if="!isContractId"
             :showLib="false"
             :limit="5"
           />
+          <div v-else v-if="scope.row.industryArtFiles && scope.row.industryArtFiles?.length">
+            <el-link
+              v-for="link in scope.row.industryArtFiles"
+              :key="link.id"
+              type="primary"
+              :underline="false"
+              @click="downloadFile(link)"
+            >
+              {{ link.name }}</el-link
+            >
+          </div>
         </el-form-item>
       </template>
       <template v-slot:otherFiles="scope">
@@ -339,9 +386,21 @@
           <fileUpload
             v-model="scope.row.otherFiles"
             module="main"
+            v-if="!isContractId"
             :showLib="false"
             :limit="5"
           />
+          <div v-else v-if="scope.row.otherFiles && scope.row.otherFiles?.length">
+            <el-link
+              v-for="link in scope.row.otherFiles"
+              :key="link.id"
+              type="primary"
+              :underline="false"
+              @click="downloadFile(link)"
+            >
+              {{ link.name }}</el-link
+            >
+          </div>
         </el-form-item>
       </template>
       <template v-slot:produceDeliveryDeadline="scope">
@@ -351,6 +410,7 @@
           <el-date-picker
             style="width: 140px"
             v-model="scope.row.produceDeliveryDeadline"
+            :disabled="isContractId"
             type="date"
             placeholder="选择日期"
           >
@@ -370,6 +430,7 @@
         >
           <el-date-picker
             style="width: 140px"
+            :disabled="isContractId"
             v-model="scope.row.customerExpectDeliveryDeadline"
             type="date"
             placeholder="选择日期"
@@ -384,6 +445,7 @@
         >
           <el-date-picker
             style="width: 140px"
+            :disabled="isContractId"
             v-model="scope.row.guaranteePeriodDeadline"
             type="date"
             placeholder="选择日期"
@@ -402,6 +464,7 @@
           :prop="'datasource.' + scope.$index + '.singleWeight'"
         >
           <el-input
+            :disabled="isContractId"
             v-model="scope.row.singleWeight"
             @input="singleWeightChange(scope.row)"
             placeholder="请输入"
@@ -419,6 +482,7 @@
         >
           <el-input
             v-model="scope.row.technologyRouteName"
+            :disabled="isContractId"
             placeholder="请选择"
             @click.native="openVersion(scope.$index)"
           ></el-input>
@@ -459,6 +523,7 @@ import dictMixins from '@/mixins/dictMixins';
 import fileUpload from '@/components/upload/fileUpload';
 import headList from '@/views/saleManage/businessOpportunity/components/headList.vue';
 import ProductionVersion from '@/components/ProductionVersion2/index.vue';
+import {getFile} from "@/api/system/file";
 
 const dayjs = require('dayjs');
 
@@ -468,7 +533,7 @@ export default {
     productList,
     fileUpload,
     headList,
-    ProductionVersion
+    ProductionVersion,
   },
   props: {
     pageName: {
@@ -493,7 +558,11 @@ export default {
     },
     contractBookType: {
       default: 1
-    }
+    },
+    isContractId: {
+      type: Boolean,
+      default: false
+    },
   },
   data() {
     const defaultForm = {
@@ -742,6 +811,9 @@ export default {
   },
 
   methods: {
+    downloadFile(file) {
+      getFile({ objectName: file.storePath }, file.name);
+    },
     openVersion(index) {
       this.$refs.versionRefs.open(index);
     },

+ 1 - 1
src/views/contractManage/contractBook/index.vue

@@ -385,7 +385,7 @@ export default {
     allDelBtn() {
       if (this.selection.length === 0) return;
       let flag = this.selection.some(item => [1, 2].includes(item.status))
-      if (flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+      if (flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
       this.delVisible = true;
     },
 

+ 1 - 1
src/views/purchasingManage/inquiryManage/index.vue

@@ -346,7 +346,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.status))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/purchasingManage/purchaseNeedManage/index.vue

@@ -270,7 +270,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.status))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/purchasingManage/purchaseOrder/accountstatement/index.vue

@@ -306,7 +306,7 @@ export default {
     allDelBtn() {
       if (this.selection.length === 0) return;
       let flag = this.selection.some(item => [1, 2].includes(item.reviewStatus))
-      if (flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+      if (flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
       this.delVisible = true;
     },
 

+ 10 - 3
src/views/purchasingManage/purchaseOrder/components/addDialog.vue

@@ -280,15 +280,15 @@
 
       <headerTitle title="产品清单" style="margin-top: 30px"></headerTitle>
 
-      <inventoryTable ref="inventoryTable" :is-show-supplier-mark="true"></inventoryTable>
+      <inventoryTable ref="inventoryTable" :is-show-supplier-mark="true" :isContractId='!!form.contractId'></inventoryTable>
       <el-row style="margin-top: 20px">
         <el-col :span="12">
           <el-form-item
-            label="金额"
+            label="优惠总金额"
             prop="payAmount"
             style="margin-bottom: 22px"
           >
-            <el-input clearable v-model="form.payAmount" placeholder="请输入">
+            <el-input clearable v-model="form.payAmount" :disabled="form.contractId" placeholder="请输入">
               <template slot="append">元</template>
             </el-input>
           </el-form-item>
@@ -457,6 +457,12 @@ export default {
         sourceType: [
           {required: true, message: '请选择需求类型', trigger: 'change'}
         ],
+        payAmount: [
+          {required: true, message: '请输入', trigger: 'blur'}
+        ],
+        partbAddress: [
+          {required: true, message: '请输入', trigger: 'blur'}
+        ],
         partaTel: [
           {
             required: true,
@@ -498,6 +504,7 @@ export default {
   },
   computed: {
     allcountAmount() {
+      this.form.payAmount = this.$store.state.order.allcountAmount
       return this.$store.state.order.allcountAmount;
     }
   },

+ 35 - 0
src/views/purchasingManage/purchaseOrder/components/inventoryTable.vue

@@ -19,6 +19,7 @@
               icon="el-icon-plus"
               class="ele-btn-icon"
               @click="handlAdd"
+              v-if="!isContractId"
             >
               新增
             </el-button>
@@ -36,6 +37,7 @@
           >
             <el-input
               v-model="row.productName"
+              :disabled="isContractId"
               placeholder="请输入"
               @click.native="handParent(row, $index)"
             ></el-input>
@@ -72,6 +74,7 @@
             }"
           >
             <el-input
+              :disabled="isContractId"
               v-model="scope.row.totalCount"
               placeholder="请输入"
               @input="getTotalPrice"
@@ -127,6 +130,7 @@
             <el-input
               v-model="scope.row.deliveryDays"
               @change="setDeliveryDays(scope.row, scope.$index, 'deliveryDays')"
+              :disabled="isContractId"
               placeholder="请输入"
             ></el-input>
           </el-form-item>
@@ -145,6 +149,7 @@
               >
                 <el-input
                   v-model="scope.row.guaranteePeriod"
+                  :disabled="isContractId"
                   @change="
                     setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
                   "
@@ -157,6 +162,7 @@
                 dictName="质保期单位"
                 clearable
                 v-model="scope.row.guaranteePeriodUnitCode"
+                :disabled="isContractId"
                 @change="
                   setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
                 "
@@ -173,6 +179,7 @@
           >
             <el-input
               v-model="scope.row.measuringUnit"
+              :disabled="isContractId"
               placeholder="请输入"
             ></el-input>
           </el-form-item>
@@ -183,6 +190,7 @@
             :prop="'datasource.' + scope.$index + '.remark'"
           >
             <el-input
+              :disabled="isContractId"
               v-model="scope.row.remark"
               type="textarea"
               placeholder="请输入"
@@ -201,6 +209,7 @@
             }"
           >
             <el-input
+              :disabled="isContractId"
               v-model="scope.row.singlePrice"
               placeholder="请输入"
               @input="getTotalPrice"
@@ -215,6 +224,7 @@
             :prop="'datasource.' + $index + '.technicalAnswerName'"
           >
             <el-input
+              :disabled="isContractId"
               v-model="row.technicalAnswerName"
               placeholder="请输入"
               @click.native="handHead(row, $index)"
@@ -227,6 +237,7 @@
             :prop="'datasource.' + scope.$index + '.technicalParams'"
           >
             <el-input
+              :disabled="isContractId"
               type="textarea"
               v-model="scope.row.technicalParams"
               placeholder="请输入"
@@ -250,11 +261,23 @@
             :prop="'datasource.' + scope.$index + '.technicalDrawings'"
           >
             <fileUpload
+              v-if="!isContractId"
               v-model="scope.row.technicalDrawings"
               module="main"
               :showLib="false"
               :limit="5"
             />
+            <div v-else v-if="scope.row.technicalDrawings && scope.row.technicalDrawings?.length">
+              <el-link
+                v-for="link in scope.row.technicalDrawings"
+                :key="link.id"
+                type="primary"
+                :underline="false"
+                @click="downloadFile(link)"
+              >
+                {{ link.name }}</el-link
+              >
+            </div>
           </el-form-item>
         </template>
         <template v-slot:guaranteePeriodDeadline="scope">
@@ -264,6 +287,7 @@
             <el-date-picker
               style="width: 140px"
               v-model="scope.row.guaranteePeriodDeadline"
+              :disabled="isContractId"
               type="date"
               placeholder="选择日期"
             >
@@ -275,6 +299,7 @@
             :prop="'datasource.' + scope.$index + '.deliveryDeadline'"
           >
             <el-date-picker
+              :disabled="isContractId"
               style="width: 140px"
               v-model="scope.row.deliveryDeadline"
               type="date"
@@ -329,11 +354,18 @@ import dictMixins from '@/mixins/dictMixins';
 import store from '@/store';
 import fileUpload from '@/components/upload/fileUpload';
 import headList from '@/views/saleManage/businessOpportunity/components/headList.vue';
+import {getFile} from "@/api/system/file";
 
 const dayjs = require('dayjs');
 
 export default {
   mixins: [dictMixins],
+  props: {
+    isContractId: {
+      type: Boolean,
+      default: false
+    }
+  },
   components: {
     productList,
     fileUpload,
@@ -519,6 +551,9 @@ export default {
     }
   },
   methods: {
+    downloadFile(file) {
+      getFile({ objectName: file.storePath }, file.name);
+    },
     // 返回列表数据
     getTableValue() {
       let comitDatasource = this.form.datasource;

+ 1 - 1
src/views/purchasingManage/purchaseOrder/index.vue

@@ -377,7 +377,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.orderStatus))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/purchasingManage/purchaseOrder/invoice/index.vue

@@ -277,7 +277,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.reviewStatus))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/purchasingManage/purchaseOrder/returnGoods/index.vue

@@ -267,7 +267,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.reviewStatus))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/purchasingManage/purchasePlanManage/index.vue

@@ -294,7 +294,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.status))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/saleManage/businessOpportunity/index.vue

@@ -359,7 +359,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.approvalStatus))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/saleManage/quotation/index.vue

@@ -314,7 +314,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.status))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 1 - 1
src/views/saleManage/saleOrder/accountstatement/index.vue

@@ -313,7 +313,7 @@ export default {
     allDelBtn() {
       if (this.selection.length === 0) return;
       let flag = this.selection.some(item => [1, 2].includes(item.reviewStatus))
-      if (flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+      if (flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
       this.delVisible = true;
     },
 

+ 27 - 13
src/views/saleManage/saleOrder/components/addDialog.vue

@@ -37,7 +37,13 @@
             >
             </DictSelection>
           </el-form-item>
-
+          <el-form-item
+            label="生产性订单"
+            prop="needProduce"
+            style="margin-bottom: 22px">
+            <el-radio v-model="form.needProduce" :label="1">是</el-radio>
+            <el-radio v-model="form.needProduce" :label="0">否</el-radio>
+          </el-form-item>
           <el-form-item
             label="销售部门"
             prop="salesDeptId"
@@ -54,14 +60,7 @@
               default-expand-all
             />
           </el-form-item>
-          <el-form-item prop="orderFiles" label="订单附件">
-            <fileUpload
-              v-model="form.orderFiles"
-              module="main"
-              :showLib="false"
-              :limit="10"
-            />
-          </el-form-item>
+
         </el-col>
         <el-col :span="12">
           <el-form-item
@@ -108,7 +107,16 @@
             >
             </DictSelection>
           </el-form-item>
+          <el-form-item prop="orderFiles" label="订单附件">
+            <fileUpload
+              v-model="form.orderFiles"
+              module="main"
+              :showLib="false"
+              :limit="10"
+            />
+          </el-form-item>
         </el-col>
+
       </el-row>
       <headerTitle title="基本信息"></headerTitle>
       <el-row>
@@ -294,11 +302,12 @@
       <inventoryTable
         ref="inventoryTable"
         :isCustomerMark="true"
+        :isContractId=!!form.contractId
       ></inventoryTable>
       <el-row style="margin-top: 20px">
         <el-col :span="12">
           <el-form-item
-            label="金额"
+            label="优惠总金额"
             prop="payAmount"
             style="margin-bottom: 22px"
           >
@@ -425,7 +434,8 @@ export default {
       partbLinkId: '',
       partbLinkName: '',
       partbName: '',
-      partbTel: ''
+      partbTel: '',
+      needProduce: 1
     };
 
     return {
@@ -491,7 +501,10 @@ export default {
         ],
         partaEmail: [
           {pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur'}
-        ]
+        ],
+        payAmount: [
+          {required: true, message: '请输入', trigger: 'blur'}
+        ],
       },
 
       // 提交状态
@@ -504,6 +517,7 @@ export default {
   },
   computed: {
     allcountAmount() {
+      this.form.payAmount = this.$store.state.order.allcountAmount
       return this.$store.state.order.allcountAmount;
     }
   },
@@ -719,7 +733,7 @@ export default {
       this.form = Object.assign({}, copyObj(this.formDef), {
         id,
         projectName,
-        saleType: +saleType,
+        saleType,
         saleTypeName,
         // deliveryDate,
         orderFiles,

+ 15 - 8
src/views/saleManage/saleOrder/components/detailDialog.vue

@@ -111,19 +111,26 @@
               {{ form.salesDeptName }}
             </el-form-item>
             <el-form-item
-              label="应付金额:"
-              prop="payAmount"
+              label="总金额:"
+              prop="totalAmount"
               style="margin-bottom: 16px"
             >
-              {{ form.payAmount }}元
+              {{ form.totalAmount }}元
             </el-form-item>
             <el-form-item
-              label="订单总金额:"
-              prop="totalAmount"
+              label="优惠总金额:"
+              prop="payAmount"
               style="margin-bottom: 16px"
             >
-              {{ form.totalAmount }}元
+              {{ form.payAmount }}元
+            </el-form-item>
+            <el-form-item
+              label="生产性订单:"
+              prop="needProduce"
+              style="margin-bottom: 22px">
+              {{ form.needProduce?'是':'否' }}
             </el-form-item>
+
           </el-col>
         </el-row>
         <headerTitle title="基本信息"></headerTitle>
@@ -318,8 +325,8 @@
         },
         rules: {},
         detailData: {},
-  
-       
+
+
       };
     },
     methods: {

+ 649 - 0
src/views/saleManage/saleOrder/customerReturnOrder/addOrEditDialog.vue

@@ -0,0 +1,649 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    multiple
+    :visible.sync="addOrEditDialogFlag"
+    :title="title"
+    :close-on-click-modal="false"
+    width="80%"
+    :append-to-body="false"
+    :before-close="cancel">
+    <el-form
+      :rules="rules"
+      ref="formRef"
+      :model="form">
+
+
+      <el-row style="margin-bottom: 10px">
+        <el-col :span="6">
+          <el-descriptions class="margin-top" :column="3" size="mini" border>
+            <el-descriptions-item>
+              <template slot="label">
+                <div class="is-required">
+                  退货单
+                </div>
+              </template>
+              <el-form-item prop="returnNo">
+                <el-input
+                  clearable
+                  v-model="form.returnNo"
+                  @click.native="handleOrderBtn"
+                  placeholder="请选择"/>
+              </el-form-item>
+
+            </el-descriptions-item>
+          </el-descriptions>
+        </el-col>
+      </el-row>
+
+      <header-title title="退货物品明细" size="16px"></header-title>
+
+      <ele-pro-table
+        ref="table"
+        :needPage="false"
+        :columns="columns"
+        :toolkit="[]"
+        :datasource="form.detailList"
+        cache-key="customerReturnOrderDialog"
+        class="time-form"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="handleSelectGoods"
+            v-if="dialogType!=='view'&&form.returnNo"
+          >
+            选择退货物品
+          </el-button>
+        </template>
+        <template v-slot:action="{ row,$index }">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除吗?"
+            @confirm="remove(row,$index)">
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+
+
+        <template v-slot:packageCount="{ row,$index }">
+          <el-form-item
+            :prop="'detailList.'+$index+'.packageCount'"
+            :rules="{required:row.outboundType!=2?true:false,trigger:'blur',message:'请输入'}">
+            <el-input v-if="dialogType!=='view'&&row.outboundType!=2"
+                      v-model="row.packageCount"></el-input>
+            <div v-else>{{ row.packageCount }}</div>
+          </el-form-item>
+        </template>
+
+        <template v-slot:measurementCount="{ row,$index }">
+          <el-form-item
+            :prop="'detailList.'+$index+'.measurementCount'"
+            :rules="{required:true,trigger:'blur',message:'请输入'}">
+            <el-input v-if="dialogType!=='view'"
+                      v-model="row.measurementCount"></el-input>
+            <div v-else>{{ row.measurementCount }}</div>
+          </el-form-item>
+        </template>
+
+        <template v-slot:weight="{ row,$index }">
+          <el-form-item
+            :prop="'detailList.'+$index+'.weight'"
+            :rules="{required:true,trigger:'blur',message:'请输入'}">
+            <el-input v-if="dialogType!=='view'"
+                      v-model="row.weight"></el-input>
+            <div v-else>{{ row.weight }}</div>
+          </el-form-item>
+        </template>
+
+        <template v-slot:carveCode="{ row,$index }">
+          <el-form-item
+            :prop="'detailList.'+$index+'.carveCode'"
+            :rules="{required:true,trigger:'blur',message:'请输入'}">
+            <el-input v-if="dialogType!=='view'"
+                      v-model="row.carveCode"></el-input>
+            <div v-else>{{ row.carveCode }}</div>
+          </el-form-item>
+        </template>
+
+        <!--  ///  发起人展示字段 -->
+        <template v-slot:reason="{ row,$index }">
+          <el-form-item
+            :prop="'detailList.'+$index+'.reason'"
+            :rules="{required:true,trigger:'blur',message:'请输入'}">
+            <el-input v-if="dialogType!=='view'"
+                      v-model="row.reason"></el-input>
+            <div v-else>{{ row.reason }}</div>
+          </el-form-item>
+        </template>
+        <template v-slot:feedbackDate="{ row,$index }">
+          <el-form-item
+            :prop="'detailList.'+$index+'.feedbackDate'"
+            :rules="{required:true,trigger:'change',message:'请选择'}"
+          >
+            <el-date-picker
+              v-if="dialogType!=='view'"
+              v-model="row.feedbackDate"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd"
+              placeholder="选择日期">
+            </el-date-picker>
+            <div v-else>{{ row.feedbackDate }}</div>
+          </el-form-item>
+
+        </template>
+        <template v-slot:sendDate="{ row,$index }">
+          <el-form-item
+            :prop="'detailList.'+$index+'.sendDate'"
+            :rules="{required:true,trigger:'change',message:'请选择'}"
+          >
+            <el-date-picker
+              v-if="dialogType!=='view'"
+              v-model="row.sendDate"
+              style="width: 100%"
+              value-format="yyyy-MM-dd"
+              type="date"
+              placeholder="选择日期">
+            </el-date-picker>
+            <div v-else>{{ row.sendDate }}</div>
+          </el-form-item>
+
+        </template>
+        <!--////-->
+      </ele-pro-table>
+    </el-form>
+    <div slot="footer" v-if="dialogType!=='view'">
+      <el-button type="primary" @click="handleSubmit('save')">保存</el-button>
+      <el-button type="primary" @click="handleSubmit('sub')">提交</el-button>
+      <el-button type="info" @click="cancel">关闭</el-button>
+    </div>
+    <!--出库详情-->
+    <outbound-details-dialog v-if="outboundDetailsDialogFlag" ref="outboundDetailsDialogRef"
+                             :outboundDetailsDialogFlag.sync="outboundDetailsDialogFlag"
+                             @saveDate="saveDate"></outbound-details-dialog>
+    <head-list ref="headRef" @changeParent="changeHead"></head-list>
+    <return-order-dialog :returnOrderDialogFlag.sync="returnOrderDialogFlag" v-if="returnOrderDialogFlag"
+                         @changeParent="getReturnOrderInfo">
+      ref="returnOrderDialogRef">
+    </return-order-dialog>
+  </ele-modal>
+</template>
+
+
+<script>
+
+import outboundDetailsDialog from '../returnGoods/components/outboundDetailsDialog.vue'
+import headList from "@/views/saleManage/businessOpportunity/components/headList.vue";
+import returnOrderDialog from './returnOrderDialog.vue'
+import {
+  getOutInBySourceBizNoAPI,
+  saleReturnGetByIdAPI,
+  saleReturnSaveAPI,
+  saleReturnUpdateAPI,
+  salesOrderReturnSubmit
+} from "@/api/saleManage/returnGoods";
+import {deepClone} from "@/utils";
+import bpmDetail from "@/views/bpm/processInstance/detail.vue";
+import fileUpload from "@/components/upload/fileUpload.vue";
+
+
+export default {
+  name: "addOrEditDialog",
+  props: {
+    addOrEditDialogFlag: {
+      type: Boolean,
+      default: false,
+    }
+  },
+  components: {
+    fileUpload,
+    outboundDetailsDialog,
+    headList,
+    returnOrderDialog
+  },
+  data() {
+    return {
+      title: '客户退货处理单',
+      dialogType: 'add',
+      activeComp: '',
+      outboundDetailsDialogFlag: false,
+      returnOrderDialogFlag: false,
+      loading: false,
+      warehousingMaterialList: [],
+      materialCodeReqList: [],
+      metaList: [],
+      currentRow: {},
+      form: {
+        detailList: [],
+        returnNo: '',
+      },
+      rules: {
+        returnNo: {required: true, message: '请选择', trigger: 'change'}
+      }
+
+    }
+  },
+  computed: {
+    columns() {
+      let basicFields = [
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 120,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          fixed: 'right',
+          showOverflowTooltip: true,
+
+        },
+        {
+          width: 45,
+          type: 'index',
+          columnKey: 'index',
+          align: 'center',
+          fixed: 'left'
+        },
+        {
+          minWidth: 120,
+          prop: 'name',
+          label: '名称',
+          align: 'center',
+          slot: 'name'
+        },
+        {
+          minWidth: 120,
+          prop: 'categoryCode',
+          label: '编码',
+          align: 'center',
+          slot: 'categoryCode'
+        },
+        // {
+        //   minWidth: 120,
+        //   prop: 'modelType',
+        //   label: '型号',
+        //   align: 'center',
+        //   slot: 'modelType'
+        // },
+        {
+          minWidth: 120,
+          prop: 'specification',
+          label: '规格',
+          align: 'center',
+          slot: 'specification'
+        },
+        {
+          minWidth: 80,
+          prop: 'packageCount',
+          label: '包装数量',
+          align: 'center',
+          slot: 'packageCount',
+          headerSlot: 'headerPackingCount'
+        },
+        {
+          minWidth: 80,
+          prop: 'packingUnit',
+          label: '包装单位',
+          align: 'center',
+          slot: 'packingUnit'
+        },
+        {
+          minWidth: 80,
+          prop: 'measurementCount',
+          label: '计量数量',
+          align: 'center',
+          slot: 'measurementCount',
+          headerSlot: 'headerCount'
+        },
+        {
+          minWidth: 80,
+          prop: 'measuringUnit',
+          label: '计量单位',
+          align: 'center',
+          slot: 'measuringUnit'
+        },
+        {
+          minWidth: 80,
+          prop: 'weight',
+          label: '重量',
+          align: 'center',
+          slot: 'weight',
+          headerSlot: 'headerWeight'
+        },
+        {
+          minWidth: 80,
+          prop: 'weightUtil',
+          label: '重量单位',
+          align: 'center',
+          slot: 'weightUtil'
+        },
+        {
+          minWidth: 80,
+          prop: 'carveCode',
+          label: '刻码',
+          slot: 'carveCode',
+          align: 'center',
+          headerSlot: 'headerEngrave'
+        },
+        {
+          minWidth: 140,
+          prop: 'reason',
+          label: '客户退货理由',
+          align: 'center',
+          slot: 'reason',
+          headerSlot: 'headerReason'
+        },
+        {
+          minWidth: 180,
+          prop: 'feedbackDate',
+          label: '客户反馈日期',
+          align: 'center',
+          slot: 'feedbackDate'
+        },
+        {
+          minWidth: 180,
+          prop: 'sendDate',
+          label: '客户发出日期',
+          slot: 'sendDate',
+          align: 'center',
+          headerSlot: 'headerSendDate'
+        },
+      ]
+      let processNodes = {
+        //详情
+        view: [
+          {
+            minWidth: 140,
+            prop: 'ifPackageOk',
+            label: '包装完好与否',
+            align: 'center',
+            slot: 'ifPackageOk',
+            headerSlot: 'headerIfPackageOk'
+          },
+          {
+            minWidth: 140,
+            prop: 'unpackUserName',
+            label: '拆包装责任人',
+            align: 'center',
+            slot: 'unpackUserName',
+            headerSlot: 'headerUnpackUserName'
+          },
+          {
+            minWidth: 250,
+            prop: 'ifReasonMatch',
+            label: '退货原因是否与退货信息一致',
+            align: 'center',
+            slot: 'ifReasonMatch',
+            headerSlot: 'headerIfReasonMatch'
+          },
+          {
+            minWidth: 140,
+            prop: 'reason',
+            label: '客户退货理由',
+            align: 'center',
+            slot: 'reason',
+            headerSlot: 'headerReason'
+          },
+          {
+            minWidth: 250,
+            prop: 'unqualifiedReasonAnalysis',
+            label: '不合格原因分析',
+            align: 'center',
+            slot: 'unqualifiedReasonAnalysis',
+            headerSlot: 'headerUnqualifiedReasonAnalysis'
+          },
+          {
+            minWidth: 250,
+            prop: 'unqualifiedTypeName',
+            label: '不合格类型',
+            align: 'center',
+            slot: 'unqualifiedTypeName',
+            headerSlot: 'headerUnqualifiedType'
+          },
+          {
+            minWidth: 250,
+            prop: 'handleOpinion',
+            label: '对不合格品的处理意见',
+            align: 'center',
+            slot: 'handleOpinion',
+            headerSlot: 'headerHandleOpinion'
+          },
+
+          {
+            minWidth: 130,
+            prop: 'inOrOut',
+            label: '内部或外部',
+            align: 'center',
+            slot: 'inOrOut',
+            formatter: (_row, _column, cellValue) => {
+              return _row.inOrOut == 1 ? '内部' : '外部';
+            }
+          },
+          {
+            minWidth: 250,
+            prop: 'outerInfo',
+            label: '外协单位',
+            align: 'center',
+            slot: 'outerInfo',
+          },
+          {
+            minWidth: 250,
+            prop: 'improveCorrect',
+            label: '不合格原因是否改善到位',
+            align: 'center',
+            slot: 'improveCorrect',
+            headerSlot: 'headerImproveCorrect'
+          },
+          {
+            minWidth: 250,
+            prop: 'improveOpinion',
+            label: '对改善后产品处理意见',
+            align: 'center',
+            slot: 'improveOpinion',
+            headerSlot: 'headerImproveOpinion'
+          }
+        ],
+      }
+      processNodes[this.dialogType] && basicFields.push(...processNodes[this.dialogType])
+      return basicFields
+    }
+  },
+  methods: {
+    //删除
+    remove(row, index) {
+      this.form.detailList.splice(index, 1)
+    },
+    //初始化
+    init(type, row = {}) {
+      this.dialogType = type
+      if (type !== 'add') {
+        this.getReturnInfo(row)
+      }
+    },
+
+    //获取详情
+    async getReturnInfo(row) {
+      this.form = await saleReturnGetByIdAPI(row.id)
+      //拼接信息
+      const data = await getOutInBySourceBizNoAPI(row.sendNo)
+      this.infoData = deepClone(data)
+      //出库物料明细
+      this.warehousingMaterialList = this.infoData?.outInDetailVOList || []
+      //出库包装明细
+      if (this.warehousingMaterialList.length) {
+        this.materialCodeReqList = []
+        this.warehousingMaterialList.forEach(item => {
+          if (item.outInDetailRecordVOList?.length) {
+            item.outInDetailRecordVOList = item.outInDetailRecordVOList.map(i => {
+              return {
+                ...i,
+                outInCode: this.infoData.bizNo,
+                outInId: item.outInId,
+                measurementCount: i.totalCount,
+                outboundDetailId: i.id,
+                outboundType: 1,
+                packageCount: i.packingCount,
+                packingUnit: i.packingUnit,
+                weight: i.weight,
+                specification: item.specification,
+                name: i.name,
+                carveCode: i.carveCode,
+                categoryCode: i.categoryCode,
+                id: ''
+              }
+            })
+            this.materialCodeReqList.push(...item.outInDetailRecordVOList)
+          }
+        })
+        //出库物料明细
+        if (this.materialCodeReqList.length) {
+          this.metaList = []
+          this.materialCodeReqList.forEach(item => {
+            if (item.outInDetailRecordMaterialDetailVOList?.length) {
+              item.outInDetailRecordMaterialDetailVOList = item.outInDetailRecordMaterialDetailVOList.map(i => {
+                return {
+                  ...i,
+                  outInId: item.outInId,
+                  outInCode: item.outInCode,
+                  measurementCount: 1,
+                  outboundDetailId: i.id,
+                  outboundType: 2,
+                  packageCount: i.packingCount,
+                  packingUnit: i.packingUnit,
+                  weight: i.weight,
+                  weightUtil: i.weightUnit,
+                  specification: item.specification,
+                  categoryCode: i.assetCode,
+                  name: i.assetName,
+                  carveCode: i.carveCode,
+                  id: ''
+                }
+              })
+              this.metaList.push(...item.outInDetailRecordMaterialDetailVOList)
+            }
+          })
+        }
+      }
+
+      this.form.detailList.forEach(item => {
+        if (item.outboundType == 1) {
+          let find = this.materialCodeReqList.find(i => i.outboundDetailId == item.outboundDetailId) || {}
+          item.name = find.name
+          item.categoryCode = find.categoryCode
+          item.specification = find.specification
+          item.weightUtil = find.weightUtil
+          item.packingUnit = find.packingUnit
+          item.measuringUnit = find.measuringUnit
+        } else {
+          let find = this.metaList.find(i => i.outboundDetailId == item.outboundDetailId) || {}
+          item.name = find.name
+          item.categoryCode = find.categoryCode
+          item.specification = find.specification
+          item.weightUtil = find.weightUtil
+          item.packingUnit = find.packingUnit
+          item.measuringUnit = find.measuringUnit
+        }
+      })
+      this.$nextTick(() => {
+        this.$refs.table.reRenderTable()
+      })
+    },
+    //选择退货单
+    handleOrderBtn() {
+      this.returnOrderDialogFlag = true
+      // this.$nextTick(() => {
+      //   this.$refs.returnOrderDialogRef.init()
+      // })
+    },
+    //退货单
+    getReturnOrderInfo(row) {
+      this.form.returnNo = row.returnNo
+      this.form.returnRecordId = row.id
+      this.form.sendNo = row.sendNo
+      this.form.detailList = []
+    },
+    //选择退货明细
+    handleSelectGoods() {
+      this.outboundDetailsDialogFlag = true
+      this.$nextTick(() => {
+        this.$refs.outboundDetailsDialogRef.init(this.form)
+      })
+    },
+    //选择退货信息回调
+    saveDate(data) {
+      this.form.detailList.push(...data)
+    },
+    //选择负责人
+    handHead(row, index) {
+      let item = {
+        id: row.unpackUserId
+      };
+      this.$refs.headRef.open(item, index);
+    },
+    //选择负责人回调
+    changeHead(obj, index) {
+      this.$set(this.form.detailList[index], 'unpackUserId', obj.id);
+      this.$set(this.form.detailList[index], 'unpackUserName', obj.name);
+    },
+    cancel() {
+      this.$emit('update:addOrEditDialogFlag', false)
+    },
+    async handleSubmit(type) {
+
+      await this.$refs.formRef.validate(async validate => {
+        if (!validate) return this.$message.warning('有必填项未填,请检查')
+        let params = {
+          detailList: this.form.detailList.map(i => {
+            return {
+              outInId: i.outInId,
+              outInCode: i.outInCode,
+              measurementCount: i.measurementCount,
+              outboundDetailId: i.outboundDetailId,
+              outboundType: i.outboundType,
+              packageCount: i.packageCount,
+              packingUnit: i.packingUnit,
+              weight: i.weight,
+              weightUtil: i.weightUtil,
+              specification: i.specification,
+              categoryCode: i.categoryCode,
+              carveCode: i.carveCode,
+              name: i.name,
+              reason: i.reason,
+              sendDate: i.sendDate,
+              feedbackDate: i.feedbackDate,
+              id: i.id
+            }
+          }),
+          returnRecordId: this.form.returnRecordId,
+          id: this.form.id
+        }
+        let api = this.dialogType == 'add' ? saleReturnSaveAPI : saleReturnUpdateAPI
+        const data = await api(params)
+        this.$message.success('操作成功')
+        if (type == 'sub') {
+          await salesOrderReturnSubmit({businessId: data})
+
+        }
+        this.$emit('done')
+        this.cancel()
+      })
+
+
+    },
+  }
+}
+</script>
+<style scoped lang="scss">
+:deep .el-form-item {
+  margin-bottom: 0;
+}
+</style>

+ 538 - 0
src/views/saleManage/saleOrder/customerReturnOrder/detailDialog.vue

@@ -0,0 +1,538 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="detailDialogFlag"
+    :title="title"
+    :append-to-body="false"
+    :close-on-click-modal="false"
+    width="80%"
+    :before-close="cancel"
+  >
+    <div class="switch">
+      <div class="switch_left">
+        <ul>
+          <li
+            v-for="item in tabOptions"
+            :key="item.key"
+            :class="{ active: activeComp == item.key }"
+            @click="activeComp = item.key"
+          >
+            {{ item.name }}
+          </li>
+        </ul>
+      </div>
+    </div>
+    <div>
+      <el-form
+        v-if="activeComp==='cMain'"
+        ref="formRef"
+        :model="form">
+        <el-row style="margin-bottom: 10px">
+          <el-col :span="6">
+            <el-descriptions class="margin-top" :column="3" size="mini" border>
+              <el-descriptions-item>
+                <template slot="label">
+                  退货单
+                </template>
+                {{ form.returnNo}}
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-col>
+        </el-row>
+
+        <header-title title="退货物品明细" size="16px"></header-title>
+
+        <ele-pro-table
+          ref="table"
+          :needPage="false"
+          :columns="columns"
+          :toolkit="[]"
+          :datasource="form.detailList"
+          cache-key="customerReturnOrderDialog"
+          class="time-form"
+        >
+          <!-- 表头工具栏 -->
+          <template v-slot:toolbar>
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handleSelectGoods"
+              v-if="dialogType!=='view'&&form.returnNo"
+            >
+              选择退货物品
+            </el-button>
+          </template>
+          <template v-slot:action="{ row,$index }">
+            <el-popconfirm
+              class="ele-action"
+              title="确定要删除吗?"
+              @confirm="remove(row,$index)">
+              <template v-slot:reference>
+                <el-link type="danger" :underline="false" icon="el-icon-delete">
+                  删除
+                </el-link>
+              </template>
+            </el-popconfirm>
+          </template>
+
+
+          <template v-slot:packageCount="{ row,$index }">
+            <el-form-item
+              :prop="'detailList.'+$index+'.packageCount'"
+              :rules="{required:row.outboundType!=2?true:false,trigger:'blur',message:'请输入'}">
+              <el-input v-if="dialogType!=='view'&&row.outboundType!=2"
+                        v-model="row.packageCount"></el-input>
+              <div v-else>{{ row.packageCount }}</div>
+            </el-form-item>
+          </template>
+
+          <template v-slot:measurementCount="{ row,$index }">
+            <el-form-item
+              :prop="'detailList.'+$index+'.measurementCount'"
+              :rules="{required:true,trigger:'blur',message:'请输入'}">
+              <el-input v-if="dialogType!=='view'"
+                        v-model="row.measurementCount"></el-input>
+              <div v-else>{{ row.measurementCount }}</div>
+            </el-form-item>
+          </template>
+
+          <template v-slot:weight="{ row,$index }">
+            <el-form-item
+              :prop="'detailList.'+$index+'.weight'"
+              :rules="{required:true,trigger:'blur',message:'请输入'}">
+              <el-input v-if="dialogType!=='view'"
+                        v-model="row.weight"></el-input>
+              <div v-else>{{ row.weight }}</div>
+            </el-form-item>
+          </template>
+
+          <template v-slot:carveCode="{ row,$index }">
+            <el-form-item
+              :prop="'detailList.'+$index+'.carveCode'"
+              :rules="{required:true,trigger:'blur',message:'请输入'}">
+              <el-input v-if="dialogType!=='view'"
+                        v-model="row.carveCode"></el-input>
+              <div v-else>{{ row.carveCode }}</div>
+            </el-form-item>
+          </template>
+
+          <!--  ///  发起人展示字段 -->
+          <template v-slot:reason="{ row,$index }">
+            <el-form-item
+              :prop="'detailList.'+$index+'.reason'"
+              :rules="{required:true,trigger:'blur',message:'请输入'}">
+              <el-input v-if="dialogType!=='view'"
+                        v-model="row.reason"></el-input>
+              <div v-else>{{ row.reason }}</div>
+            </el-form-item>
+          </template>
+          <template v-slot:feedbackDate="{ row,$index }">
+            <el-form-item
+              :prop="'detailList.'+$index+'.feedbackDate'"
+              :rules="{required:true,trigger:'change',message:'请选择'}"
+            >
+              <el-date-picker
+                v-if="dialogType!=='view'"
+                v-model="row.feedbackDate"
+                style="width: 100%"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期">
+              </el-date-picker>
+              <div v-else>{{ row.feedbackDate }}</div>
+            </el-form-item>
+
+          </template>
+          <template v-slot:sendDate="{ row,$index }">
+            <el-form-item
+              :prop="'detailList.'+$index+'.sendDate'"
+              :rules="{required:true,trigger:'change',message:'请选择'}"
+            >
+              <el-date-picker
+                v-if="dialogType!=='view'"
+                v-model="row.sendDate"
+                style="width: 100%"
+                value-format="yyyy-MM-dd"
+                type="date"
+                placeholder="选择日期">
+              </el-date-picker>
+              <div v-else>{{ row.sendDate }}</div>
+            </el-form-item>
+
+          </template>
+          <!--////-->
+        </ele-pro-table>
+      </el-form>
+    </div>
+    <bpmDetail v-if="activeComp==='cBpm'&&currentRow.processInstanceId" :id="currentRow.processInstanceId"></bpmDetail>
+    <div slot="footer" class="footer">
+      <el-button @click="cancel">返回</el-button>
+    </div>
+  </ele-modal>
+</template>
+
+<script>
+import {getOutInBySourceBizNoAPI, saleReturnGetByIdAPI} from '@/api/saleManage/returnGoods';
+import dictMixins from '@/mixins/dictMixins';
+import bpmDetail from '@/views/bpm/processInstance/detail.vue';
+import customerReturnOrderDetail from "./addOrEditDialog.vue";
+import {deepClone} from "@/utils";
+
+
+export default {
+  mixins: [dictMixins],
+  props: ['detailDialogFlag'],
+  components: {
+    bpmDetail,
+    customerReturnOrderDetail
+  },
+  data() {
+    return {
+      activeComp: 'cMain',
+      tabOptions: [
+        {key: 'cMain', name: '退货处理单详情'},
+        {key: 'cBpm', name: '退货处理单流程详情'},
+      ],
+      title: '详情',
+      warehousingMaterialList: [],
+      materialCodeReqList: [],
+      metaList: [],
+      currentRow: {},
+      form: {
+        detailList: [],
+        returnNo: '',
+      },
+      dialogType: '',
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          width: 45,
+          type: 'index',
+          columnKey: 'index',
+          align: 'center',
+          fixed: 'left'
+        },
+        {
+          minWidth: 120,
+          prop: 'name',
+          label: '名称',
+          align: 'center',
+          slot: 'name'
+        },
+        {
+          minWidth: 120,
+          prop: 'categoryCode',
+          label: '编码',
+          align: 'center',
+          slot: 'categoryCode'
+        },
+        // {
+        //   minWidth: 120,
+        //   prop: 'modelType',
+        //   label: '型号',
+        //   align: 'center',
+        //   slot: 'modelType'
+        // },
+        {
+          minWidth: 120,
+          prop: 'specification',
+          label: '规格',
+          align: 'center',
+          slot: 'specification'
+        },
+        {
+          minWidth: 80,
+          prop: 'packageCount',
+          label: '包装数量',
+          align: 'center',
+          slot: 'packageCount',
+          headerSlot: 'headerPackingCount'
+        },
+        {
+          minWidth: 80,
+          prop: 'packingUnit',
+          label: '包装单位',
+          align: 'center',
+          slot: 'packingUnit'
+        },
+        {
+          minWidth: 80,
+          prop: 'measurementCount',
+          label: '计量数量',
+          align: 'center',
+          slot: 'measurementCount',
+          headerSlot: 'headerCount'
+        },
+        {
+          minWidth: 80,
+          prop: 'measuringUnit',
+          label: '计量单位',
+          align: 'center',
+          slot: 'measuringUnit'
+        },
+        {
+          minWidth: 80,
+          prop: 'weight',
+          label: '重量',
+          align: 'center',
+          slot: 'weight',
+          headerSlot: 'headerWeight'
+        },
+        {
+          minWidth: 80,
+          prop: 'weightUtil',
+          label: '重量单位',
+          align: 'center',
+          slot: 'weightUtil'
+        },
+        {
+          minWidth: 80,
+          prop: 'carveCode',
+          label: '刻码',
+          slot: 'carveCode',
+          align: 'center',
+          headerSlot: 'headerEngrave'
+        },
+        {
+          minWidth: 140,
+          prop: 'reason',
+          label: '客户退货理由',
+          align: 'center',
+          slot: 'reason',
+          headerSlot: 'headerReason'
+        },
+        {
+          minWidth: 180,
+          prop: 'feedbackDate',
+          label: '客户反馈日期',
+          align: 'center',
+          slot: 'feedbackDate'
+        },
+        {
+          minWidth: 180,
+          prop: 'sendDate',
+          label: '客户发出日期',
+          slot: 'sendDate',
+          align: 'center',
+          headerSlot: 'headerSendDate'
+        },
+        {
+          minWidth: 140,
+          prop: 'ifPackageOk',
+          label: '包装完好与否',
+          align: 'center',
+          slot: 'ifPackageOk',
+          headerSlot: 'headerIfPackageOk'
+        },
+        {
+          minWidth: 140,
+          prop: 'unpackUserName',
+          label: '拆包装责任人',
+          align: 'center',
+          slot: 'unpackUserName',
+          headerSlot: 'headerUnpackUserName'
+        },
+        {
+          minWidth: 250,
+          prop: 'ifReasonMatch',
+          label: '退货原因是否与退货信息一致',
+          align: 'center',
+          slot: 'ifReasonMatch',
+          headerSlot: 'headerIfReasonMatch'
+        },
+        {
+          minWidth: 140,
+          prop: 'reason',
+          label: '客户退货理由',
+          align: 'center',
+          slot: 'reason',
+          headerSlot: 'headerReason'
+        },
+        {
+          minWidth: 250,
+          prop: 'unqualifiedReasonAnalysis',
+          label: '不合格原因分析',
+          align: 'center',
+          slot: 'unqualifiedReasonAnalysis',
+          headerSlot: 'headerUnqualifiedReasonAnalysis'
+        },
+        {
+          minWidth: 250,
+          prop: 'unqualifiedTypeName',
+          label: '不合格类型',
+          align: 'center',
+          slot: 'unqualifiedTypeName',
+          headerSlot: 'headerUnqualifiedType'
+        },
+        {
+          minWidth: 250,
+          prop: 'handleOpinion',
+          label: '对不合格品的处理意见',
+          align: 'center',
+          slot: 'handleOpinion',
+          headerSlot: 'headerHandleOpinion'
+        },
+
+        {
+          minWidth: 130,
+          prop: 'inOrOut',
+          label: '内部或外部',
+          align: 'center',
+          slot: 'inOrOut',
+          formatter: (_row, _column, cellValue) => {
+            return _row.inOrOut && (_row.inOrOut == 1 ? '内部' : '外部');
+          }
+        },
+        {
+          minWidth: 250,
+          prop: 'outerInfo',
+          label: '外协单位',
+          align: 'center',
+          slot: 'outerInfo',
+        },
+        {
+          minWidth: 250,
+          prop: 'improveCorrect',
+          label: '不合格原因是否改善到位',
+          align: 'center',
+          slot: 'improveCorrect',
+          headerSlot: 'headerImproveCorrect'
+        },
+        {
+          minWidth: 250,
+          prop: 'improveOpinion',
+          label: '对改善后产品处理意见',
+          align: 'center',
+          slot: 'improveOpinion',
+          headerSlot: 'headerImproveOpinion'
+        }
+      ]
+    }
+  },
+  created() {
+  },
+  methods: {
+    async init(type, row) {
+      this.dialogType = type
+      await this.getReturnInfo(row)
+      this.currentRow = row
+    },
+    //获取详情
+    async getReturnInfo(row) {
+      this.form = await saleReturnGetByIdAPI(row.id)
+      //拼接信息
+      const data = await getOutInBySourceBizNoAPI(row.sendNo)
+      this.infoData = deepClone(data)
+      //出库物料明细
+      this.warehousingMaterialList = this.infoData?.outInDetailVOList || []
+      //出库包装明细
+      if (this.warehousingMaterialList.length) {
+        this.materialCodeReqList = []
+        this.warehousingMaterialList.forEach(item => {
+          if (item.outInDetailRecordVOList?.length) {
+            item.outInDetailRecordVOList = item.outInDetailRecordVOList.map(i => {
+              return {
+                ...i,
+                outInCode: this.infoData.bizNo,
+                outInId: item.outInId,
+                measurementCount: i.totalCount,
+                outboundDetailId: i.id,
+                outboundType: 1,
+                packageCount: i.packingCount,
+                packingUnit: i.packingUnit,
+                weight: i.weight,
+                specification: item.specification,
+                name: i.name,
+                carveCode: i.carveCode,
+                categoryCode: i.categoryCode,
+                id: ''
+              }
+            })
+            this.materialCodeReqList.push(...item.outInDetailRecordVOList)
+          }
+        })
+        //出库物料明细
+        if (this.materialCodeReqList.length) {
+          this.metaList = []
+          this.materialCodeReqList.forEach(item => {
+            if (item.outInDetailRecordMaterialDetailVOList?.length) {
+              item.outInDetailRecordMaterialDetailVOList = item.outInDetailRecordMaterialDetailVOList.map(i => {
+                return {
+                  ...i,
+                  outInId: item.outInId,
+                  outInCode: item.outInCode,
+                  measurementCount: 1,
+                  outboundDetailId: i.id,
+                  outboundType: 2,
+                  packageCount: i.packingCount,
+                  packingUnit: i.packingUnit,
+                  weight: i.weight,
+                  weightUtil: i.weightUnit,
+                  specification: item.specification,
+                  categoryCode: i.assetCode,
+                  name: i.assetName,
+                  carveCode: i.carveCode,
+                  id: ''
+                }
+              })
+              this.metaList.push(...item.outInDetailRecordMaterialDetailVOList)
+            }
+          })
+        }
+      }
+
+      this.form.detailList.forEach(item => {
+        if (item.outboundType == 1) {
+          let find = this.materialCodeReqList.find(i => i.outboundDetailId == item.outboundDetailId) || {}
+          item.name = find.name
+          item.categoryCode = find.categoryCode
+          item.specification = find.specification
+          item.weightUtil = find.weightUtil
+          item.packingUnit = find.packingUnit
+          item.measuringUnit = find.measuringUnit
+        } else {
+          let find = this.metaList.find(i => i.outboundDetailId == item.outboundDetailId) || {}
+          item.name = find.name
+          item.categoryCode = find.categoryCode
+          item.specification = find.specification
+          item.weightUtil = find.weightUtil
+          item.packingUnit = find.packingUnit
+          item.measuringUnit = find.measuringUnit
+        }
+      })
+      this.$nextTick(() => {
+        this.$refs.table.reRenderTable()
+      })
+    },
+    cancel() {
+      this.$emit('update:detailDialogFlag', false)
+    },
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.ele-dialog-form {
+  .el-form-item {
+    margin-bottom: 10px;
+  }
+}
+
+.headbox {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+
+  .amount {
+    font-size: 14px;
+    font-weight: bold;
+    margin-right: 20px;
+  }
+}
+</style>

+ 360 - 0
src/views/saleManage/saleOrder/customerReturnOrder/index.vue

@@ -0,0 +1,360 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <div class="ele-border-lighter form-content" v-loading="loading">
+        <searchTablePage @search="reload"></searchTablePage>
+
+        <!-- 数据表格 -->
+        <ele-pro-table
+          ref="table"
+          :columns="columns"
+          :datasource="datasource"
+          height="calc(100vh - 385px)"
+          full-height="calc(100vh - 116px)"
+          tool-class="ele-toolbar-form"
+          :selection.sync="selection"
+          cache-key="eomContactPageTable"
+        >
+          <!-- 表头工具栏 -->
+          <template v-slot:toolbar>
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handleAddOrEdit('add' )"
+            >
+              新建
+            </el-button>
+
+            <el-button
+              size="small"
+              type="danger"
+              el-icon-delete
+              class="ele-btn-icon"
+              @click="allDelBtn"
+              :disabled="selection?.length === 0"
+            >
+              批量删除
+            </el-button>
+          </template>
+
+          <!-- 查看详情列 -->
+
+          <template v-slot:returnNo="{ row }">
+            <el-link
+              type="primary"
+              :underline="false"
+              @click="openorderDetail(row, 'returnNo')"
+            >
+              {{ row.returnNo }}
+            </el-link
+            >
+          </template>
+          <template v-slot:orderNo="{ row }">
+            <el-link
+              type="primary"
+              :underline="false"
+              @click="openorderDetail(row, 'orderNo')"
+            >
+              {{ row.orderNo }}
+            </el-link
+            >
+          </template>
+          <!-- 操作列 -->
+          <template v-slot:action="{ row }">
+            <el-link
+              type="primary"
+              :underline="false"
+              icon="el-icon-edit"
+              @click="handleAddOrEdit('update', row)"
+              v-if="[0,3].includes(row.approvalStatus)">
+              修改
+            </el-link>
+            <el-link
+              type="primary"
+              :underline="false"
+              icon="el-icon-plus"
+              @click="returnSubmit(row)"
+              v-if="[0, 3].includes(row.approvalStatus)"
+            >
+              提交
+            </el-link>
+
+            <el-popconfirm
+              class="ele-action"
+              title="确定要删除此信息吗?"
+              v-if="[0, 3].includes(row.approvalStatus)"
+              @confirm="remove([row.id])"
+            >
+              <template v-slot:reference>
+                <el-link type="danger" :underline="false" icon="el-icon-delete">
+                  删除
+                </el-link>
+              </template>
+            </el-popconfirm>
+          </template>
+        </ele-pro-table>
+      </div>
+    </el-card>
+
+
+    <send-detail-dialog ref="sendDetailDialogRef"></send-detail-dialog>
+    <order-detail-dialog ref="orderDetailDialogRef"></order-detail-dialog>
+
+    <!--  客户真实退货单  -->
+    <add-or-edit-dialog :add-or-edit-dialog-flag.sync="addOrEditDialogFlag" ref="addOrEditDialogRef"
+                        v-if="addOrEditDialogFlag"  @done="reload"></add-or-edit-dialog>
+<!--详情-->
+    <detail-dialog :detailDialogFlag.sync="detailDialogFlag" ref="detailDialogRef" v-if="detailDialogFlag"></detail-dialog>
+    <!-- 多选删除弹窗 -->
+    <pop-modal
+      :visible.sync="delVisible"
+      content="是否确定删除?"
+      @done="commitBtn"
+    />
+  </div>
+</template>
+
+<script>
+
+import sendDetailDialog from '@/views/saleManage/saleOrder/invoice/components/detailDialog.vue';
+import orderDetailDialog from '@/views/saleManage/saleOrder/components/detailDialog.vue';
+import popModal from '@/components/pop-modal';
+import addOrEditDialog from "@/views/saleManage/saleOrder/customerReturnOrder/addOrEditDialog.vue";
+import {reviewStatusEnum} from '@/enum/dict';
+import searchTablePage from "@/views/saleManage/saleOrder/customerReturnOrder/searchTable-page.vue";
+import detailDialog from "./detailDialog.vue";
+import {
+  saleReturnPageList,
+  deleteSaleReturnAPI,
+  salesOrderReturnSubmit
+} from '@/api/saleManage/returnGoods';
+import dictMixins from '@/mixins/dictMixins';
+import addReturnGoodsDialog from "@/views/saleManage/saleOrder/returnGoods/components/addReturnGoodsDialog.vue";
+
+
+export default {
+  mixins: [dictMixins],
+  components: {
+    addReturnGoodsDialog,
+    sendDetailDialog,
+    orderDetailDialog,
+    popModal,
+    addOrEditDialog,
+    searchTablePage,
+    detailDialog
+  },
+  data() {
+    return {
+      activeComp: 'saleorder',
+      tabOptions: [
+        {key: 'saleorder', name: '销售订单'},
+        {key: 'invoice', name: '发货单'},
+        {key: 'customerReturnOrder', name: '退货处理单'},
+        {key: 'returnorder', name: '退货单'}
+      ],
+      selection: [], //单选中集合
+      delVisible: false, //批量删除弹框状态
+      loading: false, // 加载状态
+      addOrEditDialogFlag: false, // 客户真实退货单
+      detailDialogFlag: false, // 客户真实退货单详情
+      columns: [
+        {
+          width: 45,
+          type: 'selection',
+          columnKey: 'selection',
+          align: 'center'
+        },
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'returnNo',
+          label: '退货单编码',
+          align: 'center',
+          slot: 'returnNo',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'orderNo',
+          label: '销售订单编码',
+          align: 'center',
+          slot: 'orderNo',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'sendNo',
+          label: '发货订单编码',
+          align: 'center',
+          slot: 'sendNo',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'contactName',
+          label: '客户名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 180
+        },
+        {
+          prop: 'approvalStatus',
+          label: '状态',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (_row, _column, cellValue) => {
+            return reviewStatusEnum[_row.approvalStatus].label;
+          }
+        },
+        {
+          prop: 'createTime',
+          label: '创建时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 170
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 230,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ]
+    };
+  },
+  computed: {},
+
+  methods: {
+    /* 表格数据源 */
+    datasource({page, limit, where, order}) {
+      return saleReturnPageList({
+        pageNum: page,
+        size: limit,
+        ...where
+      });
+    },
+
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({page: 1, where});
+    },
+
+    //创建/修改客户退货单
+    handleAddOrEdit(type, row) {
+      this.addOrEditDialogFlag = true
+      this.$nextTick(() => {
+        this.$refs.addOrEditDialogRef.init(type, row)
+      })
+
+    },
+
+    //批量删除
+    allDelBtn() {
+      if (this.selection.length === 0) return;
+      let flag = this.selection.some(item => [1, 2].includes(item.approvalStatus))
+      if (flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
+      this.delVisible = true;
+    },
+
+    //删除接口
+    remove(delData) {
+      deleteSaleReturnAPI(delData).then((res) => {
+        this.$message.success('删除成功!');
+        this.reload();
+      });
+    },
+
+    //删除弹框确定
+    commitBtn() {
+      const dataId = this.selection.map((v) => v.id);
+      this.remove(dataId);
+    },
+    returnSubmit(res) {
+      salesOrderReturnSubmit({
+        businessId: res.id
+      }).then((res) => {
+        this.$message.success('提交成功!');
+        this.reload();
+      });
+    },
+    //查看详情
+    openorderDetail(row, type) {
+      if (type === 'returnNo') {
+        this.detailDialogFlag = true
+        this.$nextTick(() => {
+          this.$refs.detailDialogRef.init('view', row)
+        })
+      }
+      if (type === 'sendNo') {
+        this.$refs.sendDetailDialogRef.open({id: row.sendId});
+      }
+      if (type === 'orderNo') {
+        this.$refs.orderDetailDialogRef.open({id: row.orderId});
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.ele-body {
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+:deep .el-card__body {
+  padding: 0;
+}
+
+:deep(.el-link--inner) {
+  margin-left: 0px !important;
+}
+
+.sys-organization-list {
+  height: calc(100vh - 264px);
+  box-sizing: border-box;
+  border-width: 1px;
+  border-style: solid;
+  overflow: auto;
+}
+
+.sys-organization-list :deep(.el-tree-node__content) {
+  height: 40px;
+
+  & > .el-tree-node__expand-icon {
+    margin-left: 10px;
+  }
+}
+
+.switch_left ul .active {
+  border-top: 4px solid var(--color-primary);
+  color: var(--color-primary-5);
+}
+
+.switch {
+  padding-bottom: 20px;
+}
+
+.el-dropdown-link {
+  cursor: pointer;
+  color: var(--color-primary-5);
+}
+
+.el-icon-arrow-down {
+  font-size: 12px;
+}
+</style>

+ 176 - 0
src/views/saleManage/saleOrder/customerReturnOrder/returnOrderDialog.vue

@@ -0,0 +1,176 @@
+<template>
+  <el-dialog title="选择退货单" custom-class="ele-dialog-form long-dialog-form" :visible.sync="returnOrderDialogFlag"
+             :before-close="handleClose" :close-on-click-modal="false" top="5vh"
+             :close-on-press-escape="false" append-to-body width="80%">
+    <el-card shadow="never">
+      <searchTable @search="reload"></searchTable>
+      <ele-pro-table ref="table" :columns="columns" :datasource="datasource" row-key="id"
+                     height="calc(100vh - 500px)" class="dict-table" @cell-click="cellClick">
+        <!-- 表头工具栏 -->
+        <template v-slot:action="{ row }">
+          <el-radio class="radio" v-model="radio" :label="row.id"><i></i></el-radio>
+        </template>
+      </ele-pro-table>
+    </el-card>
+
+    <div class="btns" slot="footer">
+      <el-button type="primary" size="small" @click="selected">选择</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+
+  </el-dialog>
+</template>
+
+<script>
+
+
+import searchTable from './searchTable.vue';
+import {getReturnTableList} from '@/api/saleManage/returnGoods';
+import {reviewStatusEnum} from '@/enum/dict';
+
+export default {
+  components: {
+    searchTable
+  },
+  props: ['returnOrderDialogFlag'],
+  data() {
+    return {
+      currentIndex: null,
+      columns: [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          action: 'action',
+          slot: 'action',
+          align: 'center',
+          label: '选择',
+
+        },
+
+        {
+          prop: 'returnNo',
+          label: '退货单编码',
+          align: 'center',
+          slot: 'returnNo',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'orderNo',
+          label: '订单编码',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'contactName',
+          label: '客户名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 180,
+        },
+        {
+          prop: 'reviewStatus',
+          label: '状态',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (_row, _column, cellValue) => {
+            return reviewStatusEnum[_row.reviewStatus].label;
+          }
+        },
+        {
+          prop: 'createTime',
+          label: '创建时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 170
+        },
+      ],
+
+      radio: null,
+    }
+  },
+
+  methods: {
+    /* 表格数据源 */
+    datasource({page, limit, where, order}) {
+      return getReturnTableList({
+        pageNum: page,
+        size: limit,
+        ...where,
+        reviewStatus: '2',
+        hasHandleReceipt: 0
+      });
+    },
+
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({pageNum: 1, where: where, reviewStatus: '2', hasHandleReceipt: 0});
+    },
+
+    handleNodeClick(data, node) {
+      this.reload({categoryId: data.id});
+    },
+
+
+    // 单击获取id
+    cellClick(row) {
+      this.current = row
+      this.radio = row.id
+    },
+    handleClose() {
+      this.$emit('update:returnOrderDialogFlag', false)
+    },
+
+    selected() {
+      if (!this.current) {
+        return this.$message.warning('请至少选择一条数据')
+      }
+      this.$emit('changeParent', this.current, this.currentIndex)
+      this.handleClose()
+    },
+
+
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.tree_col {
+  border: 1px solid #eee;
+  padding: 10px 0;
+  box-sizing: border-box;
+  height: 500px;
+  overflow: auto;
+}
+
+.table_col {
+  padding-left: 10px;
+
+  ::v-deep .el-table th.el-table__cell {
+    background: #f2f2f2;
+  }
+}
+
+.pagination {
+  text-align: right;
+  padding: 10px 0;
+}
+
+.btns {
+  text-align: center;
+  padding: 10px 0;
+}
+
+.topsearch {
+  margin-bottom: 15px;
+}
+</style>

+ 124 - 0
src/views/saleManage/saleOrder/customerReturnOrder/searchTable-page.vue

@@ -0,0 +1,124 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="100px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="退货单编码:" prop="returnNo">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.returnNo"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="订单编码:" prop="orderNo">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.orderNo"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg:6, md: 12 } : { span:6 }">
+        <el-form-item label="发货单编码:" prop="sendNo">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.sendNo"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="审核状态:" prop="reviewStatus">
+          <el-select v-model="params.reviewStatus" placeholder="请选择" class="w100" clearable>
+            <el-option
+              v-for="item in reviewStatusEnum"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg:6, md: 12 } : { span:6 }">
+
+        <el-form-item label="客户名称:" prop="contactName">
+          <el-input
+            placeholder="请输入"
+            style="max-width:320px"
+            v-model.trim="params.contactName" controls-position="right" >
+          </el-input>
+
+        </el-form-item>
+
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg:6, md: 12 } : { span:4 }">
+
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+import {reviewStatusEnum} from '@/enum/dict';
+const repliedOptions=[
+  {value:0,label:'否'},
+  {value:1,label:'是'},
+]
+export default {
+  data () {
+    // 默认表单数据
+    const defaultParams = {
+      contractName: '',
+      contractId:'',
+      docNo:'',
+      orderId:'',
+      replied:null,
+      reviewStatus:null
+    };
+    return {
+      reviewStatusEnum,
+      defaultParams,
+      repliedOptions,
+      // 表单数据
+      params: { ...defaultParams }
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive () {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  methods: {
+    //选择时间
+    changeDate(e){
+      this.createTime=e
+    },
+    /* 搜索 */
+    search () {
+      this.$emit('search', {
+        ...this.params
+      });
+    },
+    /*  重置 */
+    reset () {
+      this.createTime=[]
+      this.params = Object.assign({},{ ...this.defaultParams });
+      this.search();
+    }
+  }
+};
+</script>

+ 105 - 0
src/views/saleManage/saleOrder/customerReturnOrder/searchTable.vue

@@ -0,0 +1,105 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="100px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="退货单编码:" prop="returnNo">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.returnNo"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="订单编码:" prop="orderNo">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.orderNo"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg:6, md: 12 } : { span:6 }">
+
+        <el-form-item label="客户名称:" prop="contactName">
+          <el-input
+          placeholder="请输入"
+          style="max-width:320px"
+           v-model.trim="params.contactName" controls-position="right" >
+          </el-input>
+
+        </el-form-item>
+
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg:6, md: 12 } : { span:4 }">
+
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+import {reviewStatusEnum} from '@/enum/dict';
+const repliedOptions=[
+  {value:0,label:'否'},
+  {value:1,label:'是'},
+]
+  export default {
+    data () {
+      // 默认表单数据
+      const defaultParams = {
+        contractName: '',
+        contractId:'',
+        returnNo:'',
+        orderId:'',
+      };
+      return {
+        reviewStatusEnum,
+        defaultParams,
+        repliedOptions,
+        // 表单数据
+        params: { ...defaultParams }
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive () {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      //选择时间
+      changeDate(e){
+       this.createTime=e
+      },
+      /* 搜索 */
+      search () {
+        this.$emit('search', {
+          ...this.params
+        });
+      },
+      /*  重置 */
+      reset () {
+        this.createTime=[]
+        this.params = Object.assign({},{ ...this.defaultParams });
+        this.search();
+      }
+    }
+  };
+</script>

+ 8 - 2
src/views/saleManage/saleOrder/index.vue

@@ -140,6 +140,9 @@
         <div v-if="activeComp == 'accountstatement'">
           <accountstatement></accountstatement>
         </div>
+        <div v-if="activeComp == 'customerReturnOrder'">
+          <customerReturnOrder></customerReturnOrder>
+        </div>
       </div>
     </el-card>
 
@@ -173,6 +176,7 @@
   import addReturnGoodsDialog from '@/views/saleManage/saleOrder/returnGoods/components/addReturnGoodsDialog';
   import popModal from '@/components/pop-modal';
   import accountstatement from './accountstatement/index.vue';
+  import customerReturnOrder from './customerReturnOrder/index.vue';
   import returnGoods from './returnGoods/index.vue';
   import { getTableList, deleteInformation ,submit} from '@/api/saleManage/saleorder';
   import dictMixins from '@/mixins/dictMixins';
@@ -190,7 +194,8 @@
       addInvoiceDialog,
       invoice,
       addDialog,
-      detailDialog
+      detailDialog,
+      customerReturnOrder
     },
     data() {
       return {
@@ -199,6 +204,7 @@
           { key: 'saleorder', name: '销售订单' },
           { key: 'invoice', name: '发货单' },
           { key: 'returnorder', name: '退货单' },
+          { key: 'customerReturnOrder', name: '退货处理单' },
           { key: 'accountstatement', name: '对账单' }
         ],
         selection: [], //单选中集合
@@ -382,7 +388,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.orderStatus))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 13 - 4
src/views/saleManage/saleOrder/invoice/components/addInvoiceDialog.vue

@@ -61,7 +61,7 @@
               style="margin-bottom: 22px"
             >
             <span>{{form.orderNo}}</span>
-              
+
             </el-form-item> -->
 
           <el-form-item
@@ -175,7 +175,16 @@
         rules: {
           partaName: [
             { required: true, message: '请选择客户名称', trigger: 'change' }
-          ]
+          ],
+          linkName: [
+            { required: true, message: '请输入', trigger: ['blur','change'] }
+          ],
+          orderNo: [
+            { required: true, message: '请选择', trigger: 'change' }
+          ],
+          receiveAddress: [
+            { required: true, message: '请输入', trigger: 'change' }
+          ],
         },
 
         // 提交状态
@@ -350,8 +359,8 @@
             delete this.form.id;
           }
           this.form.repliedFiles = this.form.repliedFiles || [];
-     
-          
+
+
           this.form.replied = this.form.repliedFiles.length > 0 ? 1 : 0;
           let commitData = Object.assign({}, this.form, {
             productList: this.$refs.inventoryTableref.getTableValue()

+ 1 - 1
src/views/saleManage/saleOrder/invoice/index.vue

@@ -275,7 +275,7 @@
       allDelBtn() {
         if (this.selection.length === 0) return;
         let flag =  this.selection.some(item=>[1,2].includes(item.reviewStatus))
-        if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+        if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
         this.delVisible = true;
       },
 

+ 135 - 50
src/views/saleManage/saleOrder/returnGoods/components/customerReturnOrderDetail.vue

@@ -1,26 +1,26 @@
 <template>
 
-<div>
-  <el-form
-    :rules="rules"
-    ref="formRef"
-    :model="form">
+  <div>
+    <el-form
+      :rules="rules"
+      ref="formRef"
+      :model="form">
 
-    <header-title title="退货物品明细" size="16px"></header-title>
+      <header-title title="退货物品明细" size="16px"></header-title>
 
-    <ele-pro-table
-      ref="table"
-      :needPage="false"
-      :columns="columns"
-      :toolkit="[]"
-      :datasource="datasource"
-      cache-key="customerReturnOrderDialog"
-      class="time-form">
-      <!--////-->
-    </ele-pro-table>
-  </el-form>
+      <ele-pro-table
+        ref="table"
+        :needPage="false"
+        :columns="columns"
+        :toolkit="[]"
+        :datasource="datasource"
+        cache-key="customerReturnOrderDialog"
+        class="time-form">
+        <!--////-->
+      </ele-pro-table>
+    </el-form>
 
-</div>
+  </div>
 
 
 </template>
@@ -33,12 +33,13 @@ import {
 } from "@/api/saleManage/returnGoods";
 import {deepClone} from "@/utils";
 import bpmDetail from "@/views/bpm/processInstance/detail.vue";
+import {reviewStatusEnum} from "@/enum/dict";
 
 
 export default {
   name: "customerReturnOrderDetail",
   components: {bpmDetail},
-  props:['row'],
+  props: ['row'],
   data() {
     return {
       title: '客户退货处理单',
@@ -146,43 +147,126 @@ export default {
           align: 'center',
           headerSlot: 'headerEngrave'
         },
+        {
+          minWidth: 140,
+          prop: 'reason',
+          label: '客户退货理由',
+          align: 'center',
+          slot: 'reason',
+          headerSlot: 'headerReason'
+        },
+        {
+          minWidth: 140,
+          prop: 'feedbackDate',
+          label: '客户反馈日期',
+          align: 'center',
+          slot: 'feedbackDate'
+        },
+        {
+          minWidth: 140,
+          prop: 'sendDate',
+          label: '客户发出日期',
+          slot: 'sendDate',
+          align: 'center',
+          headerSlot: 'headerSendDate'
+        },
+        {
+          minWidth: 140,
+          prop: 'ifPackageOk',
+          label: '包装完好与否',
+          align: 'center',
+          slot: 'ifPackageOk',
+          headerSlot: 'headerIfPackageOk'
+        },
+        {
+          minWidth: 140,
+          prop: 'unpackUserName',
+          label: '拆包装责任人',
+          align: 'center',
+          slot: 'unpackUserName',
+          headerSlot: 'headerUnpackUserName'
+        },
+        {
+          minWidth: 250,
+          prop: 'ifReasonMatch',
+          label: '退货原因是否与退货信息一致',
+          align: 'center',
+          slot: 'ifReasonMatch',
+          headerSlot: 'headerIfReasonMatch'
+        },
+        {
+          minWidth: 140,
+          prop: 'reason',
+          label: '客户退货理由',
+          align: 'center',
+          slot: 'reason',
+          headerSlot: 'headerReason'
+        },
+        {
+          minWidth: 250,
+          prop: 'unqualifiedReasonAnalysis',
+          label: '不合格原因分析',
+          align: 'center',
+          slot: 'unqualifiedReasonAnalysis',
+          headerSlot: 'headerUnqualifiedReasonAnalysis'
+        },
+        {
+          minWidth: 250,
+          prop: 'unqualifiedTypeName',
+          label: '不合格类型',
+          align: 'center',
+          slot: 'unqualifiedTypeName',
+          headerSlot: 'headerUnqualifiedType'
+        },
+        {
+          minWidth: 250,
+          prop: 'handleOpinion',
+          label: '对不合格品的处理意见',
+          align: 'center',
+          slot: 'handleOpinion',
+          headerSlot: 'headerHandleOpinion'
+        },
+
+        {
+          minWidth: 130,
+          prop: 'inOrOut',
+          label: '内部或外部',
+          align: 'center',
+          slot: 'inOrOut',
+          formatter: (_row, _column, cellValue) => {
+            return _row.inOrOut == 1 ? '内部' : '外部';
+          }
+        },
+        {
+          minWidth: 250,
+          prop: 'outerInfo',
+          label: '外协单位',
+          align: 'center',
+          slot: 'outerInfo',
+        },
+        {
+          minWidth: 250,
+          prop: 'improveCorrect',
+          label: '不合格原因是否改善到位',
+          align: 'center',
+          slot: 'improveCorrect',
+          headerSlot: 'headerImproveCorrect'
+        },
+        {
+          minWidth: 250,
+          prop: 'improveOpinion',
+          label: '对改善后产品处理意见',
+          align: 'center',
+          slot: 'improveOpinion',
+          headerSlot: 'headerImproveOpinion'
+        }
       ]
-      let processNodes = {
-        //发起人
-        stater: [
-          {
-            minWidth: 140,
-            prop: 'reason',
-            label: '客户退货理由',
-            align: 'center',
-            slot: 'reason',
-            headerSlot: 'headerReason'
-          },
-          {
-            minWidth: 140,
-            prop: 'feedbackDate',
-            label: '客户反馈日期',
-            align: 'center',
-            slot: 'feedbackDate'
-          },
-          {
-            minWidth: 140,
-            prop: 'sendDate',
-            label: '客户发出日期',
-            slot: 'sendDate',
-            align: 'center',
-            headerSlot: 'headerSendDate'
-          },
-        ]
-      }
-      processNodes[this.taskDefinitionKey] && basicFields.push(...processNodes[this.taskDefinitionKey])
-      console.log(this.taskDefinitionKey);
       this.activeComp = this.taskDefinitionKey
       return basicFields
     }
   },
   mounted() {
-    this.init('',this.row)
+    this.init('', this.row)
   },
   methods: {
 
@@ -194,6 +278,7 @@ export default {
       }
     },
     async getReturnInfo(row) {
+      if (!row.handleReceiptId) return
       this.form = await saleReturnGetByIdAPI(row.handleReceiptId)
 
       //拼接信息

+ 5 - 2
src/views/saleManage/saleOrder/returnGoods/components/customerReturnOrderDialog.vue

@@ -27,7 +27,9 @@
         :rules="rules"
         ref="formRef"
         :model="form">
+        <el-form-item>
 
+        </el-form-item>
         <header-title title="退货物品明细" size="16px"></header-title>
 
         <ele-pro-table
@@ -483,7 +485,7 @@ export default {
     handleSelectGoods() {
       this.outboundDetailsDialogFlag = true
       this.$nextTick(() => {
-        this.$refs.outboundDetailsDialogRef.init(this.currentRow)
+        this.$refs.outboundDetailsDialogRef.init(this.form )
       })
     },
     //选择退货信息回调
@@ -532,7 +534,8 @@ export default {
               id: i.id
             }
           }),
-          returnRecordId: this.currentRow.id
+          returnRecordId: this.currentRow.id,
+          id: this.currentRow.handleReceiptId
         }
         let api = this.dialogType == 'add' ? saleReturnSaveAPI : saleReturnUpdateAPI
         const data = await api(params)

+ 4 - 3
src/views/saleManage/saleOrder/returnGoods/components/detailDialog.vue

@@ -244,7 +244,7 @@ export default {
       form: {
         orderFiles: [{name: '222'}]
       },
-      data:{},
+      data: {},
       rules: {},
       detailData: {},
       competAnalysisListcolumns: [
@@ -383,8 +383,9 @@ export default {
       this.visible = true;
       this.getDetailData(row.id);
       this.detailId = row.id;
-      this.data = await saleReturnGetByIdAPI(row.handleReceiptId)
-
+      if(row.handleReceiptId){
+        this.data = await saleReturnGetByIdAPI(row.handleReceiptId)
+      }
     },
 
     cancel() {

+ 1 - 1
src/views/saleManage/saleOrder/returnGoods/index.vue

@@ -300,7 +300,7 @@ export default {
     allDelBtn() {
       if (this.selection.length === 0) return;
       let flag =  this.selection.some(item=>[1,2].includes(item.reviewStatus))
-      if(flag) return this.$message.warning('抱歉已审核、待审核数据不能删除,请检查')
+      if(flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
       this.delVisible = true;
     },