Просмотр исходного кода

feat: 新增付款计划功能并优化发票管理模块

liujt 8 месяцев назад
Родитель
Сommit
0af26f9185

+ 25 - 2
src/BIZComponents/inventoryTableDetails.vue

@@ -89,7 +89,7 @@
   // import fileMain from '@/components/addDoc/index.vue';
   import { contactQueryByCategoryIdsAPI } from '@/api/bpm/components/supplierManage/contact';
   const dayjs = require('dayjs');
-  import { lbjtList, levelList, pricingWayList } from '@/enum/dict.js';
+  import { lbjtList, levelList, pricingWayList, quoteTypeOp } from '@/enum/dict.js';
   import timeDialog from '@/components/timeDialog/index.vue';
   import tableColumnsMixin from '@/mixins/tableColumnsMixin.js';
 
@@ -177,7 +177,8 @@
           datasource: []
         },
         columnsVersion: 1,
-        tabMixinsInit: false
+        tabMixinsInit: false,
+        quoteTypeOp
       };
     },
     computed: {
@@ -496,6 +497,28 @@
             slot: 'notaxSinglePrice',
             align: 'center'
           },
+          {
+            width: 150,
+            prop: 'quoteWay',
+            label: '报价方式',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              return this.quoteTypeOp.find((item) => item.value == _row.quoteWay)
+                ?.label || '';
+            }
+          },
+          {
+            width: 150,
+            prop: 'discountRatio',
+            label: '折让比例',
+            align: 'center',
+            isNone: !this.isDiscount,
+            formatter: (_row, _column, cellValue) => {
+              return _row.discountRatio
+                ? Number(_row.discountRatio).toFixed(2) + '%'
+                : '';
+            }
+          },
           {
             width: 150,
             prop: 'discountSinglePrice',

+ 717 - 0
src/BIZComponents/paymentCollectionPlan/Detail.vue

@@ -0,0 +1,717 @@
+<template>
+  <el-form ref="form" :model="form" :rules="rules">
+    <ele-pro-table
+      ref="table"
+      :needPage="false"
+      :columns="columns"
+      :datasource="form.datasource"
+      class="time-form"
+    >
+      <!-- 表头工具栏 -->
+      <template v-slot:toolbar>
+        <div class="headbox">
+            <!-- <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="handlAdd"
+            v-if="type!='view'"
+            >
+            新增
+            </el-button> -->
+
+            <!-- <div class="pricebox">
+                <span class="amount">比例合计:{{ allRatio }}元</span>
+                <span class="amount">计划收款金额合计:{{ allPrice }}元</span>
+            </div> -->
+        </div>
+      </template>
+
+      <template v-slot:headerPeriod="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+
+      <template v-slot:period="scope">
+        <span>第{{ scope.row.period }}期</span>
+      </template>
+
+      <template v-slot:moneyName="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.moneyName'"
+          :rules="{
+            required: true,
+            message: '请输入',
+            trigger: 'blur'
+          }"
+        >
+          <el-input
+            v-model="scope.row.moneyName"
+            placeholder="请输入"
+            :disabled="type=='view'"
+
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:headerMoneyName="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:ratio="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.ratio'"
+          :rules="{
+            required: true,
+            pattern: numberReg,
+            message: '请输入正确的比例',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="scope.row.ratio"
+            placeholder="请输入"
+            :disabled="type=='view'"
+            @input="(val) => ratioInput(val, scope.$index)"
+          >
+            <template slot="append">%</template>
+          </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:type="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.type'"
+          :rules="{
+            required: true,
+            message: '请选择款项类型',
+            trigger: 'change'
+          }"
+        >
+          <el-select
+            v-model="scope.row.type"
+            placeholder="请选择"
+            style="width: 100%"
+            :disabled="type=='view'"
+
+          >
+            <el-option
+              v-for="item in paymentTypeOp"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </template>
+      <template v-slot:headerRatio="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+
+      <template v-slot:headerPrice="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:price="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.price'"
+          :rules="{
+            required: true,
+            pattern: numberReg,
+            message: '请输入正确的金额',
+            trigger: 'change'
+          }"
+        >
+            <el-input
+                type="number"
+                :min="0"
+                :disabled="type=='view'"
+                v-model="scope.row.price"
+                style="width: 100%"
+                placeholder="请输入"
+            >
+                <template slot="append">元</template>
+            </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:deadLine="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.deadLine'"
+          :rules="{
+            required: true,
+            message: '请选择日期',
+            trigger: 'change'
+          }"
+        >
+          <el-date-picker
+            style="width: 140px"
+            v-model="scope.row.deadLine"
+            :disabled="type=='view'"
+            type="date"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </template>
+      <template v-slot:headerDeadLine="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:remark="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.remark'"
+        >
+          <el-input
+            v-model="scope.row.remark"
+            type="textarea"
+            placeholder="请输入"
+            :disabled="type=='view'"
+          ></el-input>
+        </el-form-item>
+      </template>
+      <!-- 操作列 -->
+      <template v-slot:action="{ row }">
+        <el-popconfirm
+          class="ele-action"
+          title="确定要删除吗?"
+          @confirm="remove(row)"
+        >
+          <template v-slot:reference>
+            <el-link type="danger" :underline="false" icon="el-icon-delete">
+              删除
+            </el-link>
+          </template>
+        </el-popconfirm>
+      </template>
+    </ele-pro-table>
+  </el-form>
+</template>
+<script>
+  import { emailReg, phoneReg, numberReg } from 'ele-admin';
+  import { paymentTypeOp } from '@/enum/dict';
+  export default {
+    props: {
+      delDetailIds: Array,
+      type: String,
+      discountTotalPrice: {
+        type: [Number, String],
+        default: 0
+      },
+      menu: {
+        type: String,
+        default: 'sale'
+      },
+    },
+    data() {
+      const defaultForm = {
+        key: null,
+        deadLine: null,
+        moneyName: '',
+        price: null,
+        ratio: null,
+        remark: '',
+        type: '',
+        period: null
+      };
+      return {
+        // allPrice: 0,
+        // allRatio: 0,
+        numberReg,
+        defaultForm,
+        discountAmount: 0,
+        form: {
+          datasource: []
+        },
+        paymentTypeOp,
+
+        rules: {}
+      };
+    },
+    computed: {
+      canHandl() {
+        return this.form.datasource.length;
+      },
+      columns() {
+        return [
+          {
+            width: 45,
+            type: 'index',
+            columnKey: 'index',
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            width: 120,
+            prop: 'detailNo',
+            label: this.menu === 'purchase' ? '付款计划编码' : '收款计划编码',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'invoiceOrderNo',
+            label: '发票号',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'relatedReceivableOrderNo',
+            label: this.menu === 'purchase' ? '关联应付编码' : '关联应收编码',
+            align: 'center'
+          },
+          {
+            prop: 'issueNumber',
+            label: '期数',
+            // slot: 'period',
+            // headerSlot: 'headerPeriod',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'paymentType',
+            label: '款项类型',
+            // slot: 'paymentType',
+            // headerSlot: 'headerPaymentType',
+            align: 'center'
+          },
+          {
+            prop: 'moneyName',
+            label: '款项名称',
+            // slot: 'moneyName',
+            // headerSlot: 'headerMoneyName',
+            align: 'center',
+            width: 170
+          },
+          {
+            width: 150,
+            prop: 'paymentRatio',
+            label: '比例',
+            // slot: 'paymentRatio',
+            // headerSlot: 'headerRatio',
+            align: 'center'
+          },
+          {
+            width: 170,
+            prop: 'planPaymentAmount',
+            label: this.menu === 'purchase' ? '计划付款金额' : '计划收款金额',
+            // slot: 'planPaymentAmount',
+            align: 'center',
+            // headerSlot: 'headerPrice',
+          },
+
+          {
+            width: 160,
+            prop: 'planPaymentDate',
+            label: this.menu === 'purchase' ? '计划付款日期' : '计划收款日期',
+            // slot: 'planPaymentDate',
+            // headerSlot: 'headerDeadLine',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'isInvoice',
+            label: '是否已开票',
+            align: 'center',
+            formatter: (row) => {
+              return row.isInvoice ? '是' : '否';
+            }
+          },
+          {
+            width: 120,
+            prop: 'invoiceAmount',
+            label: '已开票金额',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'invoiceDate',
+            label: '开票日期',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'isGenerateReceivablePayment',
+            label: this.menu === 'purchase' ? '是否生成应付款项' : '是否生成应收款项',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              return cellValue == 1 ? '是' : '否';
+            }
+          },
+          {
+            width: 120,
+            prop: 'receivableAmount',
+            label: this.menu === 'purchase' ? '应付金额' : '应收金额',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'receivedAmount',
+            label: this.menu === 'purchase' ? '已付款金额' : '已收款金额',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'actualReceivablePaymentDate',
+            label: this.menu === 'purchase' ? '实际付款日期' : '实际收款日期',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'deliveryStatus',
+            label: this.menu === 'purchase' ? '收货货状态' : '发货状态',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              let options = this.menu === 'purchase' ? [
+                { value: 0, label: '待收货' },
+                { value: 1, label: '部分收货' },
+                { value: 2, label: '全部收货' }
+              ] : [
+                { value: 0, label: '待发货' },
+                { value: 1, label: '部分发货' },
+                { value: 2, label: '全部发货' }
+              ];
+              return options.find(item => item.value == cellValue)?.label || '';
+            },
+          },
+          {
+            width: 120,
+            prop: 'reconciliationStatus',
+            label: '对账状态',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              let options = [
+                { value: 0, label: '未对账' },
+                { value: 1, label: '部分对账' },
+                { value: 2, label: '全部对账' }
+              ];
+              return options.find(item => item.value == cellValue)?.label || '';
+            }
+          },
+          {
+            width: 220,
+            prop: 'paymentStatus',
+            label: this.menu === 'purchase' ? '付款状态' : '收款状态',
+            slot: 'paymentStatus',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              let options = this.menu === 'purchase' ? [
+                { value: 0, label: '未付款' },
+                { value: 1, label: '部分付款' },
+                { value: 2, label: '全部付款' }
+              ] : [
+                { value: 0, label: '未收款' },
+                { value: 1, label: '部分收款' },
+                { value: 2, label: '全部收款' }
+              ];
+              return options.find(item => item.value == cellValue)?.label || '';
+            }
+          },
+          {
+            width: 120,
+            prop: 'overdueStatus',
+            label: '逾期状态',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              return _row.overdueStatus == 1 ? '逾期中' : '未逾期';
+            }
+          },
+          // {
+          //   columnKey: 'action',
+          //   label: '操作',
+          //   align: 'center',
+          //   resizable: false,
+          //   slot: 'action',
+          //   showOverflowTooltip: true,
+          //   show: this.type != 'view'
+          // }
+        ];
+      },
+      allRatio() {
+        return this.form.datasource.reduce((acc, cur) => acc + Number(cur.ratio), 0).toFixed(2);
+      },
+      allPrice() {
+        return this.form.datasource.reduce((acc, cur) => acc + Number(cur.price), 0).toFixed(2);
+      },
+    },
+    watch: {
+      discountAmount(newval) {
+        if (newval) {
+          this.refreshprice();
+        }
+      }
+    },
+    methods: {
+      setDiscountAmount(val) {
+        this.discountAmount = val;
+      },
+      //输入比例更新金额
+      async ratioInput(val, index = null) {
+        val = Number(val);
+        try {
+          if (index != null) {
+            await this.checkRatio();
+          }
+          let newval = (val / 100).toFixed(2);
+          let price = (this.discountAmount * newval).toFixed(2);
+          console.log(newval, price, index, '88888');
+          if (index != null) {
+            console.log(newval, price, index, '999999');
+            this.$set(this.form.datasource[index], 'price', price);
+          } else {
+            return price;
+          }
+        } catch (error) {
+          return 0;
+        }
+
+        //this.$set( this.form.datasource[index], 'price',  price)
+      },
+      //检验比例
+      checkRatio() {
+        return new Promise((resolve, reject) => {
+          let newData = this.form.datasource,
+            sum = 0;
+          newData.forEach((r) => {
+            if (r.ratio) {
+              sum += Number(r.ratio);
+            }
+          });
+          console.log(sum, '3333333');
+          if (sum > 100) {
+            this.$message.error('总共比例不能超过100');
+            this.$set(
+              this.form.datasource[this.form.datasource.length - 1],
+              'ratio',
+              null
+            );
+            this.$set(
+              this.form.datasource[this.form.datasource.length - 1],
+              'price',
+              0.0
+            );
+            reject(false);
+          } else {
+            resolve(true);
+          }
+        });
+      },
+      refreshprice() {
+        let newData = this.form.datasource;
+        newData.forEach(async (r, index) => {
+          if (r.ratio) {
+            console.log(this.ratioInput(Number(r.ratio)), '9999888888');
+            r.price = await this.ratioInput(Number(r.ratio));
+          }
+        });
+      },
+      // 返回列表数据
+      getTableValue() {
+        return this.form.datasource;
+      },
+      //修改回显
+      putTableValue(data) {
+        if (data && data?.length) {
+          this.form.datasource = data;
+        }
+      },
+      remove(row) {
+        let index = this.form.datasource.findIndex((n) => n.key == row.key);
+        if (index !== -1) {
+          this.form.datasource.splice(index, 1);
+          this.setSort();
+          if (row.id) {
+            this.delDetailIds.push(row.id);
+          }
+        }
+      },
+      // 清空表格
+      restTable() {
+        this.form.datasource = [];
+      },
+      // 重新排序
+      setSort() {
+        this.form.datasource.forEach((n, index) => {
+          n.key = index + 1;
+        });
+      },
+      defaultList(method, period, dateRange) {
+        console.log('method, period', method, period);
+        const tempList = []
+        if(dateRange) {
+          this.setDefaultList(dateRange, period);
+          return
+        }
+        if(method == 3) {
+          let params = ['预付款', '交货款'];
+          for(let i = 0; i < period; i++) {
+            let i = JSON.parse(JSON.stringify(this.defaultForm));
+              i.moneyName = item;
+              i.type = i < params.length ? this.paymentTypeOp[index].value : '';
+              i.key = index + 1;
+              i.period = index + 1;
+              tempList.push(i);
+          }
+          // params.forEach((item, index) => {
+          //     let i = JSON.parse(JSON.stringify(this.defaultForm));
+          //     i.moneyName = item;
+          //     i.type = this.paymentTypeOp[index].value;
+          //     i.key = index + 1;
+          //     i.period = index + 1;
+          //     tempList.push(i);
+          // });
+        } else {
+          // method == 4 || method == 5 || method == 6 || method == 7 || method == 8
+          let params = [''];
+          params.forEach((item, index) => {
+              let i = JSON.parse(JSON.stringify(this.defaultForm));
+              i.key = index + 1;
+              i.period = index + 1;
+              tempList.push(i);
+          });
+        }
+        this.form.datasource = tempList;
+      },
+
+      transformDaysFun(date) {
+        const startDate = new Date(date[0]);
+        const endDate = new Date(date[1]);
+        // 计算毫秒差并转换为天数,使用Math.ceil确保结果为整数
+        const days = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)) + 1;
+        console.log('包含两头的天数:', days);
+
+        // 生成包括头尾在内的所有日期
+        const allDates = [];
+        const current = new Date(startDate);
+        
+        // 遍历从开始日期到结束日期的所有天数
+        while (current <= endDate) {
+          // 格式化日期为YYYY-MM-dd
+          const year = current.getFullYear();
+          const month = current.getMonth() + 1; // 月份从0开始,需要+1
+          const day = current.getDate();
+          
+          const formattedMonth = String(month).padStart(2, '0');
+          const formattedDay = String(day).padStart(2, '0');
+          const formattedDateStr = `${year}-${formattedMonth}-${formattedDay}`;
+          
+          allDates.push(formattedDateStr);
+          
+          // 移动到下一天
+          current.setDate(current.getDate() + 1);
+        }
+        return allDates;
+      },
+
+      transformMonthFun(date, day) {
+        // 处理月份数据(转换为Date对象)
+        const parseMonthDate = (dateStr) => {
+          return dateStr instanceof Date ? dateStr : new Date(dateStr + '-01');
+        };
+        
+        const start = parseMonthDate(date[0]);
+        const end = parseMonthDate(date[1]);
+        
+        // 先生成所有月份的日期数组
+        const allMonthDates = [];
+        const currentDate = new Date(start);
+        
+        // 遍历从开始月份到结束月份的所有月份
+        while (currentDate <= end) {
+          const year = currentDate.getFullYear();
+          const month = currentDate.getMonth() + 1; // 月份从0开始,需要+1
+          const receiptDate = day;
+          
+          // 格式化日期为YYYY-MM-dd
+          const formattedMonth = String(month).padStart(2, '0');
+          const formattedDate = String(receiptDate).padStart(2, '0');
+          const deadLine = receiptDate ? `${year}-${formattedMonth}-${formattedDate}` : '';
+          
+          allMonthDates.push(deadLine);
+          
+          // 使用Date对象的setMonth方法正确移动到下一个月(自动处理年份变化)
+          currentDate.setMonth(currentDate.getMonth() + 1);
+        }
+        return allMonthDates;
+      },
+      setDefaultList(dateRange, period) {
+        const tempPeriod = period || 0;
+
+        // 计算基本比例
+        const basicRatio = 100 / tempPeriod;
+        let totalRatio = 0;
+        
+        // 生成付款计划列表项
+        const tempList = [];
+        
+        // 根据传入的period参数生成付款计划
+        for (let i = 0; i < tempPeriod; i++) {
+          let item = JSON.parse(JSON.stringify(this.defaultForm));
+          // 获取日期:如果i小于日期数组长度则使用对应日期,否则设为空
+          const deadLine = i < dateRange.length ? dateRange[i] : '';
+          const ratio = parseFloat(basicRatio.toFixed(2));
+
+          item.period = i + 1;
+          item.deadLine = deadLine;
+          item.ratio = ratio;
+
+          tempList.push(item);
+          totalRatio += ratio;
+        }
+        
+        // 调整最后一项的比例,确保总和为100
+        if (tempList.length > 0) {
+          const difference = 100 - totalRatio;
+          if (difference !== 0) {
+            tempList[tempList.length - 1].ratio = parseFloat((tempList[tempList.length - 1].ratio + difference).toFixed(2));
+          }
+        }
+        
+        console.log('付款计划列表:~~', tempList);
+        this.form.datasource = tempList;
+        // this.$set(this.form, 'datasource', tempList);
+        console.log('付款计划列表:', this.form.datasource);
+      },
+      // 添加
+      handlAdd() {
+        let item = JSON.parse(JSON.stringify(this.defaultForm));
+        item.key = this.form.datasource.length + 1;
+        this.form.datasource.push(item);
+      },
+
+      validateForm(callback) {
+        //开始表单校验
+        this.$refs.form.validate((valid) => {
+          callback(valid);
+        });
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .time-form .el-form-item {
+    margin-bottom: 0 !important;
+  }
+
+  .headbox {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .amount {
+      font-size: 14px;
+      font-weight: bold;
+      padding-right: 30px;
+    }
+  }
+
+  .pricebox {
+      display: flex;
+      justify-content: flex-start;
+      align-items: center;
+      font-weight: bold;
+    }
+    :deep(.el-input-group__append) {
+      padding: 0;
+    }
+</style>

+ 653 - 0
src/BIZComponents/paymentCollectionPlan/Index.vue

@@ -0,0 +1,653 @@
+<template>
+  <el-form ref="form" :model="form" :rules="rules">
+    <ele-pro-table
+      ref="table"
+      :needPage="false"
+      :columns="columns"
+      :datasource="form.datasource"
+      :toolkit="[]"
+      class="time-form"
+    >
+      <!-- 表头工具栏 -->
+      <template v-slot:toolbar>
+        <div class="headbox">
+            <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="handlAdd"
+            v-if="type!='view'"
+            >
+            新增
+            </el-button>
+
+            <div class="pricebox">
+                <span class="amount">比例合计:{{ allRatio }}%</span>
+                <span class="amount">计划{{ menu === 'purchase' ? '收款' : '付款' }}金额合计:{{ allPrice }}元</span>
+
+                <!-- <el-form-item
+                    style="width: 300px"
+                    label="优惠后总金额:"
+                    prop="discountTotalPrice"
+                    :rules="{
+                        required: true,
+                        message: '请输入优惠后总金额',
+                        trigger: 'change'
+                    }"
+                >
+                    <el-input
+                    type="number"
+                    :min="0"
+                    :max="allPrice"
+                    :disabled="!allPrice"
+                    v-model="form.discountTotalPrice"
+                    style="width: 180px"
+                    placeholder="请输入"
+                    @input="discountInputByOrder(form.discountTotalPrice)"
+                    >
+                    <template slot="append">元</template>
+                    </el-input>
+                </el-form-item> -->
+            </div>
+        </div>
+      </template>
+
+      <template v-slot:headerIssueNumber="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template> 
+
+      <template v-slot:headerType="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+
+      <template v-slot:issueNumber="scope">
+        <span>第{{ scope.row.issueNumber }}期</span>
+      </template>
+
+      <template v-slot:moneyName="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.moneyName'"
+          :rules="{
+            required: true,
+            message: '请输入',
+            trigger: 'blur'
+          }"
+        >
+          <el-input
+            v-model="scope.row.moneyName"
+            placeholder="请输入"
+            :disabled="type=='view'"
+
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:headerMoneyName="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:ratio="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.ratio'"
+          :rules="{
+            required: true,
+            pattern: numberReg,
+            message: '请输入正确的比例',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="scope.row.ratio"
+            placeholder="请输入"
+            :disabled="type=='view'"
+            @input="(val) => ratioInput(val, scope.$index)"
+          >
+            <template slot="append">%</template>
+          </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:type="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.type'"
+          :rules="{
+            required: true,
+            message: '请选择款项类型',
+            trigger: 'change'
+          }"
+        >
+          <el-select
+            v-model="scope.row.type"
+            placeholder="请选择"
+            style="width: 100%"
+            :disabled="type=='view'"
+
+          >
+            <el-option
+              v-for="item in paymentTypeOp"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </template>
+      <template v-slot:headerRatio="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+
+      <template v-slot:headerPrice="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:price="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.price'"
+          :rules="{
+            required: true,
+            pattern: numberReg,
+            message: '请输入正确的金额',
+            trigger: 'change'
+          }"
+        >
+            <el-input
+                type="number"
+                :min="0"
+                :disabled="type=='view'"
+                v-model="scope.row.price"
+                style="width: 100%"
+                placeholder="请输入"
+            >
+                <template slot="append">元</template>
+            </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:deadLine="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.deadLine'"
+          :rules="{
+            required: true,
+            message: '请选择日期',
+            trigger: 'change'
+          }"
+        >
+          <el-date-picker
+            style="width: 140px"
+            v-model="scope.row.deadLine"
+            :disabled="type=='view'"
+            type="date"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </template>
+      <template v-slot:headerDeadLine="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:remark="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :prop="'datasource.' + scope.$index + '.remark'"
+        >
+          <el-input
+            v-model="scope.row.remark"
+            type="textarea"
+            placeholder="请输入"
+            :disabled="type=='view'"
+          ></el-input>
+        </el-form-item>
+      </template>
+      <!-- 操作列 -->
+      <template v-slot:action="{ row }">
+        <el-popconfirm
+          class="ele-action"
+          title="确定要删除吗?"
+          @confirm="remove(row)"
+        >
+          <template v-slot:reference>
+            <el-link type="danger" :underline="false" icon="el-icon-delete">
+              删除
+            </el-link>
+          </template>
+        </el-popconfirm>
+      </template>
+    </ele-pro-table>
+  </el-form>
+</template>
+<script>
+  import { emailReg, phoneReg, numberReg } from 'ele-admin';
+  import { paymentTypeOp } from '@/enum/dict';
+  export default {
+    props: {
+      delDetailIds: Array,
+      type: String,
+      menu: {
+        type: String,
+        default: 'sale'
+      },
+      discountTotalPrice: {
+        type: [Number, String],
+        default: 0
+      }
+    },
+    data() {
+      const defaultForm = {
+        key: null,
+        deadLine: null,
+        moneyName: '',
+        price: null,
+        ratio: null,
+        remark: '',
+        type: '',
+        issueNumber: null
+      };
+      return {
+        // allPrice: 0,
+        // allRatio: 0,
+        numberReg,
+        defaultForm,
+        discountAmount: 0,
+        form: {
+          datasource: []
+        },
+        paymentTypeOp,
+
+        rules: {}
+      };
+    },
+    computed: {
+      canHandl() {
+        return this.form.datasource.length;
+      },
+      columns() {
+        return [
+          {
+            width: 45,
+            type: 'index',
+            columnKey: 'index',
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            width: 180,
+            prop: 'issueNumber',
+            label: '期数',
+            slot: 'issueNumber',
+            headerSlot: 'headerIssueNumber',
+            align: 'center'
+          },
+          {
+            width: 150,
+            prop: 'type',
+            label: '款项类型',
+            slot: 'type',
+            headerSlot: 'headerType',
+            align: 'center'
+          },
+          {
+            prop: 'moneyName',
+            label: '款项名称',
+            slot: 'moneyName',
+            headerSlot: 'headerMoneyName',
+            align: 'center',
+            // width: 170
+          },
+          {
+            width: 150,
+            prop: 'ratio',
+            label: '比例',
+            slot: 'ratio',
+            headerSlot: 'headerRatio',
+            align: 'center'
+          },
+          {
+            width: 170,
+            prop: 'price',
+            label: this.menu === 'purchase' ? '计划付款金额' : '计划收款金额',
+            slot: 'price',
+            align: 'center',
+            headerSlot: 'headerPrice',
+          },
+
+          {
+            width: 160,
+            prop: 'deadLine',
+            label: this.menu === 'purchase' ? '计划付款日期' : '计划收款日期',
+            slot: 'deadLine',
+            headerSlot: 'headerDeadLine',
+            align: 'center'
+          },
+          {
+            // width: 220,
+            prop: 'remark',
+            label: '说明',
+            slot: 'remark',
+            align: 'center'
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true,
+            show: this.type != 'view'
+          }
+        ];
+      },
+      allRatio() {
+        return this.form.datasource.reduce((acc, cur) => acc + Number(cur.ratio), 0).toFixed(2);
+      },
+      allPrice() {
+        return this.form.datasource.reduce((acc, cur) => acc + Number(cur.price), 0).toFixed(2);
+      },
+    },
+    watch: {
+      discountAmount(newval) {
+        if (newval) {
+          this.refreshprice();
+        }
+      }
+    },
+    methods: {
+      setDiscountAmount(val) {
+        console.log(val, '000000');
+        this.discountAmount = val;
+      },
+      //输入比例更新金额
+      async ratioInput(val, index = null) {
+        console.log(this.discountAmount, '77777');
+        val = Number(val);
+        try {
+          if (index != null) {
+            await this.checkRatio();
+          }
+          let newval = (val / 100).toFixed(2);
+          let price = (this.discountAmount * newval).toFixed(2);
+          console.log(newval, price, index, '88888');
+          if (index != null) {
+            console.log(newval, price, index, '999999');
+            this.$set(this.form.datasource[index], 'price', price);
+          } else {
+            return price;
+          }
+        } catch (error) {
+          return 0;
+        }
+
+        //this.$set( this.form.datasource[index], 'price',  price)
+      },
+      //检验比例
+      checkRatio() {
+        return new Promise((resolve, reject) => {
+          let newData = this.form.datasource,
+            sum = 0;
+          newData.forEach((r) => {
+            if (r.ratio) {
+              sum += Number(r.ratio);
+            }
+          });
+          console.log(sum, '3333333');
+          if (sum > 100) {
+            this.$message.error('总共比例不能超过100');
+            this.$set(
+              this.form.datasource[this.form.datasource.length - 1],
+              'ratio',
+              null
+            );
+            this.$set(
+              this.form.datasource[this.form.datasource.length - 1],
+              'price',
+              0.0
+            );
+            reject(false);
+          } else {
+            resolve(true);
+          }
+        });
+      },
+      refreshprice() {
+        let newData = this.form.datasource;
+        newData.forEach(async (r, index) => {
+          if (r.ratio) {
+            console.log(this.ratioInput(Number(r.ratio)), '9999888888');
+            r.price = await this.ratioInput(Number(r.ratio));
+          }
+        });
+      },
+      // 返回列表数据
+      getTableValue() {
+        return this.form.datasource;
+      },
+      //修改回显
+      putTableValue(data) {
+        console.log('data~~~~', data);
+        if (data) {
+          this.form.datasource = data.receiptPaymentList;
+          this.setDiscountAmount(data.payAmount);
+        }
+      },
+      remove(row) {
+        let index = this.form.datasource.findIndex((n) => n.key == row.key);
+        if (index !== -1) {
+          this.form.datasource.splice(index, 1);
+          this.setSort();
+          if (row.id) {
+            this.delDetailIds.push(row.id);
+          }
+        }
+      },
+      // 清空表格
+      restTable() {
+        this.form.datasource = [];
+      },
+      // 重新排序
+      setSort() {
+        this.form.datasource.forEach((n, index) => {
+          n.key = index + 1;
+        });
+      },
+      defaultList(method, issueNumber, dateRange) {
+        console.log('method, issueNumber', method, issueNumber);
+        const tempList = []
+        if(dateRange) {
+          this.setDefaultList(dateRange, issueNumber);
+          return
+        }
+        if(method == 3) {
+          let params = ['预付款', '交货款'];
+          for(let i = 0; i < issueNumber; i++) {
+            let item = JSON.parse(JSON.stringify(this.defaultForm));
+              item.moneyName = i < params.length ? params[i] : '';
+              item.type = i < params.length ? this.paymentTypeOp[i].value : '';
+              item.key = i + 1;
+              item.issueNumber = i + 1;
+              tempList.push(item);
+          }
+          // params.forEach((item, index) => {
+          //     let i = JSON.parse(JSON.stringify(this.defaultForm));
+          //     i.moneyName = item;
+          //     i.type = this.paymentTypeOp[index].value;
+          //     i.key = index + 1;
+          //     i.issueNumber = index + 1;
+          //     tempList.push(i);
+          // });
+        } else {
+          // method == 4 || method == 5 || method == 6 || method == 7 || method == 8
+          // let params = [''];
+          // params.forEach((item, index) => {
+          //     let i = JSON.parse(JSON.stringify(this.defaultForm));
+          //     i.key = index + 1;
+          //     i.issueNumber = index + 1;
+          //     tempList.push(i);
+          // });
+          for(let i = 0; i < issueNumber; i++) {
+            let item = JSON.parse(JSON.stringify(this.defaultForm));
+              item.moneyName = '';
+              item.type = '';
+              item.key = i + 1;
+              item.issueNumber = i + 1;
+              tempList.push(item);
+          }
+        }
+        console.log('tempList~~~', tempList);
+        this.form.datasource = tempList;
+      },
+
+      transformDaysFun(date) {
+        const startDate = new Date(date[0]);
+        const endDate = new Date(date[1]);
+        // 计算毫秒差并转换为天数,使用Math.ceil确保结果为整数
+        const days = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)) + 1;
+        console.log('包含两头的天数:', days);
+
+        // 生成包括头尾在内的所有日期
+        const allDates = [];
+        const current = new Date(startDate);
+        
+        // 遍历从开始日期到结束日期的所有天数
+        while (current <= endDate) {
+          // 格式化日期为YYYY-MM-dd
+          const year = current.getFullYear();
+          const month = current.getMonth() + 1; // 月份从0开始,需要+1
+          const day = current.getDate();
+          
+          const formattedMonth = String(month).padStart(2, '0');
+          const formattedDay = String(day).padStart(2, '0');
+          const formattedDateStr = `${year}-${formattedMonth}-${formattedDay}`;
+          
+          allDates.push(formattedDateStr);
+          
+          // 移动到下一天
+          current.setDate(current.getDate() + 1);
+        }
+        return allDates;
+      },
+
+      transformMonthFun(date, day) {
+        // 处理月份数据(转换为Date对象)
+        const parseMonthDate = (dateStr) => {
+          return dateStr instanceof Date ? dateStr : new Date(dateStr + '-01');
+        };
+        
+        const start = parseMonthDate(date[0]);
+        const end = parseMonthDate(date[1]);
+        
+        // 先生成所有月份的日期数组
+        const allMonthDates = [];
+        const currentDate = new Date(start);
+        
+        // 遍历从开始月份到结束月份的所有月份
+        while (currentDate <= end) {
+          const year = currentDate.getFullYear();
+          const month = currentDate.getMonth() + 1; // 月份从0开始,需要+1
+          const receiptDate = day;
+          
+          // 格式化日期为YYYY-MM-dd
+          const formattedMonth = String(month).padStart(2, '0');
+          const formattedDate = String(receiptDate).padStart(2, '0');
+          const deadLine = receiptDate ? `${year}-${formattedMonth}-${formattedDate}` : '';
+          
+          allMonthDates.push(deadLine);
+          
+          // 使用Date对象的setMonth方法正确移动到下一个月(自动处理年份变化)
+          currentDate.setMonth(currentDate.getMonth() + 1);
+        }
+        return allMonthDates;
+      },
+      setDefaultList(dateRange, issueNumber) {
+        const tempPeriod = issueNumber || 0;
+
+        // 计算基本比例
+        const basicRatio = 100 / tempPeriod;
+        let totalRatio = 0;
+        
+        // 生成付款计划列表项
+        const tempList = [];
+        
+        // 根据传入的period参数生成付款计划
+        for (let i = 0; i < tempPeriod; i++) {
+          let item = JSON.parse(JSON.stringify(this.defaultForm));
+          // 获取日期:如果i小于日期数组长度则使用对应日期,否则设为空
+          const deadLine = i < dateRange.length ? dateRange[i] : '';
+          const ratio = parseFloat(basicRatio.toFixed(2));
+
+          item.issueNumber = i + 1;
+          item.deadLine = deadLine;
+          // item.ratio = ratio;
+
+          tempList.push(item);
+          // totalRatio += ratio;
+        }
+        
+        // 调整最后一项的比例,确保总和为100
+        // if (tempList.length > 0) {
+        //   const difference = 100 - totalRatio;
+        //   if (difference !== 0) {
+        //     tempList[tempList.length - 1].ratio = parseFloat((tempList[tempList.length - 1].ratio + difference).toFixed(2));
+        //   }
+        // }
+        
+        console.log('付款计划列表:~~', tempList);
+        this.form.datasource = tempList;
+        // this.$set(this.form, 'datasource', tempList);
+        console.log('付款计划列表:', this.form.datasource);
+      },
+      // 添加
+      handlAdd() {
+        let item = JSON.parse(JSON.stringify(this.defaultForm));
+        item.key = this.form.datasource.length + 1;
+        item.issueNumber = this.form.datasource.length + 1;
+        this.form.datasource.push(item);
+      },
+
+      // validateForm(callback) {
+      //   //开始表单校验
+      //   this.$refs.form.validate((valid) => {
+      //     callback(valid);
+      //   });
+      // }
+      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);
+        });
+      },
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .time-form .el-form-item {
+    margin-bottom: 0 !important;
+  }
+
+  .headbox {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .amount {
+      font-size: 14px;
+      font-weight: bold;
+      padding-right: 30px;
+    }
+  }
+
+  .pricebox {
+      display: flex;
+      justify-content: flex-start;
+      align-items: center;
+      font-weight: bold;
+    }
+    :deep(.el-input-group__append) {
+      padding: 0;
+    }
+</style>

