Ver código fonte

fix(saleOrder): 修复收款计划在特定生产需求下不显示的问题

liujt 8 meses atrás
pai
commit
b075c390bd

+ 1229 - 0
src/views/financialManage/invoiceManage/components/addOrEditDialogNew copy.vue

@@ -0,0 +1,1229 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="addOrEditDialogFlag"
+    :title="title"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    width="70%"
+    :before-close="cancel"
+    :maxable="true"
+    :resizable="true"
+  >
+    <el-form
+      ref="form"
+      :rules="rules"
+      class="el-form-box"
+      :model="form"
+      label-width="160px"
+    >
+      <headerTitle title="基本信息"></headerTitle>
+      <el-row :gutter="12">
+        <el-col :span="8">
+          <el-form-item label="发票类型" prop="type">
+            <el-select
+              v-model="form.type"
+              @change="handleSelType('isType')"
+              clearable
+              :disabled="!isEditType"
+              style="width: 100%"
+            >
+              <el-option label="开票" value="1"></el-option>
+              <el-option label="收票" value="2"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="form.type">
+          <el-form-item label="来源类型" prop="sourceType">
+            <el-select
+              v-model="form.sourceType"
+              @change="handleSelType()"
+              :disabled="!isEditType"
+              clearable
+              style="width: 100%"
+            >
+              <el-option v-for="item in sourceTypeOp" :label="item.label" :value="item.value" :key="item.value"></el-option>
+              <!-- <el-option label="对账单" :value="1"></el-option>
+              <el-option label="合同" :value="2"></el-option>
+              <el-option label="订单" :value="3"></el-option>
+              <el-option label="收款计划" :value="1"></el-option>
+              <el-option
+                label="应收"
+                :value="5"
+                v-if="form.type == 1"
+              ></el-option>
+              <el-option
+                label="应付"
+                :value="4"
+                v-if="form.type == 2"
+              ></el-option> -->
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="form.sourceType == 6">
+          <el-form-item label="收款计划编码" prop="sourceCode">
+            <el-input
+              v-model="form.sourceCode"
+              readonly
+              @click.native="handleSelectAccount(6)"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="form.sourceType == 7">
+          <el-form-item label="付款计划编码" prop="sourceCode">
+            <el-input
+              v-model="form.sourceCode"
+              readonly
+              @click.native="handleSelectAccount(7)"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="form.sourceType == 5">
+          <el-form-item label="应收编码" prop="sourceCode">
+            <el-input
+              v-model="form.sourceCode"
+              readonly
+              @click.native="handleSelectAccount(5)"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="form.sourceType == 4">
+          <el-form-item label="应付编码" prop="sourceCode">
+            <el-input
+              v-model="form.sourceCode"
+              readonly
+              @click.native="handleSelectAccount(4)"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="发票金额" prop="amount">
+            <el-input
+              type="number"
+              v-model="form.amount"
+              :precision="2"
+              :controls="false"
+              style="width: 100%"
+              disabled
+              :min="0"
+            >
+              <template slot="append">
+                <span>元</span>
+              </template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="发票号" prop="invoiceNos">
+            <el-input
+              v-model="form.invoiceNos"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="开票日期">
+            <el-date-picker
+              style="width: 100%"
+              v-model="form.expectInvoiceDate"
+              type="date"
+              value-format="yyyy-MM-dd"
+              placeholder="选择日期"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="申请部门" prop="applyDeptId">
+            <ele-tree-select
+              clearable
+              :data="deptTreeList"
+              v-model="form.applyDeptId"
+              valueKey="id"
+              labelKey="name"
+              placeholder="请选择"
+              @change="changeDeptInfo"
+              default-expand-all
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="申请人" prop="applyUserId">
+            <personSelect
+              ref="directorRef"
+              v-model="form.applyUserId"
+              @selfChange="changeUserInfo"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="发票种类" prop="category">
+            <el-select
+              v-model="form.category"
+              clearable
+              style="width: 100%"
+            >
+              <el-option label="增值税专用发票" :value="1"></el-option>
+              <el-option label="增值税普通发票" :value="2"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item prop="files" label="发票附件">
+            <fileMain v-model="form.files"></fileMain>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <headerTitle title="发票信息"></headerTitle>
+      <el-row :gutter="12">
+        <el-col :span="12">
+          <el-form-item label="购买方名称" prop="companyName">
+            <el-input
+              v-model="form.companyName"
+              placeholder="请输入"
+              v-if="enterprisePage.length <= 1 || form.type == 1"
+            />
+            <el-select
+              v-if="enterprisePage.length > 1 && form.type == 2"
+              style="width: 100%"
+              v-model="form.companyName"
+              placeholder="请选择"
+              @change="enterpriseChange"
+            >
+              <el-option
+                v-for="item in enterprisePage"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label="统一社会信用代码"
+            prop="companyUsc"
+            class="form_item_label"
+          >
+            <el-input v-model="form.companyUsc"></el-input>
+          </el-form-item>
+          <el-form-item label="联系人" prop="companyContactName">
+            <el-input v-model="form.companyContactName"></el-input>
+          </el-form-item>
+          <el-form-item label="电话" prop="companyTel">
+            <el-input v-model="form.companyTel"></el-input>
+          </el-form-item>
+          <el-form-item label="银行账号" prop="companyBankAccount">
+            <el-input v-model="form.companyBankAccount"></el-input>
+          </el-form-item>
+          <el-form-item label="开户行" prop="companyBankBranchNo">
+            <el-input v-model="form.companyBankBranchNo"></el-input>
+          </el-form-item>
+          
+          <el-form-item label="地址" prop="companyAddress">
+            <el-input v-model="form.companyAddress"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="销售方名称" prop="receiverName">
+            <el-input
+              v-model="form.receiverName"
+              placeholder="请输入"
+              v-if="enterprisePage.length <= 1 || form.type == 2"
+            />
+            <el-select
+              v-if="enterprisePage.length > 1 && form.type == 1"
+              style="width: 100%"
+              v-model="form.receiverName"
+              placeholder="请选择"
+              @change="enterpriseChange"
+            >
+              <el-option
+                v-for="item in enterprisePage"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label="统一社会信用代码"
+            prop="salesCompanyUsc"
+            class="form_item_label"
+          >
+            <el-input v-model="form.salesCompanyUsc"></el-input>
+          </el-form-item>
+          <el-form-item label="联系人" prop="receiverContactName">
+            <el-input v-model="form.receiverContactName"></el-input>
+          </el-form-item>
+          <el-form-item label="电话" prop="receiverTel">
+            <el-input v-model="form.receiverTel"></el-input>
+          </el-form-item>
+          <el-form-item label="银行账号" prop="salesCompanyBankAccount">
+            <el-input v-model="form.salesCompanyBankAccount"></el-input>
+          </el-form-item>
+          <el-form-item label="开户行" prop="salesCompanyBankBranchNo">
+            <el-input v-model="form.salesCompanyBankBranchNo"></el-input>
+          </el-form-item>
+          
+          <el-form-item label="地址" prop="receiverAddress">
+            <el-input v-model="form.receiverAddress"></el-input>
+          </el-form-item>
+          <!-- <el-form-item prop="files" label="发票附件">
+            <fileMain v-model="form.files"></fileMain>
+          </el-form-item> -->
+        </el-col>
+      </el-row>
+    
+      <div style="margin-top: 20px;">
+        <headerTitle :title="form.type == 2 ? '付款计划信息' : '收款计划信息'"></headerTitle>
+        <!-- <el-form ref="form" :model="tableForm"> -->
+          <ele-pro-table
+            ref="table"
+            :needPage="false"
+            :columns="columns"
+            :datasource="form.receiptPayments"
+            row-key="id"
+            class="time-form"
+          >
+            <template v-slot:toolbar>
+              <!-- <span>已开票金额:{{ totalInvoiceAmount }}</span> -->
+            </template>
+            
+            <template v-slot:invoiceAmount="scope">
+              <el-form-item
+                style="width: 100%;"
+                label-width="0"
+                :prop="'receiptPayments.' + scope.$index + '.invoiceAmount'"
+                :rules="[
+                  {
+                    required: true,
+                    message: '请输入开票金额',
+                    trigger: 'blur'
+                  },
+                  {
+                    validator: (rule, value, callback) => {
+                      if (value === undefined || value === null || value === '') {
+                        callback('请输入开票金额');
+                      } else if (parseFloat(value) <= 0 || parseFloat(value) > parseFloat(scope.row.unInvoiceAmount)) {
+                        callback('开票金额必须大于0且不超过未开票金额');  
+                      } else {
+                        callback();
+                      }
+                    },
+                    trigger: 'blur'
+                  }
+                ]"
+              > 
+                <span v-if="dialogType === 'view'">{{ scope.row.invoiceAmount }}</span>
+                <el-input :min="0" :max="scope.row.unInvoiceAmount" v-limit="{ min: 0, max: scope.row.unInvoiceAmount }" v-else v-model="scope.row.invoiceAmount" type="number" @input="updateInvoiceAmount(scope.row)"></el-input>
+              </el-form-item>
+            </template>
+          </ele-pro-table>
+        <!-- </el-form> -->
+      </div>
+    </el-form>
+    <div style="margin-top: 20px;">
+      <headerTitle title="关联物品清单信息"></headerTitle>
+      <table-info-new
+        :dialogType="dialogType"
+        :contactData="contactData"
+        ref="tableInfoRef"
+        :invoiceAmount="form.invoiceAmount"
+      ></table-info-new>
+    </div>
+    <div slot="footer">
+      <el-button type="primary" v-click-once @click="handleSave(0)">保存</el-button>
+      <el-button
+        type="primary"
+        v-if="isNeed_process_is_close"
+         v-click-once
+        @click="handleSave(1)"
+        >提交</el-button
+      >
+      <el-button  v-click-once @click="cancel">返回</el-button>
+    </div>
+    <process-submit-dialog
+      api-fun-name="fininvoiceapplyStatusAPI"
+      :processSubmitDialogFlag.sync="processSubmitDialogFlag"
+      v-if="processSubmitDialogFlag"
+      ref="processSubmitDialogRef"
+      @reload="reload"
+    ></process-submit-dialog>
+    <!--对账单-->
+    <!-- <account-statement-dialog
+      ref="accountStatementDialogRef"
+      :form="form"
+      v-if="accountStatementDialogFlag"
+      :accountstatement-dialog-flag.sync="accountStatementDialogFlag"
+      @getAccountData="getAccountData"
+      :contactData="contactData"
+      :type="form.type"
+    >
+    </account-statement-dialog> -->
+    <!--采购订单-->
+    <purchasinOrderListDialog
+      ref="orderListDialogRef"
+      @changeParent="changeOrder"
+    ></purchasinOrderListDialog>
+    <!--销售订单-->
+    <saleOrderListDialog
+      ref="saleOrderListDialogref"
+      @changeParent="changeOrder"
+    ></saleOrderListDialog>
+
+    <contractListDialog
+      ref="selectContractRef"
+      @changeParent="changeContract"
+      :type="form.type"
+    ></contractListDialog>
+    <!-- 应收 -->
+    <receivableDialog
+      ref="receivableRef"
+      @receivableDone="receivableDone"
+      v-if="receivableDialogFlag"
+      :receivableDialogFlag.sync="receivableDialogFlag"
+    ></receivableDialog>
+    <!-- 应付 -->
+    <paymentListDialog
+      ref="receivableRef1"
+      @receivableDone="receivableDone"
+      v-if="paymentListDialogFlag"
+      :paymentListDialogFlag.sync="paymentListDialogFlag"
+    ></paymentListDialog>
+
+    <!-- 收款计划列表 -->
+    <collectionPlanDialog
+      ref="collectionPlanDialogRef"
+      v-if="collectionPlanDialogFlag"
+      :collectionPlanDialogFlag.sync="collectionPlanDialogFlag"
+      @getPlanData="getPlanData"
+      :type="form.type"
+    ></collectionPlanDialog>
+
+  </ele-modal>
+</template>
+<script>
+  import personSelect from '@/components/CommomSelect/person-select.vue';
+  import { listOrganizations } from '@/api/system/organization';
+  import { mapGetters } from 'vuex';
+  import fileUpload from '@/components/upload/fileUpload.vue';
+  import tableInfoNew from './tableInfoNew.vue';
+  import { getTreeByPid } from '@/api/classifyManage';
+  import {
+    invoiceApplyInfoV2API,
+    invoiceApplyCreateAPI,
+    invoiceApplyUpdateV2API
+  } from '@/api/financialManage/invoiceManage';
+  import { getpurchaseorderDetail } from '@/api/purchasingManage/purchaseOrder';
+  import { getSaleOrderDetail } from '@/api/saleManage/saleorder';
+  import { getDetail } from '@/api/contractManage/contractBook';
+  import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+  import accountStatementDialog from './accountstatementDialog.vue';
+  import contractListDialog from '@/views/saleManage/saleOrder/components/contractListDialog.vue';
+  import purchasinOrderListDialog from '@/views/purchasingManage/purchaseOrder/invoice/components/orderListDialog.vue'; //采购订单
+  import saleOrderListDialog from '@/views/saleManage/saleOrder/invoice/components/orderListDialog.vue'; //销售订单
+  import { enterprisePage } from '@/api/contractManage/contractBook';
+  import { contactDetail } from '@/api/saleManage/contact';
+  // import fileMain from '@/components/addDoc/index.vue';
+  import receivableDialog from '@/views/financialManage/receivableManage/components/receivableDialog.vue'; //应收
+  import paymentListDialog from '@/views/financialManage/payableManage/components/paymentListDialog.vue'; //应付
+  import collectionPlanDialog from './collectionPlanDialog.vue'   // 收款计划列表
+
+  import { updateContractStatus } from '@/api/contractManage/contractBook';
+  import { getMergeInvoiceInfoAPI } from '@/api/financialManage/payAndCollectPlan';
+  import { paymentTypeOp } from '@/enum/dict';
+
+  const defForm = {
+    accountingSubjectCode: '',
+    accountingSubjectId: '',
+    accountingSubjectName: '',
+    amount: undefined,
+    contactId: '',
+    companyAddress: '',
+    companyBankAccount: '',
+    companyUsc: '',
+    expectInvoiceDate: '',
+    companyBankBranchNo: '',
+    companyName: '',
+    receiverAddress: '',
+    receiverName: '',
+    receiverTel: '',
+    receiverContactName: '',
+    companyTel: '',
+    companyContactName: '',
+    detailList: [],
+    drawerId: '',
+    drawerName: '',
+    files: [],
+    invoiceStatus: '',
+    link: [],
+    remark: '',
+    settlementAccountId: '',
+    settlementAccountName: '',
+    invoiceAmount: 0,
+    getAccountData: '',
+    sourceId: '',
+    sourceCode: '',
+    salesCompanyUsc: '',
+    salesCompanyBankBranchNo: '',
+    salesCompanyBankAccount: '',
+    category: 1,
+    receiptPayments: [],
+    productMap: {}
+  };
+  export default {
+    name: 'add-or-edit-dialog',
+    components: {
+      processSubmitDialog,
+      fileUpload,
+      personSelect,
+      tableInfoNew,
+      accountStatementDialog,
+      contractListDialog,
+      purchasinOrderListDialog,
+      saleOrderListDialog,
+      // fileMain,
+      receivableDialog,
+      paymentListDialog,
+      collectionPlanDialog
+    },
+    props: {
+      isEditType: {
+        type: Boolean,
+        default: true
+      },
+      addOrEditDialogFlag: {
+        type: Boolean,
+        default: false
+      },
+      contactData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      }
+    },
+    provide() {
+      return {
+        invoiceType: () => this.form.type
+      };
+    },
+    computed: {
+      ...mapGetters(['user']),
+      sourceTypeOp() {
+        return this.form.type == 1 ? [{
+          label: '收款计划',
+          value: 6
+        }, {
+          label: '应收管理',
+          value: 5
+        }] : [{
+          label: '付款计划',
+          value: 7
+        }, {
+          label: '应付管理',
+          value: 4
+        }]
+      },
+      columns() {
+        return [
+          {
+            width: 45,
+            type: 'index',
+            columnKey: 'index',
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            width: 150,
+            prop: 'sourceOrderDetailNo',
+            label: this.form.type == 1 ? '收款计划编码' : '付款计划编码',
+            align: 'center'
+          },
+          {
+            width: 150,
+            prop: 'relatedOrderNo',
+            label: '订单编号',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'relatedOrderType',
+            label: '订单类型',
+            align: 'center',
+            formatter: (row) => {
+              return row.relatedOrderType == 1 ? '销售订单' : '采购订单'
+            }
+          },
+          {
+            width: 120,
+            prop: 'contractNo',
+            label: '合同编码',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'contractCode',
+            label: '合同编号',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'contractName',
+            label: '合同名称',
+            align: 'center'
+          },
+          {
+            prop: 'issueNumber',
+            label: '期数',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'paymentType',
+            label: '款项类型',
+            align: 'center',
+            formatter: (row) => {
+              return this.paymentTypeOp.find(item => item.value == row.paymentType)?.label || ''
+            }
+          },
+          {
+            prop: 'moneyName',
+            label: '款项名称',
+            align: 'center',
+            width: 170
+          },
+          {
+            width: 150,
+            prop: 'paymentRatio',
+            label: '比例',
+            align: 'center'
+          },
+          {
+            width: 170,
+            prop: 'planPaymentAmount',
+            label: this.form.type == 1 ? '计划收款金额' : '计划付款金额',
+            align: 'center',
+          },
+          {
+            width: 150,
+            prop: 'unInvoiceAmount',
+            label: '未开票金额',
+            align: 'center'
+          },
+          {
+            width: 150,
+            prop: 'invoicedAmount',
+            label: '已开票金额',
+            align: 'center'
+          },
+          {
+            width: 160,
+            prop: 'invoiceAmount',
+            label: '开票金额',
+            align: 'center',
+            slot: 'invoiceAmount',
+            fixed: 'right'
+          }
+        ];
+      },
+    },
+    data() {
+      return {
+        businessId: '',
+        paymentTypeOp,
+        fullscreen: false,
+        receivableDialogFlag: false,
+        dialogType: '',
+        title: '',
+        isOtherSourceFlag: false,
+        processSubmitDialogFlag: false,
+        collectionPlanDialogFlag: false,
+        paymentListDialogFlag: false,
+        enterprisePage: [],
+        totalInvoiceAmount: 0,
+        form: {
+          applyDeptId: '',
+          applyDeptName: '',
+          applyUserId: '',
+          applyUserName: '',
+          type: '1',
+          id: '',
+          ...defForm
+        },
+        feeTypeList: [],
+        accountingSubjectList: [],
+        deptList: [],
+        deptTreeList: [],
+        rules: {
+          applyDeptId: { required: true, message: '请选择', trigger: 'change' },
+          applyUserId: { required: true, message: '请选择', trigger: 'change' },
+          accountingSubjectId: {
+            required: true,
+            message: '请选择',
+            trigger: 'change'
+          },
+          feeTypeId: { required: true, message: '请选择', trigger: 'change' },
+          // amount: { required: true, message: '请输入', trigger: 'blur' },
+          companyName: { required: true, message: '请输入', trigger: 'blur' },
+          type: { required: true, message: '请选择', trigger: 'change' },
+          sourceType: { required: true, message: '请选择', trigger: 'change' }
+        }
+      };
+    },
+    created() {
+      this.getClassifyList(24, 'accountingSubjectList');
+      this.getDeptList();
+    },
+    methods: {
+      //从发票管理新增发票初始化
+      async init(row = {}, type) {
+        this.businessId = row.id || '';
+        this.title = type == 'add' ? '新增' : '修改';
+        console.log('row', row, type);
+        this.dialogType = type;
+        if (type == 'add') {
+          this.form.applyDeptId = this.user.info.groupId;
+          this.form.applyDeptName = this.user.info.groupName;
+          this.form.applyUserId = this.user.info.userId;
+          this.form.applyUserName = this.user.info.name;
+          enterprisePage({
+            pageNum: 1,
+            size: 200
+          }).then((res) => {
+            this.enterprisePage = [];
+            this.enterprisePage.push(...res.list);
+            this.enterpriseChange(this.enterprisePage[0]?.name);
+          });
+        } else {
+          await this.getInfo(row.id);
+        }
+        this.$nextTick(async () => {
+          // await this.getUser List(this.form.applyDeptId);
+        });
+      },
+      updateInvoiceAmount(row) {
+        // row.invoiceAmount = Number(row.invoiceAmount).toFixed(2);
+        this.form.amount = this.form.receiptPayments.reduce((pre, cur) => {
+          return pre + Number(cur.invoiceAmount);
+        }, 0);
+        this.$refs.tableInfoRef.setSinglePrice(row, this.form.receiptPayments);
+      },
+      //来源类型
+      async handleSelectAccount(val) {
+        if (val == 6 || val == 7) {
+          this.collectionPlanDialogFlag = true;
+        }
+        if (val == 2) {
+          this.$refs.selectContractRef.open({}, 1, 1);
+        }
+        if (val == 3 && this.form.type == 2) {
+          this.$refs.orderListDialogRef.open({}, 1, true);
+        }
+        if (val == 3 && this.form.type == 1) {
+          this.$refs.saleOrderListDialogref.open({}, 1, true);
+        }
+        if (val == 5) {
+          this.receivableDialogFlag = true;
+        }
+        if (val == 4) {
+          this.paymentListDialogFlag = true;
+        }
+      },
+      //合同回调
+      async changeContract(data) {
+        const res = await getDetail(data.id);
+        this.$set(this.form, 'sourceId', data.id);
+        this.$set(this.form, 'sourceCode', data.contractNo);
+        this.$set(
+          this.form,
+          'amount',
+          res.contractVO?.discountTotalPrice - res.contractVO?.invoiceAmount
+        );
+        this.$set(this.form, 'invoiceAmount', res.contractVO?.invoiceAmount);
+        this.getContactDetail(
+          this.form.type == 2
+            ? res.contractVO?.partbId
+            : res.contractVO?.partaId,
+          res.contractVO
+        );
+
+        res.productList.forEach((item) => {
+          item.singlePrice =
+            (item.discountSinglePrice &&
+              Number(item.discountSinglePrice).toFixed(2)) ||
+            item.singlePrice;
+          item.totalPrice =
+            (item.discountTotalPrice &&
+              Number(item.discountTotalPrice).toFixed(2)) ||
+            item.totalPrice;
+          item.typeName = this.form.type == 1 ? '销售合同' : '采购合同';
+          item.type = this.form.type == 1 ? '101' : '102';
+        });
+        this.$nextTick(() => {
+          this.$refs.table.setValue(res.productList);
+        });
+        this.$forceUpdate();
+      },
+      async getContactDetail(id, data) {
+        let contactValue = {};
+        if (id) {
+          this.form.contactId = id;
+          contactValue = await contactDetail(id);
+        }
+        const { base, other, bankList, linkList } = contactValue;
+        if (this.form.type == 1) {
+          this.form.companyName = base.name;
+          this.form.companyUsc = base.unifiedSocialCreditCode;
+          this.form.companyAddress = other?.addressName + other?.address;
+          this.form.companyTel =
+            data.partbTel ||
+            linkList.find((item) => item.ifChief == 1)?.mobilePhone;
+
+          this.form.companyBankAccount = bankList[0]?.accountNo;
+          this.form.companyBankBranchNo = bankList[0]?.bankName;
+          this.enterpriseChange(data.partbName);
+        } else {
+          this.form.receiverName = base.name;
+          this.form.receiverAddress = base?.addressName + other?.address;
+          this.form.receiverTel =
+            data.partaTel ||
+            linkList.find((item) => item.ifChief == 1)?.mobilePhone;
+          this.form.salesCompanyUsc = base.unifiedSocialCreditCode;
+          this.form.salesCompanyBankAccount = bankList[0]?.accountNo;
+          this.form.salesCompanyBankBranchNo = bankList[0]?.bankName;
+          this.enterpriseChange(data.partaName);
+        }
+      },
+
+      setCompanyBankAccount(base) {
+        console.log('base~~~', base);
+        if (this.form.type == 1) {
+          console.log('base~~~111', base.companyName);
+          this.form.companyName = base.companyName;
+          this.form.companyUsc = base.companyUsc;
+          this.form.companyAddress = base.companyAddress;
+          this.form.companyTel = base.companyTel;
+          this.form.companyContactName = base.companyContactName;
+
+          this.form.companyBankAccount = base.companyBankAccount;
+          this.form.companyBankBranchNo = base.companyBankBranchNo;
+          // this.enterpriseChange(base.companyName);
+        } else {
+          this.form.receiverName = base.receiverName;
+          this.form.receiverAddress = base.receiverAddress;
+          this.form.receiverTel = base.receiverTel;
+          this.form.receiverContactName = base.receiverContactName;
+          this.form.salesCompanyUsc = base.salesCompanyUsc;
+          this.form.salesCompanyBankAccount = base.salesCompanyBankAccount;
+          this.form.salesCompanyBankBranchNo = base.salesCompanyBankBranchNo;
+          // this.enterpriseChange(base.receiverName);
+        }
+      },
+      //订单回调
+      async changeOrder(data) {
+        this.$set(this.form, 'sourceId', data.id);
+        this.$set(this.form, 'sourceCode', data.orderNo);
+        let res = {};
+        if (this.form.type == 2) {
+          res = await getpurchaseorderDetail(data.id);
+        } else {
+          res = await getSaleOrderDetail(data.id);
+        }
+        this.$set(this.form, 'amount', res.payAmount - res.invoiceAmount);
+        this.$set(this.form, 'invoiceAmount', res.invoiceAmount);
+        this.getContactDetail(
+          this.form.type == 2 ? res.partbId : res.partaId,
+          res
+        );
+        res.productList.forEach((item) => {
+          item.singlePrice =
+            (item.discountSinglePrice &&
+              Number(item.discountSinglePrice).toFixed(2)) ||
+            item.singlePrice;
+          item.totalPrice =
+            (item.discountTotalPrice &&
+              Number(item.discountTotalPrice).toFixed(2)) ||
+            item.totalPrice;
+          item.typeName = this.form.type == 1 ? '销售订单' : '采购订单';
+          item.type = this.form.type == 1 ? '201' : '202';
+        });
+        this.$nextTick(() => {
+          this.$refs.table.setValue(res.productList);
+        });
+        this.$forceUpdate();
+
+        console.log(res);
+      },
+
+      //应收应付回调
+      async payableManage(data) {
+        const { row, form } = data;
+        console.log(data);
+        this.$set(this.form, 'sourceId', row.id);
+        this.$set(this.form, 'sourceCode', row.code);
+        // this.$set(
+        //   this.form,
+        //   'amount',
+        //   row.receivedTotalPrice || row.paidTotalPrice
+        // );
+        // this.$set(this.form, 'invoiceAmount', row.invoiceAmount);
+        // this.getContactDetail(form.contactId, {});
+      },
+      receivableDone(data) {
+        // this.$set(this.form, 'type', Number(data.type));
+        // this.$set(this.form, 'sourceType', data.sourceType);
+        // this.payableManage(data.data);
+        this.getPlanData(data)
+      },
+      // 收/付款计划回调
+      async getPlanData(data) {
+        let tempIds = [];
+        let tempNames = [];
+        if(this.form.sourceType == 4 || this.form.sourceType == 5) {
+          tempIds = data.map((item) => item.receiptPlanOrderId);
+          tempNames = data.map((item) => item.code);
+        } else {
+          tempIds = data.map((item) => item.id);
+          tempNames = data.map((item) => item.detailNo);
+        }
+
+        this.form.sourceCode = tempNames.join(',');
+        
+        const res = await getMergeInvoiceInfoAPI(tempIds)
+        res.receiptPayments = res.receiptPayments.map((item) => {
+          item.invoiceAmount = item.unInvoiceAmount;
+          return item
+        })
+        
+        this.form.receiptPayments = res.receiptPayments;
+        this.form.productMap = res.productMap;
+        const amount = this.form.receiptPayments.reduce((prev, cur) => prev + 
+        +cur.invoiceAmount, 0) || 0;
+        this.form.amount = amount;
+        console.log('form~~~', this.form);
+        this.setCompanyBankAccount(res)
+        // this.form.detailList = res.detailList;
+        this.$nextTick(() => {
+          this.$refs.tableInfoRef.setValue(this.form);
+        })
+        console.log('getPlanData~~~', res);
+        // console.log('detailList~~~', res.detailList);
+      },
+      //对账单回调
+      async getAccountData(tableInfo) {
+        let res = {};
+        if (this.form.type == 2) {
+          res = await getpurchaseorderDetail(tableInfo?.children?.orderId);
+        } else {
+          res = await getSaleOrderDetail(tableInfo?.children?.orderId);
+        }
+        this.getContactDetail(tableInfo.contactId, res);
+        this.$nextTick(() => {
+          this.$set(this.form, 'sourceId', tableInfo?.children?.id);
+          this.$set(this.form, 'sourceCode', tableInfo?.statementNo);
+          this.$set(
+            this.form,
+            'invoiceAmount',
+            tableInfo?.children?.invoiceAmount
+          );
+
+          this.$refs.table.getAccountData(tableInfo);
+        });
+      },
+      //订单、合同列表
+      async createInvoice1(data, type, sourceType) {
+        console.log('createInvoice1~~~', data);
+        // const tempIds = data.map((item) => item.id).join(',');
+        this.$set(this.form, 'type', type);
+        this.$set(this.form, 'sourceType', sourceType);
+        // this.$set(this.form, 'sourceCode', tempIds);
+
+        await this.init({}, 'add');
+
+        this.getPlanData(data);
+        // if (sourceType == 2) {
+        //   this.changeContract(data);
+        // }
+        // if (sourceType == 3) {
+        //   this.changeOrder(data);
+        // }
+        // if (sourceType == 4 || sourceType == 5) {
+        //   this.payableManage(data);
+        // }
+      },
+
+      //对账单列表
+      createInvoice(
+        row = {},
+        invoiceType,
+        tableInfo = {},
+        isOtherSourceFlag = true,
+        dialogType = 'add'
+      ) {
+        this.dialogType = dialogType;
+        this.init(row, dialogType);
+        this.form.type = tableInfo.type;
+        this.$set(this.form, 'sourceType', invoiceType);
+        // this.form.sourceType=invoiceType
+        setTimeout(() => {
+          this.getAccountData(tableInfo);
+        }, 400);
+      },
+      //获取详情
+      async getInfo(id) {
+        this.form = await invoiceApplyInfoV2API(id);
+        this.$nextTick(() => {
+          this.$refs.tableInfoRef.putValue(this.form);
+        })
+      },
+
+      //获取分类管理中的数据
+      async getClassifyList(id, listName) {
+        let res = await getTreeByPid(id);
+        this[listName] = res.data;
+      },
+      //获取费用类别选中数据
+      changeFeeTypeInfo(val) {
+        if (!val) {
+          this.form.feeTypeName = '';
+          this.form.feeTypeCode = '';
+        }
+        let data = this.$refs.feeTypeTree?.$refs?.tree?.getCurrentNode() || {};
+        this.form.feeTypeName = data.name;
+        this.form.feeTypeCode = data.code;
+      },
+      //获取会计科目选中数据
+      changeSubjectInfo(val) {
+        if (!val) return (this.form.accountingSubjectName = '');
+        let data = this.$refs.treeSelect?.$refs?.tree?.getCurrentNode() || {};
+        this.form.accountingSubjectName = data.name;
+      },
+      // 获取部门数据
+      getDeptList() {
+        listOrganizations().then((list) => {
+          this.deptList = list;
+          this.deptTreeList = this.$util.toTreeData({
+            data: list,
+            idField: 'id',
+            parentIdField: 'parentId'
+          });
+        });
+      },
+      // 选择负责人部门
+      changeDeptInfo(id) {
+        const info = this.deptList.find((e) => e.id == id) || {};
+        this.form.applyDeptName = info.name;
+        this.form.applyUserId = '';
+        this.form.applyUserName = '';
+        this.getUserList(id);
+      },
+      // 获取人员数据
+      getUserList(deptId) {
+        if (deptId) {
+          this.$refs.directorRef.getList({ deptId });
+        }
+      },
+      //选择人员数据
+      changeUserInfo(val, info) {
+        this.form.applyUserName = info.name;
+      },
+
+      //
+      handleSelType(val) {
+        this.form = Object.assign({}, this.form, defForm);
+        if (val == 'isType') {
+          this.$set(this.form, 'sourceType', '');
+        }
+        this.form.receiptPayments = [];
+        this.$refs.tableInfoRef.clearTable();
+        this.enterpriseChange(this.enterprisePage[0]?.name);
+      },
+      setPrice(val) {
+        this.form.amount = val;
+      },
+      //系统公司信息
+      enterpriseChange(name) {
+        let data = this.enterprisePage.find((item) => item.name == name);
+
+        if (this.form.type == 2) {
+          this.form.companyName = data?.name;
+          this.form.companyUsc = data?.unifiedSocialCreditCode;
+          this.form.companyAddress = data?.address;
+          this.form.companyTel = data?.tel;
+          this.form.companyContactName = data?.contact;
+        } else {
+          this.form.receiverName = data?.name;
+          this.form.receiverAddress = data?.address;
+          this.form.salesCompanyUsc = data?.unifiedSocialCreditCode;
+          this.form.receiverTel = data?.tel;
+          this.form.receiverContactName = data?.contact;
+        }
+        this.$forceUpdate();
+      },
+
+      getValidate() {
+        console.log(this.form);
+        let arr = [
+          new Promise((resolve, reject) => {
+            this.$refs.form.validate((valid) => {
+              if (!valid) {
+                reject(false);
+              } else {
+                resolve(true);
+              }
+            });
+          })
+        ];
+       
+        // this.$refs.tableInfoRef.tableForm.detailList.forEach((item, index) => {
+        //   arr.push(
+        //     new Promise((resolve, reject) => {
+        //       this.$refs.tableInfoRef.$ref['form'+index].validateForm((valid) => {
+        //         if (!valid) {
+        //           reject(false);
+        //         } else {
+        //           resolve(true);
+        //         }
+        //       });
+        //     })
+        //   );
+        // })
+        return Promise.all(arr);
+      },
+
+      async handleSave(flag) {
+        // this.$refs.form.validate(async (valid) => {
+        try {
+          const valid = await this.getValidate();
+          console.log('valid~~~',valid);
+          // if (!valid) return this.$message.warning('有必填项未填,请检查');
+          
+          // if (this.form.sourceType != 4 || this.form.sourceType != 5) {
+          //   tableData = await this.$refs.table.getTableValidate();
+          // }
+          // // 校验表格数据
+          // const tableValid = await new Promise((resolve) => {
+          //   this.$refs.table.validateForm((valid) => {
+          //     resolve(valid);
+          //   });
+          // });
+          const tableValid = await this.$refs.tableInfoRef.getTableValidate();
+          console.log('tableValid~~~',tableValid);
+          // if (!tableValid) {
+          //   return;
+          // }
+
+          let tableData = this.$refs.tableInfoRef.getTableData();
+          // this.form.link = tableData.link;
+          this.form.productMap = tableData;
+          console.log('commitData~~~',this.form);
+          const API =
+            this.dialogType == 'add'
+              ? invoiceApplyCreateAPI
+              : invoiceApplyUpdateV2API;
+          const id = await API(this.form);
+          if (this.form.sourceType == 2) {
+            updateContractStatus([this.form.sourceId]);
+          }
+          if (flag) {
+            await this.handleSub(id);
+            return;
+          }
+          this.$message.success('操作成功');
+          this.done();
+          this.cancel();
+        // });
+        } catch (error) {
+          // this.$message.warning('有必填项未填,请检查');
+        }
+      },
+      //
+      handleSave1(flag) {
+        this.$refs.form.validate(async (valid) => {
+          if (!valid) return this.$message.warning('有必填项未填,请检查');
+          let tableData = {};
+          if (this.form.sourceType != 4 || this.form.sourceType != 5) {
+            tableData = await this.$refs.table.getTableValidate();
+          }
+          // 校验表格数据
+          const tableValid = await new Promise((resolve) => {
+            this.$refs.table.validateForm((valid) => {
+              resolve(valid);
+            });
+          });
+          if (!tableValid) {
+            return;
+          }
+          this.form.link = tableData.link;
+          this.form.detailList = tableData.detailList;
+          const API =
+            this.dialogType == 'add'
+              ? invoiceApplySaveAPI
+              : invoiceApplyUpdateV2API;
+          const id = await API(this.form);
+          if (this.form.sourceType == 2) {
+            updateContractStatus([this.form.sourceId]);
+          }
+          if (flag) {
+            await this.handleSub(id);
+            return;
+          }
+          this.$message.success('操作成功');
+          this.done();
+          this.cancel();
+        });
+      },
+      //提交-开启流程
+      async handleSub(id = '') {
+        let data = await invoiceApplyInfoV2API(this.businessId || id);
+        this.processSubmitDialogFlag = true;
+        let key =
+          data.type == 1 ? 'fin_invoice_apply' : 'fin_invoice_receive_apply';
+        this.$nextTick(() => {
+          let params = {
+            businessId: data.id,
+            businessKey: key,
+            formCreateUserId: data.createUserId,
+            variables: {
+              type: data.type,
+              businessCode: data.code,
+
+              businessName: data.companyName,
+              businessType: data.type == 1 ? '开票' : '收票'
+            }
+            // callBackMethodType : '1',
+            // callBackMethod : 'proTargetPlanApproveApiImpl.updatePlanApprovalStatus',
+            // pcHandle : '/bpm/handleTask/components/project-manage/plan-manage/submit.vue',
+            // pcView : '/bpm/handleTask/components/project-manage/plan-manage/detailDialog.vue',
+            // miniHandle : '',
+            // miniView : '',
+          };
+          this.$refs.processSubmitDialogRef.init(params);
+        });
+        // try {
+        //   await invoiceApplySubmit({
+        //     businessId: id || this.form.id,
+        //     type: this.form.type
+        //   });
+        // } catch (e) {
+        //   this.$message.error(e.message);
+        // }
+      },
+      reload() {
+        this.done();
+        this.cancel();
+      },
+      //刷新主列表数据
+      done() {
+        this.$emit('reload');
+      },
+      //关闭弹窗
+      cancel() {
+        this.$emit('update:addOrEditDialogFlag', false);
+      }
+    }
+  };
+</script>
+<style scoped lang="scss"></style>

