From af3fb0aa2f1fc3e50a183e20160727c0b96aa462 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Fri, 6 Nov 2026 19:27:31 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8E=BB=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bms/common/utils/StringUtils.java | 29 +++++++++++++++++++ .../price/oracle/OracleOrderBillMapper.java | 2 +- .../service/impl/PrcOrderBillServiceImpl.java | 2 +- .../service/impl/PrcZoneServiceImpl.java | 10 +------ .../impl/TmsPriceQuoteServiceImpl.java | 17 ++++------- bms-front/src/views/price/billing/bill.vue | 26 ++++++++--------- 6 files changed, 51 insertions(+), 35 deletions(-) diff --git a/bms-back/bms-common/src/main/java/com/bms/common/utils/StringUtils.java b/bms-back/bms-common/src/main/java/com/bms/common/utils/StringUtils.java index d9a86f5d..82628b08 100644 --- a/bms-back/bms-common/src/main/java/com/bms/common/utils/StringUtils.java +++ b/bms-back/bms-common/src/main/java/com/bms/common/utils/StringUtils.java @@ -168,6 +168,35 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils return (str == null ? "" : str.trim()); } + /** + * Normalize destination postcode for zone match / persist. + * Removes all Unicode whitespace (incl. NBSP / U+2005) and ASCII spaces; + * strips Excel-style trailing ".0" on pure digits. + */ + public static String normalizePostcode(String postcode) + { + if (isEmpty(postcode)) + { + return postcode; + } + StringBuilder sb = new StringBuilder(postcode.length()); + for (int i = 0; i < postcode.length(); ) + { + int cp = postcode.codePointAt(i); + if (!Character.isWhitespace(cp)) + { + sb.appendCodePoint(cp); + } + i += Character.charCount(cp); + } + String n = sb.toString(); + if (n.endsWith(".0") && n.matches("\\d+\\.0")) + { + return n.substring(0, n.length() - 2); + } + return n; + } + /** * 替换指定字符串的指定区间内字符为"*" * diff --git a/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderBillMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderBillMapper.java index 0628a1df..dd93978b 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderBillMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderBillMapper.java @@ -47,7 +47,7 @@ public class OracleOrderBillMapper req.setCountryCode(firstStr(row, "COUNTRY")); String countryName = firstStr(row, "COUNTRY_NAME", "COUNTRY_EINGTH_NAME", "COUNTRY"); req.setCountryName(countryName); - req.setDestPostcode(firstStr(row, "CONSIGNEE_POSTCODE")); + req.setDestPostcode(StringUtils.normalizePostcode(firstStr(row, "CONSIGNEE_POSTCODE"))); // Prefer CONFIRM_WEIGHT (customer confirmed); fallback DIMENSIONAL_WEIGHT_FACTOR (charge weight). BigDecimal weight = firstPositiveDecimal(row, "CONFIRM_WEIGHT", "DIMENSIONAL_WEIGHT_FACTOR"); req.setWeight(weight); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java index 8614f22d..86bbc07f 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java @@ -3324,7 +3324,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService bill.setPkgHeight(request.getPkgHeight()); bill.setShipperName(request.getShipperName()); bill.setConsigneeName(request.getConsigneeName()); - bill.setDestPostcode(request.getDestPostcode()); + bill.setDestPostcode(StringUtils.normalizePostcode(request.getDestPostcode())); bill.setWarehouseCode(request.getWarehouseCode()); bill.setOrderTime(request.getOrderTime()); applyUpstreamOrderStatus(bill, request); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcZoneServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcZoneServiceImpl.java index 368f60fb..f868cfcd 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcZoneServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcZoneServiceImpl.java @@ -783,15 +783,7 @@ public class PrcZoneServiceImpl implements IPrcZoneService private static String normalizePostcode(String postcode) { - if (StringUtils.isEmpty(postcode)) - { - return postcode; - } - if (postcode.endsWith(".0") && postcode.matches("\\d+\\.0")) - { - return postcode.substring(0, postcode.length() - 2); - } - return postcode; + return StringUtils.normalizePostcode(postcode); } private static String normalizeCell(String text) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/TmsPriceQuoteServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/TmsPriceQuoteServiceImpl.java index 5f996c1b..33e1bade 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/TmsPriceQuoteServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/TmsPriceQuoteServiceImpl.java @@ -388,7 +388,11 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService } // Charge weight keeps 3 decimals; freight unit price keeps 2 (see buildFromRates). BigDecimal weight = request.getWeight().setScale(3, RoundingMode.HALF_UP); - String destPostcode = emptyToNull(request.getDestPostcode()); + String destPostcode = emptyToNull(normalizePostcode(request.getDestPostcode())); + if (destPostcode != null) + { + request.setDestPostcode(destPostcode); + } String productName = null; if (request instanceof TmsPriceBillRequest) { @@ -992,16 +996,7 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService private static String normalizePostcode(String postcode) { - if (StringUtils.isEmpty(postcode)) - { - return postcode; - } - String n = postcode.trim().replace(" ", ""); - if (n.endsWith(".0") && n.matches("\\d+\\.0")) - { - return n.substring(0, n.length() - 2); - } - return n; + return StringUtils.normalizePostcode(postcode); } private TmsPriceQuoteResult tryFixed(PrcCustomerPriceSet bind, PrcPriceSet set, PrcPriceSetVersion version, diff --git a/bms-front/src/views/price/billing/bill.vue b/bms-front/src/views/price/billing/bill.vue index 7052c865..af47ada7 100644 --- a/bms-front/src/views/price/billing/bill.vue +++ b/bms-front/src/views/price/billing/bill.vue @@ -622,19 +622,6 @@ const searchColumns = [ collapseTagsTooltip: true } }, - { - label: '\u8ba1\u8d39\u5931\u8d25', - prop: 'billingFailStatuses', - component: 'select', - options: billingFailStatusOptions, - placeholder: '\u8bf7\u9009\u62e9', - props: { - multiple: true, - clearable: true, - collapseTags: true, - collapseTagsTooltip: true - } - }, { label: '计费时间', prop: 'bizDateRange', @@ -655,6 +642,19 @@ const searchColumns = [ clearable: true, defaultTime: [new Date(2000, 0, 1, 0, 0, 0), new Date(2000, 0, 1, 23, 59, 59)] } + }, + { + label: '\u8ba1\u8d39\u5931\u8d25', + prop: 'billingFailStatuses', + component: 'select', + options: billingFailStatusOptions, + placeholder: '\u8bf7\u9009\u62e9', + props: { + multiple: true, + clearable: true, + collapseTags: true, + collapseTagsTooltip: true + } } ] From 489f99dc7b5cca92abfa7b6a443fcfbccc38e953 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Mon, 9 Nov 2026 11:09:51 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=A5=97=E9=A4=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bms-back/sql/price/exclusive_quote_menu.sql | 80 +++++++++++++++---- .../set/composables/usePriceSetModule.js | 30 +++---- 2 files changed, 78 insertions(+), 32 deletions(-) diff --git a/bms-back/sql/price/exclusive_quote_menu.sql b/bms-back/sql/price/exclusive_quote_menu.sql index e6e831ee..f9aa8a70 100644 --- a/bms-back/sql/price/exclusive_quote_menu.sql +++ b/bms-back/sql/price/exclusive_quote_menu.sql @@ -1,29 +1,75 @@ --- Exclusive quote module menus SET NAMES utf8mb4; --- Top-level directory -INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) -SELECT 2600, N'专属报价', 0, 55, 'exclusive', NULL, '', '', 1, 0, 'M', '0', '0', '', 'money', 'admin', sysdate(), N'老板客户专属报价' -FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2600 OR (path = 'exclusive' AND parent_id = 0 AND menu_type = 'M')); +-- Exclusive package menus under package management (套餐管理). +-- Idempotent: create if missing, rename/reparent if already present, drop obsolete top directory 专属报价. -SET @exParentId := (SELECT menu_id FROM sys_menu WHERE menu_id = 2600 LIMIT 1); -SET @exParentId := IFNULL(@exParentId, ( - SELECT menu_id FROM sys_menu WHERE path = 'exclusive' AND menu_type = 'M' AND parent_id = 0 ORDER BY menu_id ASC LIMIT 1 -)); +SET @pkgParentId := ( + SELECT menu_id FROM sys_menu + WHERE menu_id = 2200 + OR (menu_name = N'套餐管理' AND parent_id = 0 AND menu_type = 'M') + ORDER BY CASE WHEN menu_id = 2200 THEN 0 ELSE 1 END, menu_id + LIMIT 1 +); --- List page +-- Drop obsolete top-level directory (and role links) +DELETE FROM sys_role_menu WHERE menu_id = 2600; +DELETE FROM sys_menu + WHERE menu_id = 2600 + OR (path = 'exclusive' AND parent_id = 0 AND menu_type = 'M' AND menu_name = N'专属报价'); + +-- List: 专属套餐 INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) -SELECT 2601, N'报价列表', @exParentId, 1, 'quote', 'price/exclusive/exclusiveQuote', '', 'ExclusiveQuote', 1, 0, 'C', '0', '0', 'price:exclusive:list', 'list', 'admin', sysdate(), N'专属报价列表' -FROM DUAL WHERE @exParentId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2601 OR perms = 'price:exclusive:list'); +SELECT 2601, N'专属套餐', @pkgParentId, 2, 'quote', 'price/exclusive/exclusiveQuote', '', 'ExclusiveQuote', 1, 0, 'C', '0', '0', 'price:exclusive:list', 'list', 'admin', sysdate(), N'专属套餐列表' +FROM DUAL WHERE @pkgParentId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2601 OR perms = 'price:exclusive:list'); + +UPDATE sys_menu +SET menu_name = N'专属套餐', + parent_id = @pkgParentId, + order_num = 2, + path = 'quote', + component = 'price/exclusive/exclusiveQuote', + route_name = 'ExclusiveQuote', + remark = N'专属套餐列表', + update_by = 'admin', + update_time = sysdate() +WHERE @pkgParentId IS NOT NULL AND (menu_id = 2601 OR perms = 'price:exclusive:list'); -- Hidden create / detail INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) -SELECT 2609, N'报价新建', @exParentId, 2, 'quoteCreate', 'price/exclusive/create', '', 'ExclusiveQuoteCreate', 1, 0, 'C', '1', '0', 'price:exclusive:add', '#', 'admin', sysdate(), N'专属报价新建/编辑' -FROM DUAL WHERE @exParentId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2609 OR path = 'quoteCreate'); +SELECT 2609, N'专属套餐新建', @pkgParentId, 5, 'quoteCreate', 'price/exclusive/create', '', 'ExclusiveQuoteCreate', 1, 0, 'C', '1', '0', 'price:exclusive:add', '#', 'admin', sysdate(), N'专属套餐新建/编辑' +FROM DUAL WHERE @pkgParentId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2609 OR path = 'quoteCreate'); + +UPDATE sys_menu +SET menu_name = N'专属套餐新建', + parent_id = @pkgParentId, + order_num = 5, + path = 'quoteCreate', + component = 'price/exclusive/create', + route_name = 'ExclusiveQuoteCreate', + remark = N'专属套餐新建/编辑', + update_by = 'admin', + update_time = sysdate() +WHERE @pkgParentId IS NOT NULL AND (menu_id = 2609 OR path = 'quoteCreate'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) -SELECT 2610, N'报价详情', @exParentId, 3, 'quoteDetail', 'price/exclusive/detail', '', 'ExclusiveQuoteDetail', 1, 0, 'C', '1', '0', 'price:exclusive:query', '#', 'admin', sysdate(), N'专属报价详情' -FROM DUAL WHERE @exParentId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2610 OR path = 'quoteDetail'); +SELECT 2610, N'专属套餐详情', @pkgParentId, 6, 'quoteDetail', 'price/exclusive/detail', '', 'ExclusiveQuoteDetail', 1, 0, 'C', '1', '0', 'price:exclusive:query', '#', 'admin', sysdate(), N'专属套餐详情' +FROM DUAL WHERE @pkgParentId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2610 OR path = 'quoteDetail'); + +UPDATE sys_menu +SET menu_name = N'专属套餐详情', + parent_id = @pkgParentId, + order_num = 6, + path = 'quoteDetail', + component = 'price/exclusive/detail', + route_name = 'ExclusiveQuoteDetail', + remark = N'专属套餐详情', + update_by = 'admin', + update_time = sysdate() +WHERE @pkgParentId IS NOT NULL AND (menu_id = 2610 OR path = 'quoteDetail'); + +-- Keep ordinary set create/detail order after list pages +UPDATE sys_menu SET order_num = 3, update_by = 'admin', update_time = sysdate() WHERE menu_id = 2208; +UPDATE sys_menu SET order_num = 4, update_by = 'admin', update_time = sysdate() WHERE menu_id = 2209; -- Buttons under list INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) @@ -52,7 +98,7 @@ FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2607 OR (pare INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, m.menu_id FROM ( - SELECT 2600 AS menu_id UNION SELECT 2601 UNION SELECT 2602 UNION SELECT 2603 + SELECT 2601 AS menu_id UNION SELECT 2602 UNION SELECT 2603 UNION SELECT 2604 UNION SELECT 2605 UNION SELECT 2606 UNION SELECT 2607 UNION SELECT 2609 UNION SELECT 2610 ) m diff --git a/bms-front/src/views/price/set/composables/usePriceSetModule.js b/bms-front/src/views/price/set/composables/usePriceSetModule.js index 9e09c06b..81035774 100644 --- a/bms-front/src/views/price/set/composables/usePriceSetModule.js +++ b/bms-front/src/views/price/set/composables/usePriceSetModule.js @@ -36,23 +36,23 @@ export function createExclusiveModule(api) { exclusiveQuote: true, onlyImportFresh: true, routes: Object.freeze({ - list: '/exclusive/quote', - create: '/exclusive/quoteCreate', - detail: '/exclusive/quoteDetail' + list: '/customer/quote', + create: '/customer/quoteCreate', + detail: '/customer/quoteDetail' }), labels: Object.freeze({ - entity: '专属报价', - entityCode: '报价编码', - entityName: '报价名称', - createButton: '新建报价', - saveProgressTitle: '正在保存专属报价', - savedSuccess: '专属报价已保存', - noActiveVersion: '该专属报价暂无生效版本', - disableConfirm: '停用后该专属报价不再参与计费命中,确认停用【{name}】?', - enableConfirm: '启用后该专属报价将重新参与计费命中,确认启用【{name}】?', - basicEditTitle: '修改专属报价基本信息', - keywordPlaceholder: '报价编码 / 名称', - detailTitleFallback: '专属报价详情' + entity: '专属套餐', + entityCode: '套餐编码', + entityName: '套餐名称', + createButton: '新建专属套餐', + saveProgressTitle: '正在保存专属套餐', + savedSuccess: '专属套餐已保存', + noActiveVersion: '该专属套餐暂无生效版本', + disableConfirm: '停用后该专属套餐不再参与计费命中,确认停用【{name}】?', + enableConfirm: '启用后该专属套餐将重新参与计费命中,确认启用【{name}】?', + basicEditTitle: '修改专属套餐基本信息', + keywordPlaceholder: '套餐编码 / 名称', + detailTitleFallback: '专属套餐详情' }) }) } From cd25055159df1b19b1c26fb7560009c67470d6d0 Mon Sep 17 00:00:00 2001 From: caojia <1301869380@qq.com> Date: Mon, 9 Nov 2026 10:50:29 +0800 Subject: [PATCH 3/8] =?UTF-8?q?:sparkles:=20=E6=96=B0=E5=A2=9E=E5=BA=94?= =?UTF-8?q?=E6=94=B6=E8=B4=A6=E5=8D=95=E6=AF=9B=E5=88=A9=E5=88=86=E6=9E=90?= =?UTF-8?q?=E4=B8=8E=E6=8F=90=E6=88=90=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/report/ArProfitController.java | 135 +++++++ .../bms/report/ArCommissionServiceTest.java | 83 +++++ .../com/bms/report/ArProfitMapperSqlTest.java | 68 ++++ .../bms/report/ArProfitScopeResolverTest.java | 52 +++ .../bms/report/CommissionCalculatorTest.java | 59 +++ .../main/java/com/bms/ar/domain/ArBill.java | 7 + .../com/bms/ar/mapper/ArCommissionMapper.java | 30 ++ .../com/bms/ar/mapper/ArProfitMapper.java | 20 ++ .../com/bms/ar/profit/ArCommissionRate.java | 22 ++ .../com/bms/ar/profit/ArCommissionResult.java | 27 ++ .../bms/ar/profit/ArCommissionService.java | 148 ++++++++ .../bms/ar/profit/ArCommissionSummary.java | 15 + .../java/com/bms/ar/profit/ArProfitQuery.java | 21 ++ .../java/com/bms/ar/profit/ArProfitRow.java | 30 ++ .../bms/ar/profit/ArProfitSalesOption.java | 11 + .../java/com/bms/ar/profit/ArProfitScope.java | 11 + .../bms/ar/profit/ArProfitScopeResolver.java | 58 +++ .../com/bms/ar/profit/ArProfitService.java | 59 +++ .../com/bms/ar/profit/ArProfitSummary.java | 18 + .../com/bms/ar/profit/ArWriteoffRate.java | 23 ++ .../bms/ar/profit/CommissionCalculator.java | 88 +++++ .../impl/ArBalanceWriteoffServiceImpl.java | 9 + .../ar/service/impl/ArBillServiceImpl.java | 23 ++ .../com/bms/price/enums/ProfitAreaRule.java | 5 + .../main/resources/mapper/ar/ArBillMapper.xml | 16 +- .../mapper/ar/ArCommissionMapper.xml | 187 ++++++++++ .../resources/mapper/ar/ArProfitMapper.xml | 158 ++++++++ bms-back/sql/20261105_ar_profit_report.sql | 339 ++++++++++++++++++ bms-front/src/api/report/arProfit.js | 15 + bms-front/src/views/report/arProfit/index.vue | 283 +++++++++++++++ 30 files changed, 2018 insertions(+), 2 deletions(-) create mode 100644 bms-back/bms-admin/src/main/java/com/bms/web/controller/report/ArProfitController.java create mode 100644 bms-back/bms-admin/src/test/java/com/bms/report/ArCommissionServiceTest.java create mode 100644 bms-back/bms-admin/src/test/java/com/bms/report/ArProfitMapperSqlTest.java create mode 100644 bms-back/bms-admin/src/test/java/com/bms/report/ArProfitScopeResolverTest.java create mode 100644 bms-back/bms-admin/src/test/java/com/bms/report/CommissionCalculatorTest.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArCommissionMapper.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArProfitMapper.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionRate.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionResult.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionService.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionSummary.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitQuery.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitRow.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSalesOption.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScope.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScopeResolver.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitService.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSummary.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/ArWriteoffRate.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/ar/profit/CommissionCalculator.java create mode 100644 bms-back/bms-system/src/main/resources/mapper/ar/ArCommissionMapper.xml create mode 100644 bms-back/bms-system/src/main/resources/mapper/ar/ArProfitMapper.xml create mode 100644 bms-back/sql/20261105_ar_profit_report.sql create mode 100644 bms-front/src/api/report/arProfit.js create mode 100644 bms-front/src/views/report/arProfit/index.vue diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/report/ArProfitController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/report/ArProfitController.java new file mode 100644 index 00000000..68752349 --- /dev/null +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/report/ArProfitController.java @@ -0,0 +1,135 @@ +package com.bms.web.controller.report; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bms.ar.profit.ArCommissionRate; +import com.bms.ar.profit.ArCommissionService; +import com.bms.ar.profit.ArProfitQuery; +import com.bms.ar.profit.ArProfitService; +import com.bms.ar.profit.ArWriteoffRate; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.PathVariable; +import jakarta.servlet.http.HttpServletResponse; +import com.bms.ar.profit.ArProfitRow; +import com.bms.ar.profit.ArCommissionResult; +import com.bms.common.utils.poi.ExcelUtil; +import com.bms.price.enums.ProfitAreaRule; +import com.bms.common.annotation.Log; +import com.bms.common.core.controller.BaseController; +import com.bms.common.core.domain.AjaxResult; +import com.bms.common.core.page.TableDataInfo; +import com.bms.common.enums.BusinessType; + +@RestController +@RequestMapping("/report/ar-profit") +public class ArProfitController extends BaseController +{ + private final ArProfitService report; + private final ArCommissionService commissions; + + public ArProfitController(ArProfitService report, ArCommissionService commissions) + { + this.report = report; + this.commissions = commissions; + } + + @PreAuthorize("@ss.hasPermi('report:arProfit:list')") + @GetMapping("/summary") + public AjaxResult summary(ArProfitQuery query) { return success(report.selectSummary(query)); } + + @PreAuthorize("@ss.hasPermi('report:arProfit:list')") + @GetMapping("/sales-options") + public AjaxResult salesOptions(@RequestParam(required = false) String keyword) { return success(report.selectSalesOptions(keyword)); } + + @PreAuthorize("@ss.hasPermi('report:arProfit:list')") + @GetMapping("/area-rules") + public AjaxResult areaRules() { return success(ProfitAreaRule.areaRules()); } + + @PreAuthorize("@ss.hasPermi('report:arProfit:list')") + @GetMapping("/orders/{detailId}/fees") + public AjaxResult fees(@PathVariable Long detailId) { return success(report.selectFees(detailId)); } + + @PreAuthorize("@ss.hasPermi('report:arProfit:list')") + @GetMapping("/bills/{billId}/details") + public TableDataInfo billDetails(@PathVariable Long billId) + { + startPage(); + return getDataTable(report.selectBillDetails(billId)); + } + + @PreAuthorize("@ss.hasPermi('report:arProfit:list')") + @GetMapping("/bills") + public TableDataInfo bills(ArProfitQuery query) + { + startPage(); + return getDataTable(report.selectBills(query)); + } + + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @GetMapping("/rates") + public AjaxResult rates() { return success(commissions.selectRates()); } + + @Log(title = "账单毛利提成比例", businessType = BusinessType.INSERT) + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @PostMapping("/rates") + public AjaxResult addRate(@RequestBody ArCommissionRate rate) + { + commissions.addRate(rate); + return success(); + } + + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @GetMapping("/writeoffs/missing-rates") + public TableDataInfo missingRates() + { + startPage(); + return getDataTable(commissions.missingRates()); + } + + @Log(title = "历史核销提成比例确认", businessType = BusinessType.UPDATE) + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @PostMapping("/writeoffs/confirm-rate") + public AjaxResult confirmRate(@RequestBody ArWriteoffRate input) + { + commissions.confirmMissingRate(input); + return success(); + } + + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @GetMapping("/commissions") + public TableDataInfo commissions(@RequestParam(required = false) Long billId, + @RequestParam(defaultValue = "false") boolean includeReversed) + { + startPage(); + return getDataTable(commissions.results(billId, includeReversed)); + } + + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @GetMapping("/commissions/summary") + public AjaxResult commissionSummary(@RequestParam(required = false) Long billId) { return success(commissions.summary(billId)); } + + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @GetMapping("/commissions/{billId}/writeoffs") + public AjaxResult commissionWriteoffs(@PathVariable Long billId) { return success(commissions.writeoffRates(billId)); } + + @Log(title = "应收账单提成明细", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('report:arProfit:commission')") + @PostMapping("/commissions/export") + public void exportCommissions(HttpServletResponse response, @RequestParam(required = false) Long billId) + { + new ExcelUtil<>(ArCommissionResult.class).exportExcel(response, commissions.results(billId, false), "应收账单提成明细"); + } + + @Log(title = "应收账单毛利分析", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('report:arProfit:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, ArProfitQuery query) + { + ExcelUtil excel = new ExcelUtil<>(ArProfitRow.class); + excel.exportExcel(response, report.selectBills(query), "应收账单毛利分析"); + } +} diff --git a/bms-back/bms-admin/src/test/java/com/bms/report/ArCommissionServiceTest.java b/bms-back/bms-admin/src/test/java/com/bms/report/ArCommissionServiceTest.java new file mode 100644 index 00000000..62fa5351 --- /dev/null +++ b/bms-back/bms-admin/src/test/java/com/bms/report/ArCommissionServiceTest.java @@ -0,0 +1,83 @@ +package com.bms.report; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.lang.reflect.Proxy; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.Test; +import com.bms.ar.domain.ArBalanceWriteoff; +import com.bms.ar.domain.ArBill; +import com.bms.ar.mapper.ArCommissionMapper; +import com.bms.ar.profit.ArCommissionRate; +import com.bms.ar.profit.ArCommissionResult; +import com.bms.ar.profit.ArCommissionService; + +class ArCommissionServiceTest +{ + @Test + void snapshotsTheRateOnceAtWriteoffAndPreservesMissingRates() + { + List calls = new ArrayList<>(); + AtomicReference inserted = new AtomicReference<>(); + AtomicReference effective = new AtomicReference<>(); + ArCommissionMapper mapper = (ArCommissionMapper) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { ArCommissionMapper.class }, (proxy, method, args) -> { + calls.add(method.getName()); + return switch (method.getName()) { + case "lockSalesUser" -> 7L; + case "selectEffective" -> effective.get(); + case "insertWriteoffRate" -> { inserted.set(args.clone()); yield 1; } + default -> throw new AssertionError(method.getName()); + }; + }); + ArCommissionService service = new ArCommissionService(mapper, null, null, null); + ArBill bill = new ArBill(); + bill.setProfitSalesUserId(7L); + ArBalanceWriteoff writeoff = new ArBalanceWriteoff(); + writeoff.setWriteoffId(18L); + ArCommissionRate rate = new ArCommissionRate(); + rate.setRateId(3L); + rate.setRate(new BigDecimal("10")); + effective.set(rate); + service.snapshotWriteoff(bill, writeoff); + assertEquals(List.of("lockSalesUser", "selectEffective", "insertWriteoffRate"), calls); + assertEquals(3L, inserted.get()[2]); + assertEquals(new BigDecimal("10"), inserted.get()[3]); + + calls.clear(); + effective.set(null); + service.snapshotWriteoff(bill, writeoff); + assertNull(inserted.get()[2]); + assertNull(inserted.get()[3]); + } + + @Test + void savesOnlyCalculatedAmountsForReadyRows() + { + ArCommissionResult ready = new ArCommissionResult(); + ready.setResultStatus("READY"); + ready.setGrossProfit(new BigDecimal("-40")); + ready.setWeightedRate(new BigDecimal("1000")); + ready.setBillAmount(new BigDecimal("100")); + ArCommissionResult missing = new ArCommissionResult(); + missing.setResultStatus("MISSING_PRICE"); + List saved = new ArrayList<>(); + ArCommissionMapper mapper = (ArCommissionMapper) Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { ArCommissionMapper.class }, (proxy, method, args) -> { + if ("selectSettlementInputs".equals(method.getName())) return List.of(ready, missing); + if ("insertResults".equals(method.getName())) { + @SuppressWarnings("unchecked") List batch = (List) args[0]; + saved.addAll(batch); + return batch.size(); + } + throw new AssertionError(method.getName()); + }); + new ArCommissionService(mapper, null, null, null).createFinalResults(1L, "finance"); + assertEquals(new BigDecimal("-4.00"), saved.get(0).getCommissionAmount()); + assertNull(saved.get(1).getCommissionAmount()); + } +} diff --git a/bms-back/bms-admin/src/test/java/com/bms/report/ArProfitMapperSqlTest.java b/bms-back/bms-admin/src/test/java/com/bms/report/ArProfitMapperSqlTest.java new file mode 100644 index 00000000..738955b5 --- /dev/null +++ b/bms-back/bms-admin/src/test/java/com/bms/report/ArProfitMapperSqlTest.java @@ -0,0 +1,68 @@ +package com.bms.report; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.InputStream; +import java.util.Map; +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.session.Configuration; +import org.junit.jupiter.api.Test; +import com.bms.ar.profit.ArProfitQuery; +import com.bms.ar.profit.ArProfitScope; +import com.bms.ar.profit.ArCommissionResult; + +class ArProfitMapperSqlTest +{ + @Test + void parsesReportAndCommissionMappersAndScopesEachReportQuery() throws Exception + { + Configuration configuration = new Configuration(); + for (String resource : new String[] { "mapper/ar/ArProfitMapper.xml", "mapper/ar/ArCommissionMapper.xml" }) + { + try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) + { + new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse(); + } + } + for (String id : new String[] { "selectBills", "selectSummary", "selectBillDetails", "selectFees" }) + { + String name = "com.bms.ar.mapper.ArProfitMapper." + id; + String self = configuration.getMappedStatement(name).getBoundSql(Map.of( + "query", new ArProfitQuery(), "scope", new ArProfitScope(false, true, false, 8L, 10L))).getSql(); + String manager = configuration.getMappedStatement(name).getBoundSql(Map.of( + "query", new ArProfitQuery(), "scope", new ArProfitScope(false, false, true, 8L, 10L))).getSql(); + assertTrue(self.contains("b.profit_sales_user_id = ?")); + assertFalse(self.contains("find_in_set")); + assertTrue(manager.contains("find_in_set")); + assertTrue(manager.contains("b.status in")); + } + ArProfitQuery orderFilter = new ArProfitQuery(); + orderFilter.setOrderNo("ORDER-1"); + String bills = configuration.getMappedStatement("com.bms.ar.mapper.ArProfitMapper.selectBills") + .getBoundSql(Map.of("query", orderFilter, "scope", new ArProfitScope(true, false, false, 8L, 10L))).getSql(); + assertTrue(bills.contains("from ar_bill b")); + assertTrue(bills.contains("exists (select 1 from ar_bill_detail matched")); + assertFalse(bills.contains("and d.order_no like")); + String billCommission = configuration.getMappedStatement("com.bms.ar.mapper.ArCommissionMapper.selectCommissionSummary") + .getBoundSql(Map.of("billId", 9L)).getSql(); + assertTrue(billCommission.contains("r.ar_bill_id = ?")); + assertTrue(billCommission.contains("then null")); + var salesSql = configuration.getMappedStatement("com.bms.ar.mapper.ArProfitMapper.selectSalesOptions") + .getBoundSql(Map.of("keyword", "sales")); + assertTrue(salesSql.getSql().contains("from sys_user u")); + assertTrue(salesSql.getSql().contains("u.nick_name like")); + assertTrue(salesSql.getSql().contains("u.user_name like")); + assertFalse(salesSql.getSql().contains("ar_bill")); + assertFalse(salesSql.getSql().contains("sys_role")); + assertTrue(salesSql.getSql().contains("limit 50")); + String settlement = configuration.getMappedStatement("com.bms.ar.mapper.ArCommissionMapper.selectSettlementInputs") + .getBoundSql(Map.of("billId", 1L)).getSql(); + assertTrue(settlement.contains("w.status = 'EFFECTIVE'")); + assertTrue(settlement.contains("b.status = 'WRITTEN_OFF'")); + var insert = configuration.getMappedStatement("com.bms.ar.mapper.ArCommissionMapper.insertResults") + .getBoundSql(Map.of("items", java.util.List.of(new ArCommissionResult(), new ArCommissionResult()), "operator", "test")); + assertTrue(insert.getSql().contains("ar_profit_commission_result")); + assertTrue(insert.getParameterMappings().size() == 16); + } +} diff --git a/bms-back/bms-admin/src/test/java/com/bms/report/ArProfitScopeResolverTest.java b/bms-back/bms-admin/src/test/java/com/bms/report/ArProfitScopeResolverTest.java new file mode 100644 index 00000000..d2ae3faf --- /dev/null +++ b/bms-back/bms-admin/src/test/java/com/bms/report/ArProfitScopeResolverTest.java @@ -0,0 +1,52 @@ +package com.bms.report; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.Test; +import com.bms.ar.profit.ArProfitScopeResolver; +import com.bms.common.core.domain.entity.SysRole; +import com.bms.common.core.domain.entity.SysUser; +import com.bms.common.core.domain.model.LoginUser; +import com.bms.common.exception.ServiceException; + +class ArProfitScopeResolverTest +{ + private static final String PERMISSION = "report:arProfit:list"; + + private LoginUser actor(String... keys) + { + SysUser user = new SysUser(); + user.setUserId(99L); + user.setStatus("0"); + user.setDelFlag("0"); + user.setRoles(java.util.Arrays.stream(keys).map(key -> { + SysRole role = new SysRole(); + role.setRoleKey(key); + role.setStatus("0"); + role.setPermissions(Set.of(PERMISSION)); + return role; + }).toList()); + return new LoginUser(99L, 10L, user, Set.of(PERMISSION)); + } + + @Test + void allowedRolesHaveOnlyTheirApprovedScope() + { + ArProfitScopeResolver resolver = new ArProfitScopeResolver(); + var sales = resolver.resolve(actor("ORA_6041"), PERMISSION); + assertTrue(sales.self()); + assertFalse(sales.all()); + var manager = resolver.resolve(actor("ORA_6040"), PERMISSION); + assertTrue(manager.department()); + assertFalse(manager.all()); + assertTrue(resolver.resolve(actor("ORA_6042"), PERMISSION).all()); + assertTrue(resolver.resolve(actor("ORA_6043"), PERMISSION).all()); + assertThrows(ServiceException.class, () -> resolver.resolve(actor("ORA_6163"), PERMISSION)); + assertThrows(ServiceException.class, () -> resolver.resolve(actor("UNKNOWN"), PERMISSION)); + assertThrows(ServiceException.class, () -> resolver.resolve(actor("ORA_6042"), "other:permission")); + } +} diff --git a/bms-back/bms-admin/src/test/java/com/bms/report/CommissionCalculatorTest.java b/bms-back/bms-admin/src/test/java/com/bms/report/CommissionCalculatorTest.java new file mode 100644 index 00000000..75e997e0 --- /dev/null +++ b/bms-back/bms-admin/src/test/java/com/bms/report/CommissionCalculatorTest.java @@ -0,0 +1,59 @@ +package com.bms.report; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigDecimal; +import java.util.List; +import com.bms.ar.profit.CommissionCalculator; +import com.bms.ar.profit.ArCommissionResult; +import com.bms.ar.profit.CommissionCalculator.Writeoff; +import org.junit.jupiter.api.Test; + +class CommissionCalculatorTest +{ + private static BigDecimal n(String value) { return new BigDecimal(value); } + + @Test + void waitsForFullSettlementAndUsesEachWriteoffRate() + { + var first = new Writeoff(n("50"), n("10")); + var partial = CommissionCalculator.calculate(n("100"), n("20"), List.of(first)); + assertEquals(n("1.00"), partial.estimated()); + assertNull(partial.formal()); + var complete = CommissionCalculator.calculate(n("100"), n("20"), + List.of(first, new Writeoff(n("50"), n("20")))); + assertEquals(n("3.00"), complete.formal()); + } + + @Test + void deductsNegativeProfitAndKeepsMissingRatesUnknown() + { + assertEquals(n("-4.00"), CommissionCalculator.calculate(n("100"), n("-40"), + List.of(new Writeoff(n("100"), n("10")))).formal()); + assertNull(CommissionCalculator.calculate(n("100"), n("20"), + List.of(new Writeoff(n("100"), null))).formal()); + assertThrows(IllegalArgumentException.class, () -> CommissionCalculator.calculate(n("100"), n("20"), + List.of(new Writeoff(n("101"), n("10"))))); + } + + @Test + void allocatesRoundingRemainderAcrossOrderResults() + { + List orders = new java.util.ArrayList<>(); + for (int i = 0; i < 3; i++) + { + ArCommissionResult order = new ArCommissionResult(); + order.setResultStatus("READY"); + order.setBillAmount(n("100")); + order.setGrossProfit(n("0.05")); + order.setWeightedRate(n("1000")); + orders.add(order); + } + CommissionCalculator.allocateFinalAmounts(orders); + assertEquals(n("0.01"), orders.get(0).getCommissionAmount()); + assertEquals(n("0.00"), orders.get(1).getCommissionAmount()); + assertEquals(n("0.01"), orders.get(2).getCommissionAmount()); + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBill.java b/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBill.java index fe31a58a..0b887444 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBill.java +++ b/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBill.java @@ -36,6 +36,13 @@ public class ArBill extends BaseEntity { private Long customerId; private String customerCode; private String customerName; + /** 创建账单时的客户区域和负责人快照。 */ + private String profitCustomerArea; + private Long profitSalesUserId; + private String profitSalesUserCode; + private String profitSalesUserName; + /** NEW=生成时固化;BACKFILLED=历史补录,来源为补录时可取得的数据。 */ + private String profitSnapshotSource; @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd") /** 账单所属期开始日期,导出模板展示用。 */ diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArCommissionMapper.java b/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArCommissionMapper.java new file mode 100644 index 00000000..d602a708 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArCommissionMapper.java @@ -0,0 +1,30 @@ +package com.bms.ar.mapper; + +import java.util.Date; +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.bms.ar.profit.ArCommissionRate; +import com.bms.ar.profit.ArWriteoffRate; +import com.bms.ar.profit.ArCommissionResult; +import com.bms.ar.profit.ArCommissionSummary; + +public interface ArCommissionMapper +{ + List selectRates(); + ArCommissionRate selectEffective(@Param("salesUserId") Long salesUserId, @Param("at") Date at); + int insertRate(ArCommissionRate rate); + Long lockSalesUser(@Param("salesUserId") Long salesUserId); + int insertWriteoffRate(@Param("writeoffId") Long writeoffId, @Param("salesUserId") Long salesUserId, + @Param("rateId") Long rateId, @Param("rate") java.math.BigDecimal rate); + int reverseResults(@Param("billId") Long billId, @Param("operator") String operator); + List selectSettlementInputs(@Param("billId") Long billId); + int insertResults(@Param("items") List items, @Param("operator") String operator); + List selectMissingRates(); + List selectWriteoffRates(@Param("billId") Long billId); + Long selectBillIdByWriteoffId(@Param("writeoffId") Long writeoffId); + int countMissingRates(@Param("billId") Long billId); + int confirmMissingRate(@Param("writeoffId") Long writeoffId, @Param("rate") java.math.BigDecimal rate, + @Param("operator") String operator, @Param("remark") String remark); + List selectResults(@Param("billId") Long billId, @Param("includeReversed") boolean includeReversed); + List selectCommissionSummary(@Param("billId") Long billId); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArProfitMapper.java b/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArProfitMapper.java new file mode 100644 index 00000000..069b6823 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArProfitMapper.java @@ -0,0 +1,20 @@ +package com.bms.ar.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.bms.ar.profit.ArProfitQuery; +import com.bms.ar.profit.ArProfitRow; +import com.bms.ar.profit.ArProfitScope; +import com.bms.ar.profit.ArProfitSummary; +import com.bms.ar.profit.ArProfitSalesOption; +import com.bms.ar.domain.ArBillDetailFee; +import com.bms.ar.domain.ArBillDetail; + +public interface ArProfitMapper +{ + List selectBills(@Param("query") ArProfitQuery query, @Param("scope") ArProfitScope scope); + List selectSummary(@Param("query") ArProfitQuery query, @Param("scope") ArProfitScope scope); + List selectSalesOptions(@Param("keyword") String keyword); + List selectBillDetails(@Param("query") ArProfitQuery query, @Param("scope") ArProfitScope scope); + List selectFees(@Param("query") ArProfitQuery query, @Param("scope") ArProfitScope scope); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionRate.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionRate.java new file mode 100644 index 00000000..da8d48ba --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionRate.java @@ -0,0 +1,22 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class ArCommissionRate +{ + private Long rateId; + private Long salesUserId; + private String salesUserCode; + private String salesUserName; + private BigDecimal rate; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date effectiveAt; + private String createBy; + private String remark; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionResult.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionResult.java new file mode 100644 index 00000000..ce732fa4 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionResult.java @@ -0,0 +1,27 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; +import com.bms.common.annotation.Excel; + +@Data +public class ArCommissionResult +{ + private Long resultId; + private Long arBillId; + private Long detailId; + private Long salesUserId; + @Excel(name = "账单号", width = 20) private String billNo; + @Excel(name = "订单号", width = 22) private String orderNo; + @Excel(name = "销售员", width = 16) private String salesUserName; + @Excel(name = "币种", width = 10) private String currency; + @Excel(name = "销售毛利", scale = 4, width = 16) private BigDecimal grossProfit; + @Excel(name = "正式提成", scale = 2, width = 16) private BigDecimal commissionAmount; + @Excel(name = "状态", readConverterExp = "READY=已计算,MISSING_RATE=比例待确认,MISSING_PRICE=价格缺失,MISSING_SNAPSHOT=归属或区域缺失,WRITEOFF_MISMATCH=核销金额不一致,REVERSED=已冲回", width = 20) private String resultStatus; + private Date createTime; + private String reversedBy; + private Date reversedTime; + private BigDecimal weightedRate; + private BigDecimal billAmount; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionService.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionService.java new file mode 100644 index 00000000..8dfe1acc --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionService.java @@ -0,0 +1,148 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.bms.ar.domain.ArBalanceWriteoff; +import com.bms.ar.domain.ArBill; +import com.bms.ar.mapper.ArCommissionMapper; +import com.bms.ar.mapper.ArBillMapper; +import com.bms.ar.enums.ArBillStatus; +import com.bms.ar.enums.ArBillGenerationStatus; +import com.bms.ar.security.ArBillRoleKeys; +import com.bms.common.exception.ServiceException; +import com.bms.common.core.domain.entity.SysUser; +import com.bms.common.utils.SecurityUtils; +import com.bms.system.mapper.SysUserMapper; + +@Service +public class ArCommissionService +{ + private final ArCommissionMapper mapper; + private final ArProfitScopeResolver scopeResolver; + private final SysUserMapper userMapper; + private final ArBillMapper billMapper; + + public ArCommissionService(ArCommissionMapper mapper, ArProfitScopeResolver scopeResolver, SysUserMapper userMapper, + ArBillMapper billMapper) + { + this.mapper = mapper; + this.scopeResolver = scopeResolver; + this.userMapper = userMapper; + this.billMapper = billMapper; + } + + public List selectRates() + { + requireFinance(); + return mapper.selectRates(); + } + + @Transactional(rollbackFor = Exception.class) + public void addRate(ArCommissionRate rate) + { + requireFinance(); + SysUser sales = rate == null || rate.getSalesUserId() == null ? null : userMapper.selectUserById(rate.getSalesUserId()); + if (sales == null || !"0".equals(sales.getStatus()) || !"0".equals(sales.getDelFlag()) + || sales.getRoles() == null || sales.getRoles().stream().noneMatch(role -> role != null + && "0".equals(role.getStatus()) && ArBillRoleKeys.SALES.equals(role.getRoleKey()))) + throw new ServiceException("请选择有效销售员"); + if (rate.getRate() == null || rate.getRate().signum() < 0 || rate.getRate().compareTo(new BigDecimal("100")) > 0 + || rate.getRate().scale() > 4) + throw new ServiceException("提成比例须为 0 至 100,最多四位小数"); + if (rate.getRemark() != null && rate.getRemark().length() > 500) + throw new ServiceException("备注不能超过 500 字"); + mapper.lockSalesUser(rate.getSalesUserId()); + Date now = new Date(); + if (rate.getEffectiveAt() == null) rate.setEffectiveAt(now); + if (rate.getEffectiveAt().before(now)) throw new ServiceException("提成比例生效时间不能早于当前时间"); + rate.setCreateBy(SecurityUtils.getUsername()); + mapper.insertRate(rate); + } + + /** 在核销事务内固化该次操作时的比例;未配置时保留空值,待财务处理。 */ + public void snapshotWriteoff(ArBill bill, ArBalanceWriteoff writeoff) + { + Long salesUserId = bill.getProfitSalesUserId(); + if (salesUserId != null) mapper.lockSalesUser(salesUserId); + ArCommissionRate rate = salesUserId == null ? null : mapper.selectEffective(salesUserId, new Date()); + mapper.insertWriteoffRate(writeoff.getWriteoffId(), salesUserId, + rate == null ? null : rate.getRateId(), rate == null ? null : rate.getRate()); + } + + /** 完全核销后生成逐单结果;由外部账单锁及核销事务保证并发一致。 */ + public void createFinalResults(Long billId, String operator) + { + List items = mapper.selectSettlementInputs(billId); + CommissionCalculator.allocateFinalAmounts(items); + for (int offset = 0; offset < items.size(); offset += 300) + { + mapper.insertResults(items.subList(offset, Math.min(offset + 300, items.size())), operator); + } + } + + /** 反核销保留原记录并标记冲回。 */ + public void reverseFinalResults(Long billId, String operator) + { + mapper.reverseResults(billId, operator); + } + + public List missingRates() + { + requireFinance(); + return mapper.selectMissingRates(); + } + + public List results(Long billId, boolean includeReversed) + { + requireFinance(); + return mapper.selectResults(billId, includeReversed); + } + + public List summary(Long billId) + { + requireFinance(); + return mapper.selectCommissionSummary(billId); + } + + public List writeoffRates(Long billId) + { + requireFinance(); + return mapper.selectWriteoffRates(billId); + } + + @Transactional(rollbackFor = Exception.class) + public void confirmMissingRate(ArWriteoffRate input) + { + requireFinance(); + if (input == null || input.getWriteoffId() == null || input.getRate() == null + || input.getRate().signum() < 0 || input.getRate().compareTo(new BigDecimal("100")) > 0 + || input.getRate().scale() > 4 || input.getRemark() == null || input.getRemark().isBlank() + || input.getRemark().length() > 500) + throw new ServiceException("请填写 0 至 100 的提成比例及核对说明"); + Long billId = mapper.selectBillIdByWriteoffId(input.getWriteoffId()); + ArBill bill = billId == null ? null : billMapper.selectArBillByIdForUpdate(billId); + if (bill == null || bill.getProfitSalesUserId() == null) + throw new ServiceException("核销记录无效或账单销售员快照缺失"); + if (!ArBillGenerationStatus.READY.equals(bill.getGenerationStatus()) + || !(ArBillStatus.CONFIRMED.getCode().equals(bill.getStatus()) + || ArBillStatus.PARTIAL_WRITTEN_OFF.getCode().equals(bill.getStatus()) + || ArBillStatus.WRITTEN_OFF.getCode().equals(bill.getStatus()))) + throw new ServiceException("账单未生成完成或状态不允许确认提成比例"); + String operator = SecurityUtils.getUsername(); + if (mapper.confirmMissingRate(input.getWriteoffId(), input.getRate(), operator, input.getRemark().trim()) != 1) + throw new ServiceException("比例已确认或核销状态已变化,请刷新"); + if (ArBillStatus.WRITTEN_OFF.getCode().equals(bill.getStatus()) && mapper.countMissingRates(billId) == 0) + { + mapper.reverseResults(billId, operator); + createFinalResults(billId, operator); + } + } + + private void requireFinance() + { + if (!scopeResolver.resolve().all()) throw new ServiceException("仅财务和系统管理员可查看或维护提成"); + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionSummary.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionSummary.java new file mode 100644 index 00000000..31063205 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionSummary.java @@ -0,0 +1,15 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import lombok.Data; + +@Data +public class ArCommissionSummary +{ + private Long salesUserId; + private String salesUserName; + private String currency; + private Long orderCount; + private Long pendingCount; + private BigDecimal commissionAmount; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitQuery.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitQuery.java new file mode 100644 index 00000000..19078556 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitQuery.java @@ -0,0 +1,21 @@ +package com.bms.ar.profit; + +import java.util.Date; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class ArProfitQuery +{ + private Long customerId; + private String billNo; + private String orderNo; + private String status; + private Long salesUserId; + private Long arBillId; + private Long detailId; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginBillDate; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endBillDate; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitRow.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitRow.java new file mode 100644 index 00000000..c7cb2718 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitRow.java @@ -0,0 +1,30 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.bms.common.annotation.Excel; + +@Data +public class ArProfitRow +{ + private Long arBillId; + @Excel(name = "账单号", width = 20) private String billNo; + @Excel(name = "客户代码", width = 16) private String customerCode; + @Excel(name = "客户名称", width = 24) private String customerName; + private String customerArea; + @Excel(name = "归属来源", readConverterExp = "NEW=生成时快照,BACKFILLED=历史补录", width = 14) private String snapshotSource; + @Excel(name = "销售员", width = 16) private String salesUserName; + @Excel(name = "币种", width = 10) private String currency; + @Excel(name = "账单状态", readConverterExp = "CONFIRMED=已确认,PARTIAL_WRITTEN_OFF=部分核销,WRITTEN_OFF=已核销", width = 14) private String status; + @Excel(name = "账单日期", dateFormat = "yyyy-MM-dd", width = 15) + @JsonFormat(pattern = "yyyy-MM-dd") + private Date billDate; + @Excel(name = "销售价", scale = 4, width = 16) private BigDecimal salesAmount; + @Excel(name = "产品价", scale = 4, width = 16) private BigDecimal productAmount; + @Excel(name = "销售毛利", scale = 4, width = 16) private BigDecimal salesGrossProfit; + @Excel(name = "销售毛利率(%)", scale = 4, width = 18) private BigDecimal salesGrossMarginRate; + @Excel(name = "账单已核销", scale = 2, width = 16) private BigDecimal writtenOffAmount; + @Excel(name = "账单未核销", scale = 2, width = 16) private BigDecimal unwrittenAmount; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSalesOption.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSalesOption.java new file mode 100644 index 00000000..0ff4a874 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSalesOption.java @@ -0,0 +1,11 @@ +package com.bms.ar.profit; + +import lombok.Data; + +@Data +public class ArProfitSalesOption +{ + private Long userId; + private String name; + private String code; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScope.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScope.java new file mode 100644 index 00000000..24d52b1d --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScope.java @@ -0,0 +1,11 @@ +package com.bms.ar.profit; + +/** 后端构造的数据范围,不接收前端传入的权限参数。 */ +public record ArProfitScope(boolean all, boolean self, boolean department, Long userId, Long deptId) +{ + public boolean isAll() { return all; } + public boolean isSelf() { return self; } + public boolean isDepartment() { return department; } + public Long getUserId() { return userId; } + public Long getDeptId() { return deptId; } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScopeResolver.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScopeResolver.java new file mode 100644 index 00000000..a2290c27 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScopeResolver.java @@ -0,0 +1,58 @@ +package com.bms.ar.profit; + +import java.util.Arrays; +import java.util.Set; +import org.springframework.stereotype.Component; +import com.bms.ar.security.ArBillRoleKeys; +import com.bms.common.constant.Constants; +import com.bms.common.core.domain.entity.SysRole; +import com.bms.common.core.domain.entity.SysUser; +import com.bms.common.core.domain.model.LoginUser; +import com.bms.common.exception.ServiceException; +import com.bms.common.utils.PermissionContext; +import com.bms.common.utils.SecurityUtils; + +@Component +public class ArProfitScopeResolver +{ + public ArProfitScope resolve() + { + return resolve(SecurityUtils.getLoginUser(), PermissionContext.get()); + } + + public ArProfitScope resolve(LoginUser actor, String permission) + { + if (actor == null || actor.getUser() == null || actor.getUserId() == null) + { + throw new ServiceException("登录状态无效,请重新登录", 401); + } + SysUser user = actor.getUser(); + if (!"0".equals(user.getStatus()) || !"0".equals(user.getDelFlag())) + { + return new ArProfitScope(false, false, false, actor.getUserId(), actor.getDeptId()); + } + if (user.isAdmin()) return new ArProfitScope(true, false, false, actor.getUserId(), actor.getDeptId()); + boolean all = false, self = false, department = false; + if (permission != null && !permission.isBlank() && user.getRoles() != null) + { + for (SysRole role : user.getRoles()) + { + if (role == null || !"0".equals(role.getStatus()) || !permits(role.getPermissions(), permission)) continue; + String key = role.getRoleKey(); + all |= ArBillRoleKeys.ALL_DATA_ROLES.contains(key == null ? "" : key); + self |= ArBillRoleKeys.SALES.equals(key); + department |= ArBillRoleKeys.SALES_MANAGER.equals(key); + } + } + if (!all && !self && !department) throw new ServiceException("无权访问应收账单毛利分析"); + return new ArProfitScope(all, self && actor.getUserId() > 0, + department && actor.getDeptId() != null && actor.getDeptId() > 0, + actor.getUserId(), actor.getDeptId()); + } + + private boolean permits(Set permissions, String required) + { + return permissions != null && (permissions.contains(Constants.ALL_PERMISSION) + || Arrays.stream(required.split(Constants.PERMISSION_DELIMITER)).map(String::trim).anyMatch(permissions::contains)); + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitService.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitService.java new file mode 100644 index 00000000..b14df719 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitService.java @@ -0,0 +1,59 @@ +package com.bms.ar.profit; + +import java.util.List; +import org.springframework.stereotype.Service; +import com.bms.ar.mapper.ArProfitMapper; +import com.bms.ar.domain.ArBillDetailFee; +import com.bms.ar.domain.ArBillDetail; + +@Service +public class ArProfitService +{ + private final ArProfitMapper mapper; + private final ArProfitScopeResolver scopeResolver; + + public ArProfitService(ArProfitMapper mapper, ArProfitScopeResolver scopeResolver) + { + this.mapper = mapper; + this.scopeResolver = scopeResolver; + } + + public List selectBills(ArProfitQuery query) + { + return mapper.selectBills(query == null ? new ArProfitQuery() : query, scopeResolver.resolve()); + } + + public List selectSummary(ArProfitQuery query) + { + return mapper.selectSummary(query == null ? new ArProfitQuery() : query, scopeResolver.resolve()); + } + + public List selectSalesOptions(String keyword) + { + ArProfitScope scope = scopeResolver.resolve(); + if (!scope.all() && !scope.self() && !scope.department()) + { + return List.of(); + } + if (keyword != null) + { + keyword = keyword.trim(); + if (keyword.length() > 100) keyword = keyword.substring(0, 100); + } + return mapper.selectSalesOptions(keyword); + } + + public List selectFees(Long detailId) + { + ArProfitQuery query = new ArProfitQuery(); + query.setDetailId(detailId); + return mapper.selectFees(query, scopeResolver.resolve()); + } + + public List selectBillDetails(Long billId) + { + ArProfitQuery query = new ArProfitQuery(); + query.setArBillId(billId); + return mapper.selectBillDetails(query, scopeResolver.resolve()); + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSummary.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSummary.java new file mode 100644 index 00000000..295b2172 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSummary.java @@ -0,0 +1,18 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import lombok.Data; + +@Data +public class ArProfitSummary +{ + private String currency; + private Long billCount; + private Long invalidBillCount; + private BigDecimal salesAmount; + private BigDecimal productAmount; + private BigDecimal salesGrossProfit; + private BigDecimal salesGrossMarginRate; + private BigDecimal writtenOffAmount; + private BigDecimal unwrittenAmount; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArWriteoffRate.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArWriteoffRate.java new file mode 100644 index 00000000..cdd49689 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArWriteoffRate.java @@ -0,0 +1,23 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +@Data +public class ArWriteoffRate +{ + private Long writeoffId; + private Long arBillId; + private String billNo; + private String customerName; + private Long salesUserId; + private String salesUserName; + private BigDecimal writeoffAmount; + private Date writeoffDate; + private BigDecimal rate; + private String remark; + private String status; + private String confirmedBy; + private Date confirmedTime; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/profit/CommissionCalculator.java b/bms-back/bms-system/src/main/java/com/bms/ar/profit/CommissionCalculator.java new file mode 100644 index 00000000..c693d320 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/ar/profit/CommissionCalculator.java @@ -0,0 +1,88 @@ +package com.bms.ar.profit; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +/** 根据账单有效核销及当时比例计算单个账单订单的提成。 */ +public final class CommissionCalculator +{ + private static final BigDecimal HUNDRED = new BigDecimal("100"); + + private CommissionCalculator() {} + + /** 比例以百分数表示,10 代表 10%;缺失比例不得按零处理。 */ + public record Writeoff(BigDecimal amount, BigDecimal rate) {} + + public record Result(BigDecimal estimated, BigDecimal formal, boolean complete) {} + + public static Result calculate(BigDecimal billAmount, BigDecimal orderProfit, List writeoffs) + { + if (billAmount == null || billAmount.signum() <= 0 || orderProfit == null || writeoffs == null) + { + return new Result(null, null, false); + } + BigDecimal written = BigDecimal.ZERO; + BigDecimal weightedRates = BigDecimal.ZERO; + boolean hasMissingRate = false; + for (Writeoff writeoff : writeoffs) + { + if (writeoff == null || writeoff.amount() == null || writeoff.amount().signum() <= 0) + { + throw new IllegalArgumentException("核销金额必须大于零"); + } + written = written.add(writeoff.amount()); + if (writeoff.rate() == null) + { + hasMissingRate = true; + } + else + { + if (writeoff.rate().signum() < 0 || writeoff.rate().compareTo(HUNDRED) > 0) + { + throw new IllegalArgumentException("提成比例必须在 0 至 100 之间"); + } + weightedRates = weightedRates.add(writeoff.amount().multiply(writeoff.rate())); + } + } + if (written.compareTo(billAmount) > 0) + { + throw new IllegalArgumentException("有效核销金额超过账单金额"); + } + boolean complete = written.compareTo(billAmount) == 0; + if (hasMissingRate) + { + return new Result(null, null, complete); + } + BigDecimal amount = orderProfit.multiply(weightedRates) + .divide(billAmount.multiply(HUNDRED), 2, RoundingMode.HALF_UP); + return new Result(amount, complete ? amount : null, complete); + } + + /** 对同一账单的结果按明细顺序分配舍入尾差,使逐单金额之和等于该账单精确总额的四舍五入。 */ + public static void allocateFinalAmounts(List items) + { + BigDecimal cumulativeNumerator = BigDecimal.ZERO; + BigDecimal allocated = BigDecimal.ZERO; + BigDecimal billAmount = null; + BigDecimal weightedRate = null; + for (ArCommissionResult item : items) + { + if (!"READY".equals(item.getResultStatus())) continue; + if (item.getBillAmount() == null || item.getBillAmount().signum() <= 0 + || item.getGrossProfit() == null || item.getWeightedRate() == null) + throw new IllegalArgumentException("正式提成计算数据不完整"); + if (billAmount == null) + { + billAmount = item.getBillAmount(); + weightedRate = item.getWeightedRate(); + } + else if (billAmount.compareTo(item.getBillAmount()) != 0 || weightedRate.compareTo(item.getWeightedRate()) != 0) + throw new IllegalArgumentException("同一账单的提成计算依据不一致"); + cumulativeNumerator = cumulativeNumerator.add(item.getGrossProfit().multiply(item.getWeightedRate())); + BigDecimal cumulativeAmount = cumulativeNumerator.divide(billAmount.multiply(HUNDRED), 2, RoundingMode.HALF_UP); + item.setCommissionAmount(cumulativeAmount.subtract(allocated)); + allocated = cumulativeAmount; + } + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBalanceWriteoffServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBalanceWriteoffServiceImpl.java index 44738f62..ef8b676c 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBalanceWriteoffServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBalanceWriteoffServiceImpl.java @@ -24,6 +24,7 @@ import com.bms.ar.enums.ArLogResult; import com.bms.ar.mapper.ArBalanceWriteoffMapper; import com.bms.ar.mapper.ArBillMapper; import com.bms.ar.security.ArBillScopeResolver; +import com.bms.ar.profit.ArCommissionService; import com.bms.ar.service.IArBalanceWriteoffService; import com.bms.ar.service.IArBillLogService; import com.bms.common.exception.ServiceException; @@ -49,6 +50,8 @@ public class ArBalanceWriteoffServiceImpl implements IArBalanceWriteoffService { private ArBillMapper billMapper; @Autowired private ArBillScopeResolver billScope; + @Autowired + private ArCommissionService commissionService; @Autowired private ArBalanceWriteoffMapper writeoffMapper; @@ -141,6 +144,7 @@ public class ArBalanceWriteoffServiceImpl implements IArBalanceWriteoffService { writeoff.setCreateUserId(operatorUserId); writeoff.setCreateBy(operator); writeoffMapper.insertArBalanceWriteoff(writeoff); + commissionService.snapshotWriteoff(bill, writeoff); // 3. 账单核销口径变更(2026-09-23):核销不再变动账户余额与已用额度, // 仅更新账单已核销/未核销金额与状态,资金变动由收款/计费入口产生。 @@ -153,6 +157,10 @@ public class ArBalanceWriteoffServiceImpl implements IArBalanceWriteoffService { throw new ServiceException("账单状态已发生变化,请刷新后重试"); } + if (ArBillStatus.WRITTEN_OFF.getCode().equals(nextStatus)) { + commissionService.createFinalResults(bill.getArBillId(), operator); + } + recordLog(bill.getArBillId(), writeoff.getWriteoffId(), ArLogOperationType.BALANCE_WRITEOFF, "余额核销账单 " + amount.toPlainString() + " " + currency, fromStatus, nextStatus, operator, requestId); @@ -207,6 +215,7 @@ public class ArBalanceWriteoffServiceImpl implements IArBalanceWriteoffService { ArBalanceWriteoffStatus.CANCELLED.getCode(), ArBalanceWriteoffStatus.EFFECTIVE.getCode()) != 1) { throw new ServiceException("核销记录状态已变化,请刷新后重试"); } + commissionService.reverseFinalResults(bill.getArBillId(), operator); recordLog(bill.getArBillId(), writeoffId, ArLogOperationType.CANCEL_BALANCE_WRITEOFF, "反核销取消核销:" + cancelRemark, fromStatus, nextStatus, operator, requestId); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillServiceImpl.java index 87499e98..727966ee 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillServiceImpl.java @@ -73,6 +73,10 @@ import com.bms.ar.mapper.ArBillLogMapper; import com.bms.ar.mapper.ArBillMapper; import com.bms.ar.security.ArBillScopeResolver; import com.bms.customer.customerinfo.domain.BmsCustomerOption; +import com.bms.customer.customerinfo.domain.BmsCustomer; +import com.bms.customer.customerinfo.mapper.BmsCustomerMapper; +import com.bms.common.core.domain.entity.SysUser; +import com.bms.system.mapper.SysUserMapper; import com.bms.ar.mapper.ArBillGenerateTaskMapper; import com.bms.ar.mapper.ArBankAccountMapper; import com.bms.ar.mapper.ArExportTemplateMapper; @@ -185,6 +189,10 @@ public class ArBillServiceImpl implements IArBillService { @Autowired private ArBillMapper billMapper; @Autowired + private BmsCustomerMapper customerMapper; + @Autowired + private SysUserMapper sysUserMapper; + @Autowired private ArBillScopeResolver billScope; @Autowired private ArBillGenerateTaskMapper generateTaskMapper; @@ -441,6 +449,21 @@ public class ArBillServiceImpl implements IArBillService { String customerName = StringUtils.trim(request.getCustomerName()); bill.setCustomerCode(customerCode == null ? "" : customerCode); bill.setCustomerName(customerName == null ? "" : customerName); + bill.setProfitSnapshotSource("NEW"); + // 固定账单生成时的客户归属;无法确定的用户保持为空,由财务核对。 + BmsCustomer snapshotCustomer = customerMapper.selectBmsCustomerByCustomerId(request.getCustomerId()); + if (snapshotCustomer != null) { + bill.setProfitCustomerArea(snapshotCustomer.getCustomerArea()); + String salesId = snapshotCustomer.getSalesUserId(); + if (salesId != null && salesId.matches("[0-9]{1,18}")) { + SysUser salesUser = sysUserMapper.selectUserById(Long.valueOf(salesId)); + if (salesUser != null) { + bill.setProfitSalesUserId(salesUser.getUserId()); + bill.setProfitSalesUserCode(salesUser.getUserName()); + bill.setProfitSalesUserName(salesUser.getNickName()); + } + } + } bill.setBillPeriodStart(request.getBillPeriodEnd()); bill.setBillPeriodEnd(request.getBillPeriodEnd()); bill.setBillDate(request.getBillDate() == null ? now : request.getBillDate()); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/enums/ProfitAreaRule.java b/bms-back/bms-system/src/main/java/com/bms/price/enums/ProfitAreaRule.java index 5e8629b3..e3f0c7f6 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/enums/ProfitAreaRule.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/enums/ProfitAreaRule.java @@ -16,6 +16,11 @@ public enum ProfitAreaRule this.customerArea = customerArea; } + public String getCustomerArea() + { + return customerArea; + } + public static ProfitAreaRule fromCustomerArea(String customerArea) { if (customerArea != null) diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillMapper.xml b/bms-back/bms-system/src/main/resources/mapper/ar/ArBillMapper.xml index a3e86e24..cc18e807 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/ar/ArBillMapper.xml @@ -11,6 +11,11 @@ + + + + + @@ -48,6 +53,11 @@ customer_id, customer_code, customer_name, + profit_customer_area, + profit_sales_user_id, + profit_sales_user_code, + profit_sales_user_name, + profit_snapshot_source, bill_period_start, bill_period_end, bill_date, @@ -169,13 +179,15 @@ - insert into ar_bill (bill_no, bill_name, customer_id, customer_code, customer_name, bill_period_start, + insert into ar_bill (bill_no, bill_name, customer_id, customer_code, customer_name, + profit_customer_area, profit_sales_user_id, profit_sales_user_code, profit_sales_user_name, profit_snapshot_source, bill_period_start, bill_period_end, bill_date, currency, order_count, total_amount, written_off_amount, unwritten_amount, status, generation_status, bill_version, bank_account_name, bank_account_no, bank_name, remark, confirmed_by, confirmed_time, create_by, create_user_id, create_time, update_by, update_time) - values (#{billNo}, #{billName}, #{customerId}, #{customerCode}, #{customerName}, #{billPeriodStart}, + values (#{billNo}, #{billName}, #{customerId}, #{customerCode}, #{customerName}, + #{profitCustomerArea}, #{profitSalesUserId}, #{profitSalesUserCode}, #{profitSalesUserName}, #{profitSnapshotSource}, #{billPeriodStart}, #{billPeriodEnd}, #{billDate}, #{currency}, #{orderCount}, #{totalAmount}, #{writtenOffAmount}, #{unwrittenAmount}, #{status}, #{generationStatus}, #{billVersion}, #{bankAccountName}, #{bankAccountNo}, #{bankName}, diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArCommissionMapper.xml b/bms-back/bms-system/src/main/resources/mapper/ar/ArCommissionMapper.xml new file mode 100644 index 00000000..a9aec461 --- /dev/null +++ b/bms-back/bms-system/src/main/resources/mapper/ar/ArCommissionMapper.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into ar_profit_commission_rate(sales_user_id, rate, effective_at, create_by, create_time, remark) + values(#{salesUserId}, #{rate}, #{effectiveAt}, #{createBy}, sysdate(), #{remark}) + + + + insert into ar_profit_writeoff_rate(writeoff_id, sales_user_id, rate_id, rate, create_time) + values(#{writeoffId}, #{salesUserId}, #{rateId}, #{rate}, sysdate()) + + + + + + + update ar_profit_writeoff_rate r + join ar_balance_writeoff w on w.writeoff_id = r.writeoff_id and w.status = 'EFFECTIVE' + join ar_bill b on b.ar_bill_id = w.ar_bill_id + set r.sales_user_id = b.profit_sales_user_id, r.rate = #{rate}, r.confirmed_by = #{operator}, + r.confirmed_time = sysdate(), r.confirm_remark = #{remark} + where r.writeoff_id = #{writeoffId} and r.rate is null and b.profit_sales_user_id is not null + + + + + update ar_profit_commission_result + set result_status = 'REVERSED', reversed_by = #{operator}, reversed_time = sysdate() + where ar_bill_id = #{billId} and result_status != 'REVERSED' + + + + + + insert into ar_profit_commission_result + (ar_bill_id, detail_id, sales_user_id, currency, gross_profit, commission_amount, result_status, create_by, create_time) + values + + (#{item.arBillId}, #{item.detailId}, #{item.salesUserId}, #{item.currency}, #{item.grossProfit}, + #{item.commissionAmount}, #{item.resultStatus}, #{operator}, sysdate()) + + + diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArProfitMapper.xml b/bms-back/bms-system/src/main/resources/mapper/ar/ArProfitMapper.xml new file mode 100644 index 00000000..251866e6 --- /dev/null +++ b/bms-back/bms-system/src/main/resources/mapper/ar/ArProfitMapper.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and (1 = 0 + or b.profit_sales_user_id = #{scope.userId} + + or exists (select 1 from sys_user u inner join sys_dept dept on dept.dept_id = u.dept_id + where u.user_id = b.profit_sales_user_id and u.del_flag = '0' + and (dept.dept_id = #{scope.deptId} or find_in_set(#{scope.deptId}, dept.ancestors))) + + ) + + and 1 = 0 + + + + + where b.status in ('CONFIRMED', 'PARTIAL_WRITTEN_OFF', 'WRITTEN_OFF') and b.generation_status = 'READY' + + and b.customer_id = #{query.customerId} + and b.bill_no like concat('%', #{query.billNo}, '%') + and b.ar_bill_id = #{query.arBillId} + + and exists (select 1 from ar_bill_detail matched where matched.ar_bill_id = b.ar_bill_id + and matched.order_no like concat('%', #{query.orderNo}, '%')) + + and b.status = #{query.status} + and b.profit_sales_user_id = #{query.salesUserId} + and b.bill_date >= #{query.beginBillDate} + and b.bill_date <= #{query.endBillDate} + + + + + + + select b.ar_bill_id, b.bill_no, b.bill_date, b.customer_code, b.customer_name, + b.profit_customer_area as customer_area, b.profit_snapshot_source as snapshot_source, + b.profit_sales_user_name as sales_user_name, b.currency, b.status, + b.total_amount as sales_amount, b.written_off_amount, b.unwritten_amount, + case when a.detail_count > 0 and a.invalid_count = 0 and b.total_amount is not null + and a.detail_total = b.total_amount then a.product_total else null end as product_amount, + case when a.detail_count > 0 and a.invalid_count = 0 and b.total_amount is not null + and a.detail_total = b.total_amount then b.total_amount - a.product_total else null end as sales_gross_profit, + case when a.detail_count > 0 and a.invalid_count = 0 and b.total_amount is not null + and a.detail_total = b.total_amount and b.total_amount != 0 + then round((b.total_amount - a.product_total) * 100 / b.total_amount, 4) else null end as sales_gross_margin_rate, + case when a.detail_count > 0 and a.invalid_count = 0 and b.total_amount is not null + and a.detail_total = b.total_amount then 0 else 1 end as profit_incomplete + from ar_bill b + left join ( + select d.ar_bill_id, count(*) as detail_count, sum(d.total_amount) as detail_total, + sum(case when d.total_amount is not null and d.currency is not null and b.currency is not null + and d.currency = b.currency and f.currency_count = 1 and f.fee_currency = d.currency + and f.sales_amount is not null and f.sales_amount = d.total_amount + and ((b.profit_customer_area = #{shenzhenArea} and f.product_complete = 1) + or (b.profit_customer_area = #{guangzhouArea} and f.redline_complete = 1)) + then 0 else 1 end) as invalid_count, + sum(case when b.profit_customer_area = #{shenzhenArea} then f.product_amount + when b.profit_customer_area = #{guangzhouArea} then f.redline_amount else null end) as product_total + from ar_bill_detail d join ar_bill b on b.ar_bill_id = d.ar_bill_id + left join ( + select fee.detail_id, + case when count(fee.amount) = count(*) then sum(fee.amount) else null end as sales_amount, + case when count(fee.currency) = count(*) then count(distinct fee.currency) else 0 end as currency_count, + min(fee.currency) as fee_currency, + case when count(fee.product_amount) = count(*) then sum(fee.product_amount) else null end as product_amount, + case when count(fee.redline_amount) = count(*) then sum(fee.redline_amount) else null end as redline_amount, + case when count(fee.product_amount) = count(*) then 1 else 0 end as product_complete, + case when count(fee.redline_amount) = count(*) then 1 else 0 end as redline_complete + from ar_bill_detail_fee fee + join ar_bill_detail d on d.detail_id = fee.detail_id + join ar_bill b on b.ar_bill_id = d.ar_bill_id + + group by fee.detail_id + ) f on f.detail_id = d.detail_id + + group by d.ar_bill_id + ) a on a.ar_bill_id = b.ar_bill_id + + + + + + + + diff --git a/bms-back/sql/20261105_ar_profit_report.sql b/bms-back/sql/20261105_ar_profit_report.sql new file mode 100644 index 00000000..74f889aa --- /dev/null +++ b/bms-back/sql/20261105_ar_profit_report.sql @@ -0,0 +1,339 @@ +-- 应收账单毛利分析:增量结构与历史客户归属快照。 +-- MySQL 5.7+;停用后端写入并备份数据库,再执行本文件,最后部署新版本并重新登录。 +-- DDL 自动提交;数据与菜单授权使用事务。失败后检查已创建对象并修复结构,再重试完整文件。 +-- 历史区域及销售员来自当前客户资料,不代表能还原历史真实归属。 +-- 已有快照不会覆盖。账单来源订单销售员与当前客户销售员不一致时不自动回填销售员。 +SET NAMES utf8mb4; + +DROP PROCEDURE IF EXISTS bms_ar_profit_upgrade_20261105_v1; +DELIMITER $$ +CREATE PROCEDURE bms_ar_profit_upgrade_20261105_v1() +BEGIN + DECLARE n INT DEFAULT 0; + DECLARE report_id BIGINT DEFAULT NULL; + DECLARE page_id BIGINT DEFAULT NULL; + DECLARE export_id BIGINT DEFAULT NULL; + DECLARE commission_id BIGINT DEFAULT NULL; + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + SELECT COUNT(*) INTO n FROM information_schema.tables + WHERE table_schema = DATABASE() AND table_name IN ('ar_bill','ar_bill_detail','ar_bill_detail_fee','ar_balance_writeoff','ctr_customer','prc_order_bill','sys_user','sys_dept','sys_role','sys_menu','sys_role_menu'); + IF n <> 11 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '应收毛利升级前置表缺失'; END IF; + SELECT COUNT(*) INTO n FROM sys_menu WHERE parent_id = 0 AND menu_type = 'M' AND menu_name = '报表中心'; + IF n > 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '报表中心目录不唯一'; END IF; + SELECT COUNT(*) INTO n FROM (SELECT perms FROM sys_menu WHERE perms IN + ('report:arProfit:list','report:arProfit:export','report:arProfit:commission') GROUP BY perms HAVING COUNT(*) > 1) conflicts; + IF n > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '应收毛利菜单权限重复'; END IF; + SELECT COUNT(*) INTO n FROM (SELECT role_key FROM sys_role WHERE role_key IN + ('ORA_6040','ORA_6041','ORA_6042','ORA_6043') AND del_flag = '0' GROUP BY role_key HAVING COUNT(*) > 1) conflicts; + IF n > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '应收毛利角色标识重复'; END IF; + SELECT COUNT(*) INTO n FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'ar_bill' AND column_name = 'profit_customer_area'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN profit_customer_area VARCHAR(50) NULL COMMENT '账单客户区域快照'; END IF; + SELECT COUNT(*) INTO n FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'ar_bill' AND column_name = 'profit_sales_user_id'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN profit_sales_user_id BIGINT NULL COMMENT '账单销售员用户ID快照'; END IF; + SELECT COUNT(*) INTO n FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'ar_bill' AND column_name = 'profit_sales_user_code'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN profit_sales_user_code VARCHAR(64) NULL COMMENT '账单销售员工号快照'; END IF; + SELECT COUNT(*) INTO n FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'ar_bill' AND column_name = 'profit_sales_user_name'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN profit_sales_user_name VARCHAR(64) NULL COMMENT '账单销售员姓名快照'; END IF; + SELECT COUNT(*) INTO n FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'ar_bill' AND column_name = 'profit_snapshot_source'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN profit_snapshot_source VARCHAR(16) NULL COMMENT 'NEW生成时快照/BACKFILLED历史补录'; END IF; + + SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'ar_bill' + AND is_nullable = 'YES' + AND ((column_name = 'profit_customer_area' AND data_type = 'varchar' AND character_maximum_length = 50) + OR (column_name = 'profit_sales_user_id' AND data_type = 'bigint') + OR (column_name IN ('profit_sales_user_code','profit_sales_user_name') AND data_type = 'varchar' AND character_maximum_length = 64) + OR (column_name = 'profit_snapshot_source' AND data_type = 'varchar' AND character_maximum_length = 16)); + IF n <> 5 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '账单快照字段结构冲突'; END IF; + SELECT COUNT(*) INTO n FROM information_schema.statistics WHERE table_schema = DATABASE() + AND table_name = 'ar_bill' AND index_name = 'idx_ar_profit_sales_date'; + IF n = 0 THEN ALTER TABLE ar_bill ADD INDEX idx_ar_profit_sales_date (profit_sales_user_id, bill_date, ar_bill_id); END IF; + SELECT COUNT(*) INTO n FROM information_schema.statistics WHERE table_schema = DATABASE() + AND table_name = 'ar_bill' AND index_name = 'idx_ar_profit_sales_date' + AND ((seq_in_index = 1 AND column_name = 'profit_sales_user_id') + OR (seq_in_index = 2 AND column_name = 'bill_date') + OR (seq_in_index = 3 AND column_name = 'ar_bill_id')); + IF n <> 3 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '账单毛利索引结构冲突'; END IF; + +-- 提成比例版本及每次核销时的比例快照;历史核销未录入比例时保留空值待财务确认。 +CREATE TABLE IF NOT EXISTS ar_profit_commission_rate ( + rate_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '提成比例记录ID', + sales_user_id BIGINT NOT NULL COMMENT '销售员用户ID', + rate DECIMAL(7,4) NOT NULL COMMENT '提成比例,百分数,例如10表示10%', + effective_at DATETIME NOT NULL COMMENT '比例生效时间', + create_by VARCHAR(64) NOT NULL COMMENT '创建人', + create_time DATETIME NOT NULL COMMENT '创建时间', + remark VARCHAR(500) NULL COMMENT '备注', + PRIMARY KEY (rate_id), + KEY idx_ar_profit_rate_effective (sales_user_id, effective_at, rate_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账单毛利销售员提成比例版本'; + +CREATE TABLE IF NOT EXISTS ar_profit_writeoff_rate ( + writeoff_id BIGINT NOT NULL COMMENT '核销记录ID', + sales_user_id BIGINT NULL COMMENT '销售员用户ID', + rate_id BIGINT NULL COMMENT '提成比例记录ID', + rate DECIMAL(7,4) NULL COMMENT '提成比例,百分数,例如10表示10%', + create_time DATETIME NOT NULL COMMENT '创建时间', + confirmed_by VARCHAR(64) NULL COMMENT '历史比例确认人', + confirmed_time DATETIME NULL COMMENT '历史比例确认时间', + confirm_remark VARCHAR(500) NULL COMMENT '历史比例确认说明', + PRIMARY KEY (writeoff_id), + KEY idx_ar_profit_writeoff_rate_sales (sales_user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账单核销时提成比例快照'; + +CREATE TABLE IF NOT EXISTS ar_profit_commission_result ( + result_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '提成结果ID', + ar_bill_id BIGINT NOT NULL COMMENT '应收账单ID', + detail_id BIGINT NOT NULL COMMENT '应收账单明细ID', + sales_user_id BIGINT NULL COMMENT '销售员用户ID', + currency VARCHAR(10) NOT NULL COMMENT '币种', + gross_profit DECIMAL(18,4) NULL COMMENT '销售毛利', + commission_amount DECIMAL(18,2) NULL COMMENT '提成金额', + result_status VARCHAR(24) NOT NULL COMMENT 'READY/MISSING_RATE/MISSING_PRICE/MISSING_SNAPSHOT/WRITEOFF_MISMATCH/REVERSED', + create_by VARCHAR(64) NOT NULL COMMENT '创建人', + create_time DATETIME NOT NULL COMMENT '创建时间', + reversed_by VARCHAR(64) NULL COMMENT '冲回操作人', + reversed_time DATETIME NULL COMMENT '冲回时间', + PRIMARY KEY (result_id), + KEY idx_ar_profit_result_bill (ar_bill_id, result_status, detail_id), + KEY idx_ar_profit_result_sales (sales_user_id, result_status, create_time) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账单完全核销时逐单正式提成及冲回记录'; + +-- 检查已有表结构,避免 IF NOT EXISTS 掩盖不兼容的旧结构。 +SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'ar_profit_commission_rate' + AND column_name IN ('rate_id','sales_user_id','rate','effective_at','create_by','create_time','remark'); +IF n <> 7 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提成比例表结构不完整'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'ar_profit_writeoff_rate' + AND column_name IN ('writeoff_id','sales_user_id','rate_id','rate','create_time','confirmed_by','confirmed_time','confirm_remark'); +IF n <> 8 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '核销比例表结构不完整'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'ar_profit_commission_result' + AND column_name IN ('result_id','ar_bill_id','detail_id','sales_user_id','currency','gross_profit','commission_amount','result_status','create_by','create_time','reversed_by','reversed_time'); +IF n <> 12 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '逐单提成表结构不完整'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.tables WHERE table_schema = DATABASE() + AND table_name IN ('ar_profit_commission_rate','ar_profit_writeoff_rate','ar_profit_commission_result') AND engine = 'InnoDB'; +IF n <> 3 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提成相关表必须使用 InnoDB'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() + AND table_name IN ('ar_profit_commission_rate','ar_profit_writeoff_rate') AND column_name = 'rate' AND column_type = 'decimal(7,4)'; +IF n <> 2 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提成比例字段类型不匹配'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() + AND ((table_name = 'ar_profit_commission_rate' AND column_name IN ('rate_id','sales_user_id') AND data_type = 'bigint' AND is_nullable = 'NO') + OR (table_name = 'ar_profit_commission_rate' AND column_name = 'effective_at' AND data_type = 'datetime' AND is_nullable = 'NO') + OR (table_name = 'ar_profit_writeoff_rate' AND column_name = 'writeoff_id' AND data_type = 'bigint' AND is_nullable = 'NO') + OR (table_name = 'ar_profit_writeoff_rate' AND column_name IN ('sales_user_id','rate_id') AND data_type = 'bigint' AND is_nullable = 'YES') + OR (table_name = 'ar_profit_writeoff_rate' AND column_name = 'rate' AND is_nullable = 'YES')); +IF n <> 7 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提成比例关键字段类型或空值约束不匹配'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'ar_profit_commission_result' + AND ((column_name = 'gross_profit' AND column_type = 'decimal(18,4)') + OR (column_name = 'commission_amount' AND column_type = 'decimal(18,2)') + OR (column_name = 'result_status' AND data_type = 'varchar' AND character_maximum_length = 24) + OR (column_name IN ('result_id','ar_bill_id','detail_id','sales_user_id') AND data_type = 'bigint')); +IF n <> 7 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '逐单提成字段类型不匹配'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'ar_profit_writeoff_rate' + AND index_name = 'PRIMARY' AND column_name = 'writeoff_id' AND seq_in_index = 1; +IF n <> 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '核销比例表主键不匹配'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'ar_profit_writeoff_rate' AND index_name = 'PRIMARY'; +IF n <> 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '核销比例表主键必须仅包含 writeoff_id'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'ar_profit_commission_rate' + AND index_name = 'PRIMARY' AND column_name = 'rate_id' AND seq_in_index = 1; +IF n <> 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提成比例表主键不匹配'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'ar_profit_commission_result' + AND index_name = 'PRIMARY' AND column_name = 'result_id' AND seq_in_index = 1; +IF n <> 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '逐单提成表主键不匹配'; END IF; +SELECT COUNT(*) INTO n FROM information_schema.statistics WHERE table_schema = DATABASE() + AND ((table_name = 'ar_profit_commission_rate' AND index_name = 'PRIMARY') + OR (table_name = 'ar_profit_commission_result' AND index_name = 'PRIMARY')); +IF n <> 2 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提成表主键结构不匹配'; END IF; + +-- 旧版本已经建表时,只补充空注释;按实际元数据保留字段类型、字符集和空值约束。 +-- 对无法安全重建的默认值、生成列或其他额外属性先中止,不擅自改写字段定义。 +SELECT COUNT(*) INTO n FROM information_schema.columns +WHERE table_schema = DATABASE() AND column_comment = '' + AND ((table_name = 'ar_profit_commission_rate' AND column_name IN ('rate_id','sales_user_id','rate','effective_at','create_by','create_time','remark')) + OR (table_name = 'ar_profit_writeoff_rate' AND column_name IN ('writeoff_id','sales_user_id','rate_id','rate','create_time','confirmed_by','confirmed_time','confirm_remark')) + OR (table_name = 'ar_profit_commission_result' AND column_name IN ('result_id','ar_bill_id','detail_id','sales_user_id','currency','gross_profit','commission_amount','result_status','create_by','create_time','reversed_by','reversed_time'))) + AND (column_default IS NOT NULL OR extra NOT IN ('','auto_increment') OR data_type NOT IN ('bigint','decimal','datetime','varchar')); +IF n > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提成表待补注释字段存在特殊定义,请检查后再执行'; END IF; + +BEGIN + DECLARE v_table VARCHAR(64); + DECLARE v_table_index INT DEFAULT 1; + DECLARE v_old_concat_limit BIGINT UNSIGNED; + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + SET SESSION group_concat_max_len = v_old_concat_limit; + RESIGNAL; + END; + SET v_old_concat_limit = @@SESSION.group_concat_max_len; + SET SESSION group_concat_max_len = 65535; + WHILE v_table_index <= 3 DO + SET v_table = CASE v_table_index + WHEN 1 THEN 'ar_profit_commission_rate' + WHEN 2 THEN 'ar_profit_writeoff_rate' + ELSE 'ar_profit_commission_result' END; + SELECT GROUP_CONCAT(CONCAT( + 'MODIFY COLUMN `', REPLACE(column_name, '`', '``'), '` ', column_type, + IF(character_set_name IS NULL, '', CONCAT(' CHARACTER SET ', character_set_name, ' COLLATE ', collation_name)), + IF(is_nullable = 'YES', ' NULL DEFAULT NULL', ' NOT NULL'), + IF(extra = 'auto_increment', ' AUTO_INCREMENT', ''), + ' COMMENT ', QUOTE(CASE column_name + WHEN 'rate_id' THEN '提成比例记录ID' + WHEN 'sales_user_id' THEN '销售员用户ID' + WHEN 'rate' THEN '提成比例,百分数,例如10表示10%' + WHEN 'effective_at' THEN '比例生效时间' + WHEN 'create_by' THEN '创建人' + WHEN 'create_time' THEN '创建时间' + WHEN 'remark' THEN '备注' + WHEN 'writeoff_id' THEN '核销记录ID' + WHEN 'confirmed_by' THEN '历史比例确认人' + WHEN 'confirmed_time' THEN '历史比例确认时间' + WHEN 'confirm_remark' THEN '历史比例确认说明' + WHEN 'result_id' THEN '提成结果ID' + WHEN 'ar_bill_id' THEN '应收账单ID' + WHEN 'detail_id' THEN '应收账单明细ID' + WHEN 'currency' THEN '币种' + WHEN 'gross_profit' THEN '销售毛利' + WHEN 'commission_amount' THEN '提成金额' + WHEN 'result_status' THEN 'READY/MISSING_RATE/MISSING_PRICE/MISSING_SNAPSHOT/WRITEOFF_MISMATCH/REVERSED' + WHEN 'reversed_by' THEN '冲回操作人' + WHEN 'reversed_time' THEN '冲回时间' + END)) ORDER BY ordinal_position SEPARATOR ', ') + INTO @bms_ar_profit_comment_columns + FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = v_table AND column_comment = '' + AND ((table_name = 'ar_profit_commission_rate' AND column_name IN ('rate_id','sales_user_id','rate','effective_at','create_by','create_time','remark')) + OR (table_name = 'ar_profit_writeoff_rate' AND column_name IN ('writeoff_id','sales_user_id','rate_id','rate','create_time','confirmed_by','confirmed_time','confirm_remark')) + OR (table_name = 'ar_profit_commission_result' AND column_name IN ('result_id','ar_bill_id','detail_id','sales_user_id','currency','gross_profit','commission_amount','result_status','create_by','create_time','reversed_by','reversed_time'))); + IF @bms_ar_profit_comment_columns IS NOT NULL THEN + SET @bms_ar_profit_comment_ddl = CONCAT('ALTER TABLE `', REPLACE(v_table, '`', '``'), '` ', @bms_ar_profit_comment_columns); + PREPARE bms_ar_profit_comment_stmt FROM @bms_ar_profit_comment_ddl; + EXECUTE bms_ar_profit_comment_stmt; + DEALLOCATE PREPARE bms_ar_profit_comment_stmt; + END IF; + SET v_table_index = v_table_index + 1; + END WHILE; + SET SESSION group_concat_max_len = v_old_concat_limit; +END; + +SELECT MAX(menu_id) INTO report_id FROM sys_menu WHERE parent_id = 0 AND menu_type = 'M' AND menu_name = '报表中心'; +SELECT MAX(menu_id) INTO page_id FROM sys_menu WHERE perms = 'report:arProfit:list'; +IF page_id IS NOT NULL THEN + SELECT COUNT(*) INTO n FROM sys_menu WHERE menu_id = page_id AND parent_id = report_id AND component = 'report/arProfit/index' AND menu_type = 'C'; + IF n <> 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '现有应收毛利菜单与预期不符'; END IF; +END IF; +SELECT MAX(menu_id) INTO export_id FROM sys_menu WHERE perms = 'report:arProfit:export'; +IF export_id IS NOT NULL THEN + SELECT COUNT(*) INTO n FROM sys_menu WHERE menu_id = export_id AND parent_id = page_id AND menu_type = 'F'; + IF n <> 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '现有应收毛利导出权限与预期不符'; END IF; +END IF; +SELECT MAX(menu_id) INTO commission_id FROM sys_menu WHERE perms = 'report:arProfit:commission'; +IF commission_id IS NOT NULL THEN + SELECT COUNT(*) INTO n FROM sys_menu WHERE menu_id = commission_id AND parent_id = page_id AND menu_type = 'F'; + IF n <> 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '现有应收毛利提成权限与预期不符'; END IF; +END IF; + +START TRANSACTION; + +-- 只读检查:不能关联客户、区域为空或销售员无效的历史账单。 +SELECT b.ar_bill_id, b.bill_no, b.customer_id, c.customer_area, c.sales_user_id +FROM ar_bill b LEFT JOIN ctr_customer c ON c.customer_id = b.customer_id +LEFT JOIN sys_user u ON CONVERT(CAST(u.user_id AS CHAR) USING utf8mb4) COLLATE utf8mb4_unicode_ci = c.sales_user_id AND u.del_flag = '0' +WHERE (b.profit_customer_area IS NULL AND (c.customer_area IS NULL OR TRIM(c.customer_area) = '')) + OR (b.profit_sales_user_id IS NULL AND u.user_id IS NULL); + +-- 检查来源订单销售员与当前客户负责人不一致的账单;下方不自动回填这些销售归属。 +SELECT DISTINCT b.ar_bill_id, b.bill_no, p.belong_saler_code AS order_saler_code, + u.user_id AS customer_sales_user_id, u.user_name AS customer_sales_code +FROM ar_bill b +JOIN ctr_customer c ON c.customer_id = b.customer_id +JOIN sys_user u ON CONVERT(CAST(u.user_id AS CHAR) USING utf8mb4) COLLATE utf8mb4_unicode_ci = c.sales_user_id AND u.del_flag = '0' +JOIN ar_bill_detail d ON d.ar_bill_id = b.ar_bill_id +JOIN prc_order_bill p ON p.bill_id = d.prc_order_bill_id +WHERE b.profit_sales_user_id IS NULL AND (b.profit_snapshot_source IS NULL OR b.profit_snapshot_source = 'BACKFILLED') + AND p.belong_saler_code IS NOT NULL + AND TRIM(p.belong_saler_code) <> '' + AND TRIM(p.belong_saler_code) <> u.user_name COLLATE utf8mb4_unicode_ci + AND TRIM(p.belong_saler_code) <> CONVERT(CAST(u.user_id AS CHAR) USING utf8mb4) COLLATE utf8mb4_unicode_ci; + +-- 此处仅补空值。客户区域来自客户当前资料,并非出账时的历史事实。 +UPDATE ar_bill b JOIN ctr_customer c ON c.customer_id = b.customer_id +SET b.profit_customer_area = c.customer_area +WHERE b.profit_customer_area IS NULL AND (b.profit_snapshot_source IS NULL OR b.profit_snapshot_source = 'BACKFILLED') + AND c.customer_area IS NOT NULL AND TRIM(c.customer_area) <> ''; + +UPDATE ar_bill b +JOIN ctr_customer c ON c.customer_id = b.customer_id +JOIN sys_user u ON CONVERT(CAST(u.user_id AS CHAR) USING utf8mb4) COLLATE utf8mb4_unicode_ci = c.sales_user_id AND u.del_flag = '0' +SET b.profit_sales_user_id = u.user_id, + b.profit_sales_user_code = u.user_name, + b.profit_sales_user_name = u.nick_name +WHERE b.profit_sales_user_id IS NULL AND (b.profit_snapshot_source IS NULL OR b.profit_snapshot_source = 'BACKFILLED') + AND NOT EXISTS ( + SELECT 1 FROM ar_bill_detail d JOIN prc_order_bill p ON p.bill_id = d.prc_order_bill_id + WHERE d.ar_bill_id = b.ar_bill_id AND p.belong_saler_code IS NOT NULL + AND TRIM(p.belong_saler_code) <> '' + AND TRIM(p.belong_saler_code) <> u.user_name COLLATE utf8mb4_unicode_ci + AND TRIM(p.belong_saler_code) <> CONVERT(CAST(u.user_id AS CHAR) USING utf8mb4) COLLATE utf8mb4_unicode_ci + ); + +UPDATE ar_bill SET profit_snapshot_source = 'BACKFILLED' +WHERE profit_snapshot_source IS NULL AND (profit_customer_area IS NOT NULL OR profit_sales_user_id IS NOT NULL); + +-- 历史核销比例不可追溯,不能使用当前比例替代。 +INSERT INTO ar_profit_writeoff_rate (writeoff_id, sales_user_id, rate_id, rate, create_time) +SELECT w.writeoff_id, b.profit_sales_user_id, NULL, NULL, NOW() +FROM ar_balance_writeoff w JOIN ar_bill b ON b.ar_bill_id = w.ar_bill_id +LEFT JOIN ar_profit_writeoff_rate s ON s.writeoff_id = w.writeoff_id +WHERE s.writeoff_id IS NULL; + +IF report_id IS NULL THEN + INSERT INTO sys_menu (menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time) + VALUES ('报表中心',0,8,'report',NULL,1,0,'M','0','0','','chart','admin',NOW()); + SET report_id = LAST_INSERT_ID(); +END IF; +IF page_id IS NULL THEN + INSERT INTO sys_menu (menu_name,parent_id,order_num,path,component,route_name,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time) + VALUES ('应收账单毛利分析',report_id,2,'arProfit','report/arProfit/index','ArProfitReport',1,0,'C','0','0','report:arProfit:list','chart','admin',NOW()); + SET page_id = LAST_INSERT_ID(); +END IF; +IF export_id IS NULL THEN + INSERT INTO sys_menu (menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time) + VALUES ('导出',page_id,1,'',NULL,1,0,'F','0','0','report:arProfit:export','#','admin',NOW()); + SET export_id = LAST_INSERT_ID(); +END IF; +IF commission_id IS NULL THEN + INSERT INTO sys_menu (menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time) + VALUES ('提成管理',page_id,2,'',NULL,1,0,'F','0','0','report:arProfit:commission','#','admin',NOW()); + SET commission_id = LAST_INSERT_ID(); +END IF; +INSERT INTO sys_role_menu (role_id,menu_id) +SELECT r.role_id, m.menu_id FROM sys_role r JOIN sys_menu m ON m.menu_id IN (report_id,page_id,export_id) +WHERE r.del_flag = '0' AND r.status = '0' AND (r.role_id = 1 OR r.role_key IN ('ORA_6040','ORA_6041','ORA_6042','ORA_6043')) + AND NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = r.role_id AND rm.menu_id = m.menu_id); +INSERT INTO sys_role_menu (role_id,menu_id) +SELECT r.role_id, commission_id FROM sys_role r +WHERE r.del_flag = '0' AND r.status = '0' AND (r.role_id = 1 OR r.role_key IN ('ORA_6042','ORA_6043')) + AND NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = r.role_id AND rm.menu_id = commission_id); + +COMMIT; + +SELECT 'AR_PROFIT_UPGRADE_COMPLETED' AS upgrade_status, + (SELECT COUNT(*) FROM ar_bill WHERE profit_customer_area IS NULL) AS missing_area, + (SELECT COUNT(*) FROM ar_bill WHERE profit_sales_user_id IS NULL) AS missing_sales, + (SELECT COUNT(*) FROM ar_bill WHERE generation_status IS NULL AND status IN ('CONFIRMED','PARTIAL_WRITTEN_OFF','WRITTEN_OFF')) AS unknown_generation_status, + (SELECT COUNT(*) FROM ar_profit_writeoff_rate r JOIN ar_balance_writeoff w ON w.writeoff_id = r.writeoff_id + JOIN ar_bill b ON b.ar_bill_id = w.ar_bill_id + WHERE (r.rate IS NULL OR r.rate < 0 OR r.rate > 100) AND w.status = 'EFFECTIVE' AND b.generation_status = 'READY' AND b.status IN ('CONFIRMED','PARTIAL_WRITTEN_OFF','WRITTEN_OFF')) AS missing_writeoff_rates, + (SELECT COUNT(*) FROM ar_bill b WHERE b.status = 'WRITTEN_OFF' AND NOT EXISTS + (SELECT 1 FROM ar_balance_writeoff w WHERE w.ar_bill_id = b.ar_bill_id AND w.status = 'EFFECTIVE')) AS paid_bills_without_writeoffs; +END$$ +DELIMITER ; +CALL bms_ar_profit_upgrade_20261105_v1(); +DROP PROCEDURE IF EXISTS bms_ar_profit_upgrade_20261105_v1; diff --git a/bms-front/src/api/report/arProfit.js b/bms-front/src/api/report/arProfit.js new file mode 100644 index 00000000..96c86759 --- /dev/null +++ b/bms-front/src/api/report/arProfit.js @@ -0,0 +1,15 @@ +import request from '@/utils/request' + +export const listArProfitBills = params => request({ url: '/report/ar-profit/bills', method: 'get', params }) +export const listArProfitBillDetails = (billId, params) => request({ url: `/report/ar-profit/bills/${billId}/details`, method: 'get', params }) +export const listArProfitSummary = params => request({ url: '/report/ar-profit/summary', method: 'get', params }) +export const listArProfitSalesOptions = params => request({ url: '/report/ar-profit/sales-options', method: 'get', params }) +export const listArProfitAreaRules = () => request({ url: '/report/ar-profit/area-rules', method: 'get' }) +export const listArProfitFees = detailId => request({ url: `/report/ar-profit/orders/${detailId}/fees`, method: 'get' }) +export const listArProfitRates = () => request({ url: '/report/ar-profit/rates', method: 'get' }) +export const addArProfitRate = data => request({ url: '/report/ar-profit/rates', method: 'post', data }) +export const listArProfitMissingRates = params => request({ url: '/report/ar-profit/writeoffs/missing-rates', method: 'get', params }) +export const confirmArProfitMissingRate = data => request({ url: '/report/ar-profit/writeoffs/confirm-rate', method: 'post', data }) +export const listArProfitCommissions = params => request({ url: '/report/ar-profit/commissions', method: 'get', params }) +export const listArProfitCommissionSummary = params => request({ url: '/report/ar-profit/commissions/summary', method: 'get', params }) +export const listArProfitWriteoffRates = billId => request({ url: `/report/ar-profit/commissions/${billId}/writeoffs`, method: 'get' }) diff --git a/bms-front/src/views/report/arProfit/index.vue b/bms-front/src/views/report/arProfit/index.vue new file mode 100644 index 00000000..fec94a2f --- /dev/null +++ b/bms-front/src/views/report/arProfit/index.vue @@ -0,0 +1,283 @@ + + + + + From 7abb7fdb06452a0d34bae11b1ff60d29646c4aa7 Mon Sep 17 00:00:00 2001 From: caojia <1301869380@qq.com> Date: Mon, 9 Nov 2026 10:59:21 +0800 Subject: [PATCH 4/8] =?UTF-8?q?:bug:=20=E4=BF=AE=E6=AD=A3=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=E9=A2=84=E8=A7=88=E9=87=8D=E9=87=8F=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/ar/bill/components/GenerateBillDialog.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bms-front/src/views/ar/bill/components/GenerateBillDialog.vue b/bms-front/src/views/ar/bill/components/GenerateBillDialog.vue index 9607db17..90e65078 100644 --- a/bms-front/src/views/ar/bill/components/GenerateBillDialog.vue +++ b/bms-front/src/views/ar/bill/components/GenerateBillDialog.vue @@ -73,8 +73,8 @@ - - + + @@ -541,6 +541,7 @@ function date(value) { } function money(value) { const num = Number(value); return Number.isNaN(num) ? '-' : num.toFixed(2) } function formatDateColumn(_, __, value) { return date(value) } +function formatWeightColumn(_, __, value) { return value == null || value === '' ? '-' : value } function formatNumberColumn(_, __, value) { return Number(value || 0).toFixed(2) } function createRequestId() { return globalThis.crypto?.randomUUID?.() || `ar-${Date.now()}-${Math.random().toString(16).slice(2)}` } From 9e3f8314f1b94bfe3b07b1624ccc685dc75b057f Mon Sep 17 00:00:00 2001 From: caojia <1301869380@qq.com> Date: Mon, 9 Nov 2026 11:06:13 +0800 Subject: [PATCH 5/8] =?UTF-8?q?:bug:=20=E4=BF=AE=E6=AD=A3=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=E9=A2=84=E8=A7=88=E5=AF=BC=E5=87=BA=E9=87=8D=E9=87=8F?= =?UTF-8?q?=E7=B2=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bms/ar/domain/vo/ArBillGeneratePreviewExportRow.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGeneratePreviewExportRow.java b/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGeneratePreviewExportRow.java index e7f1f235..4f2dab18 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGeneratePreviewExportRow.java +++ b/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGeneratePreviewExportRow.java @@ -37,10 +37,10 @@ public class ArBillGeneratePreviewExportRow implements Serializable { @Excel(name = "国家/地区", sort = 6, width = 18) private String countryName; - @Excel(name = "实际重(kg)", sort = 7, scale = 2, width = 16) + @Excel(name = "实际重(kg)", sort = 7, width = 16) private BigDecimal actualWeight; - @Excel(name = "计费重(kg)", sort = 8, scale = 2, width = 16) + @Excel(name = "计费重(kg)", sort = 8, width = 16) private BigDecimal chargeWeight; @Excel(name = "应收金额", sort = 9, scale = 2, width = 16) From 61099b2514c9fb2c8e55b39d2f9bae7bcdad36f0 Mon Sep 17 00:00:00 2001 From: caojia <1301869380@qq.com> Date: Mon, 9 Nov 2026 11:23:51 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/ar/ar_bill_template.xlsx | Bin 12037 -> 209944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bms-back/bms-system/src/main/resources/templates/ar/ar_bill_template.xlsx b/bms-back/bms-system/src/main/resources/templates/ar/ar_bill_template.xlsx index 9af3491a1216141af698168b129653ef1a98d66a..df730b35a7c694966a20d4eca300d0aca4b3eee6 100644 GIT binary patch delta 202024 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

