|
|
@@ -9,106 +9,12 @@
|
|
|
title="收款"
|
|
|
@update:visible="updateVisible"
|
|
|
>
|
|
|
- <div>
|
|
|
- <!-- 收款信息 -->
|
|
|
- <headerTitle title="收款信息" size="16px"></headerTitle>
|
|
|
- <div style="margin: 10px 0; font-size: 14px; color: #606266;">
|
|
|
- <span>预收金额:{{ row.advanceTotalPrice || 0 }} 元</span>
|
|
|
- <span style="margin-left: 20px;">已收金额:{{ receivedAmount }} 元</span>
|
|
|
- <span style="margin-left: 20px;">未收金额:{{ unreceivedAmount }} 元</span>
|
|
|
- </div>
|
|
|
-
|
|
|
- <el-button
|
|
|
- size="small"
|
|
|
- type="primary"
|
|
|
- icon="el-icon-plus"
|
|
|
- class="ele-btn-icon"
|
|
|
- style="margin-bottom: 10px;"
|
|
|
- @click="addRow"
|
|
|
- >
|
|
|
- 新增
|
|
|
- </el-button>
|
|
|
-
|
|
|
- <el-form ref="form" :model="form" class="table-form">
|
|
|
- <ele-pro-table
|
|
|
- ref="table"
|
|
|
- :needPage="false"
|
|
|
- :columns="columns"
|
|
|
- :datasource="form.tableData"
|
|
|
- :toolkit="[]"
|
|
|
- >
|
|
|
- <!-- 收款时间 -->
|
|
|
- <template v-slot:receivedDate="{ row: r, $index }">
|
|
|
- <el-form-item
|
|
|
- :prop="`tableData.${$index}.receivedDate`"
|
|
|
- :rules="{ required: true, message: '请选择收款时间', trigger: 'change' }"
|
|
|
- class="table-form-item"
|
|
|
- >
|
|
|
- <el-date-picker
|
|
|
- v-model="r.receivedDate"
|
|
|
- type="date"
|
|
|
- placeholder="年/月/日"
|
|
|
- value-format="yyyy-MM-dd"
|
|
|
- style="width: 100%"
|
|
|
- size="small"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </template>
|
|
|
- <!-- 已收金额 -->
|
|
|
- <template v-slot:receivedTotalPrice="{ row: r, $index }">
|
|
|
- <el-form-item
|
|
|
- :prop="`tableData.${$index}.receivedTotalPrice`"
|
|
|
- :rules="{ required: true, message: '请输入已收金额', trigger: 'blur' }"
|
|
|
- class="table-form-item"
|
|
|
- >
|
|
|
- <el-input
|
|
|
- v-model="r.receivedTotalPrice"
|
|
|
- placeholder="请输入"
|
|
|
- size="small"
|
|
|
- @input="calcAmount"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </template>
|
|
|
- <!-- 支付类型 -->
|
|
|
- <template v-slot:paymentType="{ row: r, $index }">
|
|
|
- <el-form-item
|
|
|
- :prop="`tableData.${$index}.paymentType`"
|
|
|
- :rules="{ required: true, message: '请选择支付类型', trigger: 'change' }"
|
|
|
- class="table-form-item"
|
|
|
- >
|
|
|
- <DictSelection
|
|
|
- v-model="r.paymentType"
|
|
|
- dictName="支付类型"
|
|
|
- placeholder="请选择"
|
|
|
- class="payment-select"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </template>
|
|
|
- <!-- 附件 -->
|
|
|
- <template v-slot:files="{ row: r }">
|
|
|
- <fileMain v-model="r.files" :limit="1"></fileMain>
|
|
|
- </template>
|
|
|
- <!-- 备注 -->
|
|
|
- <template v-slot:remark="{ row: r }">
|
|
|
- <el-input
|
|
|
- v-model="r.remark"
|
|
|
- placeholder="请输入"
|
|
|
- size="small"
|
|
|
- />
|
|
|
- </template>
|
|
|
- <!-- 操作 -->
|
|
|
- <template v-slot:action="{ row: r }">
|
|
|
- <el-link
|
|
|
- type="danger"
|
|
|
- :underline="false"
|
|
|
- @click="removeRow(r)"
|
|
|
- >
|
|
|
- 删除
|
|
|
- </el-link>
|
|
|
- </template>
|
|
|
- </ele-pro-table>
|
|
|
- </el-form>
|
|
|
- </div>
|
|
|
+ <collect-table-form
|
|
|
+ ref="collectTableFormRef"
|
|
|
+ :form.sync="form"
|
|
|
+ :total-price="row.advanceTotalPrice"
|
|
|
+ total-label="预收金额"
|
|
|
+ ></collect-table-form>
|
|
|
|
|
|
<template v-slot:footer>
|
|
|
<el-button type="primary" :loading="loading" @click="save">
|
|
|
@@ -120,19 +26,15 @@
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
- import headerTitle from '@/components/header-title';
|
|
|
- import fileMain from '@/components/addDoc/index.vue';
|
|
|
+ import collectTableForm from '@/BIZComponents/collectTableForm/index.vue';
|
|
|
import { saveDetailDetail } from '@/api/financialManage/advanceReceipt';
|
|
|
import {
|
|
|
- addAdvanceReceipt,
|
|
|
- updateAdvanceReceipt,
|
|
|
getAdvanceReceiptInfo
|
|
|
} from '@/api/financialManage/advanceReceipt';
|
|
|
|
|
|
export default {
|
|
|
components: {
|
|
|
- headerTitle,
|
|
|
- fileMain
|
|
|
+ collectTableForm
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
@@ -142,142 +44,46 @@
|
|
|
row: {},
|
|
|
form: {
|
|
|
tableData: []
|
|
|
- },
|
|
|
- columns: [
|
|
|
- {
|
|
|
- type: 'index',
|
|
|
- label: '序号',
|
|
|
- width: 55,
|
|
|
- align: 'center',
|
|
|
- fixed: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'receivedDate',
|
|
|
- label: '收款时间',
|
|
|
- align: 'center',
|
|
|
- minWidth: 160,
|
|
|
- slot: 'receivedDate'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'receivedTotalPrice',
|
|
|
- label: '已收金额',
|
|
|
- align: 'center',
|
|
|
- minWidth: 140,
|
|
|
- slot: 'receivedTotalPrice'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'paymentType',
|
|
|
- label: '支付类型',
|
|
|
- align: 'center',
|
|
|
- minWidth: 140,
|
|
|
- slot: 'paymentType'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'files',
|
|
|
- label: '附件',
|
|
|
- align: 'center',
|
|
|
- minWidth: 120,
|
|
|
- slot: 'files'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'remark',
|
|
|
- label: '备注',
|
|
|
- align: 'center',
|
|
|
- minWidth: 140,
|
|
|
- slot: 'remark'
|
|
|
- },
|
|
|
- {
|
|
|
- columnKey: 'action',
|
|
|
- label: '操作',
|
|
|
- width: 80,
|
|
|
- align: 'center',
|
|
|
- resizable: false,
|
|
|
- slot: 'action',
|
|
|
- fixed: 'right'
|
|
|
- }
|
|
|
- ]
|
|
|
+ }
|
|
|
};
|
|
|
},
|
|
|
- computed: {
|
|
|
- receivedAmount() {
|
|
|
- return this.form.tableData.reduce((sum, item) => {
|
|
|
- const val = parseFloat(item.receivedTotalPrice);
|
|
|
- return sum + (isNaN(val) ? 0 : val);
|
|
|
- }, 0).toFixed(2);
|
|
|
- },
|
|
|
- unreceivedAmount() {
|
|
|
- const total = parseFloat(this.row.advanceTotalPrice) || 0;
|
|
|
- const received = parseFloat(this.receivedAmount) || 0;
|
|
|
- return (total - received).toFixed(2);
|
|
|
- }
|
|
|
- },
|
|
|
methods: {
|
|
|
async open(row) {
|
|
|
this.visible = true;
|
|
|
this.row = row || {};
|
|
|
this.info = await getAdvanceReceiptInfo(row.id);
|
|
|
- this.form.tableData = this.info.detailList || [];
|
|
|
- },
|
|
|
-
|
|
|
- addRow() {
|
|
|
- this.form.tableData.push({
|
|
|
- receivedDate: '',
|
|
|
- receivedTotalPrice: '',
|
|
|
- paymentType: '',
|
|
|
- files: [],
|
|
|
- remark: ''
|
|
|
- });
|
|
|
- },
|
|
|
-
|
|
|
- removeRow(row) {
|
|
|
- const index = this.form.tableData.indexOf(row);
|
|
|
- if (index !== -1) {
|
|
|
- this.form.tableData.splice(index, 1);
|
|
|
- }
|
|
|
- this.calcAmount();
|
|
|
- },
|
|
|
-
|
|
|
- calcAmount() {
|
|
|
- // 触发 computed 重新计算
|
|
|
- this.$forceUpdate();
|
|
|
- },
|
|
|
-
|
|
|
- save() {
|
|
|
- // 简单校验
|
|
|
- if (this.form.tableData.length === 0) {
|
|
|
- this.$message.warning('请至少添加一条收款记录');
|
|
|
- return;
|
|
|
- }
|
|
|
- for (let i = 0; i < this.form.tableData.length; i++) {
|
|
|
- const item = this.form.tableData[i];
|
|
|
- if (!item.receivedDate) {
|
|
|
- this.$message.warning(`第${i + 1}行收款时间不能为空`);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!item.receivedTotalPrice) {
|
|
|
- this.$message.warning(`第${i + 1}行已收金额不能为空`);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!item.paymentType) {
|
|
|
- this.$message.warning(`第${i + 1}行支付类型不能为空`);
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- this.loading = true;
|
|
|
- const params = this.form.tableData.map(item => {
|
|
|
+ this.form.tableData = this.info.detailList.map(item => {
|
|
|
return {
|
|
|
...item,
|
|
|
- advanceId: this.row.id,
|
|
|
- advanceCode: this.row.code,
|
|
|
+ paymentType: item.paymentType.toString()
|
|
|
}
|
|
|
- })
|
|
|
- saveDetailDetail(params).then(() => {
|
|
|
- this.loading = false;
|
|
|
- this.$message.success('收款成功');
|
|
|
- this.updateVisible(false);
|
|
|
- this.$emit('done');
|
|
|
- });
|
|
|
+ }) || [];
|
|
|
+ },
|
|
|
+
|
|
|
+ save() {
|
|
|
+ // 先校验公共组件内的表单
|
|
|
+ this.$refs.collectTableFormRef.validate().then(() => {
|
|
|
+ // 取整个表单数据
|
|
|
+ const data = this.$refs.collectTableFormRef.getData();
|
|
|
+ this.loading = true;
|
|
|
+ const params = data.tableData.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ advanceId: this.row.id,
|
|
|
+ advanceCode: this.row.code
|
|
|
+ };
|
|
|
+ });
|
|
|
+ saveDetailDetail(params)
|
|
|
+ .then(() => {
|
|
|
+ this.loading = false;
|
|
|
+ this.$message.success('收款成功');
|
|
|
+ this.updateVisible(false);
|
|
|
+ this.$emit('done');
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.loading = false;
|
|
|
+ });
|
|
|
+ }).catch(() => {});
|
|
|
},
|
|
|
|
|
|
updateVisible(value) {
|