Переглянути джерело

feat(对账单): 新增对账单明细查询及展示功能静态

liujt 7 місяців тому
батько
коміт
2d2074e104

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

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

+ 300 - 0
src/views/saleManage/saleOrder/accountstatement/components/addAccountDialogNew.vue

@@ -0,0 +1,300 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="addAccountDialogFlag"
+    :title="title"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    :maxable="true"
+    :resizable="true"
+    width="85%"
+    :before-close="cancel"
+  >
+    <!--销售表单-->
+    <sale-form
+      @handleSearch="handleSearch"
+      :dataForm.sync="dataForm"
+      :datasource.sync="datasource"
+      :contactData="contactData"
+      :saleOrderData="saleOrderData"
+      :recorpayList.sync="recorpayList"
+      :dialogType="dialogType"
+      ref="saleFormRef"
+    ></sale-form>
+    <headerTitle title="对账明细" style="margin-top: 30px">
+      <template v-slot>
+        <el-row style="font-weight: 700; color: red">
+          <span>总金额:</span>
+          <span>{{ dataForm.amountTotalPrice || 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-row>
+      </template>
+    </headerTitle>
+    <!-- <recorpayTableList
+      ref="recorpayListRef"
+      :dataForm="dataForm"
+      :recorpayList.sync="recorpayList"
+      :dialogType="dialogType"
+    ></recorpayTableList> -->
+    <inventoryTable
+      ref="inventoryTableref"
+      :dataForm="dataForm"
+      :datasource.sync="datasource"
+      :dialogType="dialogType"
+    ></inventoryTable>
+    <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 InventoryTable from './inventoryTable.vue';
+  import recorpayTableList from './recorpayTableList.vue';
+
+  import saleForm from './saleForm.vue';
+  import {
+    getStatementRecordListAPI,
+    infoAccountStatementAPI,
+    saveAccountStatementAPI,
+    updateAccountStatementAPI
+  } from '@/api/saleManage/accountstatement';
+  import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+
+  export default {
+    name: 'addAccountDialog',
+    components: {
+      processSubmitDialog,
+      InventoryTable,
+      saleForm,
+      recorpayTableList
+    },
+    //客户管理数据
+    props: {
+      addAccountDialogFlag: {
+        type: Boolean,
+        default: false
+      },
+      contactData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      saleOrderData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      }
+    },
+    data() {
+      return {
+        fullscreen: false,
+        datasource: [],
+        recorpayList: [],
+        dataForm: {
+          sourceType: 1,
+          dateType: 1,
+          queryDimension: 1,
+          dateValue: '',
+          contactId: '',
+          contactName: '',
+          sourceName: '',
+          sourceId: '',
+          type: '',
+          year: '',
+          quarter: '',
+          month: '',
+          dateTimeRange: [],
+          orderNo: '',
+          orderId: '',
+          id: '',
+          startDate: '',
+          endDate: '',
+          repliedFiles: []
+        },
+        title: '',
+        processSubmitDialogFlag: false,
+        dialogType: ''
+      };
+    },
+    computed: {},
+    methods: {
+      open(dialogType, row, type = '') {
+        this.dialogType = dialogType;
+        this.title =
+          dialogType == 'add'
+            ? '新增'
+            : dialogType == 'update'
+            ? '修改'
+            : '详情';
+        this.dataForm.type = type;
+        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.getInfo(row);
+        }
+      },
+      //获取对账单详情
+      async getInfo(row) {
+        let data = await infoAccountStatementAPI(row.id);
+        // this.recorpayList = data.recorpayList || [];
+        this.datasource = data || [];
+        this.dataForm = data;
+        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:addAccountDialogFlag', false);
+      },
+      //查询获取订单数据
+      async handleSearch(params) {
+        let searchQuery = {
+          endDate: params.endDate,
+          sourceId: params.sourceId,
+          sourceType: params.sourceType,
+          startDate: params.startDate,
+          queryDimension: params.queryDimension,
+          type: 1
+        };
+
+        // const searchQuery = ["SALES20251225007","SALES20251225005","SALES20251225009"];
+
+        let data = await getStatementRecordListAPI(searchQuery);
+        console.log(data, 'data');
+
+        this.datasource = data || [];
+        // this.recorpayList = data.recorpayList || [];
+        this.dataForm = {
+          ...this.dataForm,
+          // amountPayablePrice: data.amountPayablePrice,
+          // amountReceivablePrice: data.amountReceivablePrice,
+          // amountTotalPrice: data.amountTotalPrice,
+          // amountPayablePass: data.amountPayablePass,
+          // amountReceivablePass: data.amountReceivablePass
+          amountTotalPrice: data.reduce((pre, cur) => pre + cur.amountTotalPrice, 0),
+          amountCompletePrice: data.reduce((pre, cur) => pre + cur.statementAmount, 0),
+          amountUnCompletePrice: data.reduce((pre, cur) => pre + cur.unStatementAmount, 0)
+        };
+        this.$forceUpdate();
+        // if (!this.datasource.length) this.$message.warning('暂无订单信息');
+      },
+      //保存
+      async save(is) {
+        if (!this.datasource.length&&!this.recorpayList.length)
+          return this.$message.warning('暂无对账信息');
+        let api =
+          this.dialogType == 'add'
+            ? saveAccountStatementAPI
+            : updateAccountStatementAPI;
+        let params = {
+          ...this.dataForm,
+          orderList: this.datasource,
+          recorpayList: this.recorpayList
+        };
+        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();
+      },
+      async submitApprove(res) {
+        let data = await infoAccountStatementAPI(res);
+        this.processSubmitDialogFlag = true;
+        this.$nextTick(() => {
+          let params = {
+            businessId: res,
+            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>

+ 664 - 0
src/views/saleManage/saleOrder/accountstatement/components/inventoryTableNew.vue

@@ -0,0 +1,664 @@
+<template>
+  <div>
+    <!-- <div v-for="(item) in datasource" style="margin-bottom: 10px">
+      <div>
+        <div style="margin-bottom: 10px;font-weight: bold;">
+          <div>
+            <el-divider direction="vertical"></el-divider>
+            <span><span>{{ index + 1 }}</span> 销售订单:</span>
+            <span>{{ item.orderNo }}</span>
+            <el-divider direction="vertical"></el-divider> -->
+            <!-- <span>计价方式:</span>
+            <span> {{ item.pricingWay == 1 ? '按数量计费' : '按重量计费' }}</span> -->
+            <!-- <el-divider direction="vertical"></el-divider> -->
+            <!-- <span>总金额:</span>
+            <span>{{item.amountTotalPrice}}</span>
+            <el-divider direction="vertical"></el-divider>
+            <span>应收金额:</span>
+            <span>{{item.amountReceivablePrice}}</span>
+            <el-divider direction="vertical"></el-divider>
+            <span>应付金额:</span>
+            <span>{{item.amountPayablePrice}}</span>
+          
+
+          </div>
+        </div>
+        <template v-if="item.orderType!=6">
+          <div  v-for="(j,i) in item.subList" :key="i">
+            <ele-pro-table :show-summary="true" :summary-method="getSummaries" ref="table" row-key="id" :needPage="false"
+                           :columns="getColumns(j)" max-height="500px" style="margin-bottom: 10px"
+                           :sub-title="getTitle(j)" :toolkit="[]" :datasource="j.detailList"
+                           cache-key="systemRoleTable17-11121" class="time-form">
+              <template v-slot:action="{ row,$index }">
+                <el-popconfirm class="ele-action" title="确定要删除吗?" @confirm="remove(index,$index,'line')">
+                  <template v-slot:reference>
+                    <el-link type="danger" v-if="dialogType!=='view'" :underline="false" icon="el-icon-delete">
+                      删除
+                    </el-link>
+                  </template>
+                </el-popconfirm>
+              </template>
+            </ele-pro-table>
+          </div>
+        </template>
+        <div v-else>
+          <ele-pro-table :show-summary="true" :summary-method="getSummaries" ref="table" row-key="id" :needPage="false"
+                         :columns="getColumns({subType:10})" sub-title="赔付订单" max-height="500px" style="margin-bottom: 10px"
+                         :toolkit="[]" :datasource="item.detailList"
+                         cache-key="systemRoleTable17-11121" class="time-form">
+            <template v-slot:action="{ row,$index }">
+              <el-popconfirm class="ele-action" title="确定要删除吗?" @confirm="remove(index,$index,'line')">
+                <template v-slot:reference>
+                  <el-link type="danger" v-if="dialogType!=='view'" :underline="false" icon="el-icon-delete">
+                    删除
+                  </el-link>
+                </template>
+              </el-popconfirm>
+            </template> -->
+            <!--            <template v-slot:productName="{ row,$index }">-->
+            <!--              <el-popover-->
+            <!--                placement="right"-->
+            <!--                width="60%"-->
+            <!--                trigger="hover">-->
+            <!--                <ele-pro-table ref="childrenTable"-->
+            <!--                               row-key="id"-->
+            <!--                               max-height="300px"-->
+            <!--                               :needPage="false" :columns="childrenColumns" :toolkit="[]"-->
+            <!--                               :datasource="row.productList"-->
+            <!--                               cache-key="systemRoleTable17-222" class="time-form">-->
+            <!--                </ele-pro-table>-->
+            <!--                <el-button type="text" slot="reference">{{ row.productName }}</el-button>-->
+            <!--              </el-popover>-->
+            <!--            </template>-->
+          <!-- </ele-pro-table>
+        </div>
+      </div>
+    </div> -->
+
+    <el-collapse  v-model="activeNames">
+      <el-collapse-item v-for="(item, index) in datasource" :key="index" :name="index">
+        <template slot="title">
+          <div class="collapse-title">
+            <div class="collapse-title-left"><span class="collapse-title-index">{{ index + 1 }}</span> 销售订单:{{ item.orderNo }}</div>
+            <div class="collapse-title-right">
+              <span>订单金额:{{ item.amountTotalPrice || 0 }}元</span>
+              <span>已对账金额:{{ item.statementAmount || 0 }}元</span>
+              <span>未对账金额:{{ item.unStatementAmount || 0 }}元</span>
+            </div>
+          </div>
+        </template>
+        <div>
+          <el-tabs type="border-card">
+            <el-tab-pane label="调拨单">
+              <ele-pro-table :show-summary="false" :summary-method="getSummaries" ref="table" row-key="id" :needPage="false"
+                          :columns="getColumns(item, 'deliveryProducts')" max-height="500px" style="margin-bottom: 10px" :datasource="item.deliveryProducts || []"
+                          cache-key="systemRoleTable17-11121" class="time-form">
+                <template v-slot:toolbar>
+                  <div class="headbox">
+                    <div>
+                      <span class="amount">对账金额合计:{{ getSummariesA(item.deliveryProducts || []) }}元</span>
+                    </div>
+                  </div>
+                </template>
+                <template v-slot:action="{ row,$index }">
+                  <el-popconfirm class="ele-action" title="确定要删除吗?" @confirm="remove(index,$index,'line')">
+                    <template v-slot:reference>
+                      <el-link type="danger" v-if="dialogType!=='view'" :underline="false" icon="el-icon-delete">
+                        删除
+                      </el-link>
+                    </template>
+                  </el-popconfirm>
+                </template>
+              </ele-pro-table>
+            </el-tab-pane>
+            <el-tab-pane label="退货单">
+              <ele-pro-table :show-summary="false" :summary-method="getSummaries" ref="table" row-key="id" :needPage="false"
+                          :columns="getColumns(item, 'returnProducts')" max-height="500px" style="margin-bottom: 10px" :datasource="item.returnProducts || []"
+                          cache-key="systemRoleTable17-11122" class="time-form">
+                <template v-slot:toolbar>
+                  <div class="headbox">
+                    <div>
+                      <span class="amount">对账金额合计:{{ getSummariesA(item.deliveryProducts || []) }}元</span>
+                    </div>
+                  </div>
+                </template>
+                <template v-slot:action="{ row,$index }">
+                  <el-popconfirm class="ele-action" title="确定要删除吗?" @confirm="remove(index,$index,'line')">
+                    <template v-slot:reference>
+                      <el-link type="danger" v-if="dialogType!=='view'" :underline="false" icon="el-icon-delete">
+                        删除
+                      </el-link>
+                    </template>
+                  </el-popconfirm>
+                </template>
+              </ele-pro-table>
+            </el-tab-pane>
+          </el-tabs>
+          
+        </div>
+      </el-collapse-item>
+    </el-collapse>
+
+<!--    <el-row v-if="dialogType=='view'" style="margin-top: 10px">-->
+<!--      <el-col :span="6" style="float: right;">-->
+<!--        <el-descriptions class="margin-top" direction="vertical" :column="3" size="small" border>-->
+<!--          <el-descriptions-item label="本期应收款总额">{{ dataForm.amountReceivablePrice }}</el-descriptions-item>-->
+<!--          <el-descriptions-item label="截止上期欠款">-->
+<!--            <template>{{ dataForm.previousPeriodEndDebt }}</template>-->
+<!--          </el-descriptions-item>-->
+<!--        </el-descriptions>-->
+<!--      </el-col>-->
+<!--    </el-row>-->
+  </div>
+
+</template>
+<script>
+import dictMixins from '@/mixins/dictMixins';
+import { pricingWayList } from '@/enum/dict';
+
+export default {
+  mixins: [dictMixins],
+  components: {},
+  props: ['datasource', 'dialogType', 'dataForm'],
+  computed: {
+    getColumns() {
+      return (item, type)=>{
+        console.log(this.dataForm)
+        let basicFields = [
+          {
+            width: 60,
+            label: '序号',
+            type: 'index',
+            columnKey: 'index',
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            minWidth: 130,
+            prop: 'statementSubOrderNo',
+            label: type == 'deliveryProducts'?'调拨单编码':'退货单编码',
+            align: 'center',
+            slot: 'statementSubOrderNo',
+            showOverflowTooltip: true
+          },
+          {
+            minWidth: 130,
+            prop: 'productOperateTime',
+            label: type == 'deliveryProducts'?'调拨日期':'退货日期',
+            align: 'center',
+            slot: 'productOperateTime',
+            showOverflowTooltip: true
+          },
+          {
+            minWidth: 120,
+            prop: 'productCode',
+            label: '产品编码',
+            slot: 'productCode',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            minWidth: 140,
+            prop: 'productName',
+            label: '产品名称',
+            slot: 'productName',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          // {
+          //   minWidth: 140,
+          //   prop: 'subType',
+          //   label: '退货产品类型',
+          //   slot: 'subType',
+          //   align: 'center',
+          //   show:j.subType==11,
+          //   showOverflowTooltip: true,formatter(_row, _column, cellValue){
+          //     return cellValue==12?'实物赔偿':'原货'
+          //   }
+          // },
+          
+          {
+            minWidth: 100,
+            prop: 'specification',
+            label: '规格',
+            align: 'center',
+            slot: 'specification',
+            showOverflowTooltip: true
+          },
+          {
+            minWidth: 100,
+            prop: 'modelType',
+            label: '型号',
+            align: 'center',
+            slot: 'modelType',
+            showOverflowTooltip: true
+          },
+          // {
+          //   prop: 'provenance',
+          //   label: '产地',
+          //   slot: 'provenance',
+          //   align: 'center',
+          //   // show:this.contractBookType==2,
+          //   minWidth: 200,
+          //   showOverflowTooltip: true,
+          //   formatter: (row, column) => {
+       
+          //     return row.provenance && row.provenance.length
+          //       ? row.provenance
+          //           .map((item) => this.getDictValue('产地', item ))
+          //           .join(',')
+          //       : '';
+          //   }
+          // },
+          {
+            minWidth: 100,
+            prop: 'pricingWay',
+            label: '计价方式',
+            align: 'center',
+            slot: 'pricingWay',
+            showOverflowTooltip: true,
+            formatter: (_row, _column, cellValue) => {
+              let pricingWay = pricingWayList.find(item => item.id == cellValue)
+              return pricingWay ? pricingWay.name : ''
+            }
+          },
+          {
+            minWidth: 100,
+            prop: 'totalCount',
+            label: '数量',
+            align: 'center',
+            slot: 'totalCount'
+          },
+          {
+            minWidth: 120,
+            prop: 'measuringUnit',
+            label: '计量单位',
+            align: 'center',
+            slot: 'measuringUnit'
+          },
+          {
+            width: 100,
+            prop: 'receiveTotalWeight',
+            label: '收货总重',
+            slot: 'receiveTotalWeight',
+            align: "center"
+          },
+          {
+            width: 100,
+            prop: 'sendTotalWeight',
+            label: '发货总重',
+            slot: 'sendTotalWeight',
+            align: "center",
+            headerSlot: 'headerTotalCount'
+          },
+
+          {
+            width: 100,
+            prop: 'increaseTotalWeight',
+            label: '增重重量',
+            slot: 'increaseTotalWeight',
+            align: "center"
+          },
+          {
+            width: 100,
+            prop: 'weightUnit',
+            label: '重量单位',
+            slot: 'weightUnit',
+            align: "center"
+          },
+          {
+            minWidth: 90,
+            prop: 'singlePrice',
+            label: '单价',
+            align: 'center',
+            slot: 'singlePrice',
+          },
+          {
+            minWidth: 100,
+            prop: 'taxRate',
+            label: '税率',
+            align: 'center',
+          },
+          {
+            width: 150,
+            prop: 'notTaxSinglePrice',
+            label: '不含税单价',
+            align: 'center'
+          },
+          {
+            minWidth: 120,
+            prop: 'totalPrice',
+            label: '合计',
+            slot: 'totalPrice',
+            align: 'center',
+          },
+          {
+            minWidth: 100,
+            prop: 'discountRate',
+            label: '折让比列',
+            align: 'center',
+          },
+          {
+            minWidth: 100,
+            prop: 'discountSinglePrice',
+            label: '折让单价',
+            align: 'center',
+          },
+          {
+            minWidth: 120,
+            prop: 'discountTotalPrice',
+            label: '折让合计',
+            slot: 'discountTotalPrice',
+            align: 'center',
+          },
+    
+
+        ]
+        let permissionType = {
+          // 'financeLeader': [
+          //   {
+          //     minWidth: 130,
+          //     prop: 'receivedPrice',
+          //     label: '已收款金额',
+          //     align: 'center',
+          //     slot: 'receivedPrice',
+          //     headerSlot: 'headerReceivedPrice'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'receivablePrice',
+          //     label: '应收款金额',
+          //     align: 'center',
+          //     slot: 'receivablePrice',
+          //   },
+          //   {
+          //     minWidth: 140,
+          //     prop: 'receivableDate',
+          //     label: '应收款日期',
+          //     align: 'center',
+          //     slot: 'receivableDate',
+          //     headerSlot: 'headerReceivableDate'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'invoicedPrice',
+          //     label: '已开票金额',
+          //     align: 'center',
+          //     slot: 'invoicedPrice',
+          //     headerSlot: 'headerInvoicedPrice'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'notInvoicedPrice',
+          //     label: '未开票金额',
+          //     align: 'center',
+          //     slot: 'notInvoicedPrice'
+          //   },
+          // ],
+          // 'leader': [
+          //   {
+          //     minWidth: 130,
+          //     prop: 'receivedPrice',
+          //     label: '已收款金额',
+          //     align: 'center',
+          //     slot: 'receivedPrice'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'receivablePrice',
+          //     label: '应收款金额',
+          //     align: 'center',
+          //     slot: 'receivablePrice'
+          //   },
+          //   {
+          //     minWidth: 140,
+          //     prop: 'receivableDate',
+          //     label: '应收款日期',
+          //     align: 'center',
+          //     slot: 'receivableDate'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'invoicedPrice',
+          //     label: '已开票金额',
+          //     align: 'center',
+          //     slot: 'invoicedPrice'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'notInvoicedPrice',
+          //     label: '未开票金额',
+          //     align: 'center',
+          //     slot: 'notInvoicedPrice'
+          //   },
+          // ],
+          // 'uploadReceipt': [
+          //   {
+          //     minWidth: 130,
+          //     prop: 'receivedPrice',
+          //     label: '已收款金额',
+          //     align: 'center',
+          //     slot: 'receivedPrice'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'receivablePrice',
+          //     label: '应收款金额',
+          //     align: 'center',
+          //     slot: 'receivablePrice'
+          //   },
+          //   {
+          //     minWidth: 140,
+          //     prop: 'receivableDate',
+          //     label: '应收款日期',
+          //     align: 'center',
+          //     slot: 'receivableDate'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'invoicedPrice',
+          //     label: '已开票金额',
+          //     align: 'center',
+          //     slot: 'invoicedPrice'
+          //   },
+          //   {
+          //     minWidth: 130,
+          //     prop: 'notInvoicedPrice',
+          //     label: '未开票金额',
+          //     align: 'center',
+          //     slot: 'notInvoicedPrice'
+          //   },
+          // ],
+        }
+        permissionType[this.taskDefinitionKey] && basicFields.push(...permissionType[this.taskDefinitionKey])
+        return basicFields
+      }
+    },
+    getTitle(){
+        return (item, type)=>{
+        //   let title=this.subTypeList[j.subType]+(j.statementSubOrderCode||'')+' '
+        //   if(j.subType==11&&j.subExecType){
+        //          if(j.subExecType=='10'){
+        //           title=title+' 退货方式:全部原货 '
+        //          }
+        //          if(j.subExecType=='20'){
+        //           title=title+' 退货方式:部分原货+实物赔偿'
+        //          }
+        //          if(j.subExecType=='30'){
+        //           title=title+' 退货方式:部分原货+现金赔偿 '+' 赔偿金额:'+j.amountPayablePrice
+        //          }
+        //          if(j.subExecType=='40'){
+        //           title=title+' 退货方式:全部实物赔偿'
+        //          }
+        //          if(j.subExecType=='50'){
+        //           title=title+' 退货方式:全部现金赔偿  '+' 赔偿金额:'+j.amountPayablePrice
+        //          }
+        //   }
+        console.log(item[type])
+          const total = item[type]?.reduce((prev, curr) => {
+            console.log(curr.discountTotalPrice)
+            return prev + Number(curr.discountTotalPrice || 0) + '元';
+          }, 0);
+          return `对账金额合计:${total}`
+        }
+      },
+      getFHDatasource() {
+        return (item)=>{
+          return item.subList?.detailList
+        }
+      }
+  },
+  created(){
+    this.requestDict('产地');
+  },
+  data() {
+    return {
+      activeNames: [],
+      rules: {},
+      form: {},
+      subTypeList:{
+        10:'发货单:',
+        11:'退货单:',
+        12:'实物赔偿清单:',
+        30:'调拨单:',
+      },
+      subColumnsTypeList:{
+        10: '发货',
+        11: '退货',
+        30: '调拨'
+      },
+    };
+  },
+  mounted() {
+    this.activeNames = this.datasource.map((item, index) => index.toString());
+  },
+  methods: {
+    remove(tableIndex, lineIndex, delType) {
+      let params = {
+        tableIndex,
+        lineIndex,
+        delType
+      }
+      this.$emit('handleRemove', params)
+    },
+    getSummaries(param) {
+      const {columns, data} = param;
+      const sums = [];
+      let fields = ['totalPrice', 'notInvoicedPrice', 'invoicedPrice', 'receivablePrice', 'receivedPrice', 'discountTotalPrice']
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '合计';
+          return;
+        }
+        const values = fields.includes(column.property) ? data.map(item => Number(item[column.property])) : []
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          sums[index] = (sums[index]).toFixed(2)
+        } else {
+          sums[index] = '';
+        }
+      });
+
+      return sums;
+    },
+    getSummariesA(table) {
+      return table.reduce((prev, curr) => {
+        return prev + Number(curr.discountTotalPrice || 0)
+      }, 0)
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.collapse-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 96%;
+}
+.collapse-title-left {
+    display: flex;
+    /* justify-content: center; */
+    align-items: center;
+    font-size: 16px;
+}
+.collapse-title-index {
+    width: 24px;
+    height: 24px;
+    background: #63a103;
+    display: inline-block;
+    text-align: center;
+    line-height: 24px;
+    border-radius: 50%;
+    color: #fff;
+    margin-right: 10px;
+    font-size: 14px;
+}
+.collapse-title-right {
+  display:grid;
+  grid-auto-flow: column;
+  gap: 18px;
+}
+.headbox {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+
+  .amount {
+    font-size: 14px;
+    font-weight: bold;
+    padding-right: 30px;
+  }
+}
+
+.time-form .el-form-item {
+  margin-bottom: 0 !important;
+}
+
+::v-deep .period {
+  display: flex;
+
+  .borderleftnone {
+    .el-input--medium .el-input__inner {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
+    }
+  }
+
+  .borderrightnone {
+    .el-input--medium .el-input__inner {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+    }
+  }
+
+}
+
+::v-deep .time-form tbody > tr:hover > td {
+  background-color: transparent !important;
+}
+
+::v-deep .time-form .el-table tr {
+  background-color: #ffffff;
+}
+
+.pricebox {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  font-weight: bold;
+}
+
+::v-deep.el-divider {
+  margin: 10px;
+  font-weight: bold;
+}
+
+</style>

+ 463 - 0
src/views/saleManage/saleOrder/accountstatement/components/saleFormNew.vue

@@ -0,0 +1,463 @@
+<template>
+  <el-form ref="form" :model="dataForm" :rules="rules" label-width="120px">
+    <headerTitle title="对账单信息"></headerTitle>
+    <el-row>
+      <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"
+            @change="handleChange"
+            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
+          label="选择客户"
+          prop="contactId"
+          v-if="dataForm.sourceType == 1"
+        >
+          <el-input
+            :disabled="dialogType == 'view' || !!contactData?.id"
+            v-model="dataForm.contactName"
+            @click.native="handleGetCus"
+          ></el-input>
+        </el-form-item>
+        <!--        <el-form-item label="选择项目" prop="projectId" v-if="dataForm.sourceType ==2">-->
+        <!--          <el-input :disabled="dialogType=='view'" v-model="dataForm.projectId" @click.native="handleGetOrd"></el-input>-->
+        <!--        </el-form-item>-->
+        <el-form-item
+          label="选择订单"
+          prop="sourceId"
+          v-if="dataForm.sourceType == 3"
+        >
+          <el-input
+          :disabled="dialogType == 'view'"
+            v-model="dataForm.sourceName"
+            @click.native="handleGetOrd"
+          ></el-input>
+        </el-form-item>
+        <el-form-item
+          label="选择合同"
+          prop="contractId"
+          v-if="dataForm.sourceType == 4"
+        >
+          <el-input
+            :disabled="dialogType == 'view'"
+            v-model="dataForm.sourceName"
+            @click.native="handleGetContract"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="查询维度" prop="queryDimension">
+          <el-select
+            :disabled="dialogType == 'view' || !!saleOrderData?.id"
+            clearable
+            class="ele-block"
+            v-model="dataForm.queryDimension"
+            placeholder="请选择"
+          >
+            <el-option label="按发货单" :value="1" />
+            <el-option label="按调拨单" :value="2" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row>
+      <el-col :span="8">
+        <el-form-item label="查询方式" prop="dateType">
+          <el-select
+            :disabled="dialogType == 'view'"
+            clearable
+            class="ele-block"
+            v-model="dataForm.dateType"
+            @change="reloadTableData"
+            placeholder="请选择"
+          >
+            <el-option label="按年度" :value="1" />
+            <el-option label="按季度" :value="2" />
+            <el-option label="按月度" :value="3" />
+            <el-option label="按时间段" :value="4" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8" v-if="![2].includes(dataForm.dateType)">
+        <el-form-item
+          label="选择年度"
+          prop="year"
+          v-if="[1].includes(dataForm.dateType)"
+        >
+          <el-date-picker
+            :disabled="dialogType == 'view'"
+            v-model="dataForm.year"
+            value-format="yyyy"
+            type="year"
+            style="width: 100%"
+            @change="reloadTableData"
+            placeholder="选择年"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item
+          label="选择月度"
+          prop="month"
+          v-if="[3].includes(dataForm.dateType)"
+        >
+          <el-date-picker
+            :disabled="dialogType == 'view'"
+            v-model="dataForm.month"
+            value-format="yyyy-MM"
+            type="month"
+            @change="reloadTableData"
+            style="width: 100%"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item
+          label="选择时间段"
+          prop="dateTimeRange"
+          v-if="[4].includes(dataForm.dateType)"
+        >
+          <el-date-picker
+            :key="dataForm.dateType"
+            :disabled="dialogType == 'view'"
+            v-model="dataForm.dateTimeRange"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            @change="reloadTableData"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            style="width: 100%"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8" v-if="[2].includes(dataForm.dateType)">
+        <el-form-item
+          label="选择年度"
+          prop="year"
+          v-if="[1, 2].includes(dataForm.dateType)"
+        >
+          <el-date-picker
+            :disabled="dialogType == 'view'"
+            v-model="dataForm.year"
+            value-format="yyyy"
+            type="year"
+            @change="reloadTableData"
+            style="width: 100%"
+            placeholder="选择年"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8" v-if="[2].includes(dataForm.dateType)">
+        <el-form-item
+          label="选择季度"
+          prop="quarter"
+          v-if="[2].includes(dataForm.dateType)"
+        >
+          <el-select
+            :disabled="dialogType == 'view'"
+            clearable
+            @change="reloadTableData"
+            class="ele-block"
+            v-model="dataForm.quarter"
+            placeholder="请选择"
+          >
+            <el-option label="一季度" value="一季度" />
+            <el-option label="二季度" value="二季度" />
+            <el-option label="三季度" value="三季度" />
+            <el-option label="四季度" value="四季度" />
+          </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="accountStatementPrice"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item prop="createUserName" label="关联订单编码">
+          <el-input disabled v-model="relatedOrderNumber"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8" v-if="dialogType == 'view'">
+        <el-form-item prop="createUserName" label="对账人">
+          <el-input disabled v-model="dataForm.createUserName"></el-input>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row>
+      <el-col :span="8" v-if="dialogType == 'view'">
+        <el-form-item prop="createTime" label="对账时间">
+          <el-input disabled v-model="dataForm.createTime"></el-input>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row v-if="dialogType == 'view'">
+      <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-row v-if="dialogType !== 'view'">
+      <el-col :span="24">
+        <el-button style="float: right" @click="handleSearch" type="primary"
+          >查询</el-button
+        >
+      </el-col>
+    </el-row>
+
+    <parentList ref="parentRef" @changeParent="getCusInfo"></parentList>
+    <orderListDialog
+      ref="orderListDialogRef"
+      @changeParent="getOrderInfo"
+      :contactData="contactData"
+    ></orderListDialog>
+    <contractListDialog
+      ref="selectContractRef"
+      @changeParent="changeContract"
+      :type="1"
+      :isAdd="true"
+    ></contractListDialog>
+  </el-form>
+</template>
+<script xmlns:el-col="http://www.w3.org/1999/html">
+  import parentList from '@/views/saleManage/contact/components/parentList.vue';
+  import OrderListDialog from './orderListDialog.vue';
+  import { getFile } from '@/api/system/file';
+  // import fileMain from '@/components/addDoc/index.vue';
+  import contractListDialog from '@/views/saleManage/saleOrder/components/contractListDialog.vue';
+import { accountStatementExportAPI } from '@/api/saleManage/accountstatement';
+
+  export default {
+    name: 'saleForm',
+    components: { OrderListDialog, parentList, 
+      // fileMain,
+       contractListDialog },
+    //客户管理数据
+    props: {
+      dataForm: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      datasource: {
+        type: Array,
+        default: () => {
+          return [];
+        }
+      },
+      dialogType: '',
+      contactData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      saleOrderData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      // recorpayList: {
+      //   type: Object,
+      //   default: () => {
+      //     return [];
+      //   }
+      // },
+      
+    },
+    data() {
+      return {
+        monthByDays: {},
+        quarterList: {
+          一季度: ['-01-01 00:00:00', '-03-31 23:59:59'],
+          二季度: ['-04-01 00:00:00', '-06-30 23:59:59'],
+          三季度: ['-07-01 00:00:00', '-09-30 23:59:59'],
+          四季度: ['-10-01 00:00:00', '-12-31 23:59:59']
+        },
+        startTime: '-01-01 00:00:00',
+        endTime: '23:59:59',
+        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' },
+        }
+      };
+    },
+    computed: {
+      //计算未对账金额
+      accountStatementPrice() {
+        return this.datasource.reduce((pre, cur) => pre + cur.amountTotalPrice, 0);
+      },
+      //计算相关订单号
+      relatedOrderNumber() {
+        return this.datasource.map((item) => item.orderNo).join(',');
+      }
+    },
+    methods: {
+      //查询
+      handleSearch() {
+        //
+        switch (this.dataForm.dateType) {
+          case 1:
+            this.dataForm.dateValue = this.dataForm.year;
+            this.dataForm.startDate = this.dataForm.year + this.startTime;
+            this.dataForm.endDate = this.dataForm.year + '-12-31 23:59:59';
+            break;
+          case 2:
+            this.dataForm.dateValue =
+              this.dataForm.year + '年-' + this.dataForm.quarter;
+            this.dataForm.startDate =
+              this.dataForm.year + this.quarterList[this.dataForm.quarter][0];
+            this.dataForm.endDate =
+              this.dataForm.year + this.quarterList[this.dataForm.quarter][1];
+            break;
+          case 3:
+            this.dataForm.dateValue = this.dataForm.month;
+            this.dataForm.startDate = this.dataForm.month + '-01 00:00:00';
+            let data = this.dataForm.month.split('-');
+            let days = new Date(data[0], data[1], 0).getDate();
+            this.dataForm.endDate =
+              this.dataForm.month + '-' + days + ' 23:59:59';
+            break;
+          default:
+            this.dataForm.dateValue = '';
+            this.dataForm.startDate =
+              this.dataForm.dateTimeRange[0] + ' 00:00:00';
+            this.dataForm.endDate =
+              this.dataForm.dateTimeRange[1] + ' 23:59:59';
+        }
+        this.$refs.form.validate((validate) => {
+          if (!validate) return;
+          this.$emit('handleSearch', this.dataForm);
+        });
+      },
+      //
+      getDays() {},
+      //获取客户信息
+      handleGetCus() {
+        let item = { id: this.dataForm.contactId };
+        this.$refs.parentRef.open(item);
+      },
+      //选择客户信息回调
+      getCusInfo(obj) {
+        let params = Object.assign({}, this.dataForm, {
+          contactId: obj.id,
+          contactName: obj.name,
+          sourceName: obj.name,
+          sourceId: obj.id
+        });
+        this.$emit('update:dataForm', params);
+        this.reloadTableData();
+      },
+      //获取合同信息
+      handleGetContract() {
+        this.$refs.selectContractRef.open();
+      },
+      changeContract(obj) {
+        let params = Object.assign({}, this.dataForm, {
+          contractId: obj.id,
+          contractName: obj.contractName,
+          sourceId: obj.id,
+          sourceName: obj.contractName,
+          contactId: obj.partaId,
+          contactName: obj.partaName
+        });
+        this.$emit('update:dataForm', params);
+        this.reloadTableData();
+      },
+      //获取订单信息
+      handleGetOrd() {
+        let item = { id: this.dataForm.orderId };
+        this.$refs.orderListDialogRef.open(item);
+      },
+      //选择订单信息回调
+      getOrderInfo(obj) {
+        this.dataForm.sourceType = 3;
+        let params = Object.assign({}, this.dataForm, {
+          orderId: obj.id,
+          orderNo: obj.orderNo,
+          contactId: obj.partaId,
+          contactName: obj.partaName,
+          sourceName: obj.orderNo,
+          sourceId: obj.id
+        });
+        this.$emit('update:dataForm', params);
+        this.reloadTableData();
+      },
+      //切换来源类型重置数据
+      handleChange(val) {
+        let params = Object.assign(
+          {},
+          {
+            ...this.dataForm,
+            orderNo: '',
+            orderId: '',
+            contactId: '',
+            contactName: '',
+            sourceName: '',
+            sourceId: '',
+            amountPayablePrice: '',
+            amountReceivablePrice: '',
+            amountTotalPrice: '',
+            amountPayablePass: '',
+            amountReceivablePass: ''
+          }
+        );
+
+        this.$emit('update:dataForm', params);
+        this.reloadTableData();
+        if (val == 1 && this.contactData.id) {
+          this.getCusInfo(this.contactData);
+        }
+      },
+      reloadTableData() {
+        this.$emit('update:datasource', []);
+        // this.$emit('update:recorpayList', []);
+      },
+      downloadFile(file) {
+        getFile({ objectName: file.storePath }, file.name);
+      }
+    },
+    mounted() {
+      // const year = new Date().getFullYear(); // 获取当前年份
+      // for (let i = 0; i < 12; i++) {
+      //   // 获取指定月份的天数
+      //   this.monthByDays[i + 1] = new Date(year, i + 1, 0).getDate()
+      // }
+    }
+  };
+</script>
+
+<style scoped lang="scss"></style>