Y1{_cr5 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

w4cXzc^K$Mp^e(-fsftCJc{~|^t!5g&Ppto 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 Date: Mon, 9 Nov 2026 13:39:14 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bms/price/mapper/PrcOrderBillMapper.java | 3 +++ .../price/service/impl/PrcPriceSetServiceImpl.java | 14 +++++++++++--- .../resources/mapper/price/PrcOrderBillMapper.xml | 4 ++++ bms-front/src/views/price/exclusive/detail.vue | 4 ++-- bms-front/src/views/price/set/detail.vue | 4 ++-- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillMapper.java index 6bc1fe72..1785de23 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillMapper.java @@ -134,4 +134,7 @@ public interface PrcOrderBillMapper @Param("surchargeAmount") BigDecimal surchargeAmount, @Param("incomeTotal") BigDecimal incomeTotal, @Param("payTotal") BigDecimal payTotal); + + /** Count order bills that reference this sales package version. */ + int countByPsvId(@Param("psvId") Long psvId); } diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java index 6c05e563..c8b15e81 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java @@ -40,6 +40,7 @@ import com.bms.price.domain.PrcSurchargeRel; import com.bms.price.mapper.BmsProductCountryMapper; import com.bms.price.mapper.BmsProductMapper; import com.bms.price.mapper.PrcCustomerPriceSetMapper; +import com.bms.price.mapper.PrcOrderBillMapper; import com.bms.price.mapper.PrcPriceSetDetailMapper; import com.bms.price.mapper.PrcPriceSetMapper; import com.bms.price.mapper.PrcPriceSetProductMapper; @@ -141,6 +142,9 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService @Autowired private IBmsCustomerService bmsCustomerService; + @Autowired + private PrcOrderBillMapper orderBillMapper; + @Override public PrcPriceSet selectPrcPriceSetById(Long priceSetId) { @@ -626,7 +630,7 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService { throw new ServiceException(MessageUtils.message("price.set.version.notExists")); } - // Draft / pending: hard delete; EFFECT: soft delete then reopen previous via refreshVersionStatus + // Draft / pending / effect may be deleted; expired stays view-only. if (!VER_DRAFT.equals(version.getStatus()) && !VER_PENDING.equals(version.getStatus()) && !VER_EFFECT.equals(version.getStatus())) @@ -634,9 +638,13 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService throw new ServiceException(MessageUtils.message("price.set.version.delete.statusNotAllowed")); } requireSet(version.getPriceSetId()); - wipeVersionChildren(psvId, version.getStatus()); + // Products / details / surcharge always physical delete. + surchargeRelMapper.physicalDeleteByPsvId(psvId); + detailMapper.physicalDeleteByPsvId(psvId); + setProductMapper.physicalDeleteByPsvId(psvId); + // Version: soft-delete when any order bill references psv_id; otherwise hard-delete. int rows; - if (VER_EFFECT.equals(version.getStatus())) + if (orderBillMapper.countByPsvId(psvId) > 0) { rows = versionMapper.softDeleteById(psvId, updateBy); } diff --git a/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml index 24acf2dd..d2e63256 100644 --- a/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml @@ -1070,4 +1070,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time = sysdate() where bill_id = #{billId} + + diff --git a/bms-front/src/views/price/exclusive/detail.vue b/bms-front/src/views/price/exclusive/detail.vue index ab62b16e..0c6f0ff7 100644 --- a/bms-front/src/views/price/exclusive/detail.vue +++ b/bms-front/src/views/price/exclusive/detail.vue @@ -448,8 +448,8 @@ function onCreateVersion() { function onRemoveVersion(row) { if (!row || row.psvId == null) return const msg = isEffectVersion(row) - ? "确认软删除已生效版本(生效时间:" + (row.effectiveTime || '未设置') + ")?版本及产品、明细将标记为已删除,上一版将自动恢复生效并清空失效时间。" - : "确认删除" + (isPendingVersion(row) ? "待生效" : "草稿") + "版本(生效时间:" + (row.effectiveTime || '未设置') + ")?其明细与附加费将一并删除。" + ? "确认删除该版本(生效时间:" + (row.effectiveTime || '未设置') + ")?若订单已引用该版本则仅软删版本记录;若无订单引用则整版本硬删。产品与明细均会物理删除,且上一版将自动恢复生效。" + : "确认删除" + (isPendingVersion(row) ? "待生效" : "草稿") + "版本(生效时间:" + (row.effectiveTime || '未设置') + ")?若订单已引用该版本则仅软删版本记录;若无订单引用则整版本硬删。产品与明细均会物理删除。" proxy.$modal.confirm(msg).then(() => { removingPsvId.value = row.psvId proxy.$modal.loading("正在删除,请稍候...") diff --git a/bms-front/src/views/price/set/detail.vue b/bms-front/src/views/price/set/detail.vue index d6856f38..46a9ba09 100644 --- a/bms-front/src/views/price/set/detail.vue +++ b/bms-front/src/views/price/set/detail.vue @@ -465,8 +465,8 @@ function onCreateVersion() { function onRemoveVersion(row) { if (!row || row.psvId == null) return const msg = isEffectVersion(row) - ? "确认软删除已生效版本(生效时间:" + (row.effectiveTime || '未设置') + ")?版本及产品、明细将标记为已删除,上一版将自动恢复生效并清空失效时间。" - : "确认删除" + (isPendingVersion(row) ? "待生效" : "草稿") + "版本(生效时间:" + (row.effectiveTime || '未设置') + ")?其明细与附加费将一并删除。" + ? "确认删除该版本(生效时间:" + (row.effectiveTime || '未设置') + ")?若订单已引用该版本则仅软删版本记录;若无订单引用则整版本硬删。产品与明细均会物理删除,且上一版将自动恢复生效。" + : "确认删除" + (isPendingVersion(row) ? "待生效" : "草稿") + "版本(生效时间:" + (row.effectiveTime || '未设置') + ")?若订单已引用该版本则仅软删版本记录;若无订单引用则整版本硬删。产品与明细均会物理删除。" proxy.$modal.confirm(msg).then(() => { removingPsvId.value = row.psvId proxy.$modal.loading("正在删除,请稍候...") From 8633019788297152f46f494aea78aca8aeef2831 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Mon, 9 Nov 2026 14:12:21 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=A1=E8=B4=B9?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bms/price/search/EsBillSearchStore.java | 70 ++++++++++++++++++- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java b/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java index 52f99f25..ed6e0398 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java @@ -69,8 +69,8 @@ public class EsBillSearchStore implements IBillSearchStore doc.put("bizId", bizId.trim()); doc.put("status", StringUtils.isEmpty(status) ? EsBizLogSupport.STATUS_SUCCESS : status.trim()); doc.put("error", StringUtils.isEmpty(errorMessage) ? null : errorMessage); - doc.put("request", parseOrRaw(requestJson)); - // Normalize response.ok boolean -> 1/0: index mapping typed response.ok as long. + // Index dynamic mapping is strict on a few fields; coerce before PUT. + doc.put("request", normalizeRequestForEs(parseOrRaw(requestJson))); doc.put("response", normalizeResponseForEs(parseOrRaw(responseJson))); String ts = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now); doc.put("updatedAt", ts); @@ -86,7 +86,26 @@ public class EsBillSearchStore implements IBillSearchStore } } - /** Index historically mapped response.ok as long; coerce boolean to 1/0. */ + /** + * request.bizDate is mapped as date (ISO / epoch only); bill writes "yyyy-MM-dd HH:mm:ss". + * request.taskId is mapped as long; UUID strings must not stay under taskId. + */ + private Object normalizeRequestForEs(Object request) + { + if (!(request instanceof JSONObject)) + { + return request; + } + JSONObject obj = (JSONObject) request; + normalizeBizDateField(obj); + relocateNonNumericTaskId(obj); + return obj; + } + + /** + * response.ok mapped as long; response.success as boolean; response.taskId as long. + * Local rebill DONE used UUID taskId + numeric success and was rejected by ES. + */ private Object normalizeResponseForEs(Object response) { if (!(response instanceof JSONObject)) @@ -99,9 +118,54 @@ public class EsBillSearchStore implements IBillSearchStore { obj.put("ok", Boolean.TRUE.equals(ok) ? Integer.valueOf(1) : Integer.valueOf(0)); } + Object success = obj.get("success"); + if (success instanceof Number) + { + obj.put("success", Boolean.valueOf(((Number) success).intValue() != 0)); + } + relocateNonNumericTaskId(obj); return obj; } + private void normalizeBizDateField(JSONObject obj) + { + Object raw = obj.get("bizDate"); + if (!(raw instanceof String)) + { + return; + } + String bizDate = ((String) raw).trim(); + // "yyyy-MM-dd HH:mm:ss" -> ISO-local so ES date mapper accepts it. + if (bizDate.length() >= 19 && bizDate.charAt(10) == ' ') + { + obj.put("bizDate", bizDate.substring(0, 10) + "T" + bizDate.substring(11)); + } + } + + private void relocateNonNumericTaskId(JSONObject obj) + { + Object taskId = obj.get("taskId"); + if (!(taskId instanceof String)) + { + return; + } + String text = ((String) taskId).trim(); + if (text.isEmpty()) + { + obj.remove("taskId"); + return; + } + try + { + obj.put("taskId", Long.valueOf(Long.parseLong(text))); + } + catch (NumberFormatException e) + { + obj.remove("taskId"); + obj.put("taskIdStr", text); + } + } + @Override public BillSyncSnapshot get(String logType, String bizId) {