From fd5b1484e6ec352773e10290d453a514c2d27456 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Thu, 20 Aug 2026 06:33:01 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=202=E3=80=81=E8=B0=83=E6=95=B4=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9D=97=203=E3=80=81=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=AE=A2=E5=95=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/base/insurance-ocr-template.js | 37 + src/api/business/contract-manage.js | 7 + src/api/settlement/formalSettlement.js | 35 + src/api/settlement/preSettlement.js | 59 + .../settlement/receivable-payable-detail.js | 6 + src/api/settlement/settlementAdjustment.js | 24 + src/api/settlement/transportReconciliation.js | 37 + src/api/transportCapacity/driver.js | 13 + src/api/transportCapacity/transport-ship.js | 13 + .../transportCapacity/transport-vehicle.js | 13 + src/api/user.js | 3 + src/api/vehicle/customer-archive.js | 12 + src/api/vehicle/insurance-record.js | 12 + src/option/business/contract-manage.js | 84 +- src/option/business/waybill-manage.js | 91 +- src/option/settlement/formalSettlementForm.js | 30 + .../settlement/formalSettlementSearch.js | 45 + .../settlement/formalSettlementTable.js | 94 + src/option/settlement/preSettlementForm.js | 79 + src/option/settlement/preSettlementSearch.js | 25 + src/option/settlement/preSettlementTable.js | 88 + .../settlement/receivable-payable-detail.js | 19 +- .../settlement/settlementAdjustmentForm.js | 28 + .../settlement/settlementAdjustmentSearch.js | 20 + .../settlement/settlementAdjustmentTable.js | 18 + .../settlement/transportReconciliationForm.js | 13 + .../transportReconciliationSearch.js | 34 + .../transportReconciliationTable.js | 77 + src/option/vehicle/insurance-record.js | 13 +- src/router/views/index.js | 96 + src/views/base/insurance-ocr-template.vue | 313 +++ .../components/billing-plan-editor.vue | 102 + .../components/business-crud-page.vue | 1974 +++++++++++++---- .../components/master-order-detail.vue | 2 +- .../components/master-order-dispatch.vue | 51 +- .../components/master-order-editor.vue | 343 ++- src/views/business/contract-manage-change.vue | 152 ++ src/views/business/contract-manage.vue | 8 +- src/views/business/loading-manage.vue | 338 ++- src/views/business/project-apply.vue | 154 +- src/views/business/shipping-template.vue | 2 +- src/views/business/transport-plan.vue | 2 +- src/views/business/voucher-manage.vue | 107 +- src/views/business/waybill-manage.vue | 2 +- .../components/formal-settlement-editor.vue | 764 +++++++ .../components/pre-settlement-editor.vue | 1433 ++++++++++++ .../settlement-adjustment-editor.vue | 396 ++++ .../transport-reconciliation-editor.vue | 832 +++++++ src/views/settlement/formal-settlement.vue | 604 +++++ src/views/settlement/pre-settlement.vue | 805 +++++++ .../settlement/receivable-payable-detail.vue | 508 ++++- .../settlement/settlement-adjustment.vue | 382 ++++ .../settlement/transport-reconciliation.vue | 350 +++ src/views/transit/exception-disposal.vue | 26 +- src/views/transportCapacity/driver.vue | 196 +- src/views/transportCapacity/ship.vue | 163 +- src/views/transportCapacity/vehicle.vue | 219 +- src/views/vehicle/customer-archive.vue | 1283 +++++++---- src/views/vehicle/insurance-record.vue | 213 +- 59 files changed, 11745 insertions(+), 1104 deletions(-) create mode 100644 src/api/base/insurance-ocr-template.js create mode 100644 src/api/settlement/formalSettlement.js create mode 100644 src/api/settlement/preSettlement.js create mode 100644 src/api/settlement/settlementAdjustment.js create mode 100644 src/api/settlement/transportReconciliation.js create mode 100644 src/option/settlement/formalSettlementForm.js create mode 100644 src/option/settlement/formalSettlementSearch.js create mode 100644 src/option/settlement/formalSettlementTable.js create mode 100644 src/option/settlement/preSettlementForm.js create mode 100644 src/option/settlement/preSettlementSearch.js create mode 100644 src/option/settlement/preSettlementTable.js create mode 100644 src/option/settlement/settlementAdjustmentForm.js create mode 100644 src/option/settlement/settlementAdjustmentSearch.js create mode 100644 src/option/settlement/settlementAdjustmentTable.js create mode 100644 src/option/settlement/transportReconciliationForm.js create mode 100644 src/option/settlement/transportReconciliationSearch.js create mode 100644 src/option/settlement/transportReconciliationTable.js create mode 100644 src/views/base/insurance-ocr-template.vue create mode 100644 src/views/business/components/billing-plan-editor.vue create mode 100644 src/views/business/contract-manage-change.vue create mode 100644 src/views/settlement/components/formal-settlement-editor.vue create mode 100644 src/views/settlement/components/pre-settlement-editor.vue create mode 100644 src/views/settlement/components/settlement-adjustment-editor.vue create mode 100644 src/views/settlement/components/transport-reconciliation-editor.vue create mode 100644 src/views/settlement/formal-settlement.vue create mode 100644 src/views/settlement/pre-settlement.vue create mode 100644 src/views/settlement/settlement-adjustment.vue create mode 100644 src/views/settlement/transport-reconciliation.vue diff --git a/src/api/base/insurance-ocr-template.js b/src/api/base/insurance-ocr-template.js new file mode 100644 index 0000000..c79cb8b --- /dev/null +++ b/src/api/base/insurance-ocr-template.js @@ -0,0 +1,37 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/insurance-ocr-template/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/insurance-ocr-template/detail', + method: 'get', + params: { id }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-transport/insurance-ocr-template/submit', + method: 'post', + data: row, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/insurance-ocr-template/remove', + method: 'post', + params: { ids }, + }); +}; diff --git a/src/api/business/contract-manage.js b/src/api/business/contract-manage.js index 09976d0..275800c 100644 --- a/src/api/business/contract-manage.js +++ b/src/api/business/contract-manage.js @@ -70,6 +70,13 @@ export const startChange = (id, reason) => }, }); +export const submitChange = data => + request({ + url: `${baseUrl}/submit-change`, + method: 'post', + data, + }); + export const terminate = (id, reason) => request({ url: `${baseUrl}/terminate`, diff --git a/src/api/settlement/formalSettlement.js b/src/api/settlement/formalSettlement.js new file mode 100644 index 0000000..593835a --- /dev/null +++ b/src/api/settlement/formalSettlement.js @@ -0,0 +1,35 @@ +import request from '@/axios'; + +const baseUrl = '/blade-transport/formal-settlement'; + +export const getList = (current, size, params) => + request({ url: `${baseUrl}/list`, method: 'get', params: { current, size, ...params } }); +export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } }); +export const getCandidates = (current, size, params) => + request({ + url: `${baseUrl}/candidate-pre-settlements`, + method: 'get', + params: { current, size, ...params }, + }); +export const getContractOptions = keyword => + request({ url: `${baseUrl}/contract-options`, method: 'get', params: { keyword } }); +export const getCandidateDetails = (current, size, params) => + request({ + url: `${baseUrl}/candidate-details`, + method: 'get', + params: { current, size, ...params }, + }); +export const save = data => request({ url: `${baseUrl}/save`, method: 'post', data }); +export const remove = id => request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); +export const submit = data => request({ url: `${baseUrl}/submit`, method: 'post', data }); +export const approve = data => request({ url: `${baseUrl}/approve`, method: 'post', data }); +export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data }); +export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data }); +export const syncKingdee = id => + request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id } }); +export const getDetailFees = detailId => + request({ url: `${baseUrl}/detail-fees`, method: 'get', params: { detailId } }); +export const adjustDetail = data => + request({ url: `${baseUrl}/adjust-detail`, method: 'post', data }); +export const applyPayment = data => + request({ url: `${baseUrl}/apply-payment`, method: 'post', data }); diff --git a/src/api/settlement/preSettlement.js b/src/api/settlement/preSettlement.js new file mode 100644 index 0000000..2b96d13 --- /dev/null +++ b/src/api/settlement/preSettlement.js @@ -0,0 +1,59 @@ +import request from '@/axios'; + +const baseUrl = '/blade-transport/pre-settlement'; + +export const getList = (current, size, params) => + request({ url: `${baseUrl}/list`, method: 'get', params: { current, size, ...params } }); + +export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } }); + +export const getContractOptions = keyword => + request({ url: `${baseUrl}/contract-options`, method: 'get', params: { keyword } }); + +export const getFeeOptions = () => request({ url: `${baseUrl}/fee-options`, method: 'get' }); + +export const getCandidateDetails = (current, size, params) => + request({ + url: `${baseUrl}/candidate-details`, + method: 'get', + params: { current, size, ...params }, + }); + +export const save = data => request({ url: `${baseUrl}/save`, method: 'post', data }); + +export const remove = id => request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); + +export const removeDetail = (id, detailId) => + request({ url: `${baseUrl}/remove-detail`, method: 'post', params: { id, detailId } }); + +export const submit = data => request({ url: `${baseUrl}/submit`, method: 'post', data }); + +export const approve = data => request({ url: `${baseUrl}/approve`, method: 'post', data }); + +export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data }); + +export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data }); + +export const applyAdvance = data => + request({ url: `${baseUrl}/apply-advance`, method: 'post', data }); + +export const updateAdvancePaid = params => + request({ url: `${baseUrl}/update-advance-paid`, method: 'post', params }); + +export const voidAdvance = params => + request({ url: `${baseUrl}/void-advance`, method: 'post', params }); + +export const formalSettlement = id => + request({ url: `${baseUrl}/formal-settlement`, method: 'post', params: { id } }); + +export const getDetailFees = detailId => + request({ url: `${baseUrl}/detail-fees`, method: 'get', params: { detailId } }); + +export const adjustDetail = data => + request({ url: `${baseUrl}/adjust-detail`, method: 'post', data }); + +export const getPrintTemplates = id => + request({ url: `${baseUrl}/print-templates`, method: 'get', params: { id } }); + +export const exportList = params => + request({ url: `${baseUrl}/export`, method: 'get', params, responseType: 'blob' }); diff --git a/src/api/settlement/receivable-payable-detail.js b/src/api/settlement/receivable-payable-detail.js index b9c9e80..55ff903 100644 --- a/src/api/settlement/receivable-payable-detail.js +++ b/src/api/settlement/receivable-payable-detail.js @@ -18,6 +18,12 @@ export const getChangeRecords = (current, size, params) => export const updateFee = data => request({ url: `${baseUrl}/update-fee`, method: 'post', data }); +export const getUpdateFeeContracts = params => + request({ url: `${baseUrl}/update-fee-contracts`, method: 'get', params }); + +export const adjustFee = data => + request({ url: `${baseUrl}/adjust-fee`, method: 'post', data }); + export const transferSettlement = data => request({ url: `${baseUrl}/transfer-settlement`, method: 'post', data }); diff --git a/src/api/settlement/settlementAdjustment.js b/src/api/settlement/settlementAdjustment.js new file mode 100644 index 0000000..3316e4f --- /dev/null +++ b/src/api/settlement/settlementAdjustment.js @@ -0,0 +1,24 @@ +import request from '@/axios'; + +const baseUrl = '/blade-transport/settlement-adjustment'; +export const getList = (current, size, params) => + request({ url: `${baseUrl}/list`, method: 'get', params: { current, size, ...params } }); +export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } }); +export const getFormalSettlements = keyword => + request({ url: `${baseUrl}/candidate-formal-settlements`, method: 'get', params: { keyword } }); +export const getFormalDetails = formalSettlementId => + request({ url: `${baseUrl}/formal-details`, method: 'get', params: { formalSettlementId } }); +export const save = data => request({ url: `${baseUrl}/save`, method: 'post', data }); +export const remove = id => request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); +export const submit = id => request({ url: `${baseUrl}/submit`, method: 'post', data: { id } }); +export const approve = id => request({ url: `${baseUrl}/approve`, method: 'post', data: { id } }); +export const returnBill = (id, reason) => + request({ url: `${baseUrl}/return`, method: 'post', data: { id, reason } }); +export const repush = id => request({ url: `${baseUrl}/repush`, method: 'post', params: { id } }); + +export const approvalStatusOptions = [ + { label: '草稿', value: 'draft' }, + { label: '审批中', value: 'reviewing' }, + { label: '审批通过', value: 'approved' }, + { label: '已驳回', value: 'returned' }, +]; diff --git a/src/api/settlement/transportReconciliation.js b/src/api/settlement/transportReconciliation.js new file mode 100644 index 0000000..091215d --- /dev/null +++ b/src/api/settlement/transportReconciliation.js @@ -0,0 +1,37 @@ +import request from '@/axios'; + +const baseUrl = '/blade-transport/transport-reconciliation'; + +export const getList = (current, size, params) => + request({ url: `${baseUrl}/list`, method: 'get', params: { current, size, ...params } }); +export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } }); +export const getFormalOptions = (current, size, params) => + request({ + url: `${baseUrl}/formal-options`, + method: 'get', + params: { current, size, ...params }, + }); +export const save = data => request({ url: `${baseUrl}/save`, method: 'post', data }); +export const remove = id => request({ url: `${baseUrl}/remove`, method: 'post', params: { id } }); +export const match = id => request({ url: `${baseUrl}/match`, method: 'post', params: { id } }); +export const manualMatch = data => + request({ url: `${baseUrl}/manual-match`, method: 'post', data }); +export const unmatch = internalId => + request({ url: `${baseUrl}/unmatch`, method: 'post', params: { internalId } }); +export const adjust = data => request({ url: `${baseUrl}/adjust`, method: 'post', data }); +export const updateByMatch = id => + request({ url: `${baseUrl}/update-by-match`, method: 'post', params: { id } }); +export const complete = id => + request({ url: `${baseUrl}/complete`, method: 'post', params: { id } }); +export const template = mode => + request({ url: `${baseUrl}/template`, method: 'get', params: { mode }, responseType: 'blob' }); + +const importFile = (url, id, file) => { + const data = new FormData(); + data.append('id', id); + data.append('file', file); + return request({ url, method: 'post', data, responseType: 'blob', timeout: 60000 }); +}; + +export const importVehicle = (id, file) => importFile(`${baseUrl}/import-vehicle`, id, file); +export const importCargo = (id, file) => importFile(`${baseUrl}/import-cargo`, id, file); diff --git a/src/api/transportCapacity/driver.js b/src/api/transportCapacity/driver.js index 81d2230..bbab4f1 100644 --- a/src/api/transportCapacity/driver.js +++ b/src/api/transportCapacity/driver.js @@ -78,3 +78,16 @@ export const recognitionTransportCertificates = certificates => { data: certificates, }); }; + +export const recognizeBaiduOcr = (imageUrl, type, side = '') => { + return request({ + url: '/blade-transport/baidu-ocr/recognize-url', + method: 'post', + timeout: 60000, + params: { + imageUrl, + type, + ...(side ? { side } : {}), + }, + }); +}; diff --git a/src/api/transportCapacity/transport-ship.js b/src/api/transportCapacity/transport-ship.js index 25122d1..33dc4ab 100644 --- a/src/api/transportCapacity/transport-ship.js +++ b/src/api/transportCapacity/transport-ship.js @@ -58,3 +58,16 @@ export const getExpiryStat = params => { params, }); }; + +export const recognizeBaiduOcr = (imageUrl, type, side = '') => { + return request({ + url: '/blade-transport/baidu-ocr/recognize-url', + method: 'post', + timeout: 60000, + params: { + imageUrl, + type, + ...(side ? { side } : {}), + }, + }); +}; diff --git a/src/api/transportCapacity/transport-vehicle.js b/src/api/transportCapacity/transport-vehicle.js index 23cf472..f2bfb67 100644 --- a/src/api/transportCapacity/transport-vehicle.js +++ b/src/api/transportCapacity/transport-vehicle.js @@ -75,3 +75,16 @@ export const recognitionTransportCertificates = objectKeys => { data: objectKeys, }); }; + +export const recognizeBaiduOcr = (imageUrl, type, side = '') => { + return request({ + url: '/blade-transport/baidu-ocr/recognize-url', + method: 'post', + timeout: 60000, + params: { + imageUrl, + type, + ...(side ? { side } : {}), + }, + }); +}; diff --git a/src/api/user.js b/src/api/user.js index b59b6cc..044df9d 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -52,6 +52,9 @@ export const loginBySso = (tenantId, state, code) => headers: { 'Tenant-Id': tenantId, }, + meta: { + isToken: false, + }, params: { tenant_id: tenantId, code, diff --git a/src/api/vehicle/customer-archive.js b/src/api/vehicle/customer-archive.js index 19d7204..9d859f2 100644 --- a/src/api/vehicle/customer-archive.js +++ b/src/api/vehicle/customer-archive.js @@ -112,3 +112,15 @@ export const getScoreTemplate = quantificationId => { }, }); }; + +export const recognizeBusinessLicenseOcr = imageUrl => { + return request({ + url: '/blade-transport/baidu-ocr/recognize-url', + method: 'post', + timeout: 60000, + params: { + imageUrl, + type: 'business_license', + }, + }); +}; diff --git a/src/api/vehicle/insurance-record.js b/src/api/vehicle/insurance-record.js index 8bb823d..3a2f105 100644 --- a/src/api/vehicle/insurance-record.js +++ b/src/api/vehicle/insurance-record.js @@ -47,3 +47,15 @@ export const update = row => { data: row, }); }; + +export const recognizeGeneralOcr = imageUrl => { + return request({ + url: '/blade-transport/baidu-ocr/recognize-url', + method: 'post', + timeout: 60000, + params: { + imageUrl, + type: 'general', + }, + }); +}; diff --git a/src/option/business/contract-manage.js b/src/option/business/contract-manage.js index b7f1290..685ceb2 100644 --- a/src/option/business/contract-manage.js +++ b/src/option/business/contract-manage.js @@ -42,12 +42,18 @@ export const config = { batchDelete: false, enableContractForm: true, enableProjectSelect: true, + projectQueryParams: { + approvalStatuses: 'approved,change_approved', + }, enableContractPeriod: true, enableContractFileUpload: true, enableCurrentUserHandler: true, enableBillingPlan: true, enableSettlementRule: true, - enableReconciliation: true, + enableReconciliation: false, + enableFeeGenerationMode: true, + enableSettlementConfigTabs: true, + enablePaymentRatio: true, enableAttachmentTable: true, enableChangeRecord: true, enableOrganizationSelect: true, @@ -57,6 +63,53 @@ export const config = { statusProp: 'approvalStatus', statusTextProp: 'approvalStatusName', customMenuActions: true, + contractNameDetail: true, + detailSections: [ + { + title: '基本信息', + fields: [ + ['contractNo', '合同编号'], + ['contractName', '合同名称'], + ['projectName', '所属项目'], + ['organizationName', '所属组织'], + ['contractCategory', '合同类别'], + ['signType', '签约类型'], + ['partyA', '甲方'], + ['partyB', '乙方'], + ['handlerUserName', '经办人'], + ['signDate', '签订日期'], + ['contractFormat', '合同格式'], + ['legalSealFlag', '是否需要加盖法人章'], + ['copyCount', '一式'], + ['paymentDays', '回款账期'], + ['remark', '备注', 2], + ], + }, + { + title: '合同期限', + fields: [ + ['startDate', '开始日期'], + ['endDate', '结束日期'], + ['temporaryStartDate', '临时效力起'], + ['temporaryEndDate', '临时效力止'], + ['effectiveType', '生效类型'], + ['contractStage', '合同阶段'], + ['approvalStatus', '审核状态'], + ['currentNode', '当前节点'], + ['currentProcessor', '当前处理人'], + ], + }, + { + title: '计费与结算', + fields: [ + ['feeGenerationMode', '费用生成模式'], + ['billingPlanJson', '计费方案', 2], + ['settlementMode', '结算类型'], + ['settlementRuleJson', '结算规则', 2], + ['paymentRatioJson', '付款比例设置', 2], + ], + }, + ], editLabelStatusMap: { change_rejected: '编辑变更内容', }, @@ -96,6 +149,22 @@ export const config = { stage: ['temporary', 'formal'], permission: 'contract_manage_reject', }, + { + action: 'approve', + label: '通过', + statusProp: 'approvalStatus', + status: ['change_reviewing'], + stage: ['formal'], + permission: 'contract_manage_approve', + }, + { + action: 'reject', + label: '驳回', + statusProp: 'approvalStatus', + status: ['change_reviewing'], + stage: ['formal'], + permission: 'contract_manage_reject', + }, { action: 'submitFormal', label: '重新提交转正', @@ -186,6 +255,7 @@ export const option = createCrudOption([ searchOrder: 7, searchPlaceholder: '请输入', order: 180, + slot: true, minWidth: 180, rules: textRule('合同名称', 100, true), }, @@ -198,7 +268,8 @@ export const option = createCrudOption([ searchPlaceholder: '请选择', formslot: true, order: 140, - dicUrl: '/blade-transport/project-apply/list?current=1&size=9999', + dicUrl: + '/blade-transport/project-apply/list?current=1&size=9999&approvalStatuses=approved,change_approved', dicFormatter: listDicFormatter, props: { label: 'projectName', @@ -481,7 +552,7 @@ export const option = createCrudOption([ editDisplay: false, }, { - label: '计费信息', + label: '费用生成模式', prop: 'billingEnabled', type: 'switch', dicData: [ @@ -515,10 +586,11 @@ export const option = createCrudOption([ labelWidth: 0, }, { - label: '附件', + label: '', prop: 'contractFileJson', formslot: true, span: 24, + className: 'contract-file-form-item', order: 20, hide: true, }, @@ -560,7 +632,7 @@ export const option = createCrudOption([ }, { label: '', - prop: 'reconciliationTitle', + prop: 'paymentRatioTitle', formslot: true, span: 24, order: -30, @@ -569,7 +641,7 @@ export const option = createCrudOption([ }, { label: '', - prop: 'reconciliationJson', + prop: 'paymentRatioJson', formslot: true, span: 24, order: -40, diff --git a/src/option/business/waybill-manage.js b/src/option/business/waybill-manage.js index 0a38799..d0e80fc 100644 --- a/src/option/business/waybill-manage.js +++ b/src/option/business/waybill-manage.js @@ -63,15 +63,6 @@ const parseProcessNodes = value => { return Array.isArray(value.nodes) ? value.nodes : []; }; -const requiresDriverAcceptConfirmation = processJson => - parseProcessNodes(processJson).some( - node => - (node.key === 'accept' || node.name === '接单') && - node.enabled !== false && - node.confirmMode === 'yes' && - node.confirmDriver === true - ); - const getProcessConfigNodes = row => { const sources = [ row.processJson, @@ -99,11 +90,79 @@ const getProcessConfigNodes = row => { }); }; -const hasAcceptProcessNode = row => +const isAcceptProcessNode = node => node.key === 'accept' || node.name === '接单'; + +const requiresDriverAcceptConfirmation = row => getProcessConfigNodes(row).some( - node => node.enabled !== false && (node.key === 'accept' || node.name === '接单') + node => + isAcceptProcessNode(node) && + node.enabled !== false && + node.confirmMode === 'yes' && + node.confirmDriver === true ); +const isDriverRejectedStatus = value => { + if (value === null || value === undefined || typeof value === 'boolean') return false; + return [ + '-1', + '2', + 'reject', + 'rejected', + 'refuse', + 'refused', + 'decline', + 'declined', + 'deny', + 'denied', + '拒绝', + '已拒绝', + '拒绝接单', + '已拒绝接单', + ].includes(String(value).trim().toLowerCase()); +}; + +const hasDriverRejectRecord = row => { + const rejectRecordValues = [ + row.driverRejectTime, + row.driverRejectedTime, + row.driverRefuseTime, + row.acceptRejectTime, + row.driverRejectReason, + row.driverRefuseReason, + row.acceptRejectReason, + ]; + if (rejectRecordValues.some(value => !isEmpty(value))) return true; + + const driverStatusProps = [ + 'driverAcceptStatus', + 'driverAccepted', + 'driverAccept', + 'accepted', + 'isAccepted', + 'acceptStatus', + 'driverResponseStatus', + 'driverOrderStatus', + 'driverAcceptResult', + 'acceptResult', + ]; + if (driverStatusProps.some(prop => isDriverRejectedStatus(row[prop]))) return true; + + const nodeStatusProps = [ + ...driverStatusProps, + 'confirmStatus', + 'executionStatus', + 'nodeStatus', + 'status', + 'result', + ]; + return getProcessConfigNodes(row) + .filter(isAcceptProcessNode) + .some(node => nodeStatusProps.some(prop => isDriverRejectedStatus(node[prop]))); +}; + +const isDriverRejectedWaybill = row => + requiresDriverAcceptConfirmation(row) && hasDriverRejectRecord(row); + const hasDriverAcceptRecord = row => { const recordValues = [ row.driverAcceptTime, @@ -304,7 +363,7 @@ export const config = { formatStatus(row, prop, defaultText) { if ( prop === 'businessStatus' && - hasAcceptProcessNode(row) && + requiresDriverAcceptConfirmation(row) && isInProgressStatus(row, defaultText) && !hasDriverAcceptRecord(row) ) { @@ -313,12 +372,18 @@ export const config = { if ( prop === 'businessStatus' && row.businessStatus === 'pending' && - !requiresDriverAcceptConfirmation(row.processJson) + !requiresDriverAcceptConfirmation(row) ) { return '进行中'; } return defaultText; }, + canReassign(row) { + return isDriverRejectedWaybill(row); + }, + canEdit(row) { + return !isDriverRejectedWaybill(row); + }, deleteStatus: ['draft'], editStatus: ['draft', 'pending'], }; diff --git a/src/option/settlement/formalSettlementForm.js b/src/option/settlement/formalSettlementForm.js new file mode 100644 index 0000000..07623d0 --- /dev/null +++ b/src/option/settlement/formalSettlementForm.js @@ -0,0 +1,30 @@ +export const formalSettlementFormFields = [ + { label: '结算单号', prop: 'formalSettlementNo', readonly: true }, + { label: '项目名称', prop: 'projectName', readonly: true }, + { label: '所属组织', prop: 'deptName', readonly: true }, + { label: '合同编号', prop: 'contractNo', readonly: true }, + { label: '合同名称', prop: 'contractId', type: 'contract', required: true }, + { label: '付款方', prop: 'payerName', readonly: true }, + { label: '收款方', prop: 'payeeName', readonly: true }, + { label: '结算类型', prop: 'settlementTypeName', readonly: true }, + { label: '结算金额', prop: 'settlementAmount', readonly: true, money: true }, + { label: '汇率日期', prop: 'exchangeRateDate', type: 'date', required: true }, + { label: '结算汇率', prop: 'exchangeRate', type: 'number', required: true }, + { label: '本位币合计', prop: 'localSettlementAmount', readonly: true, money: true }, + { label: '申请付款金额(含预付)', prop: 'appliedPaymentAmount', readonly: true, money: true }, + { label: '已收/已付合计', prop: 'paidAmount', readonly: true, money: true }, +]; + +export const createFormalSettlementForm = () => ({ + id: null, + formalSettlementNo: '', + contractId: null, + contractName: '', + settlementType: '', + sourcePreSettlementIds: [], + sourceDetailIds: [], + exchangeRateDate: '', + exchangeRate: 1, + attachmentsJson: '[]', + remark: '', +}); diff --git a/src/option/settlement/formalSettlementSearch.js b/src/option/settlement/formalSettlementSearch.js new file mode 100644 index 0000000..c5766f5 --- /dev/null +++ b/src/option/settlement/formalSettlementSearch.js @@ -0,0 +1,45 @@ +export const approvalStatusOptions = [ + { label: '草稿', value: 'draft' }, + { label: '审批中', value: 'reviewing' }, + { label: '审批通过', value: 'approved' }, + { label: '已驳回', value: 'returned' }, + { label: '已作废', value: 'voided' }, +]; + +export const invoiceStatusOptions = [ + { label: '未收/开票', value: 'unreceived' }, + { label: '部分收/开票', value: 'partial' }, + { label: '已收/开票', value: 'completed' }, +]; + +export const paymentStatusOptions = [ + { label: '未收/付款', value: 'unpaid' }, + { label: '部分收/付款', value: 'partial' }, + { label: '已收/付款', value: 'paid' }, +]; + +export const kingdeeSyncStatusOptions = [ + { label: '未同步', value: 'unsynced' }, + { label: '已同步', value: 'synced' }, + { label: '同步失败', value: 'failed' }, +]; + +export const formalSettlementSearchFields = [ + { label: '结算单号', prop: 'formalSettlementNo', type: 'input' }, + { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '项目', prop: 'projectName', type: 'input' }, + { label: '所属组织', prop: 'deptName', type: 'input' }, + { label: '合同编号', prop: 'contractNo', type: 'input' }, + { label: '付款方', prop: 'payerName', type: 'input' }, + { label: '收款方', prop: 'payeeName', type: 'input' }, + { label: '发票状态', prop: 'invoiceStatus', type: 'select', options: invoiceStatusOptions }, + { label: '收付款状态', prop: 'paymentStatus', type: 'select', options: paymentStatusOptions }, + { label: '审核状态', prop: 'approvalStatus', type: 'select', options: approvalStatusOptions }, + { + label: '金蝶单据状态', + prop: 'kingdeeSyncStatus', + type: 'select', + options: kingdeeSyncStatusOptions, + }, + { label: '生成日期', prop: 'createDateRange', type: 'daterange' }, +]; diff --git a/src/option/settlement/formalSettlementTable.js b/src/option/settlement/formalSettlementTable.js new file mode 100644 index 0000000..fd0dcbb --- /dev/null +++ b/src/option/settlement/formalSettlementTable.js @@ -0,0 +1,94 @@ +export const formalSettlementTableColumns = [ + { label: '结算单号', prop: 'formalSettlementNo', minWidth: 160, link: true, fixed: 'left' }, + { label: '预结算单号', prop: 'preSettlementNos', minWidth: 190 }, + { label: '来源', prop: 'sourceType', minWidth: 110 }, + { label: '付款方', prop: 'payerName', minWidth: 150 }, + { label: '收款方', prop: 'payeeName', minWidth: 150 }, + { label: '项目名称', prop: 'projectName', minWidth: 140 }, + { label: '所属组织', prop: 'deptName', minWidth: 140 }, + { label: '合同编号', prop: 'contractNo', minWidth: 150 }, + { label: '合同名称', prop: 'contractName', minWidth: 170 }, + { label: '原币结算金额', prop: 'settlementAmount', minWidth: 145, money: true }, + { label: '本位币结算金额', prop: 'localSettlementAmount', minWidth: 155, money: true }, + { label: '结算汇率', prop: 'exchangeRate', minWidth: 110 }, + { label: '申请付款金额(含预付)', prop: 'appliedPaymentAmount', minWidth: 185, money: true }, + { label: '已收/已付合计', prop: 'paidAmount', minWidth: 145, money: true }, + { label: '发票状态', prop: 'invoiceStatusName', minWidth: 120 }, + { label: '收付款状态', prop: 'paymentStatusName', minWidth: 120 }, + { label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true }, + { label: '当前节点', prop: 'currentNode', minWidth: 130 }, + { label: '当前处理人', prop: 'currentProcessor', minWidth: 130 }, + { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 }, + { label: '创建人', prop: 'createUserName', minWidth: 110 }, + { label: '创建时间', prop: 'createTime', minWidth: 170 }, +]; + +export const sourceColumns = [ + { label: '预结算单号', prop: 'preSettlementNo', minWidth: 160 }, + { label: '结算金额', prop: 'settlementAmount', minWidth: 130, money: true }, + { label: '申请预付金额', prop: 'advanceAppliedAmount', minWidth: 140, money: true }, + { label: '已付款金额', prop: 'advancePaidAmount', minWidth: 130, money: true }, +]; + +export const detailColumns = [ + { label: '单据号', prop: 'documentNo', minWidth: 180 }, + { label: '运单号', prop: 'waybillNo', minWidth: 160 }, + { label: '车号', prop: 'vehicleNo', minWidth: 130 }, + { label: '发货地址', prop: 'departureAddress', minWidth: 180 }, + { label: '到货地址', prop: 'arrivalAddress', minWidth: 180 }, + { label: '实际发货时间', prop: 'actualDepartureTime', minWidth: 170 }, + { label: '实际完成时间', prop: 'actualCompletionTime', minWidth: 170 }, + { label: '运输类型', prop: 'transportType', minWidth: 120 }, + { label: '货物名称', prop: 'cargoName', minWidth: 140 }, + { label: '货物类型', prop: 'cargoType', minWidth: 130 }, + { label: '运输总量', prop: 'transportQuantity', minWidth: 120 }, + { label: '里程(KM)', prop: 'mileage', minWidth: 120 }, + { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '运输单价', prop: 'unitPrice', minWidth: 120, money: true }, + { label: '运费', prop: 'freightAmount', minWidth: 120, money: true }, + { label: '调整金额', prop: 'adjustAmount', minWidth: 120, money: true }, + { label: '结算金额(含税)', prop: 'settlementAmountTax', minWidth: 155, money: true }, + { label: '结算金额(不含税)', prop: 'settlementAmountNoTax', minWidth: 170, money: true }, + { label: '备注', prop: 'remark', minWidth: 180 }, +]; + +export const candidateColumns = [ + { label: '预结算单号', prop: 'preSettlementNo', minWidth: 170 }, + { label: '项目名称', prop: 'projectName', minWidth: 140 }, + { label: '所属组织', prop: 'deptName', minWidth: 140 }, + { label: '合同编号', prop: 'contractNo', minWidth: 150 }, + { label: '合同名称', prop: 'contractName', minWidth: 170 }, + { label: '付款方', prop: 'payerName', minWidth: 150 }, + { label: '收款方', prop: 'payeeName', minWidth: 150 }, + { label: '结算金额', prop: 'settlementAmount', minWidth: 130, money: true }, + { label: '创建时间', prop: 'createTime', minWidth: 170 }, +]; + +export const candidateDetailColumns = [ + { label: '单据号', prop: 'documentNo', minWidth: 180 }, + { label: '项目名称', prop: 'projectName', minWidth: 140 }, + { label: '所属组织', prop: 'deptName', minWidth: 140 }, + { label: '生成日期', prop: 'feeDate', minWidth: 120 }, + { label: '客商名称', prop: 'customerName', minWidth: 150 }, + { label: '合同编号', prop: 'contractNo', minWidth: 150 }, + { label: '合同名称', prop: 'contractName', minWidth: 170 }, + { label: '来源', prop: 'sourceType', minWidth: 110 }, + { label: '运单号', prop: 'waybillNo', minWidth: 150 }, + { label: '车号', prop: 'vehicleNo', minWidth: 130 }, + { label: '运输类型', prop: 'transportType', minWidth: 120 }, + { label: '货物名称', prop: 'cargoName', minWidth: 140 }, + { label: '货物类型', prop: 'cargoType', minWidth: 130 }, + { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '应收应付合计', prop: 'totalAmount', minWidth: 140, money: true }, + { label: '状态', prop: 'settlementStatusName', minWidth: 110 }, +]; + +export const paymentColumns = [ + { label: '付款类型', prop: 'paymentTypeName', minWidth: 120 }, + { label: '单据号', prop: 'paymentNo', minWidth: 160 }, + { label: '申请付款金额', prop: 'appliedAmount', minWidth: 145, money: true }, + { label: '已付款金额', prop: 'paidAmount', minWidth: 130, money: true }, + { label: '单据状态', prop: 'billStatusName', minWidth: 120 }, + { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 }, + { label: '创建时间', prop: 'createTime', minWidth: 170 }, +]; diff --git a/src/option/settlement/preSettlementForm.js b/src/option/settlement/preSettlementForm.js new file mode 100644 index 0000000..cc19b5c --- /dev/null +++ b/src/option/settlement/preSettlementForm.js @@ -0,0 +1,79 @@ +export const settlementTypeOptions = [ + { label: '应收', value: 'receivable' }, + { label: '应付', value: 'payable' }, +]; + +export const preSettlementFormFields = [ + { label: '预结算单号', prop: 'preSettlementNo', readonly: true }, + { label: '合同名称', prop: 'contractId', type: 'contract', required: true }, + { label: '合同编号', prop: 'contractNo', readonly: true }, + { label: '项目名称', prop: 'projectName', readonly: true }, + { label: '收款方', prop: 'payeeName', readonly: true }, + { label: '付款方', prop: 'payerName', readonly: true }, + { label: '结算类型', prop: 'settlementType', readonly: true }, + { label: '结算金额', prop: 'settlementAmount', readonly: true, money: true }, + { label: '汇率日期', prop: 'exchangeRateDate', type: 'date' }, + { label: '结算汇率', prop: 'exchangeRate', type: 'number' }, + { label: '本位币合计', prop: 'localSettlementAmount', readonly: true, money: true }, + { label: '创建人', prop: 'createUserName', readonly: true }, + { label: '创建日期', prop: 'createTime', readonly: true }, + { label: '备注', prop: 'remark', type: 'textarea', span: 24, maxlength: 200 }, +]; + +export const preSettlementFormRules = { + contractId: [{ required: true, message: '请选择合同名称', trigger: 'change' }], + exchangeRateDate: [ + { + validator: (_rule, value, callback, source) => { + if (source.currency && source.currency !== 'RMB' && !value) { + callback(new Error('外币结算请选择汇率日期')); + return; + } + callback(); + }, + trigger: 'change', + }, + ], + exchangeRate: [ + { + validator: (_rule, value, callback, source) => { + if (source.currency && source.currency !== 'RMB' && (!value || Number(value) <= 0)) { + callback(new Error('外币结算请输入大于0的结算汇率')); + return; + } + callback(); + }, + trigger: ['blur', 'change'], + }, + ], + remark: [{ max: 200, message: '备注不能超过200个字符', trigger: 'blur' }], +}; + +export const emptyPreSettlementForm = () => ({ + id: '', + preSettlementNo: '', + contractId: '', + contractNo: '', + contractName: '', + projectId: '', + projectName: '', + deptId: '', + deptName: '', + payeeName: '', + payerName: '', + settlementType: 'payable', + currency: 'RMB', + settlementAmount: 0, + localCurrency: 'RMB', + localSettlementAmount: 0, + exchangeRateDate: '', + exchangeRate: 1, + approvalStatus: 'draft', + approvalStatusName: '草稿', + currentNode: '草稿', + currentProcessor: '', + createUserName: '', + createTime: '', + attachmentsJson: '[]', + remark: '', +}); diff --git a/src/option/settlement/preSettlementSearch.js b/src/option/settlement/preSettlementSearch.js new file mode 100644 index 0000000..8e57a0e --- /dev/null +++ b/src/option/settlement/preSettlementSearch.js @@ -0,0 +1,25 @@ +export const approvalStatusOptions = [ + { label: '草稿', value: 'draft' }, + { label: '审批中', value: 'reviewing' }, + { label: '审批通过', value: 'approved' }, + { label: '已驳回', value: 'returned' }, + { label: '已作废', value: 'voided' }, +]; + +export const preSettlementSearchFields = [ + { label: '预结算单号', prop: 'preSettlementNo', type: 'input' }, + { label: '预付单号', prop: 'advanceNo', type: 'input' }, + { label: '项目名称', prop: 'projectName', type: 'input' }, + { label: '所属组织', prop: 'deptName', type: 'input' }, + { label: '合同名称', prop: 'contractName', type: 'input' }, + { label: '合同编号', prop: 'contractNo', type: 'input' }, + { label: '收款方', prop: 'payeeName', type: 'input' }, + { label: '付款方', prop: 'payerName', type: 'input' }, + { label: '生成日期', prop: 'createDateRange', type: 'daterange' }, + { + label: '审核状态', + prop: 'approvalStatus', + type: 'select', + options: approvalStatusOptions, + }, +]; diff --git a/src/option/settlement/preSettlementTable.js b/src/option/settlement/preSettlementTable.js new file mode 100644 index 0000000..044a0f0 --- /dev/null +++ b/src/option/settlement/preSettlementTable.js @@ -0,0 +1,88 @@ +export const preSettlementTableColumns = [ + { label: '预结算单号', prop: 'preSettlementNo', minWidth: 150, link: true, fixed: 'left' }, + { label: '来源', prop: 'sourceType', minWidth: 100 }, + { label: '付款方', prop: 'payerName', minWidth: 160 }, + { label: '收款方', prop: 'payeeName', minWidth: 160 }, + { label: '项目名称', prop: 'projectName', minWidth: 130 }, + { label: '所属组织', prop: 'deptName', minWidth: 140 }, + { label: '合同编号', prop: 'contractNo', minWidth: 140 }, + { label: '合同名称', prop: 'contractName', minWidth: 160 }, + { label: '原币结算金额', prop: 'settlementAmount', minWidth: 140, money: true, precision: 2 }, + { label: '本位币结算金额', prop: 'localSettlementAmount', minWidth: 150, money: true, precision: 2 }, + { label: '结算汇率', prop: 'exchangeRate', minWidth: 110, precision: 2 }, + { label: '申请预付金额', prop: 'advanceAppliedAmount', minWidth: 140, money: true }, + { label: '已付款金额', prop: 'advancePaidAmount', minWidth: 130, money: true }, + { label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true }, + { label: '当前节点', prop: 'currentNode', minWidth: 130 }, + { label: '当前处理人', prop: 'currentProcessor', minWidth: 130 }, + { label: '创建人', prop: 'createUserName', minWidth: 110 }, + { label: '创建时间', prop: 'createTime', minWidth: 170 }, +]; + +export const settlementSummaryColumns = [ + { label: '费用类型', prop: 'feeType', minWidth: 150 }, + { label: '费用项', prop: 'feeItem', minWidth: 160 }, + { label: '原金额', prop: 'originalAmount', minWidth: 130 }, + { label: '调整金额', prop: 'adjustAmount', minWidth: 140 }, + { label: '结算金额', prop: 'settlementAmount', minWidth: 140 }, + { label: '备注', prop: 'remark', minWidth: 200 }, +]; + +export const settlementDetailColumns = [ + { label: '单据号', prop: 'documentNo', minWidth: 180, link: true }, + { label: '运单号', prop: 'waybillNo', minWidth: 160 }, + { label: '车号', prop: 'vehicleNo', minWidth: 130 }, + { label: '发货地址', prop: 'departureAddress', minWidth: 180 }, + { label: '到货地址', prop: 'arrivalAddress', minWidth: 180 }, + { label: '实际发货时间', prop: 'actualDepartureTime', minWidth: 170 }, + { label: '实际完成时间', prop: 'actualCompletionTime', minWidth: 170 }, + { label: '运输类型', prop: 'transportType', minWidth: 120 }, + { label: '货物名称', prop: 'cargoName', minWidth: 150 }, + { label: '货物类型', prop: 'cargoType', minWidth: 140 }, + { label: '运输总量', prop: 'transportQuantityText', minWidth: 120 }, + { label: '里程(KM)', prop: 'mileage', minWidth: 120 }, + { label: '批次号', prop: 'batchNo', minWidth: 130 }, + { label: '运输单价', prop: 'unitPrice', minWidth: 120, money: true }, + { label: '运费', prop: 'freightAmount', minWidth: 120, money: true }, + { label: '原金额', prop: 'originalAmount', minWidth: 120, money: true }, + { label: '调整金额', prop: 'adjustAmount', minWidth: 120, money: true }, + { label: '结算金额(含税)', prop: 'settlementAmountTax', minWidth: 150, money: true }, + { label: '结算金额(不含税)', prop: 'settlementAmountNoTax', minWidth: 165, money: true }, + { label: '备注', prop: 'remark', minWidth: 180 }, +]; + +export const advanceColumns = [ + { label: '预付单号', prop: 'advanceNo', minWidth: 160 }, + { label: '申请预付金额', prop: 'appliedAmount', minWidth: 150 }, + { label: '已付款金额', prop: 'paidAmount', minWidth: 140 }, + { label: '单据状态', prop: 'billStatus', minWidth: 120 }, + { label: '金蝶预付单号', prop: 'kingdeeAdvanceNo', minWidth: 170 }, + { label: '创建人', prop: 'createUserName', minWidth: 120 }, + { label: '创建时间', prop: 'createTime', minWidth: 170 }, +]; + +export const changeRecordColumns = [ + { label: '变更类型', prop: 'changeType', minWidth: 130 }, + { label: '行号', prop: 'lineNo', minWidth: 80 }, + { label: '类型', prop: 'operationType', minWidth: 100 }, + { label: '变更内容', prop: 'changeContent', minWidth: 320 }, + { label: '操作人', prop: 'operatorName', minWidth: 120 }, + { label: '变更原因', prop: 'changeReason', minWidth: 180 }, + { label: '变更时间', prop: 'changeTime', minWidth: 170 }, +]; + +export const candidateDetailColumns = [ + { label: '单据号', prop: 'documentNo', minWidth: 180 }, + { label: '费用日期', prop: 'feeDate', minWidth: 120 }, + { label: '客商名称', prop: 'customerName', minWidth: 150 }, + { label: '发货地点', prop: 'departureAddress', minWidth: 170 }, + { label: '到货地点', prop: 'arrivalAddress', minWidth: 170 }, + { label: '合同名称', prop: 'contractName', minWidth: 160 }, + { label: '运单号', prop: 'waybillNo', minWidth: 150 }, + { label: '车号', prop: 'vehicleNo', minWidth: 130 }, + { label: '运输类型', prop: 'transportType', minWidth: 120 }, + { label: '货物名称', prop: 'cargoName', minWidth: 140 }, + { label: '货物类型', prop: 'cargoType', minWidth: 130 }, + { label: '批次号', prop: 'batchNo', minWidth: 120 }, + { label: '结算金额', prop: 'totalAmount', minWidth: 130, money: true }, +]; diff --git a/src/option/settlement/receivable-payable-detail.js b/src/option/settlement/receivable-payable-detail.js index 952ac91..6c1420c 100644 --- a/src/option/settlement/receivable-payable-detail.js +++ b/src/option/settlement/receivable-payable-detail.js @@ -46,8 +46,6 @@ export const tableColumns = [ { label: '里程(KM)', prop: 'mileage', minWidth: 120, align: 'right' }, { label: '批次号', prop: 'batchNo', minWidth: 120 }, { label: '运输单价', prop: 'unitPriceText', minWidth: 120, align: 'right' }, - { label: '运输费', prop: 'freightAmountText', minWidth: 120, align: 'right' }, - { label: '其它费用', prop: 'otherFeeAmountText', minWidth: 120, align: 'right' }, { label: '费用合计', prop: 'totalAmountText', minWidth: 130, align: 'right' }, { label: '状态', prop: 'settlementStatusName', minWidth: 120 }, { label: '创建人', prop: 'createUserName', minWidth: 120 }, @@ -114,6 +112,23 @@ export const generateWaybillColumns = [ { label: '运输类型', prop: 'transportType', minWidth: 130 }, { label: '承运类型', prop: 'carrierType', minWidth: 130 }, { label: '货物信息', prop: 'cargoInfo', minWidth: 160 }, + { label: '发货地址', prop: 'departureAddress', minWidth: 220 }, + { label: '发货联系人', prop: 'departureContact', minWidth: 130 }, + { label: '到货地址', prop: 'arrivalAddress', minWidth: 220 }, + { label: '收货联系人', prop: 'arrivalContact', minWidth: 130 }, + { label: '单价', prop: 'unitPrice', minWidth: 110, align: 'right' }, + { label: '运费', prop: 'freight', minWidth: 110, align: 'right' }, + { label: '其他费用合计', prop: 'otherFeeTotal', minWidth: 140, align: 'right' }, + { label: '运费合计', prop: 'freightTotal', minWidth: 120, align: 'right' }, + { label: '客户合同', prop: 'contractName', minWidth: 160 }, + { label: '发货计划', prop: 'planName', minWidth: 140 }, + { label: '运输批次', prop: 'batchNo', minWidth: 140 }, + { label: '原始单号', prop: 'originalNo', minWidth: 140 }, + { label: '多式联运总单号', prop: 'masterNo', minWidth: 160 }, + { label: '备注', prop: 'remark', minWidth: 180 }, + { label: '创建时间', prop: 'createTime', minWidth: 170 }, + { label: '更新时间', prop: 'updateTime', minWidth: 170 }, + { label: '状态', prop: 'businessStatusName', minWidth: 110 }, ]; export const generatePreviewColumns = [ diff --git a/src/option/settlement/settlementAdjustmentForm.js b/src/option/settlement/settlementAdjustmentForm.js new file mode 100644 index 0000000..8c30cf0 --- /dev/null +++ b/src/option/settlement/settlementAdjustmentForm.js @@ -0,0 +1,28 @@ +export const settlementAdjustmentFormFields = [ + { label: '单据号', prop: 'adjustmentNo' }, + { label: '* 关联结算单号', prop: 'formalSettlementId' }, + { label: '客户/客商名称', prop: 'customerName' }, + { label: '结算单类型', prop: 'settlementTypeName' }, + { label: '关联合同名称', prop: 'contractName' }, + { label: '关联项目', prop: 'projectName' }, + { label: '原结算金额', prop: 'originalSettlementAmount', money: true }, + { label: '调整金额', prop: 'adjustmentAmount', money: true }, + { label: '调整后结算金额', prop: 'adjustedSettlementAmount', money: true }, +]; + +export const createSettlementAdjustmentForm = () => ({ + id: null, + adjustmentNo: '', + formalSettlementId: null, + formalSettlementNo: '', + settlementType: '', + projectName: '', + deptName: '', + customerName: '', + contractNo: '', + contractName: '', + adjustmentAmount: 0, + originalSettlementAmount: 0, + adjustedSettlementAmount: 0, + remark: '', +}); diff --git a/src/option/settlement/settlementAdjustmentSearch.js b/src/option/settlement/settlementAdjustmentSearch.js new file mode 100644 index 0000000..5711fce --- /dev/null +++ b/src/option/settlement/settlementAdjustmentSearch.js @@ -0,0 +1,20 @@ +import { approvalStatusOptions } from '@/api/settlement/settlementAdjustment'; + +export const settlementAdjustmentSearchFields = [ + { label: '单据号', prop: 'adjustmentNo', type: 'input' }, + { label: '日期', prop: 'createDateRange', type: 'daterange' }, + { label: '客户名称', prop: 'customerName', type: 'input' }, + { label: '项目名称', prop: 'projectName', type: 'input' }, + { label: '所属组织', prop: 'deptName', type: 'input' }, + { label: '关联结算单', prop: 'formalSettlementNo', type: 'input' }, + { + label: '结算单类型', + prop: 'settlementType', + type: 'select', + options: [ + { label: '应付', value: 'payable' }, + { label: '应收', value: 'receivable' }, + ], + }, + { label: '审核状态', prop: 'approvalStatus', type: 'select', options: approvalStatusOptions }, +]; diff --git a/src/option/settlement/settlementAdjustmentTable.js b/src/option/settlement/settlementAdjustmentTable.js new file mode 100644 index 0000000..d411d5b --- /dev/null +++ b/src/option/settlement/settlementAdjustmentTable.js @@ -0,0 +1,18 @@ +export const settlementAdjustmentTableColumns = [ + { label: '单据号', prop: 'adjustmentNo', minWidth: 160, link: true, fixed: 'left' }, + { label: '结算单号', prop: 'formalSettlementNo', minWidth: 160 }, + { label: '结算单类型', prop: 'settlementTypeName', minWidth: 110 }, + { label: '项目名称', prop: 'projectName', minWidth: 140 }, + { label: '所属组织', prop: 'deptName', minWidth: 140 }, + { label: '客商名称', prop: 'customerName', minWidth: 150 }, + { label: '合同编号', prop: 'contractNo', minWidth: 150 }, + { label: '合同名称', prop: 'contractName', minWidth: 170 }, + { label: '调整金额', prop: 'adjustmentAmount', minWidth: 130, money: true }, + { label: '原结算金额', prop: 'originalSettlementAmount', minWidth: 140, money: true }, + { label: '调整后结算金额', prop: 'adjustedSettlementAmount', minWidth: 160, money: true }, + { label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true }, + { label: '当前节点', prop: 'currentNode', minWidth: 120 }, + { label: '当前处理人', prop: 'currentProcessor', minWidth: 130 }, + { label: '创建人', prop: 'createUserName', minWidth: 110 }, + { label: '创建时间', prop: 'createTime', minWidth: 170 }, +]; diff --git a/src/option/settlement/transportReconciliationForm.js b/src/option/settlement/transportReconciliationForm.js new file mode 100644 index 0000000..69f249c --- /dev/null +++ b/src/option/settlement/transportReconciliationForm.js @@ -0,0 +1,13 @@ +export const transportReconciliationFormFields = [ + { prop: 'reconciliationNo', label: '对账单号', readonly: true }, + { prop: 'reconciliationMode', label: '对账模式', type: 'mode' }, + { prop: 'formalSettlementNo', label: '正式结算单', type: 'formal' }, + { prop: 'payerName', label: '付款方', readonly: true }, + { prop: 'payeeName', label: '收款方', readonly: true }, + { prop: 'projectName', label: '项目', readonly: true }, + { prop: 'deptName', label: '所属组织', readonly: true }, + { prop: 'contractName', label: '合同名称', readonly: true }, + { prop: 'paidAmount', label: '已付合计', money: true, readonly: true }, + { prop: 'reconcilerName', label: '对账人', readonly: true }, + { prop: 'reconciliationDate', label: '对账日期', type: 'date' }, +]; diff --git a/src/option/settlement/transportReconciliationSearch.js b/src/option/settlement/transportReconciliationSearch.js new file mode 100644 index 0000000..ad0ee72 --- /dev/null +++ b/src/option/settlement/transportReconciliationSearch.js @@ -0,0 +1,34 @@ +export const reconciliationMatchStatusOptions = [ + { label: '全部', value: '' }, + { label: '未匹配', value: 'unmatched' }, + { label: '部分匹配', value: 'partial' }, + { label: '已匹配', value: 'matched' }, +]; + +export const reconciliationStatusOptions = [ + { label: '全部', value: '' }, + { label: '未完成', value: 'unfinished' }, + { label: '已完成', value: 'completed' }, +]; + +export const transportReconciliationSearchFields = [ + { prop: 'reconciliationNo', label: '对账单号', type: 'input' }, + { prop: 'preSettlementNos', label: '预结算单号', type: 'input' }, + { prop: 'projectName', label: '项目', type: 'input' }, + { prop: 'deptName', label: '所属组织', type: 'input' }, + { prop: 'contractNo', label: '合同编号', type: 'input' }, + { prop: 'payerName', label: '付款方', type: 'input' }, + { prop: 'payeeName', label: '收款方', type: 'input' }, + { + prop: 'matchStatus', + label: '匹配状态', + type: 'select', + options: reconciliationMatchStatusOptions, + }, + { + prop: 'reconciliationStatus', + label: '对账状态', + type: 'select', + options: reconciliationStatusOptions, + }, +]; diff --git a/src/option/settlement/transportReconciliationTable.js b/src/option/settlement/transportReconciliationTable.js new file mode 100644 index 0000000..4a98dd8 --- /dev/null +++ b/src/option/settlement/transportReconciliationTable.js @@ -0,0 +1,77 @@ +export const transportReconciliationTableColumns = [ + { prop: 'reconciliationNo', label: '对账单号', minWidth: 150, link: true }, + { prop: 'payerName', label: '付款方', minWidth: 150 }, + { prop: 'payeeName', label: '收款方', minWidth: 150 }, + { prop: 'projectName', label: '项目名称', minWidth: 120 }, + { prop: 'deptName', label: '所属组织', minWidth: 120 }, + { prop: 'contractNo', label: '合同编号', minWidth: 130 }, + { prop: 'contractName', label: '合同名称', minWidth: 150 }, + { prop: 'settlementAmount', label: '结算金额', minWidth: 120, money: true }, + { prop: 'reconciliationModeName', label: '对账模式', minWidth: 110 }, + { prop: 'externalBillCount', label: '账单总数(条)', minWidth: 110 }, + { prop: 'matchedCount', label: '匹配数(条)', minWidth: 100 }, + { prop: 'reconciliationStatusName', label: '对账状态', minWidth: 100 }, + { prop: 'createUserName', label: '创建人', minWidth: 100 }, + { prop: 'createTime', label: '创建时间', minWidth: 160 }, +]; + +export const internalColumns = [ + { prop: 'documentNo', label: '单据号', minWidth: 150 }, + { prop: 'waybillNo', label: '运单号', minWidth: 120 }, + { prop: 'matchedExternalLineNo', label: '匹配外部账单行号', minWidth: 140 }, + { prop: 'vehicleNo', label: '车号', minWidth: 100 }, + { prop: 'departureAddress', label: '发货地址', minWidth: 180 }, + { prop: 'arrivalAddress', label: '到货地址', minWidth: 180 }, + { prop: 'actualDepartureTime', label: '实际发货时间', minWidth: 150 }, + { prop: 'actualCompletionTime', label: '实际完成时间', minWidth: 150 }, + { prop: 'transportType', label: '运输类型', minWidth: 120 }, + { prop: 'cargoName', label: '货物名称', minWidth: 120 }, + { prop: 'cargoType', label: '货物类型', minWidth: 120 }, + { prop: 'specification', label: '规格', minWidth: 100 }, + { prop: 'model', label: '型号', minWidth: 100 }, + { prop: 'transportQuantity', label: '运输总量', minWidth: 100, number: true }, + { prop: 'mileage', label: '里程(KM)', minWidth: 100, number: true }, + { prop: 'batchNo', label: '批次号', minWidth: 100 }, + { prop: 'unitPrice', label: '运输单价', minWidth: 110, money: true }, + { prop: 'freightAmount', label: '运输费', minWidth: 110, money: true }, + { prop: 'settlementAmount', label: '结算金额', minWidth: 120, money: true }, + { prop: 'matchResult', label: '匹配结果', minWidth: 100 }, + { prop: 'updateResult', label: '账单更新结果', minWidth: 130 }, +]; + +export const externalVehicleColumns = [ + { prop: 'externalLineNo', label: '序号', minWidth: 70 }, + { prop: 'vehicleNo', label: '车牌号', minWidth: 110 }, + { prop: 'departureAddress', label: '发货地址', minWidth: 180 }, + { prop: 'arrivalAddress', label: '到货地址', minWidth: 180 }, + { prop: 'actualDepartureTime', label: '实际发货时间', minWidth: 150 }, + { prop: 'actualCompletionTime', label: '实际完成时间', minWidth: 150 }, + { prop: 'transportType', label: '运输类型', minWidth: 120 }, + { prop: 'cargoName', label: '货物名称', minWidth: 120 }, + { prop: 'cargoType', label: '货物类型', minWidth: 120 }, + { prop: 'transportQuantity', label: '运输总量', minWidth: 100, number: true }, + { prop: 'mileage', label: '里程(KM)', minWidth: 100, number: true }, + { prop: 'batchNo', label: '批次号', minWidth: 100 }, + { prop: 'unitPrice', label: '运输单价', minWidth: 110, money: true }, + { prop: 'freightAmount', label: '运费', minWidth: 110, money: true }, + { prop: 'settlementAmount', label: '结算费用合计', minWidth: 130, money: true }, + { prop: 'matchStatus', label: '匹配状态', minWidth: 110 }, +]; + +export const externalCargoColumns = [ + { prop: 'externalLineNo', label: '序号', minWidth: 70 }, + { prop: 'vehicleNo', label: '车牌号', minWidth: 110 }, + { prop: 'departureAddress', label: '发货地址', minWidth: 180 }, + { prop: 'arrivalAddress', label: '到货地址', minWidth: 180 }, + { prop: 'actualDepartureTime', label: '实际发货时间', minWidth: 150 }, + { prop: 'actualCompletionTime', label: '实际完成时间', minWidth: 150 }, + { prop: 'cargoName', label: '货物名称', minWidth: 120 }, + { prop: 'cargoType', label: '货物类型', minWidth: 120 }, + { prop: 'specification', label: '规格', minWidth: 100 }, + { prop: 'model', label: '型号', minWidth: 100 }, + { prop: 'transportQuantity', label: '运输量', minWidth: 100, number: true }, + { prop: 'unitPrice', label: '运输单价', minWidth: 110, money: true }, + { prop: 'mileage', label: '里程(KM)', minWidth: 100, number: true }, + { prop: 'freightAmount', label: '运输费', minWidth: 110, money: true }, + { prop: 'settlementAmount', label: '结算金额', minWidth: 120, money: true }, +]; diff --git a/src/option/vehicle/insurance-record.js b/src/option/vehicle/insurance-record.js index 29fb02c..5872b3c 100644 --- a/src/option/vehicle/insurance-record.js +++ b/src/option/vehicle/insurance-record.js @@ -23,11 +23,7 @@ export const insuranceTypeDic = [ { label: '船舶险', value: '船舶险' }, ]; -export const ocrTemplateDic = [ - { label: '紫金-机动车交强险', value: '紫金-机动车交强险' }, - { label: '机动车商业险', value: '机动车商业险' }, - { label: '船舶保险', value: '船舶保险' }, -]; +export const ocrTemplateDic = []; export const option = { height: 'auto', @@ -67,9 +63,14 @@ export const option = { prop: 'ocrTemplate', type: 'select', dicData: ocrTemplateDic, - value: '紫金-机动车交强险', + value: '', hide: true, + display: true, + addDisplay: true, + editDisplay: true, + viewDisplay: true, span: 12, + rules: [{ required: true, message: '请选择OCR识别模板', trigger: 'change' }], }, { label: '上传文件', diff --git a/src/router/views/index.js b/src/router/views/index.js index a1c8c7d..fd2018f 100644 --- a/src/router/views/index.js +++ b/src/router/views/index.js @@ -2,6 +2,102 @@ import Layout from '@/page/index/index.vue'; import Store from '@/store/'; export default [ + { + path: '/business/contract-manage/form', + component: Layout, + children: [ + { + path: '', + name: '新增合同管理', + meta: { keepAlive: false }, + component: () => import('@/views/business/contract-manage.vue'), + }, + ], + }, + { + path: '/business/project-apply/form', + component: Layout, + children: [ + { + path: '', + name: '新增项目申请', + meta: { keepAlive: false }, + component: () => import('@/views/business/project-apply.vue'), + }, + ], + }, + { + path: '/business/waybill-manage/form', + component: Layout, + children: [ + { + path: '', + name: '新增编辑运单管理', + meta: { keepAlive: false }, + component: () => import('@/views/business/waybill-manage.vue'), + }, + ], + }, + { + path: '/business/loading-manage/form', + component: Layout, + children: [ + { + path: '', + name: '新增编辑配载管理', + meta: { keepAlive: false }, + component: () => import('@/views/business/loading-manage.vue'), + }, + ], + }, + { + path: '/business/transport-plan/form', + component: Layout, + children: [ + { + path: '', + name: '新增编辑运输计划', + meta: { keepAlive: false }, + component: () => import('@/views/business/transport-plan.vue'), + }, + ], + }, + { + path: '/business/shipping-template/form', + component: Layout, + children: [ + { + path: '', + name: '新增编辑运单模板', + meta: { keepAlive: false }, + component: () => import('@/views/business/shipping-template.vue'), + }, + ], + }, + { + path: '/vehicle/customer-archive/form', + component: Layout, + children: [ + { + path: '', + name: '新增客商档案', + meta: { keepAlive: false }, + component: () => import('@/views/vehicle/customer-archive.vue'), + }, + ], + }, + { + path: '/business/contract-manage/change', + component: Layout, + children: [ + { + path: '', + name: '合同变更', + meta: { keepAlive: false }, + component: () => import('@/views/business/contract-manage-change.vue'), + }, + ], + }, { path: '/wel', component: () => diff --git a/src/views/base/insurance-ocr-template.vue b/src/views/base/insurance-ocr-template.vue new file mode 100644 index 0000000..f5cbc3a --- /dev/null +++ b/src/views/base/insurance-ocr-template.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/src/views/business/components/billing-plan-editor.vue b/src/views/business/components/billing-plan-editor.vue new file mode 100644 index 0000000..9de5f4c --- /dev/null +++ b/src/views/business/components/billing-plan-editor.vue @@ -0,0 +1,102 @@ + + + + diff --git a/src/views/business/components/business-crud-page.vue b/src/views/business/components/business-crud-page.vue index 4bb64b2..4e90d4c 100644 --- a/src/views/business/components/business-crud-page.vue +++ b/src/views/business/components/business-crud-page.vue @@ -1,11 +1,21 @@ @@ -115,12 +125,19 @@ - - -