diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/customer/customermoney/CustomerBillController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/customer/customermoney/CustomerBillController.java index 9d9ccb4b..ccac100e 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/customer/customermoney/CustomerBillController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/customer/customermoney/CustomerBillController.java @@ -13,13 +13,13 @@ import org.springframework.web.bind.annotation.PutMapping; 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.domain.ArBill; -import com.bms.ar.domain.ArBalanceWriteoff; -import com.bms.ar.domain.vo.ArBillListExportRow; -import com.bms.ar.domain.vo.ArBillQuery; -import com.bms.ar.domain.vo.ArBillSummary; -import com.bms.ar.service.IArBalanceWriteoffService; -import com.bms.ar.service.IArBillService; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.domain.ArBalanceWriteoff; +import com.bms.receivable.domain.vo.ArBillListExportRow; +import com.bms.receivable.domain.vo.ArBillQuery; +import com.bms.receivable.domain.vo.ArBillSummary; +import com.bms.receivable.service.IArBalanceWriteoffService; +import com.bms.receivable.service.IArBillService; import com.bms.common.annotation.Log; import com.bms.common.core.controller.BaseController; import com.bms.common.core.domain.AjaxResult; diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java index 4e348900..501f1293 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java @@ -152,8 +152,8 @@ public class BillingController extends BaseController { query = new PrcOrderBill(); } - // Billing list only shows success and the three soft misses. - query.setBillingFailStatuses(limitBillingListFailStatus(query.getBillingFailStatuses())); + // Billing list only shows successfully billed orders. + query.setBillingFailStatuses(limitBillingListFailStatus()); query.setBillingFailStatus(null); startPage(); List list = prcOrderBillService.selectBillList(query); @@ -161,7 +161,7 @@ public class BillingController extends BaseController } /** - * Async export billing list by current filters (status limited to 0-3). + * Async export billing list by current filters (status limited to success=0). * Requires at least one meaningful filter. Poll task then download. */ @PreAuthorize("@ss.hasPermi('price:billing:export')") @@ -178,7 +178,7 @@ public class BillingController extends BaseController { return error(MessageUtils.message("price.bill.export.filterRequired")); } - query.setBillingFailStatuses(limitBillingListFailStatus(query.getBillingFailStatuses())); + query.setBillingFailStatuses(limitBillingListFailStatus()); query.setBillingFailStatus(null); return successTask(prcOrderBillService.submitOrderBillExport( PrcOrderBillExportTask.TYPE_BILLING, query)); @@ -204,32 +204,13 @@ public class BillingController extends BaseController prcOrderBillService.downloadOrderBillExport(taskId, response); } - private static List limitBillingListFailStatus(List requested) + private static List limitBillingListFailStatus() { - // Soft-fail list: success + sales 1/2/3 + product-catalog 23/24/25 - List allowed = Arrays.asList( - Integer.valueOf(0), Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), - Integer.valueOf(23), Integer.valueOf(24), Integer.valueOf(25)); - if (requested == null || requested.isEmpty()) - { - return new ArrayList(allowed); - } - List kept = new ArrayList(); - for (Integer status : requested) - { - if (status != null && allowed.contains(status) && !kept.contains(status)) - { - kept.add(status); - } - } - if (kept.isEmpty()) - { - kept.add(Integer.valueOf(-1)); - } - return kept; + // Billing list is success-only (billing_fail_status = 0). + return new ArrayList(Arrays.asList(Integer.valueOf(0))); } - /** All prc_order_bill rows. Billing list stays limited to status 0-3. */ + /** All prc_order_bill rows. Billing list stays limited to status 0. */ @PreAuthorize("@ss.hasPermi('price:orderBill:list')") @GetMapping("/orderBill/list") public TableDataInfo orderBillList(PrcOrderBill query) @@ -239,6 +220,15 @@ public class BillingController extends BaseController return getDataTable(list); } + + /** Order-list popup: billing fail reason by billId (data-scoped). */ + @PreAuthorize("@ss.hasPermi('price:orderBill:list')") + @GetMapping("/orderBill/{billId}/failReason") + public AjaxResult orderBillFailReason(@PathVariable("billId") String billId) + { + return success(prcOrderBillService.getBillingFailReason(billId)); + } + /** * Async export order list by current filters. * Requires at least one meaningful filter (default orderStatuses alone is not enough). diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/LabelPackageController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/LabelPackageController.java index 14913a99..6a43760e 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/LabelPackageController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/LabelPackageController.java @@ -217,54 +217,6 @@ public class LabelPackageController extends BaseController return toAjax(payProductService.removeLabelProducts(priceSetId, productIds)); } - @PreAuthorize("@ss.hasPermi('price:label:query')") - @GetMapping("/{priceSetId}/channels") - public AjaxResult listChannels(@PathVariable Long priceSetId) - { - priceSetService.assertSetCategory(priceSetId, PrcPriceSet.CATEGORY_LABEL); - return success(payProductService.listLabelChannels(priceSetId)); - } - - @PreAuthorize("@ss.hasPermi('price:label:edit')") - @Log(title = "打单套餐绑定渠道", businessType = BusinessType.UPDATE) - @PutMapping("/{priceSetId}/channels") - public AjaxResult bindChannels(@PathVariable Long priceSetId, @RequestBody Map body) - { - priceSetService.assertSetCategory(priceSetId, PrcPriceSet.CATEGORY_LABEL); - List channelIds = new ArrayList(); - Object rawIds = body == null ? null : body.get("channelIds"); - if (rawIds instanceof List) - { - for (Object item : (List) rawIds) - { - if (item != null && !String.valueOf(item).trim().isEmpty()) - { - channelIds.add(String.valueOf(item).trim()); - } - } - } - Long productId = null; - Object rawProductId = body == null ? null : body.get("productId"); - if (rawProductId instanceof Number) - { - productId = ((Number) rawProductId).longValue(); - } - else if (rawProductId != null && !String.valueOf(rawProductId).trim().isEmpty() - && !"null".equalsIgnoreCase(String.valueOf(rawProductId).trim())) - { - productId = Long.valueOf(String.valueOf(rawProductId).trim()); - } - return success(payProductService.bindLabelChannels(priceSetId, channelIds, productId)); - } - - @PreAuthorize("@ss.hasPermi('price:label:edit')") - @Log(title = "打单套餐解绑渠道", businessType = BusinessType.DELETE) - @DeleteMapping("/{priceSetId}/channels/{channelId}") - public AjaxResult unbindChannel(@PathVariable Long priceSetId, @PathVariable String channelId) - { - priceSetService.assertSetCategory(priceSetId, PrcPriceSet.CATEGORY_LABEL); - return toAjax(payProductService.unbindLabelChannel(priceSetId, channelId)); - } @PreAuthorize("@ss.hasPermi('price:label:list')") @GetMapping("/customer/list") diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArBankAccountController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArBankAccountController.java similarity index 88% rename from bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArBankAccountController.java rename to bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArBankAccountController.java index ce8b99bd..5e5e8470 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArBankAccountController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArBankAccountController.java @@ -1,4 +1,4 @@ -package com.bms.web.controller.ar; +package com.bms.web.controller.receivable; import java.util.List; @@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.bms.ar.domain.ArBankAccount; -import com.bms.ar.service.IArBillService; +import com.bms.receivable.domain.ArBankAccount; +import com.bms.receivable.service.IArBillService; import com.bms.common.core.controller.BaseController; import com.bms.common.core.domain.AjaxResult; diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArBillController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArBillController.java similarity index 95% rename from bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArBillController.java rename to bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArBillController.java index 0bd01d70..fbb853d2 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArBillController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArBillController.java @@ -1,4 +1,4 @@ -package com.bms.web.controller.ar; +package com.bms.web.controller.receivable; import java.util.ArrayList; import java.util.List; @@ -23,21 +23,20 @@ import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.bms.ar.domain.ArBill; -import com.bms.ar.domain.ArBankAccount; -import com.bms.ar.domain.ArBillDetailFee; -import com.bms.ar.domain.ArBillExport; -import com.bms.ar.domain.ArBillGenerateTask; -import com.bms.ar.domain.ArBillLog; -import com.bms.ar.domain.vo.ArBillActionRequest; -import com.bms.ar.domain.vo.ArBillGenerateQuery; -import com.bms.ar.domain.vo.ArBillGeneratePreviewExportRow; -import com.bms.ar.domain.vo.ArBillGenerateRequest; -import com.bms.ar.domain.vo.ArBillListExportRow; -import com.bms.ar.domain.vo.ArBillQuery; -import com.bms.ar.enums.ArBillDateType; -import com.bms.ar.service.IArBillService; -import com.bms.ar.security.ArBillScopeResolver; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.domain.ArBankAccount; +import com.bms.receivable.domain.ArBillDetailFee; +import com.bms.receivable.domain.ArBillGenerateTask; +import com.bms.receivable.domain.ArBillLog; +import com.bms.receivable.domain.vo.ArBillActionRequest; +import com.bms.receivable.domain.vo.ArBillGenerateQuery; +import com.bms.receivable.domain.vo.ArBillGeneratePreviewExportRow; +import com.bms.receivable.domain.vo.ArBillGenerateRequest; +import com.bms.receivable.domain.vo.ArBillListExportRow; +import com.bms.receivable.domain.vo.ArBillQuery; +import com.bms.receivable.enums.ArBillDateType; +import com.bms.receivable.service.IArBillService; +import com.bms.receivable.security.ArBillScopeResolver; import com.bms.common.annotation.Log; import com.bms.common.core.controller.BaseController; import com.bms.common.core.domain.AjaxResult; diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArReceiptController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArReceiptController.java similarity index 97% rename from bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArReceiptController.java rename to bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArReceiptController.java index 5e0cc246..44ef54a3 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/ar/ArReceiptController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/receivable/ArReceiptController.java @@ -1,4 +1,4 @@ -package com.bms.web.controller.ar; +package com.bms.web.controller.receivable; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -12,9 +12,8 @@ import org.springframework.web.bind.annotation.PutMapping; 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.domain.ArBalanceWriteoff; -import com.bms.ar.domain.ArBill; -import com.bms.ar.service.IArBalanceWriteoffService; +import com.bms.receivable.domain.ArBalanceWriteoff; +import com.bms.receivable.service.IArBalanceWriteoffService; import com.bms.common.annotation.Log; import com.bms.common.core.controller.BaseController; import com.bms.common.core.domain.AjaxResult; 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 index a23c3977..7a4f4c78 100644 --- 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 @@ -6,16 +6,16 @@ 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 com.bms.receivable.profit.ArCommissionRate; +import com.bms.receivable.profit.ArCommissionService; +import com.bms.receivable.profit.ArProfitQuery; +import com.bms.receivable.profit.ArProfitService; +import com.bms.receivable.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.receivable.profit.ArProfitRow; +import com.bms.receivable.profit.ArCommissionResult; import com.bms.common.utils.poi.ExcelUtil; import com.bms.price.enums.ProfitAreaRule; import com.bms.common.annotation.Log; diff --git a/bms-back/bms-admin/src/main/resources/application.yml b/bms-back/bms-admin/src/main/resources/application.yml index 29427a10..b04a644e 100644 --- a/bms-back/bms-admin/src/main/resources/application.yml +++ b/bms-back/bms-admin/src/main/resources/application.yml @@ -42,14 +42,14 @@ bms: order-source-sync-threads: 16 # Order-list local rebill workers (2~24). Pair with Druid maxActive >= threads + 8. local-rebill-threads: 16 - # Night auto-rebill: hours 0-8, pull 500 (all statuses) -> bill -> next 500 until empty / 09:00. - # Empty page => no billing. + # Auto-rebill: every hour all day, pull 500 (all statuses) -> bill -> next 500 until empty. + # Empty page => no billing. Window [start-hour, end-hour). night-retry: enabled: true start-hour: 0 - end-hour: 9 + end-hour: 24 batch-size: 500 - cron: "0 0/1 0-8 * * ?" + cron: "0 0 * * * ?" oracle: # SLAVE datasource Oracle main-order table (schema.table allowed) order-table: WEISHI_USER.TAB_ORDER diff --git a/bms-back/bms-admin/src/test/java/com/bms/ar/ArBillExportDownloadTest.java b/bms-back/bms-admin/src/test/java/com/bms/receivable/ArBillExportDownloadTest.java similarity index 100% rename from bms-back/bms-admin/src/test/java/com/bms/ar/ArBillExportDownloadTest.java rename to bms-back/bms-admin/src/test/java/com/bms/receivable/ArBillExportDownloadTest.java 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 index 1fa6ffaf..a7bb20a1 100644 --- 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 @@ -11,14 +11,14 @@ 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; -import com.bms.ar.profit.ArProfitScope; -import com.bms.ar.profit.ArProfitScopeResolver; +import com.bms.receivable.domain.ArBalanceWriteoff; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.mapper.ArCommissionMapper; +import com.bms.receivable.profit.ArCommissionRate; +import com.bms.receivable.profit.ArCommissionResult; +import com.bms.receivable.profit.ArCommissionService; +import com.bms.receivable.profit.ArProfitScope; +import com.bms.receivable.profit.ArProfitScopeResolver; import com.bms.common.exception.ServiceException; class ArCommissionServiceTest 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 index f40d5c05..225d2433 100644 --- 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 @@ -8,22 +8,47 @@ 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; +import com.bms.receivable.profit.ArProfitQuery; +import com.bms.receivable.profit.ArProfitScope; +import com.bms.receivable.profit.ArCommissionResult; class ArProfitMapperSqlTest { + @Test + void snapshotCalculationIsScopedToTheGeneratingBill() throws Exception + { + Configuration configuration = new Configuration(); + configuration.getTypeAliasRegistry().registerAlias("ArBill", com.bms.receivable.domain.ArBill.class); + for (String resource : new String[] {"mapper/receivable/ArBillScopeMapper.xml", "mapper/receivable/ArBillMapper.xml"}) + { + try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) + { + new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse(); + } + } + var bound = configuration.getMappedStatement("com.bms.receivable.mapper.ArBillMapper.updateProfitSnapshot") + .getBoundSql(Map.of("arBillId", 42L, "shenzhenArea", "C", "guangzhouArea", "GZ")); + String sql = bound.getSql(); + assertTrue(sql.contains("fd.ar_bill_id = ?")); + assertTrue(sql.contains("d.ar_bill_id = ?")); + assertTrue(sql.contains("b.ar_bill_id = ? and b.generation_status = 'GENERATING'")); + assertTrue(sql.contains("f.sales_amount = d.total_amount")); + assertTrue(sql.contains("a.detail_total != b.total_amount")); + assertTrue(sql.contains("'MISSING_PRICE'")); + assertTrue(sql.contains("'CURRENCY_MISMATCH'")); + assertTrue(sql.contains("'PRICE_OVERFLOW'")); + } + @Test void commissionInReportSummaryUsesBillFiltersAndDataScope() throws Exception { Configuration configuration = new Configuration(); - String resource = "mapper/ar/ArProfitMapper.xml"; + String resource = "mapper/receivable/ArProfitMapper.xml"; try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) { new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse(); } - var statement = configuration.getMappedStatement("com.bms.ar.mapper.ArProfitMapper.selectSummary"); + var statement = configuration.getMappedStatement("com.bms.receivable.mapper.ArProfitMapper.selectSummary"); ArProfitQuery query = new ArProfitQuery(); query.setCustomerId(5L); query.setBillNo("AR123"); @@ -65,7 +90,7 @@ class ArProfitMapperSqlTest { Configuration configuration = new Configuration(); // 提成 Mapper 先加载时也必须能解析引用的报表权限片段。 - for (String resource : new String[] { "mapper/ar/ArCommissionMapper.xml", "mapper/ar/ArProfitMapper.xml" }) + for (String resource : new String[] {"mapper/receivable/ArCommissionMapper.xml", "mapper/receivable/ArProfitMapper.xml"}) { try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) { @@ -74,7 +99,7 @@ class ArProfitMapperSqlTest } for (String id : new String[] { "selectBills", "selectSummary", "selectBillDetails", "selectFees" }) { - String name = "com.bms.ar.mapper.ArProfitMapper." + id; + String name = "com.bms.receivable.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( @@ -84,18 +109,26 @@ class ArProfitMapperSqlTest assertTrue(manager.contains("find_in_set")); assertTrue(manager.contains("b.status in")); } - String bills = configuration.getMappedStatement("com.bms.ar.mapper.ArProfitMapper.selectBills") + String bills = configuration.getMappedStatement("com.bms.receivable.mapper.ArProfitMapper.selectBills") .getBoundSql(Map.of("query", new ArProfitQuery(), "scope", new ArProfitScope(true, false, false, 8L, 10L))).getSql(); assertTrue(bills.contains("from ar_bill b")); assertTrue(bills.contains("b.bill_name")); + assertTrue(bills.contains("b.profit_calc_status = 'READY'")); + assertTrue(bills.contains("b.product_amount")); + assertTrue(bills.contains("b.redline_amount")); + assertFalse(bills.contains("ar_bill_detail")); assertFalse(bills.contains("order_no")); - String billCommission = configuration.getMappedStatement("com.bms.ar.mapper.ArCommissionMapper.selectCommissionSummary") + String summary = configuration.getMappedStatement("com.bms.receivable.mapper.ArProfitMapper.selectSummary") + .getBoundSql(Map.of("query", new ArProfitQuery(), "scope", new ArProfitScope(true, false, false, 8L, 10L))).getSql(); + assertFalse(summary.contains("ar_bill_detail")); + assertTrue(summary.contains("ar_profit_commission_result")); + String billCommission = configuration.getMappedStatement("com.bms.receivable.mapper.ArCommissionMapper.selectCommissionSummary") .getBoundSql(Map.of("billId", 9L, "scope", new ArProfitScope(true, false, false, 8L, 10L))).getSql(); assertTrue(billCommission.contains("r.ar_bill_id = ?")); assertTrue(billCommission.contains("then null")); for (String id : new String[] { "selectResults", "selectCommissionSummary" }) { - var statement = configuration.getMappedStatement("com.bms.ar.mapper.ArCommissionMapper." + id); + var statement = configuration.getMappedStatement("com.bms.receivable.mapper.ArCommissionMapper." + id); String self = statement.getBoundSql(Map.of("billId", 9L, "includeReversed", true, "scope", new ArProfitScope(false, true, false, 8L, 10L))).getSql(); String department = statement.getBoundSql(Map.of("includeReversed", false, @@ -113,7 +146,7 @@ class ArProfitMapperSqlTest assertFalse(all.contains("b.profit_sales_user_id = ?")); assertFalse(all.contains("find_in_set")); } - var salesSql = configuration.getMappedStatement("com.bms.ar.mapper.ArProfitMapper.selectSalesOptions") + var salesSql = configuration.getMappedStatement("com.bms.receivable.mapper.ArProfitMapper.selectSalesOptions") .getBoundSql(Map.of("keyword", "sales")); assertTrue(salesSql.getSql().contains("from sys_user u")); assertTrue(salesSql.getSql().contains("u.nick_name like")); @@ -121,11 +154,11 @@ class ArProfitMapperSqlTest 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") + String settlement = configuration.getMappedStatement("com.bms.receivable.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") + var insert = configuration.getMappedStatement("com.bms.receivable.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 index d2ae3faf..a2a736ec 100644 --- 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 @@ -4,10 +4,9 @@ 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.receivable.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; 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 index 75e997e0..f3daabb9 100644 --- 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 @@ -6,9 +6,9 @@ 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 com.bms.receivable.profit.CommissionCalculator; +import com.bms.receivable.profit.ArCommissionResult; +import com.bms.receivable.profit.CommissionCalculator.Writeoff; import org.junit.jupiter.api.Test; class CommissionCalculatorTest diff --git a/bms-back/bms-system/src/main/java/com/bms/customer/customermoney/service/impl/CustomerMoneyServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/customer/customermoney/service/impl/CustomerMoneyServiceImpl.java index 3437ef1a..c8ef355c 100644 --- a/bms-back/bms-system/src/main/java/com/bms/customer/customermoney/service/impl/CustomerMoneyServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/customer/customermoney/service/impl/CustomerMoneyServiceImpl.java @@ -15,8 +15,8 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import com.bms.common.exception.ServiceException; import com.bms.common.utils.SecurityUtils; -import com.bms.ar.domain.ArBankAccount; -import com.bms.ar.mapper.ArBankAccountMapper; +import com.bms.receivable.domain.ArBankAccount; +import com.bms.receivable.mapper.ArBankAccountMapper; import com.bms.customer.customerinfo.domain.BmsCustomer; import com.bms.customer.customerinfo.domain.BmsCustomerAttachment; import com.bms.customer.customerinfo.mapper.BmsCustomerMapper; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/config/BillingProperties.java b/bms-back/bms-system/src/main/java/com/bms/price/config/BillingProperties.java index 7dd9c9c0..9fb43987 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/config/BillingProperties.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/config/BillingProperties.java @@ -25,7 +25,7 @@ public class BillingProperties * Keep below Druid maxActive with headroom for other traffic. */ private int localRebillThreads = 16; - /** Night window auto-retry of prc_billing_task (all statuses) */ + /** Hourly auto-retry of prc_billing_task (all statuses) */ private NightRetry nightRetry = new NightRetry(); private Oracle oracle = new Oracle(); @@ -120,8 +120,8 @@ public class BillingProperties } /** - * Overnight rebill window: pull prc_billing_task (all success_status) and retryTask. - * Default hours [0, 9) local time; empty result skips billing. + * Auto rebill window: pull prc_billing_task (all success_status) and retryTask. + * Default hours [0, 24) local time (all day); empty result skips billing. */ public static class NightRetry { @@ -129,8 +129,8 @@ public class BillingProperties private boolean enabled = true; /** Inclusive start hour (0 = 00:00) */ private int startHour = 0; - /** Exclusive end hour (9 = stop at 09:00) */ - private int endHour = 9; + /** Exclusive end hour (24 = all day) */ + private int endHour = 24; /** Page size: bill this many then pull next page (default 500) */ private int batchSize = 500; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/ChannelProductMap.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/ChannelProductMap.java index 49eb06ad..e8198d8b 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/ChannelProductMap.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/ChannelProductMap.java @@ -20,9 +20,6 @@ public class ChannelProductMap private Long productId; - /** 打单套餐 ID,对应 prc_price_set.price_set_id(应收可填) */ - private Long priceSetId; - /** 渠道名称(列表回显) */ private String channelName; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java index 943c8c7e..4d855f8e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java @@ -122,7 +122,7 @@ public class PrcOrderBill extends BaseEntity private String creditArrearsStatus; /** NONE / REFUNDED */ private String refundStatus; - /** Billing fail: 0 ok; 1/2/3 sales miss; 23/24/25 catalog miss; soft-fail amount=0, no fee rows */ + /** Billing fail: 0 ok writes income bill+fee; non-0 amount=0, no income bill/fee */ private Integer billingFailStatus; /** 失败原因 */ private String errorMessage; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/OrderBillFailReasonVo.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/OrderBillFailReasonVo.java new file mode 100644 index 00000000..c3daba3d --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/OrderBillFailReasonVo.java @@ -0,0 +1,61 @@ +package com.bms.price.domain.vo; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * Order-list billing fail reason popup payload. + */ +@Data +public class OrderBillFailReasonVo implements Serializable +{ + private static final long serialVersionUID = 1L; + + private String billId; + private String orderNo; + private String transferNo; + private String trackingNo; + + private String customerCode; + private String customerName; + private String productCode; + private String productName; + private String countryCode; + private String countryName; + private String zoneCode; + private String zoneName; + private String destPostcode; + + private Long priceSetId; + private String priceSetCode; + private String priceSetName; + private String setType; + private Long psvId; + private String versionNo; + private Long psdId; + + private BigDecimal weight; + private BigDecimal chargeWeight; + private BigDecimal weightMin; + private BigDecimal weightMax; + private String weightLabel; + private BigDecimal freightRate; + private BigDecimal freightAmount; + private BigDecimal incomeTotal; + private String currency; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date bizDate; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pickupDate; + + private Integer billingFailStatus; + private String billingFailStatusLabel; + /** Raw persisted fail text. */ + private String errorMessage; + /** Templated human-readable fail reason. */ + private String failReasonDetail; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java index d7c16610..68b7b5c1 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java @@ -103,7 +103,7 @@ public class TmsPriceQuoteResult implements Serializable private String creditArrearsStatus; /** NONE / REFUNDED */ private String refundStatus; - /** Billing fail: 0 ok; 1/2/3 sales; 23/24/25 catalog (soft-fail on bill sync) */ + /** Billing fail: 0 ok (income bill+fee); 1/2/3 sales; 23/24/25 catalog */ private Integer billingFailStatus; private Integer pieces; private BigDecimal actualWeight; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java b/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java index b3194933..4203d69a 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java @@ -6,7 +6,8 @@ package com.bms.price.enums; * 1/2/3 sales-price (package) miss: product / country / weight; * 23/24/25 product-catalog price miss: product / country / weight; * 4+ map to prc_billing_task.fail_code. - * Soft-fail income bill: 0/1/2/3/23/24/25; fee rows only for 0. + * 26 not billed yet (order-source sync only). + * Income bill + fee rows: only status 0. */ public enum BillBillingFailStatus { @@ -38,7 +39,9 @@ public enum BillBillingFailStatus /** Product catalog miss: product hit but country/zone miss. */ CATALOG_COUNTRY(24), /** Product catalog miss: product+country hit but weight band miss. */ - CATALOG_WEIGHT(25); + CATALOG_WEIGHT(25), + /** Order landed from upstream but not billed yet. */ + NOT_BILLED(26); private final int code; @@ -70,16 +73,23 @@ public enum BillBillingFailStatus public static boolean isFail(Integer code) { - return code != null && code.intValue() > SUCCESS.code; + if (code == null) + { + return false; + } + int value = code.intValue(); + return value != SUCCESS.code && value != NOT_BILLED.code; } - /** Soft-fail sales/catalog misses also persist prc_income_bill. */ + public static boolean isNotBilled(Integer code) + { + return code != null && code.intValue() == NOT_BILLED.code; + } + + /** Only success (0) persists prc_income_bill. */ public static boolean storesIncomeBill(Integer code) { - int value = code == null ? SUCCESS.code : code.intValue(); - return value == SUCCESS.code - || value == PRODUCT.code || value == COUNTRY.code || value == WEIGHT.code - || value == CATALOG_PRODUCT.code || value == CATALOG_COUNTRY.code || value == CATALOG_WEIGHT.code; + return code == null || code.intValue() == SUCCESS.code; } /** 仅 0 落 prc_income_bill_fee。 */ @@ -96,7 +106,7 @@ public enum BillBillingFailStatus } for (BillBillingFailStatus status : values()) { - if (status == SUCCESS) + if (status == SUCCESS || status == NOT_BILLED) { continue; } @@ -113,6 +123,7 @@ public enum BillBillingFailStatus switch (this) { case SUCCESS: + case NOT_BILLED: return null; case PRODUCT: return BillTaskFailCode.PRODUCT_NOT_HIT.getCode(); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/ChannelProductMapMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/ChannelProductMapMapper.java index 05933715..f557cccd 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/mapper/ChannelProductMapMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/ChannelProductMapMapper.java @@ -1,24 +1,19 @@ package com.bms.price.mapper; -import java.util.List; import org.apache.ibatis.annotations.Param; import com.bms.price.domain.ChannelProductMap; /** - * 渠道产品关系映射 + * Channel-product pay-type mapping. */ public interface ChannelProductMapMapper { ChannelProductMap selectByChannelAndType(@Param("channelId") String channelId, @Param("payType") String payType); - List selectByPriceSetId(@Param("priceSetId") Long priceSetId); int upsert(ChannelProductMap row); int deleteByChannelAndType(@Param("channelId") String channelId, @Param("payType") String payType); - int deleteByChannelTypeAndPriceSet(@Param("channelId") String channelId, @Param("payType") String payType, - @Param("priceSetId") Long priceSetId); - int deleteByProductId(@Param("productId") Long productId); } diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PayProductTermMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PayProductTermMapper.java index f900cf56..ed8df97c 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PayProductTermMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PayProductTermMapper.java @@ -17,8 +17,6 @@ public interface PayProductTermMapper PayProductTerm selectByProductId(Long productId); - /** 打单产品所属套餐 ID */ - Long selectLabelPriceSetIdByProduct(@Param("productId") Long productId); List selectByPriceSetId(@Param("priceSetId") Long priceSetId); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/IPayProductService.java b/bms-back/bms-system/src/main/java/com/bms/price/service/IPayProductService.java index d5d414f4..f4228c16 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/IPayProductService.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/IPayProductService.java @@ -91,14 +91,6 @@ public interface IPayProductService /** 从打单套餐移除产品(失效/清理对应 term 明细) */ int removeLabelProducts(Long priceSetId, Long[] productIds); - /** 打单套餐已绑定渠道列表 */ - java.util.List listLabelChannels(Long priceSetId); - - /** 打单套餐批量绑定渠道(写 AR + price_set_id) */ - String bindLabelChannels(Long priceSetId, java.util.List channelIds, Long productId); - - /** 打单套餐解绑渠道 */ - int unbindLabelChannel(Long priceSetId, String channelId); /** 取消渠道上指定收付类型的产品。payType 为空时按应付 AP */ void unbindChannel(String channelId, String payType); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderBillService.java b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderBillService.java index f8139c2e..a0b37996 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderBillService.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderBillService.java @@ -13,6 +13,7 @@ import com.bms.price.domain.vo.BatchAddIncomeBillFeeRequest; import com.bms.price.domain.vo.ChargeWeightImportRow; import com.bms.price.domain.vo.ChargeWeightTemplateRequest; import com.bms.price.domain.vo.LocalRebillRequest; +import com.bms.price.domain.vo.OrderBillFailReasonVo; import com.bms.price.domain.vo.RecalcBillPriceRequest; import com.bms.price.domain.vo.UpdateIncomeBillFeeRequest; import com.bms.price.domain.vo.TmsPriceBillRequest; @@ -60,6 +61,9 @@ public interface IPrcOrderBillService TmsPriceQuoteResult getBill(String billId); + /** Billing fail reason for order-list popup (data-scoped). */ + OrderBillFailReasonVo getBillingFailReason(String billId); + TmsPriceQuoteResult getBillByOrderNo(String orderNo); /** Manual add income fee from surcharge config; refresh receivable totals. */ diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PayProductServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PayProductServiceImpl.java index bb0bd09a..0feb7f1b 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PayProductServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PayProductServiceImpl.java @@ -1056,103 +1056,6 @@ public class PayProductServiceImpl implements IPayProductService return n; } - @Override - public List listLabelChannels(Long priceSetId) - { - if (priceSetId == null) - { - return Collections.emptyList(); - } - List list = channelProductMapMapper.selectByPriceSetId(priceSetId); - return list == null ? Collections.emptyList() : list; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String bindLabelChannels(Long priceSetId, List channelIds, Long productId) - { - if (priceSetId == null) - { - throw new ServiceException("请选择打单套餐"); - } - if (channelIds == null || channelIds.isEmpty()) - { - throw new ServiceException("请选择要绑定的渠道"); - } - if (productId == null) - { - throw new ServiceException("请选择套餐内应收产品"); - } - PrcPriceSet set = priceSetMapper.selectPrcPriceSetById(priceSetId); - if (set == null || !PrcPriceSet.CATEGORY_LABEL.equalsIgnoreCase(String.valueOf(set.getSetCategory()))) - { - throw new ServiceException("打单套餐不存在"); - } - Long root = resolveRoot(productId); - boolean inSet = false; - List products = selectLabelProducts(priceSetId); - for (PayProduct p : products) - { - if (p != null && root.equals(p.getProductId())) - { - inSet = true; - break; - } - } - if (!inSet) - { - throw new ServiceException("所选产品不属于本打单套餐"); - } - String operator = SecurityUtils.getUsername(); - int n = 0; - for (String channelId : channelIds) - { - if (isBlank(channelId)) - { - continue; - } - ServiceChannel channel = serviceChannelMapper.selectServiceChannelById(channelId.trim()); - if (channel == null || isBlank(channel.getChannelCode())) - { - throw new ServiceException("渠道不存在或渠道编码为空:" + channelId); - } - ChannelProductMap row = new ChannelProductMap(); - row.setChannelId(channelId.trim()); - row.setChannelCode(channel.getChannelCode()); - row.setProductId(root); - row.setPriceSetId(priceSetId); - row.setPayType(PAY_TYPE_AR); - row.setCreateBy(operator); - row.setUpdateBy(operator); - channelProductMapMapper.upsert(row); - n++; - } - if (n <= 0) - { - throw new ServiceException("没有可绑定的渠道"); - } - return "已绑定 " + n + " 个渠道"; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public int unbindLabelChannel(Long priceSetId, String channelId) - { - if (priceSetId == null || isBlank(channelId)) - { - return 0; - } - return channelProductMapMapper.deleteByChannelTypeAndPriceSet(channelId.trim(), PAY_TYPE_AR, priceSetId); - } - - private Long resolveLabelPriceSetId(Long productId) - { - if (productId == null) - { - return null; - } - return payProductTermMapper.selectLabelPriceSetIdByProduct(productId); - } @Override public List selectLabelProducts(Long priceSetId) @@ -1756,10 +1659,6 @@ public class PayProductServiceImpl implements IPayProductService row.setChannelCode(channel.getChannelCode()); row.setProductId(storedId); row.setPayType(type); - if (PAY_TYPE_AR.equals(type)) - { - row.setPriceSetId(resolveLabelPriceSetId(storedId)); - } String operator = SecurityUtils.getUsername(); row.setCreateBy(operator); row.setUpdateBy(operator); 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 bf2952a3..1004127c 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 @@ -6,7 +6,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Collections; import java.util.Arrays; import java.util.Date; import java.util.HashSet; @@ -28,8 +27,8 @@ import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; -import com.bms.ar.enums.ArIncomeBillFeeStatus; -import com.bms.ar.enums.ArOrderBillStatus; +import com.bms.receivable.enums.ArIncomeBillFeeStatus; +import com.bms.receivable.enums.ArOrderBillStatus; import com.bms.common.annotation.DataScope; import com.bms.common.core.domain.entity.SysUser; import com.bms.common.exception.ServiceException; @@ -63,6 +62,7 @@ import com.bms.price.domain.vo.BatchAddIncomeBillFeeRequest; import com.bms.price.domain.vo.ChargeWeightImportRow; import com.bms.price.domain.vo.ChargeWeightTemplateRequest; import com.bms.price.domain.vo.LocalRebillRequest; +import com.bms.price.domain.vo.OrderBillFailReasonVo; import com.bms.price.domain.vo.RecalcBillPriceRequest; import com.bms.price.domain.vo.UpdateIncomeBillFeeRequest; import com.bms.price.task.PrcBatchAddIncomeFeeAsyncRunner; @@ -71,6 +71,7 @@ import com.bms.price.task.PrcChargeWeightImportAsyncRunner.ChargeWeightImportWor import com.bms.price.task.PrcOrderBillExportAsyncRunner; import com.bms.price.task.PrcOrderBillLocalRebillAsyncRunner; import com.bms.price.task.PrcRecalcBillPriceAsyncRunner; +import com.bms.price.service.support.BillingFailReasonSupport; import com.bms.price.service.support.OrderBillExportSupport; import com.bms.price.domain.vo.TmsPriceBillRequest; import com.bms.price.domain.vo.TmsOrderBillStatusResult; @@ -86,6 +87,10 @@ import com.bms.price.mapper.PrcIncomeBillFeeMapper; import com.bms.price.mapper.PrcIncomeBillMapper; import com.bms.price.mapper.PrcOrderBillExtMapper; import com.bms.price.mapper.PrcOrderBillMapper; +import com.bms.price.mapper.PrcPriceSetDetailMapper; +import com.bms.price.mapper.PrcPriceSetVersionMapper; +import com.bms.price.domain.PrcPriceSetDetail; +import com.bms.price.domain.PrcPriceSetVersion; import com.bms.price.mapper.PrcPayBillFeeMapper; import com.bms.price.mapper.PrcPayBillMapper; import com.bms.price.oracle.OracleOrderBillExtFiller; @@ -121,6 +126,12 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService @Autowired private PrcOrderBillMapper orderBillMapper; + @Autowired + private PrcPriceSetVersionMapper priceSetVersionMapper; + + @Autowired + private PrcPriceSetDetailMapper priceSetDetailMapper; + /** TMS 实时状态查询使用客户主档案,不读取订单上的历史状态快照。 */ @Autowired private BmsCustomerMapper bmsCustomerMapper; @@ -433,6 +444,86 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService payBillFeeMapper.selectByBillId(bill.getBillId())); } + + @Override + public OrderBillFailReasonVo getBillingFailReason(String billId) + { + if (StringUtils.isEmpty(billId)) + { + throw new ServiceException(MessageUtils.message("price.bill.billIdRequired")); + } + PrcOrderBill query = new PrcOrderBill(); + query.setBillId(billId.trim()); + List list = self.selectBillList(query); + if (list == null || list.isEmpty()) + { + throw new ServiceException(MessageUtils.message("price.bill.notFound")); + } + PrcOrderBill bill = list.get(0); + OrderBillFailReasonVo vo = new OrderBillFailReasonVo(); + vo.setBillId(bill.getBillId()); + vo.setOrderNo(bill.getOrderNo()); + vo.setTransferNo(bill.getTransferNo()); + vo.setTrackingNo(bill.getTrackingNo()); + vo.setCustomerCode(bill.getCustomerCode()); + vo.setCustomerName(bill.getCustomerName()); + vo.setProductCode(bill.getProductCode()); + vo.setProductName(bill.getProductName()); + vo.setCountryCode(bill.getCountryCode()); + vo.setCountryName(bill.getCountryName()); + vo.setDestPostcode(bill.getDestPostcode()); + vo.setPriceSetId(bill.getPriceSetId()); + vo.setPriceSetCode(bill.getPriceSetCode()); + vo.setPriceSetName(bill.getPriceSetName()); + vo.setSetType(bill.getSetType()); + vo.setPsvId(bill.getPsvId()); + vo.setPsdId(bill.getPsdId()); + vo.setWeight(bill.getWeight()); + vo.setChargeWeight(bill.getChargeWeight()); + vo.setWeightMin(bill.getWeightMin()); + vo.setWeightMax(bill.getWeightMax()); + vo.setWeightLabel(bill.getWeightLabel()); + vo.setFreightRate(bill.getFreightRate()); + vo.setFreightAmount(bill.getFreightAmount()); + vo.setIncomeTotal(bill.getIncomeTotal()); + vo.setCurrency(bill.getCurrency()); + vo.setBizDate(bill.getBizDate()); + vo.setPickupDate(bill.getPickupDate()); + Integer status = bill.getBillingFailStatus() == null + ? Integer.valueOf(BillBillingFailStatus.SUCCESS.getCode()) : bill.getBillingFailStatus(); + vo.setBillingFailStatus(status); + vo.setBillingFailStatusLabel(OrderBillExportSupport.billingFailStatusLabel(status)); + if (bill.getPsvId() != null && priceSetVersionMapper != null) + { + PrcPriceSetVersion ver = priceSetVersionMapper.selectPrcPriceSetVersionById(bill.getPsvId()); + if (ver != null) + { + vo.setVersionNo(ver.getVersionNo()); + } + } + if (bill.getPsdId() != null && priceSetDetailMapper != null) + { + PrcPriceSetDetail detail = priceSetDetailMapper.selectPrcPriceSetDetailById(bill.getPsdId()); + if (detail != null) + { + vo.setZoneCode(detail.getZoneCode()); + vo.setZoneName(detail.getZoneName()); + } + } + String reason = bill.getErrorMessage(); + if (StringUtils.isEmpty(reason)) + { + reason = bill.getMatchMessage(); + } + if (StringUtils.isEmpty(reason)) + { + reason = vo.getBillingFailStatusLabel(); + } + vo.setErrorMessage(reason); + vo.setFailReasonDetail(BillingFailReasonSupport.buildDetail(vo, reason)); + return vo; + } + @Override public TmsPriceQuoteResult getBillByOrderNo(String orderNo) { @@ -3091,7 +3182,8 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService bill.setBillId(UUID.randomUUID().toString()); bill.setArBillStatus(ArOrderBillStatus.UNBILLED.getCode()); bill.setRefundStatus(BillRefundStatus.NONE.getCode()); - bill.setBillingFailStatus(Integer.valueOf(BillBillingFailStatus.SUCCESS.getCode())); + // Order-source sync only: mark not billed until quote/bill runs. + bill.setBillingFailStatus(Integer.valueOf(BillBillingFailStatus.NOT_BILLED.getCode())); bill.setFreightRate(BigDecimal.ZERO); bill.setBaseFreightRate(BigDecimal.ZERO); bill.setRegistrationFee(BigDecimal.ZERO); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/support/BillingFailReasonSupport.java b/bms-back/bms-system/src/main/java/com/bms/price/service/support/BillingFailReasonSupport.java new file mode 100644 index 00000000..e3f72bdd --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/support/BillingFailReasonSupport.java @@ -0,0 +1,114 @@ +package com.bms.price.service.support; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import com.bms.common.utils.StringUtils; +import com.bms.price.domain.vo.OrderBillFailReasonVo; + +/** + * Build templated billing-fail reason text for order-list popup. + */ +public final class BillingFailReasonSupport +{ + private BillingFailReasonSupport() {} + + private static final Map TEMPLATES = new HashMap(); + + static + { + TEMPLATES.put(Integer.valueOf(1), "\u3010\u9500\u552e\u4ef7\u672a\u5339\u914d\u4ea7\u54c1\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u5ba2\u6237 {customer}\uff0c\u4ea7\u54c1 {product}\uff0c\u56fd\u5bb6 {country}\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u5728\u5ba2\u6237\u9500\u552e\u4ef7\u5957\u9910\u300c{priceSet}\u300d\u4e2d\u672a\u627e\u5230\u8be5\u4ea7\u54c1\uff0c\u8bf7\u68c0\u67e5\u5957\u9910\u4ea7\u54c1\u8303\u56f4\u6216\u4ea7\u54c1\u4ee3\u7801\u6620\u5c04\u3002"); + TEMPLATES.put(Integer.valueOf(2), "\u3010\u9500\u552e\u4ef7\u672a\u5339\u914d\u56fd\u5bb6\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u5ba2\u6237 {customer}\uff0c\u4ea7\u54c1 {product}\uff0c\u76ee\u7684\u56fd\u5bb6 {country}\uff0c\u90ae\u7f16 {postcode}\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u5957\u9910\u300c{priceSet}\u300d\u7248\u672c {version}\u5df2\u547d\u4e2d\u4ea7\u54c1\uff0c\u4f46\u672a\u547d\u4e2d\u56fd\u5bb6/\u5206\u533a\uff0c\u8bf7\u8865\u9f50\u56fd\u5bb6\u4e0e\u5206\u533a\u4ef7\u683c\u3002"); + TEMPLATES.put(Integer.valueOf(3), "\u3010\u9500\u552e\u4ef7\u672a\u5339\u914d\u91cd\u91cf\u6bb5\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u5ba2\u6237 {customer}\uff0c\u4ea7\u54c1 {product}\uff0c\u56fd\u5bb6 {country}\uff0c\u5206\u533a {zone}\uff0c\u8ba1\u8d39\u91cd {chargeWeight} kg\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u5957\u9910\u300c{priceSet}\u300d\u7248\u672c {version}\u5df2\u547d\u4e2d\u4ea7\u54c1\u4e0e\u56fd\u5bb6\uff0c\u4f46\u8ba1\u8d39\u91cd\u672a\u843d\u5728\u4ef7\u683c\u91cd\u91cf\u6bb5\u5185\uff0c\u8bf7\u68c0\u67e5\u91cd\u91cf\u6bb5\u8bbe\u7f6e\u3002"); + TEMPLATES.put(Integer.valueOf(23), "\u3010\u4ea7\u54c1\u4ef7\u672a\u5339\u914d\u4ea7\u54c1\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u5ba2\u6237 {customer}\uff0c\u4ea7\u54c1 {product}\uff0c\u56fd\u5bb6 {country}\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u4ea7\u54c1\u4ef7\u76ee\u5f55\u4e2d\u672a\u627e\u5230\u8be5\u4ea7\u54c1\uff0c\u8bf7\u68c0\u67e5\u4ea7\u54c1\u4ef7\u6863\u6848\u662f\u5426\u5df2\u7ef4\u62a4\u3002"); + TEMPLATES.put(Integer.valueOf(24), "\u3010\u4ea7\u54c1\u4ef7\u672a\u5339\u914d\u56fd\u5bb6\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u4ea7\u54c1 {product}\uff0c\u76ee\u7684\u56fd\u5bb6 {country}\uff0c\u90ae\u7f16 {postcode}\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u4ea7\u54c1\u4ef7\u5df2\u547d\u4e2d\u4ea7\u54c1\uff0c\u4f46\u672a\u547d\u4e2d\u56fd\u5bb6/\u5206\u533a\uff0c\u8bf7\u8865\u9f50\u4ea7\u54c1\u4ef7\u56fd\u5bb6\u4ef7\u683c\u3002"); + TEMPLATES.put(Integer.valueOf(25), "\u3010\u4ea7\u54c1\u4ef7\u672a\u5339\u914d\u91cd\u91cf\u6bb5\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u4ea7\u54c1 {product}\uff0c\u56fd\u5bb6 {country}\uff0c\u5206\u533a {zone}\uff0c\u8ba1\u8d39\u91cd {chargeWeight} kg\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u4ea7\u54c1\u4ef7\u5df2\u547d\u4e2d\u4ea7\u54c1\u4e0e\u56fd\u5bb6\uff0c\u4f46\u8ba1\u8d39\u91cd\u672a\u843d\u5728\u91cd\u91cf\u6bb5\u5185\uff0c\u8bf7\u68c0\u67e5\u4ea7\u54c1\u4ef7\u91cd\u91cf\u6bb5\u3002"); + TEMPLATES.put(Integer.valueOf(4), "\u3010\u672a\u7ed1\u5b9a\u5957\u9910\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u5ba2\u6237 {customer}\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u8be5\u5ba2\u6237\u672a\u7ed1\u5b9a\u9500\u552e\u4ef7\u5957\u9910\uff0c\u65e0\u6cd5\u6309\u5957\u9910\u53d6\u4ef7\uff0c\u8bf7\u5148\u5728\u5ba2\u6237/\u5957\u9910\u7ed1\u5b9a\u540e\u518d\u8ba1\u8d39\u3002"); + TEMPLATES.put(Integer.valueOf(5), "\u3010\u5957\u9910\u672a\u542f\u7528/\u65e0\u751f\u6548\u7248\u672c\u3011\n\u8ba2\u5355 {orderNo}\uff08\u8f6c\u5355\u53f7 {transferNo}\uff09\uff0c\u5ba2\u6237 {customer}\uff0c\u5957\u9910\u300c{priceSet}\u300d\uff0c\u8ba1\u8d39\u65f6\u95f4 {bizDate}\u3002\n\u8ba1\u8d39\u65e5\u6ca1\u6709\u53ef\u7528\u7684\u5957\u9910\u751f\u6548\u7248\u672c\uff0c\u8bf7\u68c0\u67e5\u5957\u9910\u542f\u7528\u72b6\u6001\u4e0e\u7248\u672c\u751f\u6548\u671f\u3002"); + } + + public static String buildDetail(OrderBillFailReasonVo vo, String fallback) + { + if (vo == null) + { + return fallback; + } + Integer status = vo.getBillingFailStatus(); + String tpl = status == null ? null : TEMPLATES.get(status); + if (StringUtils.isEmpty(tpl)) + { + StringBuilder sb = new StringBuilder(); + sb.append("\u3010").append(nz(vo.getBillingFailStatusLabel(), "\u8ba1\u8d39\u5931\u8d25")).append("\u3011\n"); + sb.append("\u8ba2\u5355 ").append(nz(vo.getOrderNo(), "-")); + sb.append("\uff08\u8f6c\u5355\u53f7 ").append(nz(vo.getTransferNo(), "-")).append("\uff09"); + sb.append("\uff0c\u5ba2\u6237 ").append(joinCodeName(vo.getCustomerCode(), vo.getCustomerName())); + sb.append("\uff0c\u4ea7\u54c1 ").append(joinCodeName(vo.getProductCode(), vo.getProductName())); + sb.append("\uff0c\u56fd\u5bb6 ").append(joinCodeName(vo.getCountryCode(), vo.getCountryName())); + sb.append("\uff0c\u8ba1\u8d39\u65f6\u95f4 ").append(fmtDate(vo.getBizDate())).append("\u3002\n"); + sb.append(nz(fallback, nz(vo.getErrorMessage(), vo.getBillingFailStatusLabel()))); + return sb.toString(); + } + Map ctx = new HashMap(); + ctx.put("orderNo", nz(vo.getOrderNo(), "-")); + ctx.put("transferNo", nz(vo.getTransferNo(), "-")); + ctx.put("trackingNo", nz(vo.getTrackingNo(), "-")); + ctx.put("customer", joinCodeName(vo.getCustomerCode(), vo.getCustomerName())); + ctx.put("product", joinCodeName(vo.getProductCode(), vo.getProductName())); + ctx.put("country", joinCodeName(vo.getCountryCode(), vo.getCountryName())); + ctx.put("zone", joinCodeName(vo.getZoneCode(), vo.getZoneName())); + ctx.put("postcode", nz(vo.getDestPostcode(), "-")); + ctx.put("priceSet", joinCodeName(vo.getPriceSetCode(), vo.getPriceSetName())); + ctx.put("version", nz(vo.getVersionNo(), "-")); + ctx.put("chargeWeight", fmtNum(vo.getChargeWeight())); + ctx.put("bizDate", fmtDate(vo.getBizDate())); + ctx.put("pickupDate", fmtDate(vo.getPickupDate())); + String out = tpl; + for (Map.Entry e : ctx.entrySet()) + { + out = out.replace("{" + e.getKey() + "}", e.getValue()); + } + if (StringUtils.isNotEmpty(fallback) && !fallback.equals(vo.getBillingFailStatusLabel())) + { + out = out + "\n\u8be6\u60c5\uff1a" + fallback; + } + return out; + } + + private static String joinCodeName(String code, String name) + { + if (StringUtils.isEmpty(code) && StringUtils.isEmpty(name)) + { + return "-"; + } + if (StringUtils.isEmpty(code)) + { + return name; + } + if (StringUtils.isEmpty(name) || name.equals(code)) + { + return code; + } + return code + "/" + name; + } + + private static String fmtDate(Date d) + { + if (d == null) + { + return "-"; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d); + } + + private static String fmtNum(BigDecimal n) + { + return n == null ? "-" : n.stripTrailingZeros().toPlainString(); + } + + private static String nz(String v, String def) + { + return StringUtils.isEmpty(v) ? def : v; + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java b/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java index f299467b..9ab6ee9e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java @@ -265,6 +265,7 @@ public final class OrderBillExportSupport case 20: return "客户已停用"; case 21: return "运费为空"; case 22: return "未知失败"; + case 26: return "未计费"; default: return String.valueOf(status); } } diff --git a/bms-back/bms-system/src/main/java/com/bms/price/task/PrcBillingTaskNightRetryTask.java b/bms-back/bms-system/src/main/java/com/bms/price/task/PrcBillingTaskNightRetryTask.java index 41affb3d..340913bd 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/task/PrcBillingTaskNightRetryTask.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/task/PrcBillingTaskNightRetryTask.java @@ -16,13 +16,13 @@ import com.bms.price.mapper.PrcBillingTaskMapper; import com.bms.price.service.IPrcBillingTaskService; /** - * 夜间窗口按 prc_billing_task 自动重计费。 + * Auto retry prc_billing_task on a schedule. * - *

