Browse Source

feat: 对账单功能

liujt 3 weeks ago
parent
commit
5d50f001ae

+ 11 - 0
src/api/saleManage/accountstatement.js

@@ -191,4 +191,15 @@ export async function getStatementRecordListAPI(data) {
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 对账单 查询待导入的账单明细 库存
+ */
+export async function getStatementRecordSummaryAPI(data) {
+  const res = await request.post(`/eom/accountstatement/getStatementRecordSummary`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }

+ 4 - 3
src/views/financialManage/advanceReceipt/components/addDialog.vue

@@ -546,9 +546,10 @@
       },
 
       async sub(res) {
-        const data = await getAdvanceReceiptInfo(
-          this.businessId || res
-        );
+        console.log('sub', res, this.businessId)
+        const data = await getAdvanceReceiptInfo({
+          id: this.businessId || res
+        });
         submit(data.id).then(() => {
           this.$message.success('提交成功');
         })

+ 9 - 1
src/views/financialManage/collectionPlan/index.vue

@@ -100,6 +100,14 @@
               <!-- 操作列 -->
               <template v-slot:action="{ row }">
                 <el-link
+                  type="primary"
+                  :underline="false"
+                  icon="el-icon-plus"
+                  @click="openEdit(row, 'single')"
+                >
+                  确认收款
+                </el-link>
+                <!-- <el-link
                   type="primary"
                   :underline="false"
                   icon="el-icon-plus"
@@ -107,7 +115,7 @@
                   @click="openEdit(row, 'single')"
                 >
                   新增发票
-                </el-link>
+                </el-link> -->
               </template>
             </ele-pro-table>
           </div>

+ 2 - 2
src/views/financialManage/prepayment/components/addDialog.vue

@@ -197,7 +197,7 @@
        <div style="margin-top: 20px" v-if="isDetail">
         <headerTitle title="付款信息"></headerTitle>
         <div style="margin: 10px 0; font-size: 14px; color: #606266;">
-          <span>预付金额:{{ form.prepayTotalPrice || 0 }} 元</span>
+          <span>预付金额:{{ form.amount || 0 }} 元</span>
           <span style="margin-left: 20px;">已付金额:{{ paidAmount }} 元</span>
           <span style="margin-left: 20px;">未付金额:{{ unpaidAmount }} 元</span>
         </div>
@@ -536,7 +536,7 @@
 
           const saveOrUpdate = this.isUpdate ? updatePrepayment : addPrepayment;
           saveOrUpdate(params)
-            .then(() => {
+            .then((res) => {
               this.loading = false;
               this.$message.success(this.isUpdate ? '修改成功' : '新增成功');
               console.log('sub', type)

+ 623 - 0
src/views/financialManage/receivableManage/components/addReceivableDialog.vue

@@ -0,0 +1,623 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible="visible"
+    :title="title"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    :maxable="true"
+    :resizable="true"
+    width="85%"
+    :before-close="cancel"
+  >
+    <div v-loading="loading">
+      <!--基本信息-->
+      <headerTitle title="基本信息" style="margin-top: 30px"></headerTitle>
+      <el-form ref="form" :model="dataForm" :rules="rules" label-width="120px">
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="会计科目:" prop="accountingSubjectId">
+              <ele-tree-select
+                clearable
+                :disabled="isDetail"
+                filterable
+                ref="treeSelect"
+                :data="accountingSubjectList"
+                v-model="dataForm.accountingSubjectId"
+                valueKey="id"
+                labelKey="name"
+                placeholder="请选择"
+                @change="changeSubjectInfo"
+                default-expand-all
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+              label="应收日期"
+              prop="date"
+            >
+              <el-date-picker
+                :disabled="dialogType == 'view'"
+                v-model="dataForm.date"
+                value-format="yyyy-MM-dd"
+                type="date"
+                style="width: 100%"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="receivablePrice" label="应收金额">
+              <el-input disabled v-model="dataForm.receivablePrice"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item prop="invoiceCode" label="发票编码">
+              <el-input disabled v-model="dataForm.invoiceCode"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="invoiceNo" label="发票号">
+              <el-input disabled v-model="dataForm.invoiceNo"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="createUserName" label="发票种类">
+              <el-select
+                :disabled="dialogType == 'view' || !!saleOrderData?.id"
+                clearable
+                class="ele-block"
+                v-model="dataForm.sourceType"
+                placeholder="请选择"
+              >
+                <el-option label="客户" :value="1" />
+                <!--            <el-option label="项目" :value="2"/>-->
+                <!-- <el-option label="合同" :value="4" /> -->
+
+                <el-option label="销售订单" :value="3" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item prop="createUserName" label="公司名称">
+              <el-input disabled v-model="dataForm.price"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="来源类型" prop="sourceType">
+              <el-select
+                :disabled="dialogType == 'view' || !!saleOrderData?.id"
+                clearable
+                class="ele-block"
+                v-model="dataForm.sourceType"
+                placeholder="请选择"
+              >
+                <el-option label="客户" :value="1" />
+                <!--            <el-option label="项目" :value="2"/>-->
+                <!-- <el-option label="合同" :value="4" /> -->
+
+                <el-option label="销售订单" :value="3" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="createUserName" label="来源编码">
+              <el-input disabled v-model="dataForm.price"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item prop="createTime" label="备注">
+              <el-input disabled v-model="dataForm.createTime"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item prop="repliedFiles" label="附件">
+              <fileMain v-model="dataForm.repliedFiles" type="view"></fileMain>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <headerTitle title="应收信息" style="margin-top: 30px"></headerTitle>
+      <receivable-info
+        :dataForm.sync="dataForm"
+        :receivableList.sync="receivableList"
+        :dialogType="dialogType"
+        @addAdvanceReceipt="addAdvanceReceipt"
+        ref="receivableInfoRef"
+      ></receivable-info>
+
+      <headerTitle title="对账明细" style="margin-top: 30px">
+        <!-- <template v-slot>
+          <el-row style="font-weight: 700; color: red">
+            <span>订单总金额:</span>
+            <span>{{ isNonDirectionalSale ? '--' : dataForm.orderTotalAmount || 0 }}</span>
+            <el-divider direction="vertical"></el-divider>
+            <span>已对账金额:</span>
+            <span>{{ dataForm.amountCompletePrice || 0 }}</span>
+            <el-divider direction="vertical"></el-divider>
+            <span>未对账金额:</span>
+            <span>{{ dataForm.amountUnCompletePrice || 0 }}</span>
+            <el-divider direction="vertical"></el-divider>
+            <span>本次对账总金额:</span>
+            <span>{{ dataForm.amountTotalPrice || 0 }}</span>
+          </el-row>
+        </template> -->
+      </headerTitle>
+      <!-- <recorpayTableList
+        ref="recorpayListRef"
+        :dataForm="dataForm"
+        :recorpayList.sync="recorpayList"
+        :dialogType="dialogType"
+      ></recorpayTableList> -->
+      <account-detail-table
+        ref="accountDetailTableRef"
+        :datasource.sync="datasource"
+        :dialogType="dialogType"
+        :queryDimension="dataForm.queryDimension"
+        @totalChange="handleTotalChange"
+        @countChange="handleCountChange"
+      ></account-detail-table>
+    </div>
+    <advance-receipt-select-dialog
+      ref="advanceReceiptSelectRef"
+      :contactId="dataForm.contactId"
+      @changeParent="onAdvanceReceiptSelected"
+    ></advance-receipt-select-dialog>
+    <div slot="footer" class="footer">
+      <el-button
+        v-if="dialogType !== 'view'"
+        type="primary"
+        @click="save"
+        v-click-once
+        >保存
+      </el-button>
+      <el-button
+        v-if="dialogType !== 'view'"
+        type="primary"
+        @click="save('sub')"
+        v-click-once
+        >提交
+      </el-button>
+      <el-button @click="cancel">返回</el-button>
+    </div>
+    <process-submit-dialog
+      :processSubmitDialogFlag.sync="processSubmitDialogFlag"
+      v-if="processSubmitDialogFlag"
+      ref="processSubmitDialogRef"
+      @reload="reload"
+    ></process-submit-dialog>
+  </ele-modal>
+</template>
+
+<script>
+  import AccountDetailTable from '@/views/saleManage/saleOrder/accountstatement/components/accountDetailTable.vue';
+  import ReceivableInfo from '@/views/saleManage/saleOrder/accountstatement/components//receivableInfo.vue';
+  import AdvanceReceiptSelectDialog from '@/views/saleManage/saleOrder/accountstatement/components//advanceReceiptSelectDialog.vue';
+
+  import saleForm from '@/views/saleManage/saleOrder/accountstatement/components/saleForm.vue';
+  import {
+    getStatementRecordListAPI,
+    infoAccountStatementAPI,
+    saveAccountStatementAPI,
+    createAccountStatementAPI,
+    updateAccountStatementAPI,
+    accountstatementInfoAPI,
+    accountstatementUpdateAPI
+  } from '@/api/saleManage/accountstatement';
+  import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+  import { paymentTypeOp } from '@/enum/dict';
+  import { getTreeByPid } from '@/api/classifyManage';
+
+  export default {
+    name: 'addReceivableDialog',
+    components: {
+      processSubmitDialog,
+      AccountDetailTable,
+      ReceivableInfo,
+      AdvanceReceiptSelectDialog,
+      saleForm
+    },
+    //客户管理数据
+    props: {
+      visible: {
+        type: Boolean,
+        default: false
+      },
+      contactData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      saleOrderData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      }
+    },
+    data() {
+      return {
+        paymentTypeOp,
+        fullscreen: false,
+        loading: false,
+        saveLoading: false,
+        datasource: [],
+        recorpayList: [],
+        receivableList: [],
+        accountingSubjectList: [],
+        isDetail: false,
+        dataForm: {
+          sourceType: 1,
+          dateType: 1,
+          queryDimension: 1,
+          dateValue: '',
+          contactId: '',
+          contactName: '',
+          sourceName: '',
+          sourceId: '',
+          type: '',
+          year: '',
+          quarter: '',
+          month: '',
+          dateTimeRange: [],
+          orderNo: '',
+          orderId: '',
+          id: '',
+          startDate: '',
+          endDate: '',
+          repliedFiles: [],
+          // 应收信息字段
+          fundType: 2,
+          transactionMethod: 1,
+          collectionTerms: '',
+          receiptStatus: 0,
+          totalAdvanceConfirmAmount: 0,
+          totalReceivableAmount: 0
+        },
+        rules: {
+          sourceType: { required: true, message: '请选择', trigger: 'change' },
+          contactId: { required: true, message: '请选择', trigger: 'change' },
+          projectId: { required: true, message: '请选择', trigger: 'change' },
+          orderId: { required: true, message: '请选择', trigger: 'change' },
+          dateType: { required: true, message: '请选择', trigger: 'change' },
+          year: { required: true, message: '请选择', trigger: 'change' },
+          quarter: { required: true, message: '请选择', trigger: 'change' },
+          month: { required: true, message: '请选择', trigger: 'change' },
+          dateTimeRange: {
+            required: true,
+            message: '请选择',
+            trigger: 'change'
+          },
+          sourceId: { required: true, message: '请选择', trigger: 'change' },
+          contractId: { required: true, message: '请选择', trigger: 'change' },
+          queryDimension: {
+            required: true,
+            message: '请选择',
+            trigger: 'change'
+          }
+        },
+        title: '',
+        processSubmitDialogFlag: false,
+        dialogType: '',
+        businessId: ''
+      };
+    },
+    computed: {
+      isNonDirectionalSale() {
+        return this.datasource.some((item) => item.orderCategory == 4);
+      }
+    },
+    methods: {
+      changeSubjectInfo(val) {
+        const { code, name } = this.$refs.treeSelect.getNodeByValue(val);
+        this.dataForm.accountingSubjectCode = code;
+        this.dataForm.accountingSubjectName = name;
+      },
+      //获取分类管理中的数据
+      async getClassifyList(id, listName) {
+        let res = await getTreeByPid(id);
+        this[listName] = res.data;
+      },
+      handleTotalChange(total) {
+        this.dataForm.amountTotalPrice = total;
+      },
+      handleCountChange(count) {
+        this.dataForm.totalStatementCount = count;
+      },
+      // 新增预收款:打开预收款选择弹窗
+      addAdvanceReceipt() {
+        this.$refs.advanceReceiptSelectRef.open();
+      },
+      // 预收款选择器回调:将选中的预收款映射为应收信息行
+      onAdvanceReceiptSelected(row) {
+        this.receivableList.push({
+          saleOrderNo: row.saleOrderNo || '',
+          advanceReceiptCode: row.advanceReceiptCode || '',
+          fundTypeName: this.fundTypeLabel(row.fundType),
+          unConfirmAmount: +row.unConfirmAmount || 0,
+          // 本次对账预收款确收金额上限取「未对账确收金额」
+          statementAmount: +row.unConfirmAmount || 0,
+          currentConfirmAmount: 0,
+          currentReceivableAmount: 0
+        });
+      },
+      fundTypeLabel(val) {
+        const item = (this.paymentTypeOp || []).find((i) => i.value === val);
+        return item ? item.label : val != null && val !== '' ? String(val) : '';
+      },
+      async open(dialogType, row, type = '') {
+        this.dialogType = dialogType;
+        this.title =
+          dialogType == 'add'
+            ? '新增'
+            : dialogType == 'update'
+            ? '修改'
+            : '详情';
+        this.dataForm.type = type;
+        await this.getClassifyList(24, 'accountingSubjectList');
+        this.$nextTick(() => {
+          if (this.contactData.id) {
+            this.$refs.saleFormRef.getCusInfo(this.contactData);
+          }
+          if (this.saleOrderData.id) {
+            this.$refs.saleFormRef.getOrderInfo(this.saleOrderData);
+          }
+        });
+        if (this.dialogType !== 'add') {
+          this.businessId = row.id;
+          this.getInfo(row);
+        }
+      },
+      //获取对账单详情
+      async getInfo(row) {
+        let data = await accountstatementInfoAPI(row.id);
+        console.log('data~~~', data);
+        // this.recorpayList = data.recorpayList || [];
+        // 解决小数精度丢失问题,使用分进行计算
+        data.orderTotalAmount =
+          data.orderList.reduce(
+            (pre, cur) => pre + Math.round(+cur.orderAmount * 100),
+            0
+          ) / 100;
+        data.amountTotalPrice =
+          data.orderList.reduce(
+            (pre, cur) => pre + Math.round(+cur.statementAmount * 100),
+            0
+          ) / 100;
+        data.amountCompletePrice =
+          data.orderList.reduce(
+            (pre, cur) => pre + Math.round(+cur.statementedAmount * 100),
+            0
+          ) / 100;
+        data.amountUnCompletePrice =
+          data.orderList.reduce(
+            (pre, cur) => pre + Math.round(+cur.unStatementAmount * 100),
+            0
+          ) / 100;
+        data.orderList = data.orderList.map((item) => {
+          item.deliveryProducts = item.deliveryProducts.map((i) => {
+            return {
+              ...i,
+              taxRate: i.taxRate || 0,
+              discountRatio: i.discountRatio || 100,
+              singlePrice: i.singlePrice || 0,
+              originalTotalCount: i.totalCount // 保存原始数量值用于校验
+            };
+          });
+          return item;
+        });
+        this.datasource = data.orderList || [];
+        this.receivableList = data.receivableList || [];
+        this.dataForm = {
+          ...this.dataForm,
+          ...data,
+          fundType: data.fundType || 2,
+          transactionMethod: data.transactionMethod || 1,
+          collectionTerms: data.collectionTerms || '',
+          receiptStatus: data.receiptStatus || 0,
+          totalAdvanceConfirmAmount: data.totalAdvanceConfirmAmount || 0,
+          totalReceivableAmount: data.totalReceivableAmount || 0
+        };
+        switch (this.dataForm.dateType) {
+          case 1:
+            // this.dataForm.year = this.dataForm.dateValue;
+            this.$set(this.dataForm, 'year', this.dataForm.dateValue);
+            break;
+          case 2: {
+            //2023年-四季度
+            let data = this.dataForm.dateValue.split('年-');
+
+            this.$set(this.dataForm, 'year', data[0]);
+            this.$set(this.dataForm, 'quarter', data[1]);
+            break;
+          }
+          case 3:
+            this.$set(this.dataForm, 'month', this.dataForm.dateValue);
+
+            break;
+          default:
+            this.dataForm.dateValue = '';
+            this.$set(this.dataForm, 'dateTimeRange', [
+              this.dataForm.startDate,
+              this.dataForm.endDate
+            ]);
+        }
+        this.$forceUpdate();
+      },
+      //关闭弹窗
+      cancel() {
+        this.$emit('update:visible', false);
+      },
+      //查询获取订单数据
+      async handleSearch(params) {
+        // console.log('this.$refs.inventoryTableRef~~~', this.$refs.inventoryTableref);
+        let searchQuery = {
+          endDate: params.endDate,
+          sourceId: params.sourceId,
+          sourceType: params.sourceType,
+          startDate: params.startDate,
+          queryDimension: params.queryDimension,
+          type: 1
+        };
+
+        // const searchQuery = ["SALES20251225007","SALES20251225005","SALES20251225009"];
+        this.loading = true;
+        try {
+          let data = await getStatementRecordListAPI(searchQuery);
+          console.log(data, 'data');
+          this.loading = false;
+          data = data.map((item) => {
+            item.deliveryProducts = item.deliveryProducts.map((i) => {
+              return {
+                ...i,
+                taxRate: i.taxRate || 0,
+                discountRatio: i.discountRatio || 100,
+                singlePrice: i.singlePrice || 0,
+                originalTotalCount: i.totalCount // 保存原始数量值用于校验
+              };
+            });
+            return item;
+          });
+          this.datasource = data || [];
+
+          console.log(this.datasource, 'this.datasource~~~');
+          // this.recorpayList = data.recorpayList || [];
+          this.dataForm = {
+            ...this.dataForm,
+            // amountPayablePrice: data.amountPayablePrice,
+            // amountReceivablePrice: data.amountReceivablePrice,
+            // amountTotalPrice: data.amountTotalPrice,
+            // amountPayablePass: data.amountPayablePass,
+            // amountReceivablePass: data.amountReceivablePass
+            orderTotalAmount:
+              data.reduce(
+                (pre, cur) => pre + Math.round(+cur.orderAmount * 100),
+                0
+              ) / 100,
+            amountTotalPrice:
+              data.reduce(
+                (pre, cur) => pre + Math.round(+cur.statementAmount * 100),
+                0
+              ) / 100,
+            amountCompletePrice:
+              data.reduce(
+                (pre, cur) => pre + Math.round(+cur.statementedAmount * 100),
+                0
+              ) / 100,
+            amountUnCompletePrice:
+              data.reduce(
+                (pre, cur) => pre + Math.round(+cur.unStatementAmount * 100),
+                0
+              ) / 100
+          };
+          this.$forceUpdate();
+        } catch (error) {
+          this.loading = false;
+        }
+        // if (!this.datasource.length) this.$message.warning('暂无订单信息');
+      },
+      //保存
+      async save(is) {
+        if (!this.datasource.length)
+          return this.$message.warning('暂无对账信息');
+
+        try {
+          // 校验明细表与应收信息表单
+          await this.$refs.accountDetailTableRef.getValidForm();
+          await this.$refs.receivableInfoRef.validate();
+
+          let api =
+            this.dialogType == 'add'
+              ? createAccountStatementAPI
+              : accountstatementUpdateAPI;
+          const totalAdvanceConfirmAmount =
+            this.receivableList.reduce(
+              (pre, cur) =>
+                pre + Math.round((+cur.currentConfirmAmount || 0) * 100),
+              0
+            ) / 100;
+          const totalReceivableAmount =
+            Math.round(
+              ((+this.dataForm.amountTotalPrice || 0) -
+                totalAdvanceConfirmAmount) *
+                100
+            ) / 100;
+          let params = {
+            ...this.dataForm,
+            totalAdvanceConfirmAmount,
+            totalReceivableAmount,
+            orderList: this.datasource,
+            receivableList: this.receivableList
+            // recorpayList: this.recorpayList
+          };
+          this.saveLoading = true;
+          let data = await api(params);
+          if (is == 'sub') {
+            await this.submitApprove(data);
+            return;
+            // await submitAccountStatementApproveAPI({
+            //   businessId: data,
+            //   type: this.dataForm.type
+            // });
+          }
+          this.$message.success('操作成功');
+          this.reload();
+          this.saveLoading = false;
+        } catch (error) {
+          console.error('保存失败:', error);
+          // 错误提示已经在 getValidForm 方法中处理
+          this.saveLoading = false;
+        }
+      },
+      async submitApprove(res) {
+        console.log(res, 'res~~~');
+        console.log(this.businessId || res, 'this.businessId || res');
+        const data = await accountstatementInfoAPI(this.businessId || res);
+        console.log(data, 'data~~~');
+        this.processSubmitDialogFlag = true;
+        this.$nextTick(() => {
+          const params = {
+            businessId: data.id,
+            businessKey: 'sales_account_statement_approve',
+            formCreateUserId: data.createUserId,
+            variables: {
+              type: data.type,
+              businessCode: data.statementNo,
+              businessName: data.contactName,
+              businessType: '对账单'
+            }
+            // callBackMethodType : '1',
+            // callBackMethod : 'proTargetPlanApproveApiImpl.updatePlanApprovalStatus',
+            // pcHandle : '/bpm/handleTask/components/project-manage/plan-manage/submit.vue',
+            // pcView : '/bpm/handleTask/components/project-manage/plan-manage/detailDialog.vue',
+            // miniHandle : '',
+            // miniView : '',
+          };
+          this.$refs.processSubmitDialogRef.init(params);
+        });
+      },
+      reload() {
+        this.cancel();
+        //刷新主页面
+        this.$emit('done');
+      }
+    }
+  };
+</script>
+<style scoped lang="scss">
+  ::v-deep.el-divider {
+    margin: 10px;
+    font-weight: bold;
+  }
+</style>

+ 34 - 33
src/views/saleManage/saleOrder/accountstatement/components/accountDetailTable.vue

@@ -1,37 +1,5 @@
 <template>
   <div class="account-detail-table">
-    <div class="detail-toolbar">
-      <el-button
-        v-if="!isView"
-        type="primary"
-        size="small"
-        @click="batchSetTaxRate"
-        >批量设置税率</el-button
-      >
-      <el-button
-        v-if="!isView"
-        type="primary"
-        size="small"
-        @click="batchSetPrice"
-        >批量设置单价</el-button
-      >
-      <el-button
-        v-if="!isView"
-        type="primary"
-        size="small"
-        @click="batchSetDiscount"
-        >批量设置折让比例</el-button
-      >
-      <div class="summary-info">
-        <span
-          >本次总对账金额:<b>{{ totalStatementAmount }}</b> 元</span
-        >
-        <span
-          >本次总对账数量:<b>{{ totalStatementCount }}</b></span
-        >
-      </div>
-    </div>
-
     <el-form ref="detailForm" :model="{ flatList }">
       <ele-pro-table
         ref="detailTable"
@@ -43,6 +11,39 @@
         cache-key="account-detail-table"
         class="time-form"
       >
+        <template v-slot:toolbar>
+          <div class="detail-toolbar">
+            <el-button
+              v-if="!isView"
+              type="primary"
+              size="small"
+              @click="batchSetTaxRate"
+              >批量设置税率</el-button
+            >
+            <el-button
+              v-if="!isView"
+              type="primary"
+              size="small"
+              @click="batchSetPrice"
+              >批量设置单价</el-button
+            >
+            <el-button
+              v-if="!isView"
+              type="primary"
+              size="small"
+              @click="batchSetDiscount"
+              >批量设置折让比例</el-button
+            >
+            <div class="summary-info">
+              <span
+                >本次总对账金额:<b>{{ totalStatementAmount }}</b> 元</span
+              >
+              <span
+                >本次总对账数量:<b>{{ totalStatementCount }}</b></span
+              >
+            </div>
+          </div>
+        </template>
         <template v-slot:statementCount="scope">
           <el-form-item
             :prop="'flatList.' + scope.$index + '.statementCount'"
@@ -565,7 +566,7 @@
   .account-detail-table {
     .detail-toolbar {
       display: flex;
-      justify-content: space-between;
+      justify-content: flex-start;
       align-items: center;
       margin-bottom: 10px;
       .summary-info {

+ 2 - 2
src/views/saleManage/saleOrder/accountstatement/components/addAccountDialog.vue

@@ -101,7 +101,7 @@
 
   import saleForm from './saleForm.vue';
   import {
-    getStatementRecordListAPI,
+    getStatementRecordSummaryAPI,
     infoAccountStatementAPI,
     saveAccountStatementAPI,
     createAccountStatementAPI,
@@ -333,7 +333,7 @@
         // const searchQuery = ["SALES20251225007","SALES20251225005","SALES20251225009"];
         this.loading = true;
         try {
-          let data = await getStatementRecordListAPI(searchQuery);
+          let data = await getStatementRecordSummaryAPI(searchQuery);
           console.log(data, 'data');
           this.loading = false;
           data = data.map((item) => {

+ 42 - 17
src/views/saleManage/saleOrder/accountstatement/components/receivableInfo.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="receivable-info">
-    <el-form ref="form" :model="dataForm" :rules="rules" label-width="150px">
+    <el-form ref="form" :model="dataForm" :rules="rules" label-width="160px">
       <el-row>
         <el-col :span="8">
           <el-form-item label="总对账预收款确收金额">
@@ -54,22 +54,16 @@
         </el-col>
         <el-col :span="8">
           <el-form-item label="收款条件" prop="collectionTerms">
-            <el-select
-              v-model="collectionTerms"
+            <el-input
+              clearable
+              v-model="paymentConditionName"
+              @click.native="openReceiveTerms"
               placeholder="请选择"
-              class="ele-block"
-              :disabled="isView"
-            >
-              <el-option
-                v-for="item in collectionTermsOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
+              readonly
+            />
           </el-form-item>
         </el-col>
-        <el-col :span="8" v-if="isView">
+        <!-- <el-col :span="8" v-if="isView">
           <el-form-item label="收款状态">
             <el-select
               v-model="receiptStatus"
@@ -85,11 +79,11 @@
               />
             </el-select>
           </el-form-item>
-        </el-col>
+        </el-col> -->
       </el-row>
     </el-form>
 
-    <div class="receivable-table-header">
+    <!-- <div class="receivable-table-header">
       <el-button
         v-if="!isView"
         type="primary"
@@ -98,7 +92,7 @@
         icon="el-icon-plus"
         >新增预收款</el-button
       >
-    </div>
+    </div> -->
     <el-form :model="{ receivableList }" ref="tableForm">
       <ele-pro-table
         ref="receivableTable"
@@ -140,6 +134,8 @@
         </template>
       </ele-pro-table>
     </el-form>
+    <!-- 收款条件 -->
+    <receiveTermsDialog ref="receiveTermsDialogRef" conditionType="rules" @changeParent="changeReceiveTerms"></receiveTermsDialog>
   </div>
 </template>
 
@@ -149,9 +145,13 @@
     transactionMethodsOp,
     paymentStatus
   } from '@/enum/dict';
+  import receiveTermsDialog from '@/views/financialManage/advanceReceipt/components/receiveTermsDialog.vue';
 
   export default {
     name: 'receivableInfo',
+    components: {
+      receiveTermsDialog
+    },
     props: {
       dataForm: {
         type: Object,
@@ -294,6 +294,22 @@
           this.emitDataForm('collectionTerms', val);
         }
       },
+      paymentConditionId: {
+        get() {
+          return this.dataForm.paymentConditionId;
+        },
+        set(val) {
+          this.emitDataForm('paymentConditionId', val);
+        }
+      },
+      paymentConditionName: {
+        get() {
+          return this.dataForm.paymentConditionName;
+        },
+        set(val) {
+          this.emitDataForm('paymentConditionName', val);
+        }
+      },
       receiptStatus: {
         get() {
           return this.dataForm.receiptStatus;
@@ -330,6 +346,15 @@
       }
     },
     methods: {
+
+      openReceiveTerms() {
+        this.$refs.receiveTermsDialogRef.open();
+      },
+      
+      changeReceiveTerms(row, index) {
+        this.emitDataForm('paymentConditionId', row.id);
+        this.emitDataForm('paymentConditionName', row.name);
+      },
       // dataForm 为 .sync prop,整体替换以避免直接 mutation
       emitDataForm(key, val) {
         this.$emit('update:dataForm', { ...this.dataForm, [key]: val });

+ 5 - 5
src/views/saleManage/saleOrder/accountstatement/components/saleForm.vue

@@ -14,7 +14,7 @@
           >
             <el-option label="客户" :value="1" />
             <!--            <el-option label="项目" :value="2"/>-->
-            <el-option label="合同" :value="4" />
+            <!-- <el-option label="合同" :value="4" /> -->
 
             <el-option label="销售订单" :value="3" />
           </el-select>
@@ -61,8 +61,8 @@
       <el-col :span="8">
         <el-form-item label="查询维度" prop="queryDimension">
           <el-select
-            disabled
             clearable
+            :disabled="dialogType == 'view'"
             class="ele-block"
             v-model="dataForm.queryDimension"
             placeholder="请选择"
@@ -78,7 +78,7 @@
       <el-col :span="8">
         <el-form-item label="对账方式" prop="dateType">
           <el-select
-            :disabled="dataForm.queryDimension == 2 || dialogType == 'view'"
+            :disabled="dialogType == 'view'"
             clearable
             class="ele-block"
             v-model="dataForm.dateType"
@@ -217,7 +217,7 @@
         </el-form-item>
       </el-col>
     </el-row>
-    <el-row v-if="dataForm.queryDimension != 2 && dialogType !== 'view'">
+    <el-row v-if="dialogType !== 'view'">
       <el-col :span="24">
         <el-button
           style="float: right"
@@ -234,7 +234,7 @@
       ref="orderListDialogRef"
       @changeParent="getOrderInfo"
       :contactData="contactData"
-      needProduces="0,1,2,5"
+      :needProduces="dataForm.queryDimension == 2 ? '4' : '0,1,2,5'"
     ></orderListDialog>
     <contractListDialog
       ref="selectContractRef"

+ 28 - 5
src/views/saleManage/saleOrder/accountstatement/index.vue

@@ -113,7 +113,18 @@
             <!--              v-if="[2].includes(row.reviewStatus)">-->
             <!--              导出-->
             <!--            </el-link>-->
-            <!-- <el-link
+            <el-link
+              size="small"
+              type="primary"
+              :underline="false"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              v-if="[2].includes(row.reviewStatus)"
+              @click="handleAddReceivable('add', row)"
+            >
+              应收
+            </el-link>
+            <el-link
               size="small"
               type="primary"
               :underline="false"
@@ -122,8 +133,8 @@
               v-if="[2].includes(row.reviewStatus)"
               @click="handleAddInvoice(row)"
             >
-              新增发票
-            </el-link> -->
+              发票
+            </el-link>
           </template>
         </ele-pro-table>
       </div>
@@ -168,6 +179,8 @@
       v-if="addInvoiceDialogFlag"
       @reload="reload"
     ></add-invoice-dialog>
+    <addReceivableDialog ref="addReceivableDialogRef" v-if="addReceivableDialogFlag"
+      :visible.sync="addReceivableDialogFlag"></addReceivableDialog>
     <process-submit-dialog
       :processSubmitDialogFlag.sync="processSubmitDialogFlag"
       v-if="processSubmitDialogFlag"
@@ -195,9 +208,10 @@
   } from '@/api/saleManage/accountstatement';
   import dictMixins from '@/mixins/dictMixins';
   import AccountInfoDialog from '@/views/financialManage/invoiceManage/components/accountInfoDialog.vue';
-  import addInvoiceDialog from '@/views/financialManage/invoiceManage/components/addOrEditDialog.vue';
+  import addInvoiceDialog from '@/views/financialManage/invoiceManage/components/addOrEditDialog.vue'
   import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
   import tabMixins from '@/mixins/tableColumnsMixin';
+  import addReceivableDialog from '@/views/financialManage/receivableManage/components/addReceivableDialog.vue'
 
   export default {
     mixins: [dictMixins,tabMixins],
@@ -210,7 +224,8 @@
       addReturnGoodsDialog,
       orderDetailDialog,
       addAccountDialog,
-      detailDialog
+      detailDialog,
+      addReceivableDialog
     },
     provide() {
       return {
@@ -236,6 +251,7 @@
       return {
         addAccountDialogFlag: false,
         detailDialogFlag: false,
+        addReceivableDialogFlag: false,
         addInvoiceDialogFlag: false,
         accountInfoDialogFlag: false,
         processSubmitDialogFlag: false,
@@ -455,6 +471,13 @@
           );
         });
       },
+      // 应收
+      handleAddReceivable(type, row) {
+        this.addReceivableDialogFlag = true;
+        this.$nextTick(() => {
+          this.$refs.addReceivableDialogRef.open(type, row);
+        });
+      },
       /*新增发票选择对账单信息回调*/
       getAccountInfo(row) {
         this.currentRow.children = row;

+ 50 - 17
src/views/saleManage/saleOrder/components/addDialogNew.vue

@@ -265,11 +265,11 @@
             />
           </el-form-item>
 
-          <el-form-item label="收款条件" prop="paymentCondition">
+          <el-form-item label="收款条件" prop="collectionConditionName">
             <el-input
               clearable
               readonly
-              v-model="form.paymentCondition"
+              v-model="form.collectionConditionName"
               @click.native="handlePaymentConditionBtn"
               placeholder="请输入"
             />
@@ -294,8 +294,8 @@
         </el-col>
 
         <el-col :span="8">
-          <el-form-item label="生成收款计划表" prop="generatePlan">
-            <el-radio-group v-model="form.generatePlan">
+          <el-form-item label="生成收款计划表" prop="isGenerateReceiptPlan">
+            <el-radio-group v-model="form.isGenerateReceiptPlan" @change="generatePlanChange">
               <el-radio :label="1">是</el-radio>
               <el-radio :label="0">否</el-radio>
             </el-radio-group>
@@ -689,7 +689,7 @@
         </el-col>
       </el-row>
 
-      <div v-if="form.needProduce != 2 && form.needProduce != 4">
+      <div v-if="form.needProduce != 2 && form.needProduce != 4 && form.isGenerateReceiptPlan != 0">
         <headerTitle title="收款计划" style="margin-top: 30px"></headerTitle>
         <PaymentCollectionPlan
           ref="paymentCollectionPlanRef"
@@ -767,8 +767,8 @@
       @changeParent="changeReturn"
     >
     </return-order-dialog>
-
-    <receiveTermsModal ref="receiveTermsModalRef"></receiveTermsModal>
+    <!-- 收款条件 -->
+    <receiveTermsDialog ref="receiveTermsDialogRef" conditionType="rules" @changeParent="changeReceiveTerms"></receiveTermsDialog>
   </ele-modal>
 </template>
 
@@ -824,7 +824,8 @@
   import PaymentCollectionPlan from '@/BIZComponents/paymentCollectionPlan/Index.vue';
   import { shippingModeOp, transactionMethodsOp } from '@/enum/dict.js';
   import { formatPrice } from '@/BIZComponents/setProduct.js';
-  import receiveTermsModal from './receiveTermsModal.vue'
+  import receiveTermsDialog from '@/views/financialManage/advanceReceipt/components/receiveTermsDialog.vue'
+
   export default {
     mixins: [dictMixins],
     components: {
@@ -845,7 +846,7 @@
       opportunityDialog,
       personSelect,
       PaymentCollectionPlan,
-      receiveTermsModal
+      receiveTermsDialog
     },
     props: {
       contactData: {
@@ -919,7 +920,10 @@
         settlementDate: [],
         endSettlementDate: '',
         startSettlementDate: '',
-        contractStartDate: ''
+        contractStartDate: '',
+        isGenerateReceiptPlan: 0,
+        collectionConditionId: '',
+        collectionConditionName: '',
       };
 
       return {
@@ -1000,7 +1004,8 @@
         isTaxRate: 0,
         isSinglePrice: 0,
         isDeptAndPerson: 0,
-        defaultTransactionMode: 1
+        defaultTransactionMode: 1,
+        isGenReceiptPlan: 1,
       };
     },
     computed: {
@@ -1019,6 +1024,10 @@
             }
           ],
 
+          isGenerateReceiptPlan: [
+            { required: true, message: '请选择是否生成收款计划', trigger: 'change' }
+          ],
+
           saleType: [
             { required: true, message: '请选择销售类型', trigger: 'change' }
           ],
@@ -1136,14 +1145,37 @@
       }).then((res) => {
         this.isSinglePrice = res.value;
         // console.log('isSinglePrice', this.isSinglePrice);
+      });  
+
+      // 是否生成收款计划单默认配置//0否 1是
+      parameterGetByCode({
+        code: 'sale_order_gen_receipt_plan'
+      }).then((res) => {
+        this.isGenReceiptPlan = res.value;
+        console.log('isGenReceiptPlan', this.isGenReceiptPlan);
       });
     },
     methods: {
-      generatePlanChange() {
-
+      changeReceiveTerms(row, index) {
+        console.log('changeReceiveTerms~~~', row)
+        this.form.collectionConditionId = row.id;
+        this.form.collectionConditionName = row.name;
+        console.log('changeReceiveTerms!!!', this.form)
+        this.$forceUpdate()
+      },
+      generatePlanChange(val) {
+        console.log(val)
+        if(val == 0) {
+ 
+        } else {
+          this.issueNumberChange(this.form.issueNumber);
+          // this.$refs.paymentCollectionPlanRef?.setDiscountAmount(
+          //   this.form.payAmount
+          // );
+        }
       },
       handlePaymentConditionBtn() {
-
+        this.$refs.receiveTermsDialogRef.open();
       },
       setIssueNumber(len) {
         this.form.issueNumber = len;
@@ -1860,6 +1892,7 @@
           this.form.createDeptName = this.user.info.groupName;
           this.form.contractStartDate = formatDate(new Date(), 'yyyy-MM-dd');
           this.form.saleType = 1;
+          this.form.isGenerateReceiptPlan = +this.isGenReceiptPlan;
           this.$nextTick(() => {
             this.issueNumberChange(this.form.issueNumber);
           });
@@ -2011,7 +2044,7 @@
             })
           );
         }
-        if (this.form.needProduce != 2 && this.form.needProduce != 4) {
+        if (this.form.needProduce != 2 && this.form.needProduce != 4 && this.form.isGenerateReceiptPlan != 0) {
           arr.push(
             new Promise((resolve, reject) => {
               this.$refs.paymentCollectionPlanRef.validateForm((valid) => {
@@ -2043,7 +2076,7 @@
             productList: this.$refs?.inventoryTable?.getTableValue() || [],
             typedetailList: this.$refs?.typeListRef?.getTableValue() || [],
             saleTypeName: this.getDictValue('销售类型', this.form.saleType),
-            receiptPaymentList:
+            receiptPaymentList: this.form.isGenerateReceiptPlan == 0 ? [] : 
               this.$refs?.paymentCollectionPlanRef?.getTableValue() || [],
             endSettlementDate: this.form.settlementDate?.length
               ? this.form.settlementDate[1]
@@ -2059,7 +2092,7 @@
             return;
           }
 
-          if (commitData.needProduce != 2 && commitData.needProduce != 4) {
+          if (commitData.needProduce != 2 && commitData.needProduce != 4 && commitData.isGenerateReceiptPlan != 0) {
             const ratioSum = commitData.receiptPaymentList.reduce(
               (acc, cur) => acc + +cur.ratio,
               0

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

@@ -218,6 +218,19 @@
               </el-option>
             </el-select>
           </el-form-item>
+          <el-form-item prop="isGenerateReceiptPlan" label="生成收款计划表:">
+            <el-radio-group v-model="form.isGenerateReceiptPlan" disabled>
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item prop="collectionConditionName" label="收款条件:">
+            <el-input
+              clearable
+              disabled
+              v-model="form.collectionConditionName"
+            />
+          </el-form-item>
           <!-- <el-form-item prop="productionRequirements" label="生产要求:">
             <el-input v-model="form.productionRequirements" type="textarea" disabled></el-input>
           </el-form-item> -->
@@ -327,7 +340,7 @@
       type="view"
     ></typeList>
 
-    <div v-if="form.needProduce != 2 && form.needProduce != 4">
+    <div v-if="form.needProduce != 2 && form.needProduce != 4 && form.isGenerateReceiptPlan != 0">
       <headerTitle
         title="收款计划"
         style="margin-top: 30px"

+ 0 - 0
src/views/saleManage/saleOrder/components/receiveTermsModal.vue