diff --git a/src/api/base/invoice-item.js b/src/api/base/invoice-item.js new file mode 100644 index 0000000..1befeb5 --- /dev/null +++ b/src/api/base/invoice-item.js @@ -0,0 +1,31 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => + request({ + url: '/blade-system/invoice-item/list', + method: 'get', + params: { ...params, current, size }, + }); + +export const getAll = () => getList(1, 1000, {}); + +export const getDetail = id => + request({ + url: '/blade-system/invoice-item/detail', + method: 'get', + params: { id }, + }); + +export const submit = row => + request({ + url: '/blade-system/invoice-item/submit', + method: 'post', + data: row, + }); + +export const remove = ids => + request({ + url: '/blade-system/invoice-item/remove', + method: 'post', + params: { ids }, + }); diff --git a/src/api/payment/receiptFlow.js b/src/api/payment/receiptFlow.js index 64cec7b..32ad53b 100644 --- a/src/api/payment/receiptFlow.js +++ b/src/api/payment/receiptFlow.js @@ -12,7 +12,7 @@ export const getSettlementCandidates = (keyword, flowId) => params: { keyword, flowId }, }); export const claim = data => request({ url: `${baseUrl}/claim`, method: 'post', data }); -export const sync = () => request({ url: `${baseUrl}/sync`, method: 'post' }); +export const sync = data => request({ url: `${baseUrl}/sync`, method: 'post', data }); export const claimStatusOptions = [ { label: '未认领', value: 'unclaimed' }, diff --git a/src/api/settlement/formalSettlement.js b/src/api/settlement/formalSettlement.js index cfb5267..bad7c4c 100644 --- a/src/api/settlement/formalSettlement.js +++ b/src/api/settlement/formalSettlement.js @@ -36,3 +36,5 @@ export const adjustDetail = data => request({ url: `${baseUrl}/adjust-detail`, method: 'post', data }); export const applyPayment = data => request({ url: `${baseUrl}/apply-payment`, method: 'post', data }); +export const applyPayments = data => + request({ url: `${baseUrl}/apply-payments`, method: 'post', data }); diff --git a/src/components/vehicle-attachment-table/main.vue b/src/components/vehicle-attachment-table/main.vue index 2ad00ef..1ce0f46 100644 --- a/src/components/vehicle-attachment-table/main.vue +++ b/src/components/vehicle-attachment-table/main.vue @@ -250,7 +250,16 @@ export default { }, batchDownload() { const rows = this.selectedRows.length ? this.selectedRows : this.rows; - rows.forEach(this.downloadAttachment); + const downloadableRows = rows.filter(row => this.attachmentUrl(row)); + if (!downloadableRows.length) { + this.$message.warning( + this.selectedRows.length ? '所选附件暂无可下载地址' : '暂无可下载附件' + ); + return; + } + downloadableRows.forEach((row, index) => { + window.setTimeout(() => this.downloadAttachment(row), index * 500); + }); }, previewAttachment(row) { const url = this.attachmentUrl(row); diff --git a/src/option/payment/billLedger.js b/src/option/payment/billLedger.js index bb320c7..1500ad7 100644 --- a/src/option/payment/billLedger.js +++ b/src/option/payment/billLedger.js @@ -1,5 +1,5 @@ export const billLedgerTableColumns = [ - { prop: 'billNo', label: '票据编号', minWidth: 170 }, + { prop: 'billNo', label: '票据编号', minWidth: 170, link: true }, { prop: 'receiverName', label: '收票单位', minWidth: 170 }, { prop: 'issuerName', label: '出票单位', minWidth: 170 }, { prop: 'billTypeName', label: '汇票类型', minWidth: 110 }, diff --git a/src/option/payment/invoiceApplication.js b/src/option/payment/invoiceApplication.js index 40f8e17..5c4a708 100644 --- a/src/option/payment/invoiceApplication.js +++ b/src/option/payment/invoiceApplication.js @@ -1,6 +1,6 @@ export const invoiceApplicationTableColumns = [ { prop: 'applicationNo', label: '单据号', minWidth: 170, link: true }, - { prop: 'settlementNos', label: '结算单号', minWidth: 190, link: true }, + { prop: 'settlementNos', label: '结算单号', minWidth: 190 }, { prop: 'projectName', label: '所属项目', minWidth: 140 }, { prop: 'deptName', label: '所属组织', minWidth: 140 }, { prop: 'issuerName', label: '开票方', minWidth: 150 }, @@ -30,5 +30,4 @@ export const invoiceApplicationDetailColumns = [ { prop: 'mileage', label: '里程(KM)', minWidth: 120 }, { prop: 'batchNo', label: '批次号', minWidth: 120 }, { prop: 'freightAmount', label: '运费', minWidth: 120, money: true }, - { prop: 'feeItemsJson', label: '费用项目', minWidth: 180 }, ]; diff --git a/src/views/base/invoice-item.vue b/src/views/base/invoice-item.vue new file mode 100644 index 0000000..8a71a93 --- /dev/null +++ b/src/views/base/invoice-item.vue @@ -0,0 +1,308 @@ + + + + + + 修改 + + + 删除 + + + {{ scope.row.defaultTaxRate }}% + + + % + + + + + + + + + diff --git a/src/views/payment/bill-ledger-form.vue b/src/views/payment/bill-ledger-form.vue index 717c52d..ef9b43f 100644 --- a/src/views/payment/bill-ledger-form.vue +++ b/src/views/payment/bill-ledger-form.vue @@ -195,48 +195,7 @@ - - - - - - {{ row.originalName || row.name || '附件' }} - - {{ row.originalName || row.name || '-' }} - - - - - - - - - {{ fileSize(row) }} - - - - - - 删除 - - - - + @@ -252,7 +211,7 @@ - + @@ -279,6 +238,7 @@ import { mapGetters } from 'vuex'; import * as api from '@/api/payment/billLedger'; import { getList as getCustomerList } from '@/api/vehicle/customer-archive'; import { getDeptTree } from '@/api/system/dept'; +import VehicleAttachmentTable from '@/components/vehicle-attachment-table/main.vue'; const emptyForm = () => ({ id: null, @@ -302,6 +262,7 @@ const emptyForm = () => ({ export default { name: 'BillLedgerForm', + components: { VehicleAttachmentTable }, data() { return { form: emptyForm(), @@ -350,7 +311,7 @@ export default { billType: [{ required: true, message: '请选择汇票类型', trigger: 'change' }], faceAmount: [{ validator: this.validateFaceAmount, trigger: 'change' }], issueDate: [{ required: true, message: '请选择出票日期', trigger: 'change' }], - maturityDate: [{ validator: this.validateMaturityDate, trigger: 'change' }], + maturityDate: [{ required: true, validator: this.validateMaturityDate, trigger: 'change' }], availableDeptIds: [{ validator: this.validateDepartments, trigger: 'change' }], feeBearerId: [{ required: true, message: '请选择费用承担方', trigger: 'change' }], confirmedDiscountRate: [{ validator: this.validateRate, trigger: 'change' }], @@ -398,6 +359,8 @@ export default { this.form = { ...emptyForm(), ...data, + confirmedDiscountRate: this.normalizeDiscountRate(data.confirmedDiscountRate), + bankDiscountReferenceRate: this.normalizeDiscountRate(data.bankDiscountReferenceRate), availableDeptIds: this.parse(data.availableDeptIdsJson), attachments: this.parse(data.attachmentsJson), }; @@ -500,6 +463,11 @@ export default { } callback(); }, + normalizeDiscountRate(value) { + return value === null || value === undefined || value === '' || Number(value) === -1 + ? null + : value; + }, normalizeAttachments(files) { const userName = this.userInfo?.realName || this.userInfo?.userName || ''; const time = this.$dayjs().format('YYYY-MM-DD HH:mm:ss'); @@ -531,9 +499,9 @@ export default { availableDeptIdsJson: JSON.stringify(this.form.availableDeptIds || []), availableDeptNames: this.form.availableDeptNames, feeBearerId: this.form.feeBearerId, - confirmedDiscountRate: this.form.confirmedDiscountRate, + confirmedDiscountRate: this.normalizeDiscountRate(this.form.confirmedDiscountRate), issuingBank: this.form.issuingBank, - bankDiscountReferenceRate: this.form.bankDiscountReferenceRate, + bankDiscountReferenceRate: this.normalizeDiscountRate(this.form.bankDiscountReferenceRate), attachmentsJson: JSON.stringify(this.form.attachments || []), remark: this.form.remark, }; diff --git a/src/views/payment/bill-ledger.vue b/src/views/payment/bill-ledger.vue index 1324807..9c2a8c7 100644 --- a/src/views/payment/bill-ledger.vue +++ b/src/views/payment/bill-ledger.vue @@ -12,16 +12,89 @@ :loading="loading" :page="page" @add="openCreate" + @view="openView" @edit="openEdit" @delete="handleDelete" @page-change="handlePageChange" @size-change="handleSizeChange" /> + + + + + {{ + detailValue('billNo') + }} + {{ + detailValue('billTypeName', 'billType') + }} + {{ + detailValue('issuerName') + }} + {{ + detailValue('receiverName') + }} + {{ + formatMoney(detailDialog.row.faceAmount) + }} + {{ + formatMoney(detailDialog.row.availableBalance) + }} + {{ + detailValue('issueDate') + }} + {{ + detailValue('maturityDate') + }} + {{ + detailValue('issuingBank') + }} + {{ + detailValue('availableDeptNames') + }} + {{ + detailValue('feeBearerName') + }} + + {{ formatRate(detailDialog.row.bankDiscountReferenceRate) }} + + + {{ formatRate(detailDialog.row.confirmedDiscountRate) }} + + + {{ formatMoney(estimatedDiscountFee()) }} + + + {{ detailValue('remark') }} + + + + + + + + + {{ formatMoney(row.usedAmount) }} + + + + + + + + diff --git a/src/views/payment/bill-payment-form.vue b/src/views/payment/bill-payment-form.vue index 98d4544..570e6b6 100644 --- a/src/views/payment/bill-payment-form.vue +++ b/src/views/payment/bill-payment-form.vue @@ -75,51 +75,7 @@ - - - - - - {{ row.originalName || row.name || '附件' }} - - {{ row.originalName || row.name || '-' }} - - - - - - - - - {{ fileSize(row) }} - - - - - - 删除 - - - - + @@ -163,6 +119,11 @@ {{ formatMoney(row.availableBalance) }} + + + 选择 + + 取消 @@ -177,6 +138,7 @@ import { Search } from '@element-plus/icons-vue'; import { mapGetters } from 'vuex'; import * as api from '@/api/payment/billPayment'; import * as billLedgerApi from '@/api/payment/billLedger'; +import VehicleAttachmentTable from '@/components/vehicle-attachment-table/main.vue'; const emptyForm = () => ({ id: null, @@ -194,6 +156,7 @@ const emptyForm = () => ({ export default { name: 'BillPaymentForm', + components: { VehicleAttachmentTable }, data() { return { Search, diff --git a/src/views/payment/components/bill-ledger-table.vue b/src/views/payment/components/bill-ledger-table.vue index 86464bc..02ef19e 100644 --- a/src/views/payment/components/bill-ledger-table.vue +++ b/src/views/payment/components/bill-ledger-table.vue @@ -1,7 +1,6 @@ - 汇票台账列表 新增 @@ -16,7 +15,10 @@ show-overflow-tooltip > - {{ formatMoney(row[column.prop]) }} + {{ + displayValue(row[column.prop]) + }} + {{ formatMoney(row[column.prop]) }} {{ displayValue(row[column.prop]) }} @@ -66,7 +68,7 @@ export default { loading: { type: Boolean, default: false }, page: { type: Object, required: true }, }, - emits: ['add', 'edit', 'delete', 'page-change', 'size-change'], + emits: ['add', 'view', 'edit', 'delete', 'page-change', 'size-change'], data() { return { columns: billLedgerTableColumns }; }, @@ -94,13 +96,9 @@ export default { .bill-ledger-table__toolbar { display: flex; align-items: center; - justify-content: space-between; + justify-content: flex-start; padding: 12px 0; } -.bill-ledger-table__title { - font-size: 16px; - font-weight: 600; -} .bill-ledger-table__links { display: flex; flex-wrap: wrap; diff --git a/src/views/payment/invoice-application-form.vue b/src/views/payment/invoice-application-form.vue index 686cd3d..39ab1c2 100644 --- a/src/views/payment/invoice-application-form.vue +++ b/src/views/payment/invoice-application-form.vue @@ -93,9 +93,9 @@ :disabled="readonly" multiple filterable - allow-create - default-first-option :multiple-limit="3" + placeholder="请选择客商开票信息邮箱" + no-data-text="当前客商开票信息未配置邮箱" > 第{{ sheetIndex + 1 }}张 - 删除 - + - + @@ -304,6 +308,9 @@ + + 删除 + @@ -358,7 +365,15 @@ {{ row[column.prop] }} + + {{ formatMoney(getFeeItemValue(row, column.feeItemKeys)) }} {{ formatMoney(row[column.prop]) }} + {{ transportTypeLabel(row.transportType) }} {{ displayValue(row[column.prop]) }} @@ -366,41 +381,7 @@ - - - - - - - - - - - - - - - 查看 - 删除 - - - - - - - + @@ -469,6 +450,11 @@ {{ formatMoney(row.availableInvoiceAmount) }} + + + 选择 + + 取消 @@ -481,13 +467,16 @@