在 [startHour, endHour) 内(默认 00:00-09:00):最多拉取 {@value #DEFAULT_BATCH} - * 条任务 id(不限 success_status)-> 全部计费 -> 立刻拉下一页。 - * 空页则跳过计费并结束本轮(下次 cron 再处理新数据)。

+ *

Within [startHour, endHour) (default all day 00:00-24:00): pull up to {@value #DEFAULT_BATCH} + * task ids (any success_status) -> bill all -> pull next page. + * Empty page skips billing and ends this tick (next cron handles new rows).

* - *

与监控手工重试 / 条件重试同一条重计费路径(先重置为 WAITING 再处理)。

+ *

Same path as monitor manual / filter retry (reset to WAITING then process).

*/ @Component public class PrcBillingTaskNightRetryTask @@ -52,10 +52,10 @@ public class PrcBillingTaskNightRetryTask private IPrcBillingTaskService billingTaskService; /** - * Fire every minute; if a previous run is still paging batches, skip. + * Fire every hour by default; if a previous run is still paging batches, skip. * Hour gate uses bms.billing.night-retry start/end. */ - @Scheduled(cron = "${bms.billing.night-retry.cron:0 0/1 0-8 * * ?}") + @Scheduled(cron = "${bms.billing.night-retry.cron:0 0 * * * ?}") public void scheduledTick() { BillingProperties.NightRetry cfg = billingProperties == null ? null : billingProperties.getNightRetry(); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/task/PrcOrderBillLocalRebillAsyncRunner.java b/bms-back/bms-system/src/main/java/com/bms/price/task/PrcOrderBillLocalRebillAsyncRunner.java index c2905a14..6f46763a 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/task/PrcOrderBillLocalRebillAsyncRunner.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/task/PrcOrderBillLocalRebillAsyncRunner.java @@ -28,11 +28,14 @@ import com.bms.price.config.BillingProperties; import com.bms.price.domain.BatchAddIncomeBillFeeTask; import com.bms.price.domain.PrcOrderBill; import com.bms.price.domain.vo.LocalRebillRequest; +import com.bms.price.domain.vo.TmsPriceQuoteResult; +import com.bms.price.enums.BillBillingFailStatus; import com.bms.price.mapper.PrcOrderBillMapper; import com.bms.price.search.EsBizLogSupport; import com.bms.price.search.IBillSearchStore; import com.bms.price.search.TabOrderSyncEsLog; import com.bms.price.service.IPrcOrderBillService; +import com.bms.price.service.support.OrderBillExportSupport; /** * Async local rebill from prc_order_bill only (no Oracle / MQ). @@ -122,16 +125,33 @@ public class PrcOrderBillLocalRebillAsyncRunner String one = ids.get(i); try { - orderBillService.rebillLocalByBillId(one); - success.incrementAndGet(); + TmsPriceQuoteResult result = orderBillService.rebillLocalByBillId(one); + // Soft-fail still persists the order bill; count as fail in progress. + if (BillBillingFailStatus.isFail(result == null ? null : result.getBillingFailStatus())) + { + fail.incrementAndGet(); + String tip = softFailMessage(result); + String transferLabel = failTransferLabel(one, + result == null ? null : result.getTransferNo()); + appendFail(failTips, transferLabel, tip); + collectFailDetail(failDetails, one, tip); + log.warn("local rebill soft-fail taskId={} billId={} transferNo={} status={} msg={}", + taskId, one, transferLabel, + result == null ? null : result.getBillingFailStatus(), tip); + } + else + { + success.incrementAndGet(); + } } catch (Exception e) { fail.incrementAndGet(); - appendFail(failTips, one, e); + String transferLabel = failTransferLabel(one, null); + appendFail(failTips, transferLabel, e); collectFailDetail(failDetails, one, e); - log.warn("local rebill failed taskId={} billId={} msg={}", - taskId, one, e.getMessage()); + log.warn("local rebill failed taskId={} billId={} transferNo={} msg={}", + taskId, one, transferLabel, e.getMessage()); } finally { @@ -250,6 +270,11 @@ public class PrcOrderBillLocalRebillAsyncRunner } private void collectFailDetail(List> failDetails, String billId, Exception e) + { + collectFailDetail(failDetails, billId, errorMessage(e)); + } + + private void collectFailDetail(List> failDetails, String billId, String message) { if (failDetails == null) { @@ -284,7 +309,7 @@ public class PrcOrderBillLocalRebillAsyncRunner item.put("orderId", StringUtils.isEmpty(orderNo) ? billId : orderNo); item.put("transferOrderId", transferNo); item.put("trackingNo", trackingNo); - item.put("errorMessage", errorMessage(e)); + item.put("errorMessage", StringUtils.isEmpty(message) ? "fail" : message); failDetails.add(item); } } @@ -427,7 +452,12 @@ public class PrcOrderBillLocalRebillAsyncRunner return v; } - private static void appendFail(StringBuilder failTips, String billId, Exception e) + private static void appendFail(StringBuilder failTips, String orderLabel, Exception e) + { + appendFail(failTips, orderLabel, errorMessage(e)); + } + + private static void appendFail(StringBuilder failTips, String orderLabel, String message) { synchronized (failTips) { @@ -439,10 +469,57 @@ public class PrcOrderBillLocalRebillAsyncRunner { failTips.append("; "); } - failTips.append(billId).append(":").append(errorMessage(e)); + failTips.append(StringUtils.isEmpty(orderLabel) ? "-" : orderLabel) + .append(":").append(StringUtils.isEmpty(message) ? "fail" : message); } } + /** Prefer transferNo in UI tips; fall back to orderNo, then billId. */ + private String failTransferLabel(String billId, String transferNoHint) + { + if (StringUtils.isNotEmpty(transferNoHint)) + { + return transferNoHint.trim(); + } + if (StringUtils.isEmpty(billId) || orderBillMapper == null) + { + return billId; + } + try + { + PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim()); + if (bill != null) + { + if (StringUtils.isNotEmpty(bill.getTransferNo())) + { + return bill.getTransferNo().trim(); + } + if (StringUtils.isNotEmpty(bill.getOrderNo())) + { + return bill.getOrderNo().trim(); + } + } + } + catch (Exception ignore) + { + // tip label is best-effort + } + return billId; + } + + private static String softFailMessage(TmsPriceQuoteResult result) + { + if (result == null) + { + return "billing fail"; + } + if (StringUtils.isNotEmpty(result.getMatchMessage())) + { + return result.getMatchMessage(); + } + return OrderBillExportSupport.billingFailStatusLabel(result.getBillingFailStatus()); + } + private static String errorMessage(Exception e) { return StringUtils.isEmpty(e.getMessage()) ? e.getClass().getSimpleName() : e.getMessage(); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/config/ArBillExportTaskConfig.java b/bms-back/bms-system/src/main/java/com/bms/receivable/config/ArBillExportTaskConfig.java similarity index 98% rename from bms-back/bms-system/src/main/java/com/bms/ar/config/ArBillExportTaskConfig.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/config/ArBillExportTaskConfig.java index 704bd650..1848c1c0 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/config/ArBillExportTaskConfig.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/config/ArBillExportTaskConfig.java @@ -1,4 +1,4 @@ -package com.bms.ar.config; +package com.bms.receivable.config; import java.util.concurrent.ThreadPoolExecutor; import org.springframework.context.annotation.Bean; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBalanceWriteoff.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBalanceWriteoff.java similarity index 98% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBalanceWriteoff.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBalanceWriteoff.java index b9f0f1ac..7683221a 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBalanceWriteoff.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBalanceWriteoff.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.math.BigDecimal; import java.util.Date; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBankAccount.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBankAccount.java similarity index 95% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBankAccount.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBankAccount.java index 0fd69fe4..645f9024 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBankAccount.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBankAccount.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.io.Serializable; import java.util.Date; 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/receivable/domain/ArBill.java similarity index 98% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBill.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBill.java index 9c1895b6..d62508b2 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/receivable/domain/ArBill.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.math.BigDecimal; import java.util.Date; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillDetail.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillDetail.java similarity index 98% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillDetail.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillDetail.java index 0140aab1..15dedf01 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillDetail.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillDetail.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.io.Serializable; import java.math.BigDecimal; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillDetailFee.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillDetailFee.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillDetailFee.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillDetailFee.java index ca8f69ea..e0d0240e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillDetailFee.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillDetailFee.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.io.Serializable; import java.math.BigDecimal; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillExport.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillExport.java similarity index 97% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillExport.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillExport.java index 12a77dfd..9e8ada8e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillExport.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillExport.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.io.Serializable; import java.util.Date; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillGenerateTask.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillGenerateTask.java similarity index 98% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillGenerateTask.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillGenerateTask.java index 00833fcf..a76fab07 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillGenerateTask.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillGenerateTask.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.io.Serializable; import java.math.BigDecimal; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillLog.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillLog.java similarity index 97% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillLog.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillLog.java index c58c1570..730e448d 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArBillLog.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArBillLog.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.io.Serializable; import java.util.Date; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArExportTemplate.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArExportTemplate.java similarity index 94% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/ArExportTemplate.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArExportTemplate.java index 237bcdd0..bcadfa22 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/ArExportTemplate.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/ArExportTemplate.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain; +package com.bms.receivable.domain; import java.io.Serializable; import java.util.Date; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillActionRequest.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillActionRequest.java similarity index 80% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillActionRequest.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillActionRequest.java index 35f5fe6d..947649be 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillActionRequest.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillActionRequest.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain.vo; +package com.bms.receivable.domain.vo; import lombok.Data; 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/receivable/domain/vo/ArBillGeneratePreviewExportRow.java similarity index 98% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGeneratePreviewExportRow.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillGeneratePreviewExportRow.java index 4f2dab18..295f937e 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/receivable/domain/vo/ArBillGeneratePreviewExportRow.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain.vo; +package com.bms.receivable.domain.vo; import java.io.Serializable; import java.math.BigDecimal; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGenerateQuery.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillGenerateQuery.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGenerateQuery.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillGenerateQuery.java index ceda9d17..995d9233 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGenerateQuery.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillGenerateQuery.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain.vo; +package com.bms.receivable.domain.vo; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGenerateRequest.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillGenerateRequest.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGenerateRequest.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillGenerateRequest.java index 106c21ca..3d0a0ee7 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillGenerateRequest.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillGenerateRequest.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain.vo; +package com.bms.receivable.domain.vo; import java.util.Date; import java.util.List; @@ -8,7 +8,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import com.bms.common.config.serializer.StrictDateDeserializer; -import com.bms.ar.enums.ArBillSelectionMode; +import com.bms.receivable.enums.ArBillSelectionMode; import lombok.Data; /** 从订单计费结果生成正式账单的参数。 */ diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillListExportRow.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillListExportRow.java similarity index 94% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillListExportRow.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillListExportRow.java index 5c156e73..328f6969 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillListExportRow.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillListExportRow.java @@ -1,11 +1,11 @@ -package com.bms.ar.domain.vo; +package com.bms.receivable.domain.vo; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; -import com.bms.ar.domain.ArBill; -import com.bms.ar.enums.ArBillStatus; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.enums.ArBillStatus; import com.bms.common.annotation.Excel; import lombok.Data; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillQuery.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillQuery.java similarity index 90% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillQuery.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillQuery.java index 70d4ff43..8f738454 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillQuery.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillQuery.java @@ -1,9 +1,9 @@ -package com.bms.ar.domain.vo; +package com.bms.receivable.domain.vo; import java.util.Date; import java.util.List; import org.springframework.format.annotation.DateTimeFormat; -import com.bms.ar.domain.ArBill; +import com.bms.receivable.domain.ArBill; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillSummary.java b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillSummary.java similarity index 91% rename from bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillSummary.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillSummary.java index 0c76a186..40b2fe28 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/domain/vo/ArBillSummary.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/domain/vo/ArBillSummary.java @@ -1,4 +1,4 @@ -package com.bms.ar.domain.vo; +package com.bms.receivable.domain.vo; import java.io.Serializable; import java.math.BigDecimal; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBalanceWriteoffStatus.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBalanceWriteoffStatus.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBalanceWriteoffStatus.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBalanceWriteoffStatus.java index d0bfc9ab..bc2ecb33 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBalanceWriteoffStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBalanceWriteoffStatus.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** * 应收账单余额核销单状态。 diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillDateType.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillDateType.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillDateType.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillDateType.java index cd522945..6cdeecbd 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillDateType.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillDateType.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收账单生成时用于截止日筛选的来源订单日期字段。 */ public enum ArBillDateType diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillGenerateTaskStatus.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillGenerateTaskStatus.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillGenerateTaskStatus.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillGenerateTaskStatus.java index 2088908f..7c012f70 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillGenerateTaskStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillGenerateTaskStatus.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收账单异步生成任务状态。 */ public final class ArBillGenerateTaskStatus diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillGenerationStatus.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillGenerationStatus.java similarity index 93% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillGenerationStatus.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillGenerationStatus.java index e8513d17..8a4ecf4e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillGenerationStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillGenerationStatus.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收账单生成状态,与账单业务状态分离。 */ public final class ArBillGenerationStatus diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillSelectionMode.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillSelectionMode.java similarity index 97% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillSelectionMode.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillSelectionMode.java index fb4dc3d7..8e473bec 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillSelectionMode.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillSelectionMode.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** * 应收账单生成时的订单选择模式。 diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillStatus.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillStatus.java similarity index 97% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillStatus.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillStatus.java index 08b59d3b..b599aa74 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArBillStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArBillStatus.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收账单状态。数据库保存值使用 code,避免业务代码散落状态字符串。 */ public enum ArBillStatus diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArExportStatus.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArExportStatus.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArExportStatus.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArExportStatus.java index f25f5973..1d9dc160 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArExportStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArExportStatus.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** * 应收账单导出任务状态。 diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArIncomeBillFeeStatus.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArIncomeBillFeeStatus.java similarity index 90% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArIncomeBillFeeStatus.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArIncomeBillFeeStatus.java index 65710904..66c24ee5 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArIncomeBillFeeStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArIncomeBillFeeStatus.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收费用明细是否已经生成正式应收账单。 */ public enum ArIncomeBillFeeStatus diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogObjectType.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogObjectType.java similarity index 94% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogObjectType.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogObjectType.java index a4e899d5..6342e09a 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogObjectType.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogObjectType.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收日志关联对象类型。 */ public enum ArLogObjectType diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogOperationSource.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogOperationSource.java similarity index 95% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogOperationSource.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogOperationSource.java index e5ae2830..5a4aac73 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogOperationSource.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogOperationSource.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收日志操作来源。 */ public enum ArLogOperationSource diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogOperationType.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogOperationType.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogOperationType.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogOperationType.java index cd84e3d1..f1d08155 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogOperationType.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogOperationType.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收日志操作类型。 */ public enum ArLogOperationType diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogResult.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogResult.java similarity index 95% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogResult.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogResult.java index 7d61a1b3..09e729e3 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArLogResult.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArLogResult.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 应收操作日志结果。 */ public enum ArLogResult diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArOrderBillStatus.java b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArOrderBillStatus.java similarity index 90% rename from bms-back/bms-system/src/main/java/com/bms/ar/enums/ArOrderBillStatus.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArOrderBillStatus.java index 3d881d95..761c767d 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/enums/ArOrderBillStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/enums/ArOrderBillStatus.java @@ -1,4 +1,4 @@ -package com.bms.ar.enums; +package com.bms.receivable.enums; /** 计费订单的应收账单状态。 */ public enum ArOrderBillStatus diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/event/ArBillExportTaskEvent.java b/bms-back/bms-system/src/main/java/com/bms/receivable/event/ArBillExportTaskEvent.java similarity index 92% rename from bms-back/bms-system/src/main/java/com/bms/ar/event/ArBillExportTaskEvent.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/event/ArBillExportTaskEvent.java index d9c17dc9..18b06024 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/event/ArBillExportTaskEvent.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/event/ArBillExportTaskEvent.java @@ -1,4 +1,4 @@ -package com.bms.ar.event; +package com.bms.receivable.event; /** * 应收账单导出任务已提交事件。 diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/event/ArBillGenerateTaskEvent.java b/bms-back/bms-system/src/main/java/com/bms/receivable/event/ArBillGenerateTaskEvent.java similarity index 92% rename from bms-back/bms-system/src/main/java/com/bms/ar/event/ArBillGenerateTaskEvent.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/event/ArBillGenerateTaskEvent.java index 0f72a8f5..103bd043 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/event/ArBillGenerateTaskEvent.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/event/ArBillGenerateTaskEvent.java @@ -1,4 +1,4 @@ -package com.bms.ar.event; +package com.bms.receivable.event; /** * 应收账单异步生成任务已提交事件。 diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBalanceWriteoffMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBalanceWriteoffMapper.java similarity index 90% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBalanceWriteoffMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBalanceWriteoffMapper.java index 3f97cca2..152892d4 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBalanceWriteoffMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBalanceWriteoffMapper.java @@ -1,10 +1,10 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.List; -import com.bms.ar.security.ArBillRowScope; +import com.bms.receivable.security.ArBillRowScope; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBalanceWriteoff; +import com.bms.receivable.domain.ArBalanceWriteoff; /** * 应收账单余额核销 Mapper diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBankAccountMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBankAccountMapper.java similarity index 85% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBankAccountMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBankAccountMapper.java index 9fc77e6c..1df7bf4c 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBankAccountMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBankAccountMapper.java @@ -1,9 +1,9 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBankAccount; +import com.bms.receivable.domain.ArBankAccount; public interface ArBankAccountMapper { ArBankAccount selectDefaultByCurrency(@Param("currency") String currency); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillDetailFeeMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillDetailFeeMapper.java similarity index 85% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillDetailFeeMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillDetailFeeMapper.java index 5c75df9c..bdb513c4 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillDetailFeeMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillDetailFeeMapper.java @@ -1,10 +1,10 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.List; -import com.bms.ar.security.ArBillRowScope; +import com.bms.receivable.security.ArBillRowScope; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBillDetailFee; +import com.bms.receivable.domain.ArBillDetailFee; public interface ArBillDetailFeeMapper { List selectByBillIdAndDetailIdScoped(@Param("arBillId") Long arBillId, @Param("detailId") Long detailId, @Param("scope") ArBillRowScope scope); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillDetailMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillDetailMapper.java similarity index 88% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillDetailMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillDetailMapper.java index 15ccdfa9..f361e703 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillDetailMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillDetailMapper.java @@ -1,12 +1,12 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.List; -import com.bms.ar.security.ArBillRowScope; +import com.bms.receivable.security.ArBillRowScope; import java.util.Map; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBillDetail; +import com.bms.receivable.domain.ArBillDetail; public interface ArBillDetailMapper { List selectByBillIdScoped(@Param("arBillId") Long arBillId, @Param("scope") ArBillRowScope scope); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillExportMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillExportMapper.java similarity index 88% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillExportMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillExportMapper.java index 959725b7..3b4e74ee 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillExportMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillExportMapper.java @@ -1,10 +1,10 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.Date; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBillExport; +import com.bms.receivable.domain.ArBillExport; public interface ArBillExportMapper { List selectByBillId(Long arBillId); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillGenerateTaskMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillGenerateTaskMapper.java similarity index 91% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillGenerateTaskMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillGenerateTaskMapper.java index b0c398ea..4facb2ca 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillGenerateTaskMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillGenerateTaskMapper.java @@ -1,17 +1,17 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.Date; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBillGenerateTask; +import com.bms.receivable.domain.ArBillGenerateTask; /** * 应收账单异步生成任务 Mapper。 */ public interface ArBillGenerateTaskMapper { List selectActiveByCreateByScoped(@Param("createBy") String createBy, - @Param("scope") com.bms.ar.security.ArBillRowScope scope); + @Param("scope") com.bms.receivable.security.ArBillRowScope scope); ArBillGenerateTask selectById(Long taskId); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillLogMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillLogMapper.java similarity index 75% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillLogMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillLogMapper.java index 01c569bf..279cbea4 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillLogMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillLogMapper.java @@ -1,10 +1,10 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.List; -import com.bms.ar.security.ArBillRowScope; +import com.bms.receivable.security.ArBillRowScope; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBillLog; +import com.bms.receivable.domain.ArBillLog; public interface ArBillLogMapper { diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillMapper.java similarity index 85% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillMapper.java index 2c1bd595..3bf8ab41 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillMapper.java @@ -1,14 +1,14 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.math.BigDecimal; import java.util.Date; import java.util.List; -import com.bms.ar.security.ArBillRowScope; +import com.bms.receivable.security.ArBillRowScope; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArBill; -import com.bms.ar.domain.vo.ArBillQuery; -import com.bms.ar.domain.vo.ArBillSummary; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.domain.vo.ArBillQuery; +import com.bms.receivable.domain.vo.ArBillSummary; public interface ArBillMapper { List selectArBillList(@Param("query") ArBillQuery query, @Param("scope") ArBillRowScope scope); @@ -36,6 +36,10 @@ public interface ArBillMapper { int insertArBill(ArBill bill); + int updateProfitSnapshot(@Param("arBillId") Long arBillId, + @Param("shenzhenArea") String shenzhenArea, + @Param("guangzhouArea") String guangzhouArea); + int updateArBillStatus(@Param("arBillId") Long arBillId, @Param("status") String status, @Param("remark") String remark, @Param("operator") String operator, @Param("fromStatus") String fromStatus); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillScopeMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillScopeMapper.java similarity index 88% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillScopeMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillScopeMapper.java index 15cc7490..b2ecc664 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArBillScopeMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArBillScopeMapper.java @@ -1,8 +1,8 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.bms.ar.security.ArBillRowScope; +import com.bms.receivable.security.ArBillRowScope; import com.bms.customer.customerinfo.domain.BmsCustomerOption; public interface ArBillScopeMapper { 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/receivable/mapper/ArCommissionMapper.java similarity index 85% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArCommissionMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArCommissionMapper.java index 1a77e51e..b261411a 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArCommissionMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArCommissionMapper.java @@ -1,13 +1,13 @@ -package com.bms.ar.mapper; +package com.bms.receivable.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; -import com.bms.ar.profit.ArProfitScope; +import com.bms.receivable.profit.ArCommissionRate; +import com.bms.receivable.profit.ArWriteoffRate; +import com.bms.receivable.profit.ArCommissionResult; +import com.bms.receivable.profit.ArCommissionSummary; +import com.bms.receivable.profit.ArProfitScope; public interface ArCommissionMapper { diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArExportTemplateMapper.java b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArExportTemplateMapper.java similarity index 80% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArExportTemplateMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArExportTemplateMapper.java index 55d79fb9..2e70a0d9 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArExportTemplateMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArExportTemplateMapper.java @@ -1,9 +1,9 @@ -package com.bms.ar.mapper; +package com.bms.receivable.mapper; import java.util.Date; import org.apache.ibatis.annotations.Param; -import com.bms.ar.domain.ArExportTemplate; +import com.bms.receivable.domain.ArExportTemplate; public interface ArExportTemplateMapper { /** 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/receivable/mapper/ArProfitMapper.java similarity index 62% rename from bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArProfitMapper.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArProfitMapper.java index 069b6823..8bb39799 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/mapper/ArProfitMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/mapper/ArProfitMapper.java @@ -1,14 +1,14 @@ -package com.bms.ar.mapper; +package com.bms.receivable.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; +import com.bms.receivable.profit.ArProfitQuery; +import com.bms.receivable.profit.ArProfitRow; +import com.bms.receivable.profit.ArProfitScope; +import com.bms.receivable.profit.ArProfitSummary; +import com.bms.receivable.profit.ArProfitSalesOption; +import com.bms.receivable.domain.ArBillDetailFee; +import com.bms.receivable.domain.ArBillDetail; public interface ArProfitMapper { 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/receivable/profit/ArCommissionRate.java similarity index 94% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionRate.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionRate.java index da8d48ba..253cd790 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionRate.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionRate.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.math.BigDecimal; import java.util.Date; 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/receivable/profit/ArCommissionResult.java similarity index 97% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionResult.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionResult.java index ce732fa4..43f28a5f 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionResult.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionResult.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.math.BigDecimal; import java.util.Date; 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/receivable/profit/ArCommissionService.java similarity index 94% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionService.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionService.java index 3447c988..e6b9200c 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionService.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionService.java @@ -1,17 +1,17 @@ -package com.bms.ar.profit; +package com.bms.receivable.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.receivable.domain.ArBalanceWriteoff; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.mapper.ArCommissionMapper; +import com.bms.receivable.mapper.ArBillMapper; +import com.bms.receivable.enums.ArBillStatus; +import com.bms.receivable.enums.ArBillGenerationStatus; +import com.bms.receivable.security.ArBillRoleKeys; import com.bms.common.exception.ServiceException; import com.bms.common.core.domain.entity.SysUser; import com.bms.common.utils.SecurityUtils; 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/receivable/profit/ArCommissionSummary.java similarity index 89% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionSummary.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionSummary.java index 31063205..532cb5e2 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArCommissionSummary.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArCommissionSummary.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.math.BigDecimal; import lombok.Data; 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/receivable/profit/ArProfitQuery.java similarity index 92% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitQuery.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitQuery.java index 358cdf8e..f795eab1 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitQuery.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitQuery.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.util.Date; import lombok.Data; 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/receivable/profit/ArProfitRow.java similarity index 97% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitRow.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitRow.java index a95aaa22..c0363d6f 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitRow.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitRow.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.math.BigDecimal; import java.util.Date; 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/receivable/profit/ArProfitSalesOption.java similarity index 80% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSalesOption.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitSalesOption.java index 0ff4a874..9aa76025 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSalesOption.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitSalesOption.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import lombok.Data; 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/receivable/profit/ArProfitScope.java similarity index 92% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScope.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitScope.java index 24d52b1d..3b4c336b 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScope.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitScope.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; /** 后端构造的数据范围,不接收前端传入的权限参数。 */ public record ArProfitScope(boolean all, boolean self, boolean department, Long userId, Long 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/receivable/profit/ArProfitScopeResolver.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScopeResolver.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitScopeResolver.java index a2290c27..52542d5d 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitScopeResolver.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitScopeResolver.java @@ -1,9 +1,9 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.util.Arrays; import java.util.Set; import org.springframework.stereotype.Component; -import com.bms.ar.security.ArBillRoleKeys; +import com.bms.receivable.security.ArBillRoleKeys; import com.bms.common.constant.Constants; import com.bms.common.core.domain.entity.SysRole; import com.bms.common.core.domain.entity.SysUser; 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/receivable/profit/ArProfitService.java similarity index 90% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitService.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitService.java index b14df719..53c5ddfb 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitService.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitService.java @@ -1,10 +1,10 @@ -package com.bms.ar.profit; +package com.bms.receivable.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; +import com.bms.receivable.mapper.ArProfitMapper; +import com.bms.receivable.domain.ArBillDetailFee; +import com.bms.receivable.domain.ArBillDetail; @Service public class ArProfitService 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/receivable/profit/ArProfitSummary.java similarity index 92% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSummary.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitSummary.java index 54c10e1f..1908ec1e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArProfitSummary.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArProfitSummary.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.math.BigDecimal; import lombok.Data; 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/receivable/profit/ArWriteoffRate.java similarity index 93% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/ArWriteoffRate.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArWriteoffRate.java index cdd49689..ba599500 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/ArWriteoffRate.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/ArWriteoffRate.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.math.BigDecimal; import java.util.Date; 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/receivable/profit/CommissionCalculator.java similarity index 99% rename from bms-back/bms-system/src/main/java/com/bms/ar/profit/CommissionCalculator.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/profit/CommissionCalculator.java index c693d320..10e9c92f 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/profit/CommissionCalculator.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/profit/CommissionCalculator.java @@ -1,4 +1,4 @@ -package com.bms.ar.profit; +package com.bms.receivable.profit; import java.math.BigDecimal; import java.math.RoundingMode; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillRoleKeys.java b/bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillRoleKeys.java similarity index 96% rename from bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillRoleKeys.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillRoleKeys.java index 850d1427..079ea2f0 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillRoleKeys.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillRoleKeys.java @@ -1,4 +1,4 @@ -package com.bms.ar.security; +package com.bms.receivable.security; import java.util.Set; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillRowScope.java b/bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillRowScope.java similarity index 95% rename from bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillRowScope.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillRowScope.java index 38eec00b..cb27a14a 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillRowScope.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillRowScope.java @@ -1,4 +1,4 @@ -package com.bms.ar.security; +package com.bms.receivable.security; /** 仅由后端构造,不能绑定到 HTTP 查询对象。 */ public final class ArBillRowScope { diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillScopeResolver.java b/bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillScopeResolver.java similarity index 98% rename from bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillScopeResolver.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillScopeResolver.java index 6bf5c4ab..1e00f09d 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/security/ArBillScopeResolver.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/security/ArBillScopeResolver.java @@ -1,4 +1,4 @@ -package com.bms.ar.security; +package com.bms.receivable.security; import java.util.Arrays; import java.util.List; @@ -7,7 +7,7 @@ import java.util.function.Supplier; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import org.springframework.stereotype.Component; -import com.bms.ar.mapper.ArBillScopeMapper; +import com.bms.receivable.mapper.ArBillScopeMapper; import com.bms.common.constant.Constants; import com.bms.common.core.domain.entity.SysRole; import com.bms.common.core.domain.entity.SysUser; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/service/IArBalanceWriteoffService.java b/bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBalanceWriteoffService.java similarity index 86% rename from bms-back/bms-system/src/main/java/com/bms/ar/service/IArBalanceWriteoffService.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBalanceWriteoffService.java index 471d70f1..7ff8f5c4 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/service/IArBalanceWriteoffService.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBalanceWriteoffService.java @@ -1,8 +1,8 @@ -package com.bms.ar.service; +package com.bms.receivable.service; import java.util.List; -import com.bms.ar.domain.ArBalanceWriteoff; -import com.bms.ar.domain.ArBill; +import com.bms.receivable.domain.ArBalanceWriteoff; +import com.bms.receivable.domain.ArBill; /** * 应收账单余额核销 Service接口 diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/service/IArBillLogService.java b/bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBillLogService.java similarity index 67% rename from bms-back/bms-system/src/main/java/com/bms/ar/service/IArBillLogService.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBillLogService.java index 32b07ccf..8a889b65 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/service/IArBillLogService.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBillLogService.java @@ -1,10 +1,10 @@ -package com.bms.ar.service; +package com.bms.receivable.service; import java.util.List; -import com.bms.ar.domain.ArBillLog; -import com.bms.ar.enums.ArLogObjectType; -import com.bms.ar.enums.ArLogOperationType; +import com.bms.receivable.domain.ArBillLog; +import com.bms.receivable.enums.ArLogObjectType; +import com.bms.receivable.enums.ArLogOperationType; public interface IArBillLogService { List selectLogList(ArBillLog query); diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/service/IArBillService.java b/bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBillService.java similarity index 79% rename from bms-back/bms-system/src/main/java/com/bms/ar/service/IArBillService.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBillService.java index 609cc1dd..c59eefed 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/service/IArBillService.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/service/IArBillService.java @@ -1,20 +1,20 @@ -package com.bms.ar.service; +package com.bms.receivable.service; import java.math.BigDecimal; import java.util.Date; import java.util.List; -import com.bms.ar.domain.ArBill; -import com.bms.ar.domain.ArBankAccount; -import com.bms.ar.domain.ArBillDetail; -import com.bms.ar.domain.ArBillDetailFee; -import com.bms.ar.domain.ArBillExport; -import com.bms.ar.domain.ArBillGenerateTask; -import com.bms.ar.domain.ArBillLog; -import com.bms.ar.domain.vo.ArBillGenerateRequest; -import com.bms.ar.domain.vo.ArBillGenerateQuery; -import com.bms.ar.domain.vo.ArBillActionRequest; -import com.bms.ar.domain.vo.ArBillQuery; -import com.bms.ar.domain.vo.ArBillSummary; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.domain.ArBankAccount; +import com.bms.receivable.domain.ArBillDetail; +import com.bms.receivable.domain.ArBillDetailFee; +import com.bms.receivable.domain.ArBillExport; +import com.bms.receivable.domain.ArBillGenerateTask; +import com.bms.receivable.domain.ArBillLog; +import com.bms.receivable.domain.vo.ArBillGenerateRequest; +import com.bms.receivable.domain.vo.ArBillGenerateQuery; +import com.bms.receivable.domain.vo.ArBillActionRequest; +import com.bms.receivable.domain.vo.ArBillQuery; +import com.bms.receivable.domain.vo.ArBillSummary; import com.bms.price.domain.PrcOrderBill; /** 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/receivable/service/impl/ArBalanceWriteoffServiceImpl.java similarity index 94% rename from bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBalanceWriteoffServiceImpl.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBalanceWriteoffServiceImpl.java index ef8b676c..7adb7581 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/receivable/service/impl/ArBalanceWriteoffServiceImpl.java @@ -1,4 +1,4 @@ -package com.bms.ar.service.impl; +package com.bms.receivable.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; @@ -12,21 +12,21 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; -import com.bms.ar.domain.ArBalanceWriteoff; -import com.bms.ar.domain.ArBill; -import com.bms.ar.domain.ArBillLog; -import com.bms.ar.enums.ArBalanceWriteoffStatus; -import com.bms.ar.enums.ArBillStatus; -import com.bms.ar.enums.ArLogObjectType; -import com.bms.ar.enums.ArLogOperationSource; -import com.bms.ar.enums.ArLogOperationType; -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.receivable.domain.ArBalanceWriteoff; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.domain.ArBillLog; +import com.bms.receivable.enums.ArBalanceWriteoffStatus; +import com.bms.receivable.enums.ArBillStatus; +import com.bms.receivable.enums.ArLogObjectType; +import com.bms.receivable.enums.ArLogOperationSource; +import com.bms.receivable.enums.ArLogOperationType; +import com.bms.receivable.enums.ArLogResult; +import com.bms.receivable.mapper.ArBalanceWriteoffMapper; +import com.bms.receivable.mapper.ArBillMapper; +import com.bms.receivable.security.ArBillScopeResolver; +import com.bms.receivable.profit.ArCommissionService; +import com.bms.receivable.service.IArBalanceWriteoffService; +import com.bms.receivable.service.IArBillLogService; import com.bms.common.exception.ServiceException; import com.bms.common.utils.SecurityUtils; import com.bms.customer.customermoney.domain.CustomerReceipt; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillLogServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillLogServiceImpl.java similarity index 80% rename from bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillLogServiceImpl.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillLogServiceImpl.java index 4231daa2..056e57d5 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillLogServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillLogServiceImpl.java @@ -1,4 +1,4 @@ -package com.bms.ar.service.impl; +package com.bms.receivable.service.impl; import java.util.List; @@ -6,14 +6,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import com.bms.ar.domain.ArBillLog; -import com.bms.ar.enums.ArLogObjectType; -import com.bms.ar.enums.ArLogOperationSource; -import com.bms.ar.enums.ArLogOperationType; -import com.bms.ar.enums.ArLogResult; -import com.bms.ar.mapper.ArBillLogMapper; -import com.bms.ar.security.ArBillScopeResolver; -import com.bms.ar.service.IArBillLogService; +import com.bms.receivable.domain.ArBillLog; +import com.bms.receivable.enums.ArLogObjectType; +import com.bms.receivable.enums.ArLogOperationSource; +import com.bms.receivable.enums.ArLogOperationType; +import com.bms.receivable.enums.ArLogResult; +import com.bms.receivable.mapper.ArBillLogMapper; +import com.bms.receivable.security.ArBillScopeResolver; +import com.bms.receivable.service.IArBillLogService; import com.bms.common.utils.uuid.IdUtils; @Service 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/receivable/service/impl/ArBillServiceImpl.java similarity index 97% rename from bms-back/bms-system/src/main/java/com/bms/ar/service/impl/ArBillServiceImpl.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillServiceImpl.java index f3e3b846..e0431a02 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/receivable/service/impl/ArBillServiceImpl.java @@ -1,4 +1,4 @@ -package com.bms.ar.service.impl; +package com.bms.receivable.service.impl; import java.io.File; import java.io.IOException; @@ -44,49 +44,49 @@ import org.springframework.transaction.support.TransactionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson2.JSON; -import com.bms.ar.domain.ArBill; -import com.bms.ar.domain.ArBankAccount; -import com.bms.ar.domain.ArBillDetail; -import com.bms.ar.domain.ArBillDetailFee; -import com.bms.ar.domain.ArBillExport; -import com.bms.ar.domain.ArBillGenerateTask; -import com.bms.ar.domain.ArBillLog; -import com.bms.ar.domain.ArExportTemplate; -import com.bms.ar.event.ArBillExportTaskEvent; -import com.bms.ar.event.ArBillGenerateTaskEvent; -import com.bms.ar.enums.ArBillGenerateTaskStatus; -import com.bms.ar.enums.ArBillDateType; -import com.bms.ar.enums.ArBillGenerationStatus; -import com.bms.ar.enums.ArBillSelectionMode; -import com.bms.ar.enums.ArBillStatus; -import com.bms.ar.enums.ArExportStatus; -import com.bms.ar.enums.ArIncomeBillFeeStatus; -import com.bms.ar.enums.ArLogObjectType; -import com.bms.ar.enums.ArLogOperationSource; -import com.bms.ar.enums.ArLogOperationType; -import com.bms.ar.enums.ArLogResult; -import com.bms.ar.enums.ArOrderBillStatus; -import com.bms.ar.mapper.ArBillDetailFeeMapper; -import com.bms.ar.mapper.ArBillDetailMapper; -import com.bms.ar.mapper.ArBillExportMapper; -import com.bms.ar.mapper.ArBillLogMapper; -import com.bms.ar.mapper.ArBillMapper; -import com.bms.ar.security.ArBillScopeResolver; +import com.bms.receivable.domain.ArBill; +import com.bms.receivable.domain.ArBankAccount; +import com.bms.receivable.domain.ArBillDetail; +import com.bms.receivable.domain.ArBillDetailFee; +import com.bms.receivable.domain.ArBillExport; +import com.bms.receivable.domain.ArBillGenerateTask; +import com.bms.receivable.domain.ArBillLog; +import com.bms.receivable.domain.ArExportTemplate; +import com.bms.receivable.event.ArBillExportTaskEvent; +import com.bms.receivable.event.ArBillGenerateTaskEvent; +import com.bms.receivable.enums.ArBillGenerateTaskStatus; +import com.bms.receivable.enums.ArBillDateType; +import com.bms.receivable.enums.ArBillGenerationStatus; +import com.bms.receivable.enums.ArBillSelectionMode; +import com.bms.receivable.enums.ArBillStatus; +import com.bms.receivable.enums.ArExportStatus; +import com.bms.receivable.enums.ArIncomeBillFeeStatus; +import com.bms.receivable.enums.ArLogObjectType; +import com.bms.receivable.enums.ArLogOperationSource; +import com.bms.receivable.enums.ArLogOperationType; +import com.bms.receivable.enums.ArLogResult; +import com.bms.receivable.enums.ArOrderBillStatus; +import com.bms.receivable.mapper.ArBillDetailFeeMapper; +import com.bms.receivable.mapper.ArBillDetailMapper; +import com.bms.receivable.mapper.ArBillExportMapper; +import com.bms.receivable.mapper.ArBillLogMapper; +import com.bms.receivable.mapper.ArBillMapper; +import com.bms.receivable.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; -import com.bms.ar.service.IArBillLogService; -import com.bms.ar.service.IArBillService; -import com.bms.ar.domain.vo.ArBillActionRequest; -import com.bms.ar.domain.vo.ArBillGenerateQuery; -import com.bms.ar.domain.vo.ArBillGenerateRequest; -import com.bms.ar.domain.vo.ArBillQuery; -import com.bms.ar.domain.vo.ArBillSummary; +import com.bms.receivable.mapper.ArBillGenerateTaskMapper; +import com.bms.receivable.mapper.ArBankAccountMapper; +import com.bms.receivable.mapper.ArExportTemplateMapper; +import com.bms.receivable.service.IArBillLogService; +import com.bms.receivable.service.IArBillService; +import com.bms.receivable.domain.vo.ArBillActionRequest; +import com.bms.receivable.domain.vo.ArBillGenerateQuery; +import com.bms.receivable.domain.vo.ArBillGenerateRequest; +import com.bms.receivable.domain.vo.ArBillQuery; +import com.bms.receivable.domain.vo.ArBillSummary; import com.bms.common.config.BmsConfig; import com.bms.common.exception.ServiceException; import com.bms.common.utils.DateUtils; @@ -116,7 +116,7 @@ public class ArBillServiceImpl implements IArBillService { private static final Logger log = LoggerFactory.getLogger(ArBillServiceImpl.class); private static final String EXPORT_TEMPLATE_BUSINESS_TYPE = "AR_BILL"; - private static final String EXPORT_TEMPLATE_RESOURCE = "templates/ar/ar_bill_template.xlsx"; + private static final String EXPORT_TEMPLATE_RESOURCE = "templates/receivable/ar_bill_template.xlsx"; /** * Excel 行号从 1 开始;模板第 4 行是表头,明细从第 5 行开始写入。 */ @@ -935,6 +935,12 @@ public class ArBillServiceImpl implements IArBillService { throw new ServiceException("账单生成结果为空或订单数量发生变化,请重新生成"); } ArBill finalBill = billMapper.selectArBillById(task.getArBillId()); + // 明细与费用已全部落库;快照和 READY 状态必须在同一事务中提交。 + if (billMapper.updateProfitSnapshot(task.getArBillId(), + com.bms.price.enums.ProfitAreaRule.SHENZHEN.getCustomerArea(), + com.bms.price.enums.ProfitAreaRule.GUANGZHOU.getCustomerArea()) != 1) { + throw new ServiceException("账单毛利快照更新失败,请重新生成"); + } billMapper.updateArBillGenerationStatus(task.getArBillId(), ArBillGenerationStatus.READY, task.getCreateBy(), null); if (generateTaskMapper.markSuccess(taskId, new Date()) != 1) { @@ -1748,6 +1754,7 @@ public class ArBillServiceImpl implements IArBillService { } return switch (status) { case SUCCESS -> ""; + case NOT_BILLED -> "未计费"; case PRODUCT -> "销售价未匹配产品"; case COUNTRY -> "销售价未匹配国家"; case WEIGHT -> "销售价未匹配重量段"; diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/task/ArBillExportTaskRunner.java b/bms-back/bms-system/src/main/java/com/bms/receivable/task/ArBillExportTaskRunner.java similarity index 94% rename from bms-back/bms-system/src/main/java/com/bms/ar/task/ArBillExportTaskRunner.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/task/ArBillExportTaskRunner.java index afab7a5f..9db52b88 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/task/ArBillExportTaskRunner.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/task/ArBillExportTaskRunner.java @@ -1,4 +1,4 @@ -package com.bms.ar.task; +package com.bms.receivable.task; import java.util.Date; @@ -12,8 +12,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; -import com.bms.ar.event.ArBillExportTaskEvent; -import com.bms.ar.service.IArBillService; +import com.bms.receivable.event.ArBillExportTaskEvent; +import com.bms.receivable.service.IArBillService; /** * 应收账单导出异步任务执行器。 diff --git a/bms-back/bms-system/src/main/java/com/bms/ar/task/ArBillGenerateTaskRunner.java b/bms-back/bms-system/src/main/java/com/bms/receivable/task/ArBillGenerateTaskRunner.java similarity index 95% rename from bms-back/bms-system/src/main/java/com/bms/ar/task/ArBillGenerateTaskRunner.java rename to bms-back/bms-system/src/main/java/com/bms/receivable/task/ArBillGenerateTaskRunner.java index bdbacf28..ee5a6f72 100644 --- a/bms-back/bms-system/src/main/java/com/bms/ar/task/ArBillGenerateTaskRunner.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/task/ArBillGenerateTaskRunner.java @@ -1,4 +1,4 @@ -package com.bms.ar.task; +package com.bms.receivable.task; import java.util.Date; @@ -12,9 +12,9 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; -import com.bms.ar.domain.ArBillGenerateTask; -import com.bms.ar.event.ArBillGenerateTaskEvent; -import com.bms.ar.service.IArBillService; +import com.bms.receivable.domain.ArBillGenerateTask; +import com.bms.receivable.event.ArBillGenerateTaskEvent; +import com.bms.receivable.service.IArBillService; /** * 应收账单异步生成任务调度器。 diff --git a/bms-back/bms-system/src/main/resources/mapper/price/ChannelProductMapMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/ChannelProductMapMapper.xml index 30e48929..3a0a3fc4 100644 --- a/bms-back/bms-system/src/main/resources/mapper/price/ChannelProductMapMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/price/ChannelProductMapMapper.xml @@ -6,37 +6,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into srv_channel_product_map ( - channel_id, channel_code, product_id, price_set_id, pay_type, create_by, create_time, update_by, update_time + channel_id, channel_code, product_id, pay_type, create_by, create_time, update_by, update_time ) values ( - #{channelId}, #{channelCode}, #{productId}, #{priceSetId}, #{payType}, #{createBy}, sysdate(), #{updateBy}, sysdate() + #{channelId}, #{channelCode}, #{productId}, #{payType}, #{createBy}, sysdate(), #{updateBy}, sysdate() ) on duplicate key update channel_code = values(channel_code), product_id = values(product_id), - price_set_id = values(price_set_id), update_by = values(update_by), update_time = sysdate() @@ -46,13 +32,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where channel_id = #{channelId} and pay_type = #{payType} - - delete from srv_channel_product_map - where channel_id = #{channelId} - and pay_type = #{payType} - and price_set_id = #{priceSetId} - - delete from srv_channel_product_map where product_id = #{productId} diff --git a/bms-back/bms-system/src/main/resources/mapper/price/PayProductTermMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/PayProductTermMapper.xml index 8d9a6563..d3e6407c 100644 --- a/bms-back/bms-system/src/main/resources/mapper/price/PayProductTermMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/price/PayProductTermMapper.xml @@ -41,15 +41,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" limit 1 - - diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBankAccountMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBankAccountMapper.xml similarity index 97% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBankAccountMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBankAccountMapper.xml index 0007fee8..4cdc2428 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBankAccountMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBankAccountMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillDetailFeeMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillDetailFeeMapper.xml similarity index 97% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBillDetailFeeMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBillDetailFeeMapper.xml index 3866eeb9..722fe1bb 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillDetailFeeMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillDetailFeeMapper.xml @@ -2,7 +2,7 @@ - + @@ -102,7 +102,7 @@ inner join ar_bill_detail d on d.detail_id = f.detail_id where d.ar_bill_id = #{arBillId} and f.detail_id = #{detailId} - AND EXISTS (SELECT 1 FROM ar_bill b WHERE b.ar_bill_id = d.ar_bill_id ) + AND EXISTS (SELECT 1 FROM ar_bill b WHERE b.ar_bill_id = d.ar_bill_id ) order by f.fee_no, f.detail_fee_id diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillDetailMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillDetailMapper.xml similarity index 98% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBillDetailMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBillDetailMapper.xml index aeaded09..b54acb31 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillDetailMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillDetailMapper.xml @@ -2,7 +2,7 @@ - + @@ -51,7 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" product_code, product_name, goods_description, country_code, country_name, dest_postcode, actual_weight, receive_weight, volume_weight, charge_weight, freight_rate, registration_fee, pkg_length, pkg_width, pkg_height, currency, total_amount, product_amount, redline_amount, billing_fail_status, remark, create_by, create_time - from ar_bill_detail where ar_bill_id = #{arBillId} AND EXISTS (SELECT 1 FROM ar_bill b WHERE b.ar_bill_id = ar_bill_detail.ar_bill_id ) + from ar_bill_detail where ar_bill_id = #{arBillId} AND EXISTS (SELECT 1 FROM ar_bill b WHERE b.ar_bill_id = ar_bill_detail.ar_bill_id ) order by detail_no diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillExportMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillExportMapper.xml similarity index 98% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBillExportMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBillExportMapper.xml index 578d7fc8..5ad69c71 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillExportMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillExportMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillGenerateTaskMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillGenerateTaskMapper.xml similarity index 97% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBillGenerateTaskMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBillGenerateTaskMapper.xml index f86db5ff..99b71648 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillGenerateTaskMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillGenerateTaskMapper.xml @@ -2,7 +2,7 @@ - + @@ -74,7 +74,7 @@ where create_by = #{createBy} and status in ('WAITING', 'RUNNING', 'CANCEL_REQUESTED') AND EXISTS (SELECT 1 FROM ar_bill b WHERE b.ar_bill_id = ar_bill_generate_task.ar_bill_id - ) + ) order by create_time desc, task_id desc diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillLogMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillLogMapper.xml similarity index 97% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBillLogMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBillLogMapper.xml index 1173f24d..cf86dec5 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillLogMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillLogMapper.xml @@ -2,7 +2,7 @@ - + @@ -51,7 +51,7 @@ and l.request_id = #{query.requestId} and l.result = #{query.result} - + order by l.create_time desc, l.log_id desc diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillMapper.xml similarity index 74% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBillMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBillMapper.xml index 4dd5533f..4d917000 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillMapper.xml @@ -2,7 +2,7 @@ - + @@ -39,7 +39,7 @@ - + @@ -106,7 +106,7 @@ and bill_date >= #{query.billDateStart} and bill_date <= #{query.billDateEnd} and bill_period_end = #{query.billPeriodEnd} - + @@ -132,7 +132,7 @@ @@ -193,6 +193,49 @@ #{confirmedBy}, #{confirmedTime}, #{createBy}, #{createUserId}, sysdate(), #{updateBy}, sysdate()) + + + update ar_bill b + left join ( + select d.ar_bill_id, count(*) as detail_count, sum(d.total_amount) as detail_total, + count(distinct d.currency) as detail_currency_count, min(d.currency) as detail_currency, + sum(case when d.currency is not null and f.currency_count = 1 and f.fee_currency = d.currency + then 0 else 1 end) as currency_errors, + sum(case when d.total_amount is not null and f.sales_amount is not null + and f.sales_amount = d.total_amount then 0 else 1 end) as amount_errors, + case when count(f.product_amount) = count(*) then sum(f.product_amount) else null end as product_total, + case when count(f.redline_amount) = count(*) then sum(f.redline_amount) else null end as redline_total + from ar_bill_detail d + 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 + from ar_bill_detail_fee fee + join ar_bill_detail fd on fd.detail_id = fee.detail_id + where fd.ar_bill_id = #{arBillId} + group by fee.detail_id + ) f on f.detail_id = d.detail_id + where d.ar_bill_id = #{arBillId} + group by d.ar_bill_id + ) a on a.ar_bill_id = b.ar_bill_id + set b.product_amount = case when abs(a.product_total) <= 99999999999999.9999 then a.product_total else null end, + b.redline_amount = case when abs(a.redline_total) <= 99999999999999.9999 then a.redline_total else null end, + b.profit_calc_status = case + when a.detail_count is null or a.detail_count = 0 then 'NO_DETAIL' + when b.profit_customer_area is null or b.profit_customer_area not in (#{shenzhenArea}, #{guangzhouArea}) then 'MISSING_AREA' + when b.currency is null or a.currency_errors > 0 or a.detail_currency_count != 1 or a.detail_currency != b.currency then 'CURRENCY_MISMATCH' + when b.total_amount is null or a.amount_errors > 0 or a.detail_total != b.total_amount then 'AMOUNT_MISMATCH' + when (b.profit_customer_area = #{shenzhenArea} and a.product_total is null) + or (b.profit_customer_area = #{guangzhouArea} and a.redline_total is null) then 'MISSING_PRICE' + when (b.profit_customer_area = #{shenzhenArea} and abs(a.product_total) > 99999999999999.9999) + or (b.profit_customer_area = #{guangzhouArea} and abs(a.redline_total) > 99999999999999.9999) then 'PRICE_OVERFLOW' + else 'READY' end + where b.ar_bill_id = #{arBillId} and b.generation_status = 'GENERATING' + + update ar_bill set status = #{status}, diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillScopeMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillScopeMapper.xml similarity index 94% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArBillScopeMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArBillScopeMapper.xml index 90c88d43..e9436273 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArBillScopeMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArBillScopeMapper.xml @@ -1,6 +1,6 @@ - + @@ -35,7 +35,7 @@ AND EXISTS (SELECT 1 FROM ctr_customer c WHERE c.customer_id = b.customer_id - + ) diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArCommissionMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArCommissionMapper.xml similarity index 95% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArCommissionMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArCommissionMapper.xml index 869e9086..41f26222 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArCommissionMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArCommissionMapper.xml @@ -1,13 +1,13 @@ - - + + - + @@ -16,7 +16,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -44,7 +44,7 @@ where sales_user_id = #{salesUserId} and effective_at <= #{at} order by effective_at desc, rate_id desc limit 1 for update - + insert into ar_profit_commission_rate(sales_user_id, rate, effective_at, create_by, create_time, remark) values(#{salesUserId}, #{rate}, #{effectiveAt}, #{createBy}, sysdate(), #{remark}) @@ -104,7 +104,7 @@ and r.result_status != 'REVERSED' and b.status = 'WRITTEN_OFF' and b.generation_status = 'READY' and r.ar_bill_id = #{billId} - + order by r.result_id desc diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArExportTemplateMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArExportTemplateMapper.xml similarity index 96% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArExportTemplateMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArExportTemplateMapper.xml index 457d012a..9344a2ca 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArExportTemplateMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArExportTemplateMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/bms-back/bms-system/src/main/resources/mapper/ar/ArProfitMapper.xml b/bms-back/bms-system/src/main/resources/mapper/receivable/ArProfitMapper.xml similarity index 66% rename from bms-back/bms-system/src/main/resources/mapper/ar/ArProfitMapper.xml rename to bms-back/bms-system/src/main/resources/mapper/receivable/ArProfitMapper.xml index 0bd971eb..5aaefa3a 100644 --- a/bms-back/bms-system/src/main/resources/mapper/ar/ArProfitMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/receivable/ArProfitMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -13,19 +13,19 @@ - + - + - + @@ -60,7 +60,16 @@ and b.bill_date <= #{query.endBillDate} - + + + b.profit_calc_status = 'READY' and b.total_amount is not null + and ((b.profit_customer_area = #{shenzhenArea} and b.product_amount is not null) + or (b.profit_customer_area = #{guangzhouArea} and b.redline_amount is not null)) + + + case when b.profit_customer_area = #{shenzhenArea} then b.product_amount + when b.profit_customer_area = #{guangzhouArea} then b.redline_amount else null end + @@ -68,45 +77,12 @@ b.profit_customer_area as customer_area, 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 + case when then else null end as product_amount, + case when then b.total_amount - () else null end as sales_gross_profit, + case when and b.total_amount != 0 + then round((b.total_amount - ()) * 100 / b.total_amount, 4) else null end as sales_gross_margin_rate, + case when 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 - select u.user_id as userId, u.nick_name as name, u.user_name as code from sys_user u where u.del_flag = '0' and u.status = '0' 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/receivable/ar_bill_template.xlsx similarity index 100% rename from bms-back/bms-system/src/main/resources/templates/ar/ar_bill_template.xlsx rename to bms-back/bms-system/src/main/resources/templates/receivable/ar_bill_template.xlsx diff --git a/bms-back/sql/20261111_ar_bill_profit_snapshot.sql b/bms-back/sql/20261111_ar_bill_profit_snapshot.sql new file mode 100644 index 00000000..e55ca5d1 --- /dev/null +++ b/bms-back/sql/20261111_ar_bill_profit_snapshot.sql @@ -0,0 +1,117 @@ +-- 应收账单毛利汇总快照升级 v1,MySQL 5.7+。 +-- 前置:执行 20261105_ar_profit_report.sql;停止所有旧版后端(包括异步任务),在独立连接执行本文件, +-- 核对末尾统计后再部署新版本。执行工具须支持 DELIMITER 和存储过程。 +-- DDL 自动提交,历史回填每批独立提交;异常修复后可重跑完整文件,已成功的快照不会覆盖。 +-- 历史客户区域沿用账单已有快照;NULL 表示未计算,异常账单不填零。 +-- READY 有效;NO_DETAIL 无明细;MISSING_AREA 区域缺失或不支持;MISSING_PRICE 缺价格; +-- CURRENCY_MISMATCH 币种异常;AMOUNT_MISMATCH 金额不一致;PRICE_OVERFLOW 超出字段范围。 +SET NAMES utf8mb4; +DROP PROCEDURE IF EXISTS bms_ar_bill_profit_snapshot_20261111_v1; +DELIMITER $$ +CREATE PROCEDURE bms_ar_bill_profit_snapshot_20261111_v1() +BEGIN + DECLARE n BIGINT DEFAULT 0; + DECLARE first_id BIGINT DEFAULT NULL; + DECLARE last_id BIGINT DEFAULT 0; + 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'); + IF n <> 3 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 IN ('ar_bill_id','profit_customer_area','total_amount','currency','generation_status')) + OR (table_name = 'ar_bill_detail' AND column_name IN ('detail_id','ar_bill_id','total_amount','currency')) + OR (table_name = 'ar_bill_detail_fee' AND column_name IN ('detail_id','amount','currency','product_amount','redline_amount'))); + IF n <> 14 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 IN ('product_amount', 'redline_amount', 'profit_calc_status') + AND NOT (is_nullable = 'YES' AND ((column_name IN ('product_amount', 'redline_amount') + AND data_type = 'decimal' AND numeric_precision = 18 AND numeric_scale = 4) + OR (column_name = 'profit_calc_status' AND data_type = 'varchar' AND character_maximum_length = 24))); + 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 = 'product_amount'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN product_amount DECIMAL(18,4) NULL COMMENT '账单产品价合计快照' AFTER total_amount; END IF; + SELECT COUNT(*) INTO n FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'ar_bill' AND column_name = 'redline_amount'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN redline_amount DECIMAL(18,4) NULL COMMENT '账单红线价合计快照' AFTER product_amount; END IF; + SELECT COUNT(*) INTO n FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'ar_bill' AND column_name = 'profit_calc_status'; + IF n = 0 THEN ALTER TABLE ar_bill ADD COLUMN profit_calc_status VARCHAR(24) NULL COMMENT '毛利快照校验状态,NULL表示未计算' AFTER redline_amount; 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 IN ('product_amount', 'redline_amount') AND data_type = 'decimal' AND numeric_precision = 18 AND numeric_scale = 4) + OR (column_name = 'profit_calc_status' AND data_type = 'varchar' AND character_maximum_length = 24)); + IF n <> 3 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '账单毛利快照字段结构冲突,请核对后重试'; END IF; + SELECT COUNT(*) INTO n FROM ar_bill WHERE profit_calc_status IS NULL + AND (product_amount IS NOT NULL OR redline_amount IS NOT NULL); + IF n > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '存在无状态的已填价格快照,请人工核对'; END IF; + SELECT COUNT(*) INTO n FROM ar_bill WHERE profit_calc_status IS NOT NULL + AND profit_calc_status NOT IN ('READY','NO_DETAIL','MISSING_AREA','CURRENCY_MISMATCH','AMOUNT_MISMATCH','MISSING_PRICE','PRICE_OVERFLOW'); + IF n > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '存在未知毛利快照状态,请人工核对'; END IF; + + backfill: LOOP + SELECT MIN(ar_bill_id) INTO first_id FROM ar_bill + WHERE generation_status = 'READY' AND (profit_calc_status IS NULL OR profit_calc_status != 'READY') AND ar_bill_id > last_id; + IF first_id IS NULL THEN LEAVE backfill; END IF; + SELECT MAX(batch.ar_bill_id) INTO last_id FROM ( + SELECT ar_bill_id FROM ar_bill WHERE generation_status = 'READY' AND (profit_calc_status IS NULL OR profit_calc_status != 'READY') + AND ar_bill_id >= first_id ORDER BY ar_bill_id LIMIT 200 + ) batch; + START TRANSACTION; + -- 与 ArBillMapper.updateProfitSnapshot 的汇总和校验保持一致。 + UPDATE ar_bill b + LEFT JOIN ( + SELECT d.ar_bill_id, COUNT(*) AS detail_count, SUM(d.total_amount) AS detail_total, + COUNT(DISTINCT d.currency) AS detail_currency_count, MIN(d.currency) AS detail_currency, + SUM(CASE WHEN d.currency IS NOT NULL AND f.currency_count = 1 AND f.fee_currency = d.currency + THEN 0 ELSE 1 END) AS currency_errors, + SUM(CASE WHEN d.total_amount IS NOT NULL AND f.sales_amount IS NOT NULL + AND f.sales_amount = d.total_amount THEN 0 ELSE 1 END) AS amount_errors, + CASE WHEN COUNT(f.product_amount) = COUNT(*) THEN SUM(f.product_amount) ELSE NULL END AS product_total, + CASE WHEN COUNT(f.redline_amount) = COUNT(*) THEN SUM(f.redline_amount) ELSE NULL END AS redline_total + FROM ar_bill_detail d + 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 + FROM ar_bill_detail_fee fee + JOIN ar_bill_detail fd ON fd.detail_id = fee.detail_id + WHERE fd.ar_bill_id BETWEEN first_id AND last_id + GROUP BY fee.detail_id + ) f ON f.detail_id = d.detail_id + WHERE d.ar_bill_id BETWEEN first_id AND last_id + GROUP BY d.ar_bill_id + ) a ON a.ar_bill_id = b.ar_bill_id + SET b.product_amount = CASE WHEN ABS(a.product_total) <= 99999999999999.9999 THEN a.product_total ELSE NULL END, + b.redline_amount = CASE WHEN ABS(a.redline_total) <= 99999999999999.9999 THEN a.redline_total ELSE NULL END, + b.profit_calc_status = CASE + WHEN a.detail_count IS NULL OR a.detail_count = 0 THEN 'NO_DETAIL' + WHEN b.profit_customer_area IS NULL OR b.profit_customer_area NOT IN ('C', 'GZ') THEN 'MISSING_AREA' + WHEN b.currency IS NULL OR a.currency_errors > 0 OR a.detail_currency_count != 1 OR a.detail_currency != b.currency THEN 'CURRENCY_MISMATCH' + WHEN b.total_amount IS NULL OR a.amount_errors > 0 OR a.detail_total != b.total_amount THEN 'AMOUNT_MISMATCH' + WHEN (b.profit_customer_area = 'C' AND a.product_total IS NULL) + OR (b.profit_customer_area = 'GZ' AND a.redline_total IS NULL) THEN 'MISSING_PRICE' + WHEN (b.profit_customer_area = 'C' AND ABS(a.product_total) > 99999999999999.9999) + OR (b.profit_customer_area = 'GZ' AND ABS(a.redline_total) > 99999999999999.9999) THEN 'PRICE_OVERFLOW' + ELSE 'READY' END + WHERE b.ar_bill_id BETWEEN first_id AND last_id AND b.generation_status = 'READY' + AND (b.profit_calc_status IS NULL OR b.profit_calc_status != 'READY'); + COMMIT; + END LOOP; + SELECT COALESCE(profit_calc_status, 'NOT_CALCULATED') AS profit_calc_status, COUNT(*) AS bill_count + FROM ar_bill WHERE generation_status = 'READY' GROUP BY profit_calc_status ORDER BY profit_calc_status; + SELECT COUNT(*) AS ready_unprocessed FROM ar_bill WHERE generation_status = 'READY' AND profit_calc_status IS NULL; +END$$ +DELIMITER ; +CALL bms_ar_bill_profit_snapshot_20261111_v1(); +DROP PROCEDURE IF EXISTS bms_ar_bill_profit_snapshot_20261111_v1; diff --git a/bms-back/sql/bms_init.sql b/bms-back/sql/bms_init.sql index c3aa62ea..51f8779e 100644 --- a/bms-back/sql/bms_init.sql +++ b/bms-back/sql/bms_init.sql @@ -76,6 +76,9 @@ CREATE TABLE `ar_bill` ( `currency` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'CNY' COMMENT '币种', `order_count` int(11) NOT NULL DEFAULT '0' COMMENT '订单数量', `total_amount` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '账单应收总额', + `product_amount` decimal(18,4) DEFAULT NULL COMMENT '账单产品价合计快照', + `redline_amount` decimal(18,4) DEFAULT NULL COMMENT '账单红线价合计快照', + `profit_calc_status` varchar(24) DEFAULT NULL COMMENT '毛利快照校验状态,NULL表示未计算', `written_off_amount` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '已核销金额缓存', `unwritten_amount` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '未核销金额缓存', `status` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '状态:DRAFT=草稿,CONFIRMED=已确认,PARTIAL_WRITTEN_OFF=部分核销,WRITTEN_OFF=已核销,VOID=已作废', diff --git a/bms-back/sql/price/billing_fail_status_not_billed.sql b/bms-back/sql/price/billing_fail_status_not_billed.sql new file mode 100644 index 00000000..6ffb865a --- /dev/null +++ b/bms-back/sql/price/billing_fail_status_not_billed.sql @@ -0,0 +1,3 @@ +-- prc_order_bill.billing_fail_status: add 26 NOT_BILLED +ALTER TABLE prc_order_bill + MODIFY COLUMN billing_fail_status tinyint NOT NULL DEFAULT 0 COMMENT '计费失败状态:0成功/1销售价未匹配产品/2销售价未匹配国家/3销售价未匹配重量段/23产品价未匹配产品/24产品价未匹配国家/25产品价未匹配重量段/4未绑定套餐/5无生效套餐版本/6已生成应收账单/7产品档案缺失/8未命中价格/9分区无价格/10邮编必填/11邮编未匹配分区/12上游订单不存在/13上游订单号为空/14上游客户为空/15上游产品为空/16上游重量无效/17计费时间为空/18退费订单无法解析/19客户代码为空/20客户已停用/21运费为空/22未知失败/26未计费。仅0写入应收主表,仅0写入应收费用'; diff --git a/bms-back/sql/price/srv_channel_product_map.sql b/bms-back/sql/price/srv_channel_product_map.sql index 37ca22af..ae62dac0 100644 --- a/bms-back/sql/price/srv_channel_product_map.sql +++ b/bms-back/sql/price/srv_channel_product_map.sql @@ -6,7 +6,6 @@ CREATE TABLE IF NOT EXISTS `srv_channel_product_map` ( `channel_id` varchar(50) NOT NULL COMMENT '渠道ID,对应 srv_service_channel.id', `channel_code` varchar(64) DEFAULT NULL COMMENT '渠道编码,对应 srv_service_channel.channel_code', `product_id` bigint(20) NOT NULL COMMENT '产品ID,应付/应收时为价卡产品编号', - `price_set_id` bigint(20) DEFAULT NULL COMMENT '应收套餐ID,对应 prc_price_set.price_set_id', `pay_type` varchar(10) NOT NULL COMMENT '收付类型,字典 bms_pay_type:AR应收 AP应付', `create_by` varchar(64) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -15,23 +14,9 @@ CREATE TABLE IF NOT EXISTS `srv_channel_product_map` ( PRIMARY KEY (`id`), UNIQUE KEY `uk_channel_pay_type` (`channel_id`, `pay_type`), KEY `idx_channel_product_map_product` (`product_id`), - KEY `idx_channel_product_map_price_set` (`price_set_id`), KEY `idx_channel_product_map_channel_code` (`channel_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='渠道产品关系映射'; -SET @sql = ( - SELECT IF( - COUNT(*) = 0, - 'ALTER TABLE srv_channel_product_map ADD COLUMN price_set_id bigint(20) DEFAULT NULL COMMENT ''应收套餐ID,对应 prc_price_set.price_set_id'' AFTER product_id, ADD KEY idx_channel_product_map_price_set (price_set_id)', - 'SELECT 1' - ) - FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'srv_channel_product_map' AND COLUMN_NAME = 'price_set_id' -); -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - SET @sql_channel_code = ( SELECT IF( COUNT(*) = 0, diff --git a/bms-front/src/api/price/billing.js b/bms-front/src/api/price/billing.js index b0976de1..6f81fd5e 100644 --- a/bms-front/src/api/price/billing.js +++ b/bms-front/src/api/price/billing.js @@ -65,6 +65,15 @@ export function listOrderBill(query) { }) } +/** Order-list: billing fail reason popup */ +export function getOrderBillFailReason(billId) { + return request({ + url: '/price/billing/orderBill/' + billId + '/failReason', + method: 'get' + }) +} + + /** Order-bill product check: package sales products missing from catalog */ export function checkOrderBillProducts(data) { return request({ diff --git a/bms-front/src/api/price/label.js b/bms-front/src/api/price/label.js index d1a6dba2..f61abc57 100644 --- a/bms-front/src/api/price/label.js +++ b/bms-front/src/api/price/label.js @@ -162,24 +162,3 @@ export function removeLabelProducts(priceSetId, productIds) { }) } -export function listLabelChannels(priceSetId) { - return request({ - url: '/price/label/' + priceSetId + '/channels', - method: 'get' - }) -} - -export function bindLabelChannels(priceSetId, data) { - return request({ - url: '/price/label/' + priceSetId + '/channels', - method: 'put', - data - }) -} - -export function unbindLabelChannel(priceSetId, channelId) { - return request({ - url: '/price/label/' + priceSetId + '/channels/' + channelId, - method: 'delete' - }) -} diff --git a/bms-front/src/views/price/billing/bill.vue b/bms-front/src/views/price/billing/bill.vue index af47ada7..8713075c 100644 --- a/bms-front/src/views/price/billing/bill.vue +++ b/bms-front/src/views/price/billing/bill.vue @@ -106,9 +106,6 @@ - @@ -565,7 +562,6 @@ const columns = [ { label: '收货重', prop: 'receiveWeight', align: 'center', width: 90, slot: 'chargeWeight' }, { label: '应收总额', prop: 'incomeTotal', align: 'right', width: 120, slot: 'incomeTotal' }, { label: '应付总额', prop: 'payTotal', align: 'right', width: 120, slot: 'payTotal' }, - { label: '计价来源', prop: 'matchSource', align: 'center', width: 130, slot: 'matchSource' }, { label: '订单状态', prop: 'orderStatus', align: 'center', width: 110, slot: 'orderStatus' }, { label: '计费状态', prop: 'billingFailStatus', align: 'center', width: 120, slot: 'billingFailStatus' }, { label: '客户状态', prop: 'customerActiveStatus', align: 'center', width: 100, slot: 'customerActiveStatus' }, @@ -643,19 +639,6 @@ const searchColumns = [ 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 - } - } ] function buildBillQuery(params) { @@ -1098,6 +1081,7 @@ function billingFailLabel(status) { function billingFailTagType(status) { const code = status == null ? 0 : Number(status) + if (code === 26) return 'info' if (code > 0) return 'danger' return 'success' } diff --git a/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue b/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue index 4ada0adf..999c3f16 100644 --- a/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue +++ b/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue @@ -254,7 +254,8 @@ function billingFailStatusLabel(code) { 3: '销售价未匹配重量段', 23: '产品价未匹配产品', 24: '产品价未匹配国家', - 25: '产品价未匹配重量段' + 25: '产品价未匹配重量段', + 26: '未计费' } const key = Number(code) return map[key] != null ? map[key] : String(code) diff --git a/bms-front/src/views/price/billing/components/BillDetail.vue b/bms-front/src/views/price/billing/components/BillDetail.vue index 1859e9b1..b4d1fa6a 100644 --- a/bms-front/src/views/price/billing/components/BillDetail.vue +++ b/bms-front/src/views/price/billing/components/BillDetail.vue @@ -405,7 +405,8 @@ const billingFailStatusOptions = [ { label: '客户代码为空', value: 19 }, { label: '客户已停用', value: 20 }, { label: '运费为空', value: 21 }, - { label: '未知失败', value: 22 } + { label: '未知失败', value: 22 }, + { label: '未计费', value: 26 } ] function billingFailLabel(status) { @@ -416,6 +417,7 @@ function billingFailLabel(status) { function billingFailTagType(status) { const code = status == null ? 0 : Number(status) + if (code === 26) return 'info' if (code > 0) return 'danger' return 'success' } diff --git a/bms-front/src/views/price/label/components/LabelChannelTable.vue b/bms-front/src/views/price/label/components/LabelChannelTable.vue deleted file mode 100644 index b3cb4698..00000000 --- a/bms-front/src/views/price/label/components/LabelChannelTable.vue +++ /dev/null @@ -1,182 +0,0 @@ - - - - - diff --git a/bms-front/src/views/price/label/detail.vue b/bms-front/src/views/price/label/detail.vue index 6bdb2bf5..1b840949 100644 --- a/bms-front/src/views/price/label/detail.vue +++ b/bms-front/src/views/price/label/detail.vue @@ -14,8 +14,6 @@ - -
{{ rebillProgressMessage }}
-
+
+
+ 总数 + {{ rebillProgressTotal }} +
+
+ 成功 + {{ rebillProgressSuccess }} +
+
+ 失败 + {{ rebillProgressFail }} +
+
+
总数 {{ rebillProgressTotal }} / 成功 {{ rebillProgressSuccess }} / 失败 {{ rebillProgressFail }}
+

计费在后台进行,可收起弹窗继续操作;请勿关闭或刷新本页

+ +
+
+
{{ failReason.billingFailStatusLabel || billingFailLabel(failReason.billingFailStatus) }}
+
{{ failReason.failReasonDetail || failReason.errorMessage }}
+
+ + + {{ failReason.orderNo || '-' }} + + + {{ failReason.transferNo || '-' }} + + + {{ failReason.trackingNo || '-' }} + + + {{ failReason.billingFailStatusLabel || billingFailLabel(failReason.billingFailStatus) }} + + + {{ joinCodeName(failReason.customerCode, failReason.customerName) }} + + + {{ joinCodeName(failReason.productCode, failReason.productName) }} + + + {{ joinCodeName(failReason.countryCode, failReason.countryName) }} + + + {{ joinCodeName(failReason.zoneCode, failReason.zoneName) }} + + + {{ failReason.destPostcode || '-' }} + + + {{ joinCodeName(failReason.priceSetCode, failReason.priceSetName) }} + + + {{ failReason.versionNo || '-' }} + + + {{ failReason.weightLabel || formatWeightRange(failReason.weightMin, failReason.weightMax) }} + + + {{ formatWeight(failReason.chargeWeight) }} + + + {{ formatWeight(failReason.weight) }} + + + {{ formatMoney(failReason.freightRate, failReason.currency) }} + + + {{ formatMoney(failReason.freightAmount, failReason.currency) }} + + + {{ formatMoney(failReason.incomeTotal, failReason.currency) }} + + + {{ formatDateTime(failReason.bizDate) }} + + + {{ formatDateTime(failReason.pickupDate) }} + + + {{ failReason.errorMessage || '-' }} + + +
+ +