+ 688 - 0
src/views/financialManage/invoiceManage/components/tableInfoNew copy 2.vue

@@ -0,0 +1,688 @@
+<template>
+  <div>
+    <el-tabs type="border-card">
+      <el-tab-pane :label="item.key" v-for="(item, idx) in tableForm.detailList" :key="idx">
+        <el-form :ref="'form' + idx" :model="tableForm">
+          <ele-pro-table
+            ref="table"
+            :needPage="false"
+            :columns="columns"
+            :datasource="item.details"
+            row-key="id"
+            class="time-form"
+          >
+            <template v-slot:toolbar>
+              <span>本次开票合计:{{ item.amountTotalPrice }}</span>
+            </template>
+            
+            <template v-slot:invoiceAmount="scope">
+            <el-form-item
+              style="width: 100%;"
+              :prop="'detailList.' + idx + '.details.' + scope.$index + '.invoiceAmount'"
+              :rules="[
+                {
+                  required: true,
+                  message: '请输入开票金额',
+                  trigger: 'blur'
+                },
+                {
+                  validator: (rule, value, callback) => {
+                    if (value === undefined || value === null || value === '') {
+                      callback('请输入开票金额');
+                    } else if (parseFloat(value) < 0 || parseFloat(value) > item.amountTotalPrice) {
+                      callback('开票金额不能小于0且小于等于本次开票合计');  
+                    } else {
+                      callback();
+                    }
+                  },
+                  trigger: 'blur'
+                }
+              ]"
+            > 
+              <span v-if="dialogType === 'view'">{{ scope.row.invoiceAmount }}</span>
+              <el-input v-else v-model="scope.row.invoiceAmount" type="number" @input="(val) => invoiceAmountChange(val, scope.row, idx, scope.$index)"></el-input>
+            </el-form-item>
+          </template>
+
+          <template v-slot:taxRate="scope">
+            <el-form-item
+              style="width: 100%;"
+              :prop="'detailList.' + idx + '.details.' + scope.$index + '.taxRate'"
+              :rules="[
+                {
+                  required: true,
+                  message: '请输入税率',
+                  trigger: 'blur'
+                },
+                {
+                  validator: (rule, value, callback) => {
+                    if (value === undefined || value === null || value === '') {
+                      callback('请输入税率');
+                    } else if (parseFloat(value) < 0) {
+                      callback('税率不能小于0');
+                    } else {
+                      callback();
+                    }
+                  },
+                  trigger: 'blur'
+                }
+              ]"
+            > 
+              <span v-if="dialogType === 'view'">{{ scope.row.taxRate }}</span>
+              <el-input v-else v-model="scope.row.taxRate" type="number" @input="getNotaxSinglePrice(scope.row, idx, scope.$index)" style="width: 80%;"></el-input>%
+            </el-form-item>
+          </template>
+
+          </ele-pro-table>
+        </el-form>
+      </el-tab-pane>
+    </el-tabs>
+    
+  </div>
+</template>
+<script>
+  export default {
+    name: 'tableInfo',
+    components: {},
+    props: {
+      form: {
+        type: Object,
+        default: () => {
+          return {
+            productMap: [],
+            receiptPayments: []
+          };
+        }
+      },
+      dialogType: {
+        type: String,
+        default: ''
+      },
+      isOtherSourceFlag: {
+        type: Boolean,
+        default: false
+      },
+      contactData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      invoiceAmount: {
+        type: Number,
+        default: 0
+      }
+    },
+    data() {
+      return {
+        columns: [
+          {
+            width: 45,
+            type: 'index',
+            columnKey: 'index',
+            align: 'center',
+            fixed: 'left'
+          },
+
+          {
+            width: 100,
+            prop: 'typeName',
+            label: '类型',
+            slot: 'typeName',
+            align: 'center'
+          },
+          // {
+          //   minWidth: 100,
+          //   prop: 'sourceCode',
+          //   label: '类型编码',
+          //   slot: 'sourceCode',
+          //   align: 'center'
+          // },
+          // {
+          //   width: 100,
+          //   prop: 'productCategoryName',
+          //   label: '分类',
+          //   slot: 'productCategoryName',
+          //   align: "center"
+          // },
+          // {
+          //   width: 100,
+          //   prop: 'productCode',
+          //   label: '编码',
+          //   slot: 'productCode',
+          //   align: "center"
+          // },
+          {
+            minWidth: 100,
+            prop: 'productName',
+            label: '产品名称',
+            slot: 'productName',
+            align: 'center'
+          },
+          {
+            minWidth: 100,
+            prop: 'modelType',
+            label: '型号',
+            slot: 'modelType',
+            align: 'center'
+          },
+
+          {
+            minWidth: 100,
+            prop: 'specification',
+            label: '规格',
+            slot: 'specification',
+            align: 'center'
+          },
+          // {
+          //   width: 100,
+          //   prop: 'unInvoiceAmount',
+          //   label: '未开票金额',
+          //   slot: 'unInvoiceAmount',
+          //   align: "center"
+          // },
+          
+          // {
+          //   width: 80,
+          //   prop: 'singleWeight',
+          //   label: '单量',
+          //   align: 'center'
+          // },
+
+          {
+            minWidth: 150,
+            prop: 'invoiceAmount',
+            label: '开票金额',
+            slot: 'invoiceAmount',
+            align: 'center'
+          },
+          {
+            minWidth: 150,
+            prop: 'invoicedAmount',
+            label: '已开票金额',
+            align: 'center'
+          },
+          {
+            minWidth: 150,
+            prop: 'taxRate',
+            label: '税率',
+            align: 'center',
+            slot: 'taxRate',
+            // formatter: (_row, _column, cellValue) => {
+            //   return _row.taxRate
+            //     ? _row.taxRate+'%'
+            //     : '';
+            // },
+          },
+          {
+            minWidth: 100,
+            prop: 'noTaxSinglePrice',
+            label: '不含税单价',
+            slot: 'noTaxSinglePrice',
+            align: 'center'
+          },
+          {
+            width: 100,
+            prop: 'totalCount',
+            label: '订单数量',
+            // slot: 'totalCount',
+            align: 'center',
+          },
+          {
+            width: 150,
+            prop: 'quoteWay',
+            label: '报价方式',
+            formatter: (row, column) => {
+              return row.quoteWay == 1
+                ? '常规价'
+                : row.quoteWay == 2
+                ? '内部价'
+                : row.quoteWay == 3 ? '议价' : '';
+            },
+            align: 'center'
+
+          },
+          {
+            minWidth: 80,
+            prop: 'singlePrice',
+            label: '单价',
+            slot: 'singlePrice',
+            align: 'center'
+          },
+          {
+            width: 100,
+            prop: 'totalPrice',
+            label: '合计',
+            align: 'center'
+          },
+          {
+            width: 100,
+            prop: 'discountRatio',
+            label: '折让比例',
+            align: 'center'
+          },
+          {
+            width: 100,
+            prop: 'discountSinglePrice',
+            label: '折让单价',
+            align: 'center'
+          },
+          {
+            width: 100,
+            prop: 'discountAmount',
+            label: '折让合计',
+            align: 'center'
+          },
+          // {
+          //   width: 100,
+          //   prop: 'sourceType',
+          //   label: '来源类型',
+          //   slot: 'sourceType',
+          //   align: "center",
+          //   formatter: (row, column) => {
+          //     return row.sourceType == 2 ? '对账销售订单' : '对账采购订单';
+          //   }
+          // },
+        ],
+        tableForm: {
+          detailList: [
+            {
+              key: '',
+              amountTotalPrice: 0,
+              details: [{
+                invoicedAmount: '',
+                invoiceAmount: '',
+                taxRate: '',
+                noTaxSinglePrice: '',
+                totalCount: '',
+                quoteWay: '',
+                singlePrice: '',
+                totalPrice: '',
+                discountRatio: 100,
+                discountSinglePrice: '',
+                discountAmount: '',
+              }]
+            }
+          ],
+          productMap: [],
+          link: []
+        },
+        typeList: [
+          {
+            label: '销售发货',
+            value: '10'
+          },
+          {
+            label: '销售退货',
+            value: '11'
+          },
+          {
+            label: '采购收货',
+            value: '20'
+          },
+          {
+            label: '采购退货',
+            value: '21'
+          }
+        ],
+      };
+    },
+    mounted() {
+      // this.tableForm = this.form;
+    },
+    watch: {
+    form: {
+      handler(val) {
+        console.log('tableInfoNew form', val);
+        const data = JSON.parse(JSON.stringify(val));
+        data.detailList = data.productMap ? this.convertToArrayFormat(data) : [
+          {
+            key: '',
+            amountTotalPrice: 0,
+            details: []
+          }
+        ];
+        console.log('tableInfoNew detailList', data.detailList);
+        this.tableForm = data;
+      },
+      deep: true
+    }
+  },
+    methods: {
+      convertToArrayFormat(data) {
+          return Object.keys(data.productMap).map(key => {
+            console.log('key!!!', key);
+              const paymentItem = data.receiptPayments?.filter(item => item?.relatedOrderNo == key)|| [];
+              console.log('paymentItem', paymentItem);
+              return {
+                  key: key,
+                  amountTotalPrice: paymentItem.length ? paymentItem.reduce((acc, cur) => acc + cur.invoiceAmount, 0) : 0,
+                  defaultAmountTotalPrice: paymentItem.length ? paymentItem.reduce((acc, cur) => acc + cur.invoiceAmount, 0) : 0,
+                  details: data.productMap[key] || []
+              };
+          });
+      },
+      // 校验发票金额
+      invoiceAmountChange(val, item, idx, index) {
+        console.log('invoiceAmountChange', val, item, idx, index);
+        console.log('this.tableForm.detailList', this.tableForm.detailList)
+        if(index !=null) {
+          let newData = this.tableForm.detailList[idx].details;
+          console.log('newData', newData);
+          let sum =0;
+          newData.forEach((r) => {
+            if (r.invoiceAmount) {
+              sum += Number(r.invoiceAmount);
+            }
+          });
+          if(val && +val > +this.tableForm.detailList[idx].details[index].unInvoiceAmount) {
+            this.$message.error('物品开票金额不能大于未开票金额');
+            this.$set(this.tableForm.detailList[idx].details[index], 'invoiceAmount', '');
+            return;
+          }
+          if(sum > this.tableForm.detailList[idx].defaultAmountTotalPrice) {
+            this.$message.error('物品开票金额不能大于本次开票合计');
+            this.$set(this.tableForm.detailList[idx].details[index], 'invoiceAmount', '');
+            return;
+          }
+          this.$set(this.tableForm.detailList[idx].details[index], 'invoiceAmount', val);
+          this.$set(this.tableForm.detailList[idx], 'amountTotalPrice', sum);
+          console.log('sum', sum, this.tableForm.detailList[idx].details[index].invoiceAmount);
+        }
+      },
+      //计算不含税单价
+      getNotaxSinglePrice(item, idx, index) {
+        if (item.singlePrice && item.taxRate) {
+          this.$set(
+            this.tableForm.detailList[idx].details[index],
+            'noTaxSinglePrice',
+            parseFloat(
+              (item.singlePrice / (1 + item.taxRate / 100)).toFixed(2)
+            )
+          );
+        } else {
+          this.$set(this.tableForm.detailList[idx].details[index], 'noTaxSinglePrice', '');
+        }
+      },
+      //获取选择的对账单数据
+      async getAccountData(params) {
+        if (params.children.orderType == 6) {
+          this.tableForm.productMap = params.children.productMap;
+          this.tableForm.productMap.forEach((item, index) => {
+            item.sourceCode = params.children.orderNo;
+            item.sourceId = params.children.id;
+            item.sourceType = params.type == 1 ? 2 : 3;
+            item.type = 12;
+            item.singlePrice = item.discountSinglePrice;
+            item.totalPrice = item.discountTotalPrice;
+            item.typeName = '销售赔付';
+          });
+        } else {
+          this.tableForm.productMap = [];
+          params.children.subList.forEach((item, index) => {
+            item.productMap.forEach((i, n) => {
+              i.sourceCode = item.statementSubOrderCode;
+              i.sourceId = params.children.id;
+              i.sourceType = params.type == 1 ? 2 : 3;
+              i.type = item.subType;
+              console.log(item.subType);
+              i.typeName = this.typeList.find(
+                (i) => i.value == item.subType
+              ).label;
+              // i.singlePrice = item.discountSinglePrice
+              i.totalPrice = i.discountTotalPrice;
+            });
+            this.tableForm.productMap.push(...item.productMap);
+          });
+          this.$refs.table.reload();
+        }
+        this.$emit(
+          'setPrice',
+          params.children.amountTotalPrice - this.invoiceAmount
+        );
+        let row = {
+          id: params.id,
+          name: params.statementNo,
+          code: params.statementNo,
+          linkType: params.type == 1 ? 190 : 290,
+          linkTypeName: params.type == 1 ? '销售对账单' : '采购对账单'
+        };
+        this.setSelectData(row);
+      },
+      putValue(data) {
+        let tempData = JSON.parse(JSON.stringify(data));
+        console.log('tableInfoNew putValue', tempData);
+        tempData.detailList = this.convertToArrayFormat(tempData);
+        console.log('data.detailList', data.detailList);
+        this.tableForm = tempData;
+        console.log('tableInfoNew putValue~~~', this.tableForm);
+      },
+      setValue(data) {
+        let tempData = JSON.parse(JSON.stringify(data));
+        tempData.detailList = this.convertToArrayFormat(tempData);
+        this.allocateInvoiceAmount(tempData.detailList);
+        // for(let item of tempData.detailList) {
+        //   const total = item.amountTotalPrice;
+        //   const details = item.details;
+        //   const count = details.length;
+          
+        //   if (count === 0) continue;
+          
+        //   // 计算基础金额(向下取整)
+        //   const baseAmount = Math.floor(total / count);
+        //   // 计算余数
+        //   const remainder = total - (baseAmount * count);
+          
+        //   // 为所有项设置基础金额
+        //   details.forEach((detail) => {
+        //     detail.invoiceAmount = baseAmount;
+        //   });
+          
+        //   // 将余数加到最后一项
+        //   if (remainder > 0 && details.length > 0) {
+        //     details[details.length - 1].invoiceAmount += remainder;
+        //   }
+        // }
+        // this.$set(this, 'tableForm', data);
+        this.tableForm = tempData;
+        // console.log('tableInfoNew detailList~~~', tempData.detailList);
+        // this.$refs.table.reload();
+      },
+      /**
+       * 分配开票金额到明细项(根据未开票金额unInvoiceAmount限制)
+       * @param {Array|Object} data - 明细列表或单个明细对象
+       * @returns {Array|Object} 处理后的数据
+       */
+      allocateInvoiceAmount(data) {
+        if (Array.isArray(data)) {
+          data.forEach(item => {
+            if (item && typeof item === 'object') {
+              this.allocateSingleInvoiceAmount(item);
+            }
+          });
+          return data;
+        } else if (data && typeof data === 'object') {
+          this.allocateSingleInvoiceAmount(data);
+          return data;
+        }
+        return data;
+      },
+      allocateSingleInvoiceAmount(item) {
+        let remainingTotal = this.toPrecision(item.amountTotalPrice);
+        const details = item.details || [];
+        
+        details.forEach((detail) => {
+          if (remainingTotal <= 0) {
+            detail.invoiceAmount = 0;
+          } else {
+            const unInvoiceAmount = this.toPrecision(detail.unInvoiceAmount);
+            
+            if (remainingTotal > unInvoiceAmount) {
+              detail.invoiceAmount = this.fromPrecision(unInvoiceAmount);
+              remainingTotal = this.subPrecision(remainingTotal, unInvoiceAmount);
+            } else {
+              detail.invoiceAmount = this.fromPrecision(remainingTotal);
+              remainingTotal = 0;
+            }
+          }
+        });
+      },
+      toPrecision(value) {
+        const num = parseFloat(value) || 0;
+        return Math.round(num * 100);
+      },
+      fromPrecision(value) {
+        const num = parseFloat(value) || 0;
+        return (num / 100).toFixed(2);
+      },
+      subPrecision(a, b) {
+        return a - b;
+      },
+
+      setSinglePrice(row, data) {
+        let index = this.tableForm.detailList.findIndex(item => item.key == row.relatedOrderNo);
+        // let detail = this.tableForm.detailList[index];
+        // console.log('tableInfoNew setPrice', row, data, index);
+        const paymentItem = data.filter(item => item?.relatedOrderNo == row.relatedOrderNo);
+        console.log('tableInfoNew~~~', this.tableForm.detailList[index]);
+        this.tableForm.detailList[index].amountTotalPrice = paymentItem.length ? paymentItem.reduce((acc, cur) => acc + +cur.invoiceAmount, 0) : 0;
+        this.tableForm.detailList[index].defaultAmountTotalPrice = paymentItem.length ? paymentItem.reduce((acc, cur) => acc + +cur.invoiceAmount, 0) : 0;
+        // console.log('tableInfoNew tableForm', this.tableForm.detailList);
+        // 直接修改对象,不需要赋值
+        this.allocateInvoiceAmount(this.tableForm.detailList[index]);
+
+        this.tableForm = {...this.tableForm};
+        this.$forceUpdate();
+      },
+      clearTable() {
+        this.tableForm = {
+          detailList: [],
+          productMap: [],
+          receiptPayments: [],
+          link: []
+        };
+      },
+      // 当数量变化时更新金额
+      updateTotalPrice(row) {
+        if (row.totalCount && row.singlePrice) {
+          row.totalPrice = (parseFloat(row.totalCount) * parseFloat(row.singlePrice)).toFixed(2);
+        }
+      },
+      getTableValidate() {
+        return new Promise(async (resolve, reject) => {
+          // 2. 验证每个表格表单
+          const validationPromises = [];
+          this.tableForm.detailList.forEach((item, index) => {
+            validationPromises.push(
+              new Promise((formResolve, formReject) => {
+                // 正确获取表单实例
+                const formInstance = this.$refs['form' + index];
+                
+                if (formInstance) {
+                  // 确保formInstance有validate方法
+                  if (typeof formInstance.validate === 'function') {
+                    formInstance.validate((valid, errors) => {
+                      if (!valid && errors) {
+                        // 显示第一个错误信息
+                        const firstError = Object.values(errors)[0][0];
+                        if (firstError) {
+                          this.$message.warning(firstError.message);
+                        }
+                        formReject(false);
+                      } else {
+                        formResolve(true);
+                      }
+                    });
+                  } else {
+                    // 如果没有validate方法,检查是否是数组(多个表单实例)
+                    if (Array.isArray(formInstance) && formInstance.length > 0) {
+                      const firstForm = formInstance[0];
+                      if (typeof firstForm.validate === 'function') {
+                        firstForm.validate((valid, errors) => {
+                          if (!valid && errors) {
+                            const firstError = Object.values(errors)[0][0];
+                            if (firstError) {
+                              this.$message.warning(firstError.message);
+                            }
+                            formReject(false);
+                          } else {
+                            formResolve(true);
+                          }
+                        });
+                      } else {
+                        formResolve(true); // 没有validate方法时默认通过
+                      }
+                    } else {
+                      formResolve(true); // 不是预期的表单实例时默认通过
+                    }
+                  }
+                } else {
+                  formResolve(true); // 表单不存在时默认通过
+                }
+              })
+            );
+          });
+
+          console.log('validationPromises~~~',validationPromises);
+          
+          // 3. 处理验证结果
+          try {
+            await Promise.all(validationPromises);
+            
+            // 4. 校验 amountTotalPrice 和 defaultAmountTotalPrice 是否相等
+            for (let i = 0; i < this.tableForm.detailList.length; i++) {
+              const item = this.tableForm.detailList[i];
+              const amountTotalPrice = parseFloat(item.amountTotalPrice) || 0;
+              const defaultAmountTotalPrice = parseFloat(item.defaultAmountTotalPrice) || 0;
+              
+              if (amountTotalPrice !== defaultAmountTotalPrice) {
+                this.$message.warning(`第${i + 1}条本次开票合计(${amountTotalPrice})必须等于本次开票金额合计(${defaultAmountTotalPrice})`);
+                reject(false);
+                return;
+              }
+            }
+            
+            resolve(this.tableForm);
+            console.log('this.tableForm~~~',this.tableForm);
+          } catch (error) {
+            reject(false);
+          }
+        });
+      },
+      validateForm(callback) {
+        //开始表单校验
+        this.$refs.form.validate((valid, obj) => {
+          if (obj) {
+            let messages = Object.keys(obj).map((key) => obj[key][0]);
+            if (messages.length > 0) {
+              this.$message.warning(messages[0].message);
+            }
+          }
+          callback(valid);
+        });
+      },
+      setSelectData(val) {
+        this.tableForm.link = [{}];
+        this.$set(this.tableForm.link[0], 'linkId', val.id);
+        this.$set(this.tableForm.link[0], 'linkName', val.name);
+        this.$set(this.tableForm.link[0], 'linkCode', val.code);
+        this.$set(this.tableForm.link[0], 'linkType', val.linkType);
+        this.$set(this.tableForm.link[0], 'linkTypeName', val.linkTypeName);
+      },
+      getTableData() {
+        const  data = JSON.parse(JSON.stringify(this.tableForm.detailList));
+        const transformedData = data.reduce((result, item) => {
+          result[item.key] = item.details;
+          return result;
+        }, {});
+        return transformedData;
+      }
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+.time-form .el-form-item {
+  margin-bottom: 0 !important;
+}
+</style>

+ 38 - 32
src/views/saleManage/saleOrder/components/addDialogNew.vue

@@ -641,14 +641,16 @@
         </el-col>
       </el-row>
 
-      <headerTitle
-        title="收款计划"
-        style="margin-top: 30px"
-      ></headerTitle>
-      <PaymentCollectionPlan
-        ref="paymentCollectionPlanRef"
-        menu="sale"
-      ></PaymentCollectionPlan>
+      <div v-if="form.needProduce != 2 && form.needProduce != 4">
+        <headerTitle
+          title="收款计划"
+          style="margin-top: 30px"
+        ></headerTitle>
+        <PaymentCollectionPlan
+          ref="paymentCollectionPlanRef"
+          menu="sale"
+        ></PaymentCollectionPlan>
+      </div>
 
     </el-form>
 
@@ -1056,14 +1058,14 @@
       setCountAmount(allPrice, discountTotalPrice) {
         this.form.totalAmount = allPrice;
         this.form.payAmount = discountTotalPrice ? discountTotalPrice : allPrice;
-        this.$refs.paymentCollectionPlanRef.setDiscountAmount(this.form.payAmount);
+        this.$refs.paymentCollectionPlanRef?.setDiscountAmount(this.form.payAmount);
       },
       setTotalPlanNum(totalPlanNum) {
         this.$set(this.form, 'totalPlanNum', totalPlanNum);
       },
       discountInput() {
         this.$refs.inventoryTable.discountInputByOrder(this.form.payAmount);
-        this.$refs.paymentCollectionPlanRef.setDiscountAmount(this.form.payAmount);
+        this.$refs.paymentCollectionPlanRef?.setDiscountAmount(this.form.payAmount);
       },
       // 选择负责人部门
       change_principalDep(id) {
@@ -1829,7 +1831,7 @@
         } else {
           this.$set(this.form, 'issueNumber', 1);
         }
-        this.$refs.paymentCollectionPlanRef.defaultList(v.dictCode, this.form.issueNumber);
+        this.$refs.paymentCollectionPlanRef?.defaultList(v.dictCode, this.form.issueNumber);
       }, 
       ifChiefChange(value, idx) {
         if (value === 1) {
@@ -1878,18 +1880,20 @@
             })
           );
         }