+ 18 - 0
src/api/bpm/components/financialManage/invoiceManage/index.js

@@ -32,6 +32,15 @@ export async function invoiceApplyUpdateAPI(data) {
   return Promise.reject(new Error(res.data.message));
 }
 
+// 新版编辑
+export async function invoiceApplyUpdateV2API(data) {
+  const res = await request.put(`/eom/fininvoiceapply/v2/update`, data);
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
 // 信息
 export async function  invoiceApplyInfoAPI(id) {
   const res = await request.get(`/eom/fininvoiceapply/getById/${id}`);
@@ -41,6 +50,15 @@ export async function  invoiceApplyInfoAPI(id) {
   return Promise.reject(new Error(res.data.message));
 }
 
+// 新版信息
+export async function  invoiceApplyInfoV2API(id) {
+  const res = await request.get(`/eom/fininvoiceapply/detail/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+} 
+
 // 删除
 export async function invoiceApplyRemoveAPI(data) {
   const res = await request.delete('/eom/fininvoiceapply/delete', {data});

+ 1 - 0
src/components/addDoc/main.vue

@@ -94,6 +94,7 @@
     data() {
       return {
         cacheKeyUrl: 'addDoc-main-view',
+        tabMixinsInit: false,
         fileId: [],
         fileShow: false,
         showEditFlag: false,

+ 57 - 0
src/enum/dict.js

@@ -368,3 +368,60 @@ export const inspectionProjectStatus = [
     value: 4
   }
 ];
+
+export const shippingModeOp = [
+  {
+    value: 1,
+    label: '发货再对账'
+  },
+  {
+    value: 2,
+    label: '对账再发货'
+  }
+];
+
+export const quoteTypeOp = [
+  {
+    value: 1,
+    label: '常规价'
+  },
+  {
+    value: 2,
+    label: '内部价'
+  },
+  {
+    value: 3,
+    label: '议价'
+  }
+];
+
+export const transactionMethodsOp = [
+  {
+    value: 1,
+    label: '先票后款'
+  },
+  {
+    value: 2,
+    label: '先款后票'
+  }
+];
+
+// 付款类型下拉
+export const paymentTypeOp = [
+  {
+    value: 1,
+    label: '预付款'
+  },
+  {
+    value: 2,
+    label: '交货款'
+  },
+  {
+    value: 3,
+    label: '质保金'
+  },
+  {
+    value: 4,
+    label: '尾款'
+  }
+]

+ 5 - 5
src/views/bpm/handleTask/components/allocate/detailDialog.vue

@@ -242,11 +242,11 @@
         this.detailList = res.map((item) => {
           return {
             ...item,
-            categoryCode: this.infoData.categoryCode,
-            categoryName: this.infoData.categoryName,
-            brandNum: this.infoData.brandNum,
-            categoryModel: this.infoData.model,
-            specification: this.infoData.specification
+            // categoryCode: this.infoData.categoryCode,
+            // categoryName: this.infoData.categoryName,
+            // brandNum: this.infoData.brandNum,
+            // categoryModel: this.infoData.model,
+            // specification: this.infoData.specification
           };
         });
       }

+ 57 - 13
src/views/bpm/handleTask/components/contractBook/detailDialog.vue

@@ -3,7 +3,7 @@
     <el-form ref="form" :model="form" :rules="rules" label-width="120px">
       <headerTitle title="合同信息"></headerTitle>
       <el-row>
-        <el-col :span="12">
+        <el-col :span="8">
           <el-form-item label="合同类型:" prop="type">
             {{ form.typeName }} {{ form.categoryName }}
           </el-form-item>
@@ -75,11 +75,9 @@
           <el-form-item label="编码:" prop="contractNumber">
             {{ form.contractNo }}
           </el-form-item>
-          <el-form-item label="合同编号:" prop="contractNumber">
-            {{ form.contractNumber }}
-          </el-form-item>
+          
         </el-col>
-        <el-col :span="12">
+        <el-col :span="8">
           <el-form-item label="签订日期:" prop="contractStartDate">
             {{ form.contractStartDate }}
           </el-form-item>
@@ -87,9 +85,9 @@
             {{ form.contractEndDate }}
           </el-form-item>
 
-          <el-form-item label="结算方式:" prop="payWay">
+          <!-- <el-form-item label="结算方式:" prop="payWay">
             {{ form.settlementModeName }}
-          </el-form-item>
+          </el-form-item> -->
           <el-form-item
             label="需求人:"
             prop="requireUserId"
@@ -103,12 +101,42 @@
           >
             {{ form.businessUserName }}
           </el-form-item>
+          <el-form-item label="合同编号:" prop="contractNumber">
+            {{ form.contractNumber }}
+          </el-form-item>
           <el-form-item prop="contractFile" label="合同附件:">
             <fileMain v-model="form.fileId" type="view"></fileMain>
           </el-form-item>
-          <el-form-item label="生产要求:" prop="productionRequirements">
+          <!-- <el-form-item label="生产要求:" prop="productionRequirements">
             {{ form.productionRequirements }}
-          </el-form-item>
+          </el-form-item> -->
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="交易方式" prop="transactionMode">
+              {{ transactionMethodsOp.find(item => item.value == form.transactionMode)?.label }}
+            </el-form-item>
+            <el-form-item label="发货模式" prop="deliveryMode">
+              {{ shippingModeOp.find(item => item.value == form.deliveryMode)?.label }}
+            </el-form-item>
+            <el-form-item label="结算方式" prop="settlementModeName">
+              {{ form.settlementModeName }}
+            </el-form-item>
+            <el-form-item v-if="form.settlementMode == 1" label="结算日期范围" prop="settlementDate">
+              {{ form.settlementDate }}
+            </el-form-item>
+
+            <el-form-item v-if="form.settlementMode == 2" label="结算月份范围" prop="settlementDate">
+              {{ form.settlementDate }}
+            </el-form-item>
+            <el-form-item  v-if="form.settlementMode == 2" label="收款日期" prop="receiptDate">
+              每月{{ form.receiptDate }}日
+            </el-form-item>
+            <el-form-item
+              label="期数"
+              prop="issueNumber"
+            >
+              {{ form.issueNumber }}期
+            </el-form-item>
         </el-col>
       </el-row>
       <headerTitle title="基本信息"></headerTitle>
@@ -192,10 +220,15 @@
     </inventoryTabledetail>
 
     <headerTitle
-      :title="form.type == '2' ? '付款方式' : '收款方式'"
+      :title="form.type == '2' ? '付款计划' : '收款计划'"
       style="margin-top: 30px"
     ></headerTitle>
-    <ele-pro-table
+    <PaymentCollectionPlan
+      ref="paymentCollectionPlanRef"
+      :menu="form.type == '2' ? 'purchase' : 'sale'"
+      type="view"
+    ></PaymentCollectionPlan>
+    <!-- <ele-pro-table
       ref="table"
       :needPage="false"
       :columns="receiptPaymentListcolumns"
@@ -203,7 +236,7 @@
       :datasource="detailData.receiptPaymentList"
       row-key="id"
     >
-    </ele-pro-table>
+    </ele-pro-table> -->
     <!-- <fileMain ref="fileMainRef"></fileMain> -->
   </div>
 </template>
@@ -215,6 +248,8 @@
   import { copyObj } from '@/utils/util';
   import inventoryTabledetail from '@/BIZComponents/inventoryTableDetails.vue';
   // import fileMain from '@/components/addDoc/index';
+  import { shippingModeOp, transactionMethodsOp } from '@/enum/dict.js';
+  import PaymentCollectionPlan from '@/BIZComponents/paymentCollectionPlan/Index.vue'
   const payType = [
     {
       label: '预付款',
@@ -232,7 +267,8 @@
   export default {
     mixins: [dictMixins],
     components: {
-      inventoryTabledetail
+      inventoryTabledetail,
+      PaymentCollectionPlan
       // fileMain
     },
     props: {
@@ -242,6 +278,8 @@
     },
     data() {
       return {
+        shippingModeOp,
+        transactionMethodsOp,
         visible: false,
         detailId: '',
         title: '详情',
@@ -513,6 +551,7 @@
         this.loading = false;
         if (data) {
           this.detailData = data;
+          data.contractVO.settlementDate = data.contractVO.startSettlementDate ? [data.contractVO.startSettlementDate, data.contractVO.endSettlementDate] : [];
           this.form = data.contractVO;
           // if (this.form.fileId) {
           //     this.form.fileId = JSON.parse(this.form.fileId);
@@ -522,6 +561,11 @@
               ...data,
               ...data.contractVO
             });
+          const receiptData = {
+            receiptPaymentList: data.receiptPaymentList,
+            payAmount: data.contractVO.discountTotalPrice
+          }
+          this.$refs.paymentCollectionPlanRef && this.$refs.paymentCollectionPlanRef.putTableValue(receiptData);
           console.log(this.form.type);
         }
       }

+ 213 - 47
src/views/bpm/handleTask/components/financialManage/invoiceManage/components/addOrEditDialog.vue

@@ -3,8 +3,8 @@
     <el-form ref="form" :rules="rules" :model="form" label-width="130px">
       <headerTitle title="基本信息"></headerTitle>
       <el-row :gutter="12">
-        <el-row :gutter="12">
-          <el-col :span="12">
+        <!-- <el-row :gutter="12"> -->
+          <el-col :span="8">
             <el-form-item label="发票类型" prop="type">
               <el-select
                 v-model="form.type"
@@ -13,53 +13,47 @@
                 clearable
                 style="width: 100%"
               >
-                <el-option label="开票" :value="1"></el-option>
-                <el-option label="收票" :value="2"></el-option>
+                <el-option label="开票" value="1"></el-option>
+                <el-option label="收票" value="2"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="8">
             <el-form-item label="来源类型" prop="sourceType">
               <el-select
                 v-model="form.sourceType"
                 :disabled="true"
                 style="width: 100%"
               >
-                <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="5"></el-option>
-                <el-option label="应付" :value="4"></el-option>
+                <el-option label="收款计划" :value="6"></el-option>
+                <el-option label="付款计划" :value="7"></el-option>
+                <el-option label="应收管理" :value="5"></el-option>
+                <el-option label="应付管理" :value="4"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.sourceType == 1">
-            <el-form-item label="对账单" prop="sourceCode">
+          <el-col :span="8" v-if="form.sourceType == 6">
+            <el-form-item label="收款计划" prop="sourceCode">
               <el-input v-model="form.sourceCode" :disabled="true"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.sourceType == 2">
-            <el-form-item label="合同" prop="sourceCode">
+          <el-col :span="8" v-if="form.sourceType == 7">
+            <el-form-item label="付款计划" prop="sourceCode">
               <el-input v-model="form.sourceCode" :disabled="true"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.sourceType == 3">
-            <el-form-item label="订单" prop="sourceCode">
+          <el-col :span="8" v-if="form.sourceType == 5">
+            <el-form-item label="应收管理" prop="sourceCode">
               <el-input v-model="form.sourceCode" :disabled="true"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.sourceType == 5">
-            <el-form-item label="应" prop="sourceCode">
+          <el-col :span="8" v-if="form.sourceType == 4">
+            <el-form-item label="应付管理" prop="sourceCode">
               <el-input v-model="form.sourceCode" :disabled="true"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.sourceType == 4">
-            <el-form-item label="应付" prop="sourceCode">
-              <el-input v-model="form.sourceCode" :disabled="true"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="金额" prop="amount">
+          <el-col :span="8">
+            <el-form-item label="发票金额" prop="amount">
               <el-input-number
                 v-model="form.amount"
                 :precision="2"
@@ -70,8 +64,16 @@
               ></el-input-number>
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-col :span="12">
+          <el-col :span="8">
+            <el-form-item label="发票号" prop="invoiceNos">
+              <el-input
+                v-model="form.invoiceNos"
+                disabled
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        <!-- </el-row> -->
+        <el-col :span="8">
           <el-form-item label="申请部门" prop="applyDeptId">
             <ele-tree-select
               disabled
@@ -86,7 +88,7 @@
             />
           </el-form-item>
         </el-col>
-        <el-col :span="12">
+        <el-col :span="8">
           <el-form-item label="申请人" prop="applyUserId">
             <personSelect
               disabled
@@ -97,8 +99,8 @@
           </el-form-item>
         </el-col>
 
-        <el-col :span="12">
-          <el-form-item label="预计开票日期">
+        <el-col :span="8">
+          <el-form-item label="开票日期">
             <el-date-picker
               disabled
               style="width: 100%"
@@ -109,7 +111,7 @@
             </el-date-picker>
           </el-form-item>
         </el-col>
-        <el-col :span="12">
+        <el-col :span="8">
           <el-form-item
             v-if="taskDefinitionKey != 'starter'"
             label="会计科目"
@@ -129,7 +131,7 @@
             />
           </el-form-item>
         </el-col>
-        <el-col :span="12" :gutter="12" v-if="taskDefinitionKey != 'starter'">
+        <el-col :span="8" :gutter="12" v-if="taskDefinitionKey != 'starter'">
           <el-form-item label="发票类型" prop="category">
             <el-radio disabled v-model="form.category" :label="2"
               >增值税普通发票</el-radio
@@ -140,7 +142,7 @@
           </el-form-item>
         </el-col>
 
-        <el-col :span="12" :gutter="12" v-if="taskDefinitionKey != 'starter'">
+        <el-col :span="8" :gutter="12" v-if="taskDefinitionKey != 'starter'">
           <el-form-item
             prop="files"
             label="发票附件"
@@ -174,6 +176,9 @@
           <el-form-item label="地址" prop="companyAddress">
             <el-input v-model="form.companyAddress" disabled></el-input>
           </el-form-item>
+          <el-form-item label="联系人" prop="companyContactName">
+            <el-input v-model="form.companyContactName" disabled></el-input>
+          </el-form-item>
           <el-form-item label="电话号码" prop="companyTel">
             <el-input v-model="form.companyTel" disabled></el-input>
           </el-form-item>
@@ -204,20 +209,81 @@
           <el-form-item label="地址" prop="receiverAddress">
             <el-input v-model="form.receiverAddress" disabled></el-input>
           </el-form-item>
+          <el-form-item label="联系人" prop="receiverContactName">
+            <el-input v-model="form.receiverContactName" disabled></el-input>
+          </el-form-item>
           <el-form-item label="电话号码" prop="receiverTel">
             <el-input v-model="form.receiverTel" disabled></el-input>
           </el-form-item>
         </el-col>
       </el-row>
     </el-form>
-    <headerTitle title="关联信息"></headerTitle>
+    <!-- <headerTitle title="关联信息"></headerTitle>
     <table-info
       v-if="form.detailList.length"
       :dialogType="taskDefinitionKey != 'starter' ? 'view' : 'update'"
       :form="form"
       ref="table"
       @setPrice="setPrice"
-    ></table-info>
+    ></table-info> -->
+    <div style="margin-top: 20px; margin-bottom: 20px;">
+        <headerTitle title="收款计划信息"></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) {
+                        callback('开票金额必须大于0');  
+                      } else {
+                        callback();
+                      }
+                    },
+                    trigger: 'blur'
+                  }
+                ]"
+              >  -->
+                <span v-if="dialogType === 'view'">{{ scope.row.invoiceAmount }}</span>
+                <!-- <el-input :min="0" :max="scope.row.planPaymentAmount" v-limit="{ min: 0, max: scope.row.planPaymentAmount }" 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>
+    <headerTitle title="关联物品清单信息"></headerTitle>
+    <!-- <table-info
+      v-if="dialogType != 'add' && form.detailList.length"
+      dialogType="view"
+      :form="form"
+      ref="table"
+    ></table-info> -->
+   <table-info-new
+      dialogType="view"
+      ref="tableInfoNewRef"
+    ></table-info-new>
   </div>
 </template>
 <script>
@@ -229,10 +295,14 @@
   import { getTreeByPid } from '@/api/classifyManage';
   import {
     invoiceApplyInfoAPI,
-    invoiceApplyUpdateAPI
+    invoiceApplyUpdateAPI,
+    invoiceApplyUpdateV2API
   } from '@/api/bpm/components/financialManage/invoiceManage';
   // import fileMain from '@/components/addDoc/index.vue';
   import { parameterGetByCode } from '@/api/main/index.js';
+  import { paymentTypeOp } from '@/enum/dict';
+  import { invoiceApplyInfoV2API } from '@/api/bpm/components/financialManage/invoiceManage';
+  import tableInfoNew from './tableInfoNew.vue';
 
   export default {
     name: 'add-or-edit-dialog',
@@ -240,7 +310,8 @@
       // fileMain,
       fileUpload,
       personSelect,
-      tableInfo
+      tableInfo,
+      tableInfoNew
     },
     props: {
       businessId: {
@@ -256,12 +327,103 @@
       };
     },
     computed: {
-      ...mapGetters(['user'])
+      ...mapGetters(['user']),
+      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: 160,
+            prop: 'invoiceAmount',
+            label: '开票金额',
+            align: 'center',
+            slot: 'invoiceAmount',
+            fixed: 'right'
+          }
+        ];
+      },
     },
     data() {
       return {
         dialogType: '',
         title: '',
+        paymentTypeOp,
         form: {
           salesCompanyUsc: '',
           salesCompanyBankBranchNo: '',
@@ -335,7 +497,10 @@
       },
       //获取详情
       async getInfo(id) {
-        this.form = await invoiceApplyInfoAPI(id);
+        this.form = await invoiceApplyInfoV2API(id);
+        this.$nextTick(() => {
+          this.$refs.tableInfoNewRef && this.$refs.tableInfoNewRef.putValue(this.form);
+        })
       },
       //获取分类管理中的数据
       async getClassifyList(id, listName) {
@@ -389,16 +554,17 @@
         return new Promise((resolve, reject) => {
           this.$refs.form.validate(async (valid) => {
             if (!valid) return this.$message.warning('有必填项未填,请检查');
-            let tableData = {};
+            // let tableData = {};
             console.log(this.form.sourceType, 'this.form.sourceType');
-            if (this.form.sourceType != 4 && this.form.sourceType != 5) {
-              tableData = await this.$refs.table.getTableValidate();
-            }
-            this.form.link = tableData.link;
-            this.form.detailList = tableData.detailList;
-            const API = invoiceApplyUpdateAPI;
+            // if (this.form.sourceType != 4 && this.form.sourceType != 5) {
+            //   tableData = await this.$refs.table.getTableValidate();
+            // }
+            // this.form.link = tableData.link;
+            // this.form.detailList = tableData.detailList;
+            const API = invoiceApplyUpdateV2API;
             const res = await API(this.form);
-            res.code == '0' ? resolve('1') : reject(new Error(data.message));
+            console.log(res, 'res~~~');
+            res.code == '0' ? resolve('1') : reject(new Error(res.message));
           });
         });
       }

+ 280 - 110
src/views/bpm/handleTask/components/financialManage/invoiceManage/components/detailDialog.vue

@@ -3,110 +3,124 @@
     <el-form ref="form" :model="form" label-width="130px">
       <headerTitle title="基本信息"></headerTitle>
       <el-row :gutter="12">
-        <el-col :span="8">
-          <el-form-item label="发票类型" prop="type">
-            <el-select v-model="form.type" disabled 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 label="来源类型" prop="sourceType">
-            <el-select
-              v-model="form.sourceType"
-              :disabled="true"
-              style="width: 100%"
-            >
-              <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="5"></el-option>
-              <el-option label="应付" :value="4"></el-option>
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8" v-if="form.sourceType == 1">
-          <el-form-item label="对账单" prop="sourceCode">
-            <el-input v-model="form.sourceCode" :disabled="true"></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8" v-if="form.sourceType == 2">
-          <el-form-item label="合同" prop="sourceCode">
-            <el-input v-model="form.sourceCode" :disabled="true"></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8" v-if="form.sourceType == 3">
-          <el-form-item label="订单" prop="sourceCode">
-            <el-input v-model="form.sourceCode" :disabled="true"></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" :disabled="true"></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" :disabled="true"></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="金额" prop="amount">
-            <el-input-number
-              disabled
-              v-model="form.amount"
-              :precision="2"
-              :controls="false"
-              style="width: 100%"
-              :min="0"
-            ></el-input-number>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="申请部门" prop="applyDeptId">
-            <el-input v-model="form.applyDeptName" disabled></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="申请人" prop="applyUserId">
-            <el-input v-model="form.applyUserName" disabled></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"
-              disabled
-              value-format="yyyy-MM-dd"
-            >
-            </el-date-picker>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8" v-if="taskDefinitionKey == 'financeApprove'">
-          <el-form-item label="会计科目" prop="accountingSubjectId">
-            <el-input v-model="form.accountingSubjectName" disabled></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="发票类型" prop="category">
-            <el-radio disabled v-model="form.category" :label="2"
-              >增值税普通发票</el-radio
-            >
-            <el-radio disabled v-model="form.category" :label="1"
-              >增值税专用发票</el-radio
-            >
-          </el-form-item>
-        </el-col>
-        <el-col :span="8" v-if="taskDefinitionKey == 'financeApprove'">
-          <el-form-item prop="files" label="发票附件">
-            <fileMain v-model="form.files" type="view"></fileMain>
-          </el-form-item>
-        </el-col>
-      </el-row>
+          <el-col :span="8">
+            <el-form-item label="发票类型" prop="type">
+              <el-select v-model="form.type" disabled 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 label="来源类型" prop="sourceType">
+              <el-select
+                v-model="form.sourceType"
+                :disabled="true"
+                style="width: 100%"
+              >
+                <el-option label="收款计划" :value="6"></el-option>
+                <el-option label="付款计划" :value="7"></el-option>
+                <el-option label="应收管理" :value="5"></el-option>
+                <el-option label="应付管理" :value="4"></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" :disabled="true"></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" :disabled="true"></el-input>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="8" v-if="form.sourceType == 3">
+            <el-form-item label="订单" prop="sourceCode">
+              <el-input v-model="form.sourceCode" :disabled="true"></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" :disabled="true"></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" :disabled="true"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="发票金额" prop="amount">
+              <el-input
+                disabled
+                v-model="form.amount"
+                :precision="2"
+                type="number"
+                :controls="false"
+                style="width: 100%"
+                :min="0"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="发票号" prop="invoiceNos">
+              <el-input
+                v-model="form.invoiceNos"
+                disabled
+              ></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"
+                disabled
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="申请部门" prop="applyDeptId">
+              <el-input v-model="form.applyDeptName" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="申请人" prop="applyUserId">
+              <el-input v-model="form.applyUserName" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="会计科目" prop="accountingSubjectName">
+              <el-input
+                v-model="form.accountingSubjectName"
+                disabled
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+          <el-form-item label="发票种类" prop="category">
+              <el-select
+                v-model="form.category"
+                clearable
+                disabled
+                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" type="view"></fileMain>
+            </el-form-item>
+          </el-col>
+        </el-row>
       <headerTitle title="发票信息"></headerTitle>
       <el-row :gutter="12">
         <el-col :span="12">
@@ -125,6 +139,9 @@
           <el-form-item label="地址" prop="companyAddress">
             <el-input v-model="form.companyAddress" disabled></el-input>
           </el-form-item>
+          <el-form-item label="联系人" prop="companyContactName">
+            <el-input v-model="form.companyContactName" disabled></el-input>
+          </el-form-item>
           <el-form-item label="电话号码" prop="companyTel">
             <el-input v-model="form.companyTel" disabled></el-input>
           </el-form-item>
@@ -151,19 +168,73 @@
           <el-form-item label="地址" prop="receiverAddress">
             <el-input v-model="form.receiverAddress" disabled></el-input>
           </el-form-item>
+          <el-form-item label="联系人" prop="receiverContactName">
+            <el-input v-model="form.receiverContactName" disabled></el-input>
+          </el-form-item>
           <el-form-item label="电话号码" prop="receiverTel">
             <el-input v-model="form.receiverTel" disabled></el-input>
           </el-form-item>
         </el-col>
       </el-row>
     </el-form>
-    <headerTitle title="关联信息"></headerTitle>
-    <table-info
+    <div style="margin-top: 20px; margin-bottom: 20px;">
+        <headerTitle title="收款计划信息"></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) {
+                        callback('开票金额必须大于0');  
+                      } else {
+                        callback();
+                      }
+                    },
+                    trigger: 'blur'
+                  }
+                ]"
+              >  -->
+                <span v-if="dialogType === 'view'">{{ scope.row.invoiceAmount }}</span>
+                <!-- <el-input :min="0" :max="scope.row.planPaymentAmount" v-limit="{ min: 0, max: scope.row.planPaymentAmount }" 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>
+    <headerTitle title="关联物品清单信息"></headerTitle>
+    <!-- <table-info
       v-if="dialogType != 'add' && form.detailList.length"
       dialogType="view"
       :form="form"
       ref="table"
-    ></table-info>
+    ></table-info> -->
+   <table-info-new
+      dialogType="view"
+      ref="tableInfoNewRef"
+    ></table-info-new>
   </div>
 </template>
 
@@ -174,7 +245,9 @@
 
   import personSelect from '@/components/CommomSelect/person-select.vue';
   import tableInfo from './tableInfo.vue';
-  import { invoiceApplyInfoAPI } from '@/api/bpm/components/financialManage/invoiceManage';
+  import { paymentTypeOp } from '@/enum/dict';
+  import { invoiceApplyInfoV2API } from '@/api/bpm/components/financialManage/invoiceManage';
+  import tableInfoNew from './tableInfoNew.vue';
   // import fileMain from "@/components/addDoc/index.vue";
 
   export default {
@@ -183,10 +256,104 @@
       // fileMain,
       tableInfo,
       personSelect,
-      fileUpload
+      fileUpload,
+      tableInfoNew
+    },
+    computed: {
+      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: 160,
+            prop: 'invoiceAmount',
+            label: '开票金额',
+            align: 'center',
+            slot: 'invoiceAmount',
+            fixed: 'right'
+          }
+        ];
+      },
     },
     data() {
       return {
+        paymentTypeOp,
         dialogType: '',
         form: {
           files: []
@@ -207,7 +374,10 @@
     methods: {
       //获取详情
       async getInfo(id) {
-        this.form = await invoiceApplyInfoAPI(id);
+        this.form = await invoiceApplyInfoV2API(id);
+        this.$nextTick(() => {
+          this.$refs.tableInfoNewRef && this.$refs.tableInfoNewRef.putValue(this.form);
+        })
       },
       downloadFile(file) {
         getFile({ objectName: file.storePath }, file.name);

+ 577 - 0
src/views/bpm/handleTask/components/financialManage/invoiceManage/components/tableInfoNew.vue

@@ -0,0 +1,577 @@
+<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: '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: []
+            }
+          ],
+          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)|| [];
+              return {
+                  key: key,
+                  amountTotalPrice: paymentItem.length ? paymentItem.reduce((acc, cur) => acc + cur.invoiceAmount, 0) : 0,
+                  details: data.productMap[key] || []
+              };
+          });
+      },
+      // 校验发票金额
+      invoiceAmountChange(val, item, idx, index) {
+        if(index !=null) {
+          let newData = this.tableForm.detailList[idx].details;
+          let sum =0;
+          newData.forEach((r) => {
+            if (r.ratio) {
+              sum += Number(r.ratio);
+            }
+          });
+          if(sum > this.tableForm.detailList[idx].amountTotalPrice) {
+            this.$message.error('物品开票金额不能大于本次开票合计');
+            this.$set(this.tableForm.detailList[idx].details[index], 'invoiceAmount', '');
+            return;
+          }
+        }
+      },
+      //计算不含税单价
+      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) {
+        console.log('tableInfoNew putValue', data);
+        data.detailList = this.convertToArrayFormat(data);
+        this.tableForm = data;
+      },
+      setValue(data) {
+        data.detailList = this.convertToArrayFormat(data);
+        for(let item of data.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.tableForm = data;
+        console.log('tableInfoNew detailList~~~', data.detailList);
+        // this.$refs.table.reload();
+      },
+      setPrice(row, data) {
+        let index = this.tableForm.detailList.findIndex(item => item.key == row.relatedOrderNo);
+        const paymentItem = data.filter(item => item?.relatedOrderNo == row.relatedOrderNo);
+        this.tableForm.detailList[index].amountTotalPrice = paymentItem.length ? paymentItem.reduce((acc, cur) => acc + +cur.invoiceAmount, 0) : 0;
+
+      },
+      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);
+            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>

+ 2 - 0
src/views/bpm/handleTask/components/financialManage/invoiceManage/submit.vue

@@ -22,6 +22,7 @@
         icon="el-icon-edit-outline"
         type="success"
         size="mini"
+        v-click-once
         @click="handleAudit(1)"
         >通过
       </el-button>
@@ -29,6 +30,7 @@
         icon="el-icon-circle-close"
         type="danger"
         size="mini"
+        v-click-once
         @click="_approveTaskWithVariables(0)"
         >驳回
       </el-button>

+ 81 - 2
src/views/bpm/handleTask/components/purchaseOrder/detailDialog.vue

@@ -59,12 +59,52 @@
             {{ form.purchaseUserName }}
           </el-form-item>
         </el-col>
+
+        <el-col :span="8">
+          <el-form-item label="交易方式" prop="transactionMode">
+              {{ transactionMethodsOp.find(item => item.value == form.transactionMode)?.label }}
+            </el-form-item>
+        </el-col>
+
+        <el-col :span="8">
+          <el-form-item label="发货模式" prop="deliveryMode">
+              {{ shippingModeOp.find(item => item.value == form.deliveryMode)?.label }}
+            </el-form-item>
+        </el-col>
+
         <el-col :span="8">
           <el-form-item label="结算方式:" prop="settlementModeName">
             {{ detailData.settlementModeName }}
           </el-form-item>
         </el-col>
 
+        <el-col :span="8" v-if="form.settlementMode == 1">
+          <el-form-item label="结算日期范围" prop="settlementDate">
+              {{ form.settlementDate }}
+            </el-form-item>
+        </el-col>
+
+        <el-col :span="8" v-if="form.settlementMode == 2">
+          <el-form-item label="结算月份范围" prop="settlementDate">
+              {{ form.settlementDate }}
+            </el-form-item>
+        </el-col>
+
+        <el-col :span="8" v-if="form.settlementMode == 2">
+          <el-form-item label="收款日期" prop="receiptDate">
+              每月{{ form.receiptDate }}日
+            </el-form-item>
+        </el-col>
+
+        <el-col :span="8">
+          <el-form-item
+              label="期数"
+              prop="issueNumber"
+            >
+              {{ form.issueNumber }}期
+            </el-form-item>
+        </el-col>
+
         <el-col :span="8">
           <el-form-item label="优惠总金额:" prop="payAmount">
             {{ form.payAmount }}元
@@ -211,6 +251,16 @@
         </ele-pro-table>
       </el-tab-pane>
     </el-tabs>
+
+    <headerTitle
+        title="收款计划"
+        style="margin-top: 30px"
+      ></headerTitle>
+      <PaymentCollectionPlan
+        ref="paymentCollectionPlanRef"
+        menu="sale"
+        type="view"
+      ></PaymentCollectionPlan>
   </div>
 </template>
 
@@ -222,11 +272,13 @@
   // import fileMain from '@/components/addDoc/index.vue';
   import { orderSourceType, outsourceSceneList } from '@/enum/dict';
   import { lbjtList } from '@/enum/dict.js';
-  import { levelList, pricingWayList } from '@/enum/dict.js';
+  import { levelList, pricingWayList, quoteTypeOp } from '@/enum/dict.js';
   import tableColumnsMixin from '@/mixins/tableColumnsMixin.js';
+  import { shippingModeOp, transactionMethodsOp } from '@/enum/dict.js';
+  import PaymentCollectionPlan from '@/BIZComponents/paymentCollectionPlan/Index.vue'
   export default {
     mixins: [dictMixins, tableColumnsMixin],
-    // components: { fileMain },
+    components: { PaymentCollectionPlan },
     props: {
       businessId: {
         default: ''
@@ -234,7 +286,10 @@
     },
     data() {
       return {
+        quoteTypeOp,
         cacheKeyUrl: 'purchase-order-bizcomponent-InventoryTableDetails',
+        shippingModeOp, 
+        transactionMethodsOp,
         orderSourceType,
         outsourceSceneList,
         visible: false,
@@ -519,6 +574,28 @@
             label: '不含税单价',
             align: 'center'
           },
+          {
+            width: 150,
+            prop: 'quoteWay',
+            label: '报价方式',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              return this.quoteTypeOp.find((item) => item.value == _row.quoteWay)
+                ?.label || '';
+            }
+          },
+          {
+            width: 150,
+            prop: 'discountRatio',
+            label: '折让比例',
+            align: 'center',
+            isNone: !this.isDiscount,
+            formatter: (_row, _column, cellValue) => {
+              return _row.discountRatio
+                ? Number(_row.discountRatio).toFixed(2) + '%'
+                : '';
+            }
+          },
           {
             width: 160,
             prop: 'discountSinglePrice',
@@ -840,8 +917,10 @@
         const data = await getpurchaseorderDetail(id);
         this.loading = false;
         if (data) {
+          data.settlementDate = data.startSettlementDate ? [data.startSettlementDate, data.endSettlementDate] : [];
           this.form = data;
           this.detailData = data;
+          this.$refs.paymentCollectionPlanRef && this.$refs.paymentCollectionPlanRef.putTableValue(data);
         }
       }
     }

+ 2 - 0
src/views/bpm/handleTask/components/purchaseOrder/submit.vue

@@ -23,6 +23,7 @@
         icon="el-icon-edit-outline"
         type="success"
         size="mini"
+        v-click-once
         @click="handleAudit(1)"
         >通过
       </el-button>
@@ -30,6 +31,7 @@
         icon="el-icon-circle-close"
         type="danger"
         size="mini"
+        v-click-once
         @click="handleAudit(0)"
         v-if="!['starter', 'starterFillApprove'].includes(taskDefinitionKey)"
         >驳回

+ 61 - 16
src/views/bpm/handleTask/components/saleOrder/detailDialog.vue

@@ -37,15 +37,22 @@
               }}
             </el-form-item>
 
-            <el-form-item label="结算方式:" prop="settlementModeName">
+            <!-- <el-form-item label="结算方式:" prop="settlementModeName">
               {{ detailData.settlementModeName }}
+            </el-form-item> -->
+
+            <el-form-item label="销售类型:" prop="saleTypeName">
+              {{ form.saleTypeName }}
             </el-form-item>
 
             <el-form-item label="客户收货地址:" prop="receiveAddress">
               {{ form.receiveAddress }}
             </el-form-item>
-            <el-form-item label="生产要求:" prop="productionRequirements">
+            <!-- <el-form-item label="生产要求:" prop="productionRequirements">
               {{ form.productionRequirements }}
+            </el-form-item> -->
+            <el-form-item prop="orderFiles" label="订单附件:">
+              <fileMain v-model="detailData.orderFiles" type="view"></fileMain>
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -86,9 +93,12 @@
             <el-form-item label="订单总金额:" prop="totalAmount">
               {{ form.totalAmount }}元
             </el-form-item>
-
-            <el-form-item prop="orderFiles" label="订单附件:">
-              <fileMain v-model="detailData.orderFiles" type="view"></fileMain>
+            
+            <el-form-item label="应付金额:" prop="payAmount">
+              {{ form.payAmount }}元
+            </el-form-item>
+            <el-form-item label="订单备注:" prop="remark">
+              {{ form.remark }}
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -99,15 +109,6 @@
             >
               {{ form.contractNumber }}
             </el-form-item>
-            <el-form-item label="销售类型:" prop="saleTypeName">
-              {{ form.saleTypeName }}
-            </el-form-item>
-            <el-form-item label="应付金额:" prop="payAmount">
-              {{ form.payAmount }}元
-            </el-form-item>
-            <el-form-item label="订单备注:" prop="remark">
-              {{ form.remark }}
-            </el-form-item>
             <el-form-item
               label="总数"
               prop="totalPlanNum"
@@ -116,6 +117,31 @@
               {{ form.totalPlanNum }}
               {{ form.planNumUnit }}
             </el-form-item>
+            <el-form-item label="交易方式" prop="transactionMode">
+              {{ transactionMethodsOp.find(item => item.value == form.transactionMode)?.label }}
+            </el-form-item>
+            <el-form-item label="发货模式" prop="deliveryMode">
+              {{ shippingModeOp.find(item => item.value == form.deliveryMode)?.label }}
+            </el-form-item>
+            <el-form-item label="结算方式" prop="settlementMode">
+              {{ detailData.settlementModeName }}
+            </el-form-item>
+            <el-form-item v-if="form.settlementMode == 1" label="结算日期范围" prop="settlementDate">
+              {{ form.settlementDate }}
+            </el-form-item>
+
+            <el-form-item v-if="form.settlementMode == 2" label="结算月份范围" prop="settlementDate">
+              {{ form.settlementDate }}
+            </el-form-item>
+            <el-form-item  v-if="form.settlementMode == 2" label="收款日期" prop="receiptDate">
+              每月{{ form.receiptDate }}日
+            </el-form-item>
+            <el-form-item
+              label="期数"
+              prop="issueNumber"
+            >
+              {{ form.issueNumber }}期
+            </el-form-item>
           </el-col>
         </el-row>
         <headerTitle title="基本信息"></headerTitle>
@@ -221,6 +247,16 @@
         ref="typeListRef"
         type="view"
       ></typeList>
+
+      <headerTitle
+        title="收款计划"
+        style="margin-top: 30px"
+      ></headerTitle>
+      <PaymentCollectionPlan
+        ref="paymentCollectionPlanRef"
+        menu="sale"
+        type="view"
+      ></PaymentCollectionPlan>
     </div>
     <div v-show="activeComp == '1'">
       <bomList :tableList="orderBomList2"></bomList>
@@ -240,12 +276,15 @@
   import inventoryTabledetail from '@/BIZComponents/inventoryTableDetails.vue';
   import typeList from './typeList.vue';
   import bomList from './bomList.vue';
+  import { shippingModeOp, transactionMethodsOp } from '@/enum/dict.js';
+  import PaymentCollectionPlan from '@/BIZComponents/paymentCollectionPlan/Index.vue'
   export default {
     mixins: [dictMixins],
     components: {
       inventoryTabledetail,
       typeList,
-      bomList
+      bomList,
+      PaymentCollectionPlan
     },
     props: {
       businessId: {
@@ -266,7 +305,9 @@
         detailData: {},
         orderBomList1: [], //生产计划
         orderBomList2: [], //生产性物资采购
-        orderBomList3: [] //客供料外协采购
+        orderBomList3: [], //客供料外协采购
+        shippingModeOp,
+        transactionMethodsOp
       };
     },
     created() {
@@ -278,7 +319,9 @@
         const data = await getSaleOrderDetail(id);
         this.loading = false;
         if (data) {
+          data.settlementDate = data.startSettlementDate ? `${data.startSettlementDate} - ${data.endSettlementDate}` : ''
           this.form = data;
+          
           this.detailData = data;
           this.orderBomList1 = data.orderBomList.filter(
             (item) => item.disposeType === 1
@@ -304,6 +347,8 @@
               this.$refs.inventoryTabledetailRef.putTableValue(data);
             this.$refs.typeListRef &&
               this.$refs.typeListRef.putTableValue(data.typedetailList);
+            this.$refs.paymentCollectionPlanRef &&
+              this.$refs.paymentCollectionPlanRef.putTableValue(data);
           });
         }
       }

+ 2 - 0
src/views/bpm/handleTask/components/saleOrder/submit.vue

@@ -23,6 +23,7 @@
         icon="el-icon-edit-outline"
         type="success"
         size="mini"
+        v-click-once
         @click="handleAudit(1)"
         >通过
       </el-button>
@@ -30,6 +31,7 @@
         icon="el-icon-circle-close"
         type="danger"
         size="mini"
+        v-click-once
         @click="handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回