From 9285618aa33ab9d6152acad19ce659ebadbbb99a Mon Sep 17 00:00:00 2001 From: ljw Date: Tue, 23 Dec 2025 11:47:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../money/pojo/entity/MoneyBillEntity.java | 6 + .../money/pojo/result/MoneyBillResult.java | 7 + .../money/quartz/MoneyBillQuartz.java | 125 ++++++++++-------- .../money/service/MoneyBillService.java | 5 +- .../mapper/money/MoneyBillMapper.xml | 19 ++- 5 files changed, 104 insertions(+), 58 deletions(-) diff --git a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/entity/MoneyBillEntity.java b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/entity/MoneyBillEntity.java index b72eeae..072fde8 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/entity/MoneyBillEntity.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/entity/MoneyBillEntity.java @@ -3,6 +3,7 @@ package com.njzscloud.supervisory.money.pojo.entity; import com.baomidou.mybatisplus.annotation.*; import com.njzscloud.supervisory.money.contant.BillStatus; import com.njzscloud.supervisory.money.contant.InvoiceStatus; +import com.njzscloud.supervisory.order.contant.OrderCategory; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -137,4 +138,9 @@ public class MoneyBillEntity { */ private String goodsName; + /** + * 订单类型; 字典代码:order_category + */ + private String orderCategory; + } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/result/MoneyBillResult.java b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/result/MoneyBillResult.java index 9e88e90..4fd0d56 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/result/MoneyBillResult.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/pojo/result/MoneyBillResult.java @@ -8,6 +8,9 @@ import lombok.experimental.Accessors; import java.math.BigDecimal; import java.time.LocalDateTime; +/** + * @author ljw + */ @Getter @Setter @ToString @@ -23,6 +26,10 @@ public class MoneyBillResult { private Long orderId; private BigDecimal discountMoney; private BigDecimal settleMoney; + /** + * 订单类型; 字典代码:order_category + */ + private String orderCategory; /** * 净重 */ diff --git a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/quartz/MoneyBillQuartz.java b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/quartz/MoneyBillQuartz.java index 04023b0..a863f73 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/quartz/MoneyBillQuartz.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/quartz/MoneyBillQuartz.java @@ -1,6 +1,5 @@ package com.njzscloud.supervisory.money.quartz; -import com.njzscloud.supervisory.goods.contant.MoneyStrategy; import com.njzscloud.supervisory.money.mapper.MoneyBillMapper; import com.njzscloud.supervisory.money.pojo.entity.MoneyBillEntity; import com.njzscloud.supervisory.money.pojo.result.MoneyBillResult; @@ -17,6 +16,9 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +/** + * @author ljw + */ @Slf4j @Component @RequiredArgsConstructor @@ -24,8 +26,8 @@ public class MoneyBillQuartz { private final MoneyBillMapper moneyBillMapper; - // @Scheduled(cron = "0 0/1 * * * ?")//每1分钟一次 - @Scheduled(cron = "0 0 1 27 * ?")//每月27号凌晨1点执行 + @Scheduled(cron = "0 0/5 * * * ?")//每1分钟一次 + // @Scheduled(cron = "0 0 1 27 * ?")//每月27号凌晨1点执行 public void syncAssetsDiscover() { generateMoneyBill(); } @@ -33,9 +35,11 @@ public class MoneyBillQuartz { public void generateMoneyBill() { // 计算上个月的时间范围 LocalDateTime now = LocalDateTime.now(); - LocalDateTime lastMonthStart = now.minusMonths(1).withDayOfMonth(1).with(LocalTime.MIN); // 上个月1号0点0分0秒 + // 上个月1号0点0分0秒 + LocalDateTime lastMonthStart = now.minusMonths(1).withDayOfMonth(1).with(LocalTime.MIN); + // 上个月月末23点59分59秒 LocalDateTime lastMonthEnd = now.minusMonths(1).withDayOfMonth(now.minusMonths(1).toLocalDate().lengthOfMonth()) - .with(LocalTime.MAX); // 上个月月末23点59分59秒 + .with(LocalTime.MAX); // 创建查询条件 MoneyBillResult queryCondition = new MoneyBillResult(); @@ -44,79 +48,94 @@ public class MoneyBillQuartz { // 执行查询 List billResults = moneyBillMapper.selectMoneyBillList(queryCondition); + // 仅保留订单类型为 PuTong 或 DuanBoRu 的记录 + billResults = billResults.stream() + .filter(r -> "PuTong".equals(r.getOrderCategory()) || "DuanBoRu".equals(r.getOrderCategory())) + .collect(Collectors.toList()); log.info("查询到上个月账单数据 {} 条", billResults.size()); - if (billResults.size() > 0) { - // 先按transCompanyId分组,再按originExpenseItemId分组 - Map>> groupedResults = billResults.stream() + if (!billResults.isEmpty()) { + // 先按transCompanyId、originExpenseItemId、orderCategory三层分组,区分不同订单类型(如 DuanBoRu 与 PuTong) + Map>>> groupedResults = billResults.stream() .collect(Collectors.groupingBy( MoneyBillResult::getTransCompanyId, - Collectors.groupingBy(MoneyBillResult::getOriginExpenseItemId) + Collectors.groupingBy(MoneyBillResult::getOriginExpenseItemId, + Collectors.groupingBy(MoneyBillResult::getOrderCategory)) )); - log.info("按transCompanyId和originExpenseItemId二级分组后共 {} 个公司分组", groupedResults.size()); + log.info("按transCompanyId、originExpenseItemId和orderCategory三级分组后共 {} 个公司分组", groupedResults.size()); // 处理每个公司分组的数据 List entityList = Lists.newArrayList(); - for (Map.Entry>> companyEntry : groupedResults.entrySet()) { + for (Map.Entry>>> companyEntry : groupedResults.entrySet()) { Long transCompanyId = companyEntry.getKey(); - Map> companyGroupResults = companyEntry.getValue(); + Map>> companyGroupResults = companyEntry.getValue(); log.info("transCompanyId: {}, 该公司包含 {} 个originExpenseItemId分组", transCompanyId, companyGroupResults.size()); // 处理该公司下的每个originExpenseItemId分组 - for (Map.Entry> itemEntry : companyGroupResults.entrySet()) { + for (Map.Entry>> itemEntry : companyGroupResults.entrySet()) { Long originExpenseItemId = itemEntry.getKey(); - List itemGroupResults = itemEntry.getValue(); + Map> categoryGroupMap = itemEntry.getValue(); - log.info("transCompanyId: {}, originExpenseItemId: {}, 该分组包含 {} 条数据", - transCompanyId, originExpenseItemId, itemGroupResults.size()); + for (Map.Entry> categoryEntry : categoryGroupMap.entrySet()) { + String orderCategoryStr = categoryEntry.getKey(); + List itemGroupResults = categoryEntry.getValue(); - // 这里可以根据业务需求处理每个分组的数据 - // 例如:计算总金额、创建MoneyBillEntity等 - MoneyBillEntity entity = new MoneyBillEntity(); - entity.setStationId(transCompanyId); - entity.setStartTime(lastMonthStart.toLocalDate()); - entity.setEndTime(lastMonthEnd.toLocalDate()); - entity.setGoodsId(originExpenseItemId); + log.info("transCompanyId: {}, originExpenseItemId: {}, orderCategory: {}, 该分组包含 {} 条数据", + transCompanyId, originExpenseItemId, orderCategoryStr, itemGroupResults.size()); - // 1. 订单数量:通过orderId分组,条数就是订单数 - long orderCount = itemGroupResults.stream() - .map(MoneyBillResult::getOrderId) - .distinct() - .count(); - entity.setOrderCount((int) orderCount); + // 创建账单实体并计算汇总字段 + MoneyBillEntity entity = new MoneyBillEntity(); + entity.setStationId(transCompanyId); + entity.setStartTime(lastMonthStart.toLocalDate()); + entity.setEndTime(lastMonthEnd.toLocalDate()); + entity.setGoodsId(originExpenseItemId); - // 2. 车数=订单数 - entity.setCarCount((int) orderCount); + // 1. 订单数量:通过orderId分组,条数就是订单数 + long orderCount = itemGroupResults.stream() + .map(MoneyBillResult::getOrderId) + .distinct() + .count(); + entity.setOrderCount((int) orderCount); - // 3. 总质量 - int totalWeight = itemGroupResults.stream() - .mapToInt(MoneyBillResult::getSettleWeight) - .sum(); - entity.setTotalWeight(totalWeight); + // 2. 车数=订单数 + entity.setCarCount((int) orderCount); - // 4. 优惠金额:discountMoney求和,可能是负数 - BigDecimal totalDiscountMoney = itemGroupResults.stream() - .map(MoneyBillResult::getDiscountMoney) - .reduce(BigDecimal.ZERO, BigDecimal::add); - entity.setDiscountMoney(totalDiscountMoney); + // 3. 总质量 + int totalWeight = itemGroupResults.stream() + .mapToInt(MoneyBillResult::getSettleWeight) + .sum(); + entity.setTotalWeight(totalWeight); - // 5. 账单金额:settleMoney求和,可能是负数 - BigDecimal totalSettleMoney = itemGroupResults.stream() - .map(MoneyBillResult::getSettleMoney) - .reduce(BigDecimal.ZERO, BigDecimal::add); - entity.setTotalMoney(totalSettleMoney); + // 4. 优惠金额:discountMoney求和,可能是负数 + BigDecimal totalDiscountMoney = itemGroupResults.stream() + .map(MoneyBillResult::getDiscountMoney) + .reduce(BigDecimal.ZERO, BigDecimal::add); + entity.setDiscountMoney(totalDiscountMoney); - // 设置其他基本信息(取第一条记录的信息) - MoneyBillResult firstResult = itemGroupResults.get(0); - entity.setUserId(firstResult.getUserId()); - entity.setGoodsName(firstResult.getExpenseItemName()); - entityList.add(entity); - log.info("生成账单实体: transCompanyId={}, originExpenseItemId={}, 订单数={}, 总质量={}, 车数={}, 优惠金额={}, 账单金额={}", - transCompanyId, originExpenseItemId, orderCount, totalWeight, orderCount, totalDiscountMoney, totalSettleMoney); + // 5. 账单金额:settleMoney求和,可能是负数 + BigDecimal totalSettleMoney = itemGroupResults.stream() + .map(MoneyBillResult::getSettleMoney) + .reduce(BigDecimal.ZERO, BigDecimal::add); + entity.setTotalMoney(totalSettleMoney); + + // 设置其他基本信息(取第一条记录的信息) + MoneyBillResult firstResult = itemGroupResults.get(0); + entity.setUserId(firstResult.getUserId()); + entity.setGoodsName(firstResult.getExpenseItemName()); + + // 如果存在订单类型字符串,则直接设置(实体中为 String 类型) + if (orderCategoryStr != null) { + entity.setOrderCategory(orderCategoryStr); + } + + entityList.add(entity); + log.info("生成账单实体: transCompanyId={}, originExpenseItemId={}, orderCategory={}, 订单数={}, 总质量={}, 车数={}, 优惠金额={}, 账单金额={}", + transCompanyId, originExpenseItemId, orderCategoryStr, orderCount, totalWeight, orderCount, totalDiscountMoney, totalSettleMoney); + } } } // 账单入库 diff --git a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/service/MoneyBillService.java b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/service/MoneyBillService.java index 5a20ffb..8964565 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/service/MoneyBillService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/money/service/MoneyBillService.java @@ -7,7 +7,6 @@ import com.njzscloud.common.mp.support.PageParam; import com.njzscloud.common.mp.support.PageResult; import com.njzscloud.common.security.util.SecurityUtil; import com.njzscloud.supervisory.biz.pojo.result.SearchCompanyResult; -import com.njzscloud.supervisory.goods.contant.MoneyStrategy; import com.njzscloud.supervisory.money.mapper.MoneyBillMapper; import com.njzscloud.supervisory.money.pojo.entity.MoneyBillEntity; import com.njzscloud.supervisory.money.pojo.result.MoneyBillResult; @@ -31,6 +30,7 @@ import java.util.Map; /** * 对账单 + * @author ljw */ @Slf4j @Service @@ -107,9 +107,10 @@ public class MoneyBillService extends ServiceImpl billResults = baseMapper.selectMoneyBillList(queryCondition); - if (null != billResults && billResults.size() > 0) { + if (null != billResults && !billResults.isEmpty()) { // 1. 订单数量:通过orderId分组,条数就是订单数 long orderCount = billResults.stream(). map(MoneyBillResult::getOrderId) diff --git a/njzscloud-svr/src/main/resources/mapper/money/MoneyBillMapper.xml b/njzscloud-svr/src/main/resources/mapper/money/MoneyBillMapper.xml index 549b789..5e8310e 100644 --- a/njzscloud-svr/src/main/resources/mapper/money/MoneyBillMapper.xml +++ b/njzscloud-svr/src/main/resources/mapper/money/MoneyBillMapper.xml @@ -27,7 +27,8 @@ u.nickname, bc.company_name as companyName, mb.goods_name as goodsName, - mb.car_count + mb.car_count, + mb.order_category FROM money_bill mb LEFT JOIN sys_user u ON mb.user_id = u.id LEFT JOIN biz_company bc ON mb.station_id = bc.id @@ -59,6 +60,9 @@ AND mb.goods_name LIKE CONCAT('%', #{entity.goodsName}, '%') + + AND mb.order_category = #{entity.orderCategory} + ORDER BY mb.modify_time DESC @@ -66,12 +70,16 @@