-
-        arr.push(
-          new Promise((resolve, reject) => {
-            this.$refs.paymentCollectionPlanRef.validateForm((valid) => {
-              if (!valid) {
-                reject(false);
-              } else {
-                resolve(true);
-              }
-            });
-          })
-        );
+        if(this.form.needProduce != 2 && this.form.needProduce != 4) {
+          arr.push(
+            new Promise((resolve, reject) => {
+              this.$refs.paymentCollectionPlanRef.validateForm((valid) => {
+                if (!valid) {
+                  reject(false);
+                } else {
+                  resolve(true);
+                }
+              });
+            })
+          );
+        }
+        
 
         return Promise.all(arr);
       },
@@ -1920,16 +1924,18 @@
             return;
           }
 
-          const receiptPaymentListSum = commitData.receiptPaymentList.reduce((acc, cur) => acc + +cur.price, 0);
-          if(+receiptPaymentListSum != +commitData.payAmount){
-            this.$message.error('计划收款金额合计与优惠后金额不一致');
-            return;
-          }
+          if(commitData.needProduce != 2 && commitData.needProduce != 4) {
+            const receiptPaymentListSum = commitData.receiptPaymentList.reduce((acc, cur) => acc + +cur.price, 0);
+            if(+receiptPaymentListSum != +commitData.payAmount){
+              this.$message.error('计划收款金额合计与优惠后金额不一致');
+              return;
+            }
 
-          const ratioSum = commitData.receiptPaymentList.reduce((acc, cur) => acc + +cur.ratio, 0);
-          if(+ratioSum != 100){
-            this.$message.error('比例合计必须为100%');
-            return;
+            const ratioSum = commitData.receiptPaymentList.reduce((acc, cur) => acc + +cur.ratio, 0);
+            if(+ratioSum != 100){
+              this.$message.error('比例合计必须为100%');
+              return;
+            }
           }
           
           if (isTemporary.length > 0) {

+ 3 - 1
src/views/saleManage/saleOrder/components/darwerComponents/saleOrderInfo.vue

@@ -321,7 +321,8 @@
       type="view"
     ></typeList>
 
-    <headerTitle
+    <div v-if="form.needProduce != 2 && form.needProduce != 4">
+      <headerTitle
         title="收款计划"
         style="margin-top: 30px"
       ></headerTitle>
@@ -330,6 +331,7 @@
         menu="sale"
         type="view"
       ></PaymentCollectionPlan>
+    </div>
   </div>
 </template>