From a49b659ac4d2c9dc2e47a6a0f6312aed0c0846ca Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Wed, 12 Nov 2025 15:46:18 +0800 Subject: [PATCH 01/11] update --- .../service/impl/XinDiantuPlatfromServiceImpl.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/service/impl/XinDiantuPlatfromServiceImpl.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/service/impl/XinDiantuPlatfromServiceImpl.java index 897bcf964..a2d52413f 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/service/impl/XinDiantuPlatfromServiceImpl.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/service/impl/XinDiantuPlatfromServiceImpl.java @@ -656,12 +656,10 @@ public class XinDiantuPlatfromServiceImpl implements ThirdPartyPlatformService { */ @Override public String notificationEquipChargeStatus(String orderCode) { - //判断是否是常畅充平台的订单 - boolean flag = isNeedPushToThirdPartyPlatform(orderCode , ThirdPlatformTypeEnum.CHANG_ZHOU_PLATFORM.getOperatorId()); - if (!flag){ - //表示不是常畅充平台的订单 - return null; - } +// boolean flag = isNeedPushToThirdPartyPlatform(orderCode , com.jsowell.common.enums.ThirdPlatformTypeEnum.XIN_DIAN_TU.getOperatorId()); +// if (!flag){ +// return null; +// } // 根据订单号查询订单信息 OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode); From 098e14faaf9dc1ac96c2b22b125ccf16817770d7 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Thu, 13 Nov 2025 09:54:39 +0800 Subject: [PATCH 02/11] =?UTF-8?q?update=20=E4=BF=AE=E5=A4=8D=E5=8D=A0?= =?UTF-8?q?=E6=A1=A9=E8=AE=A2=E5=8D=95=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsowell/pile/vo/web/OccupyOrderVO.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OccupyOrderVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OccupyOrderVO.java index 9a4ea6b54..3a3e46cf2 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OccupyOrderVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OccupyOrderVO.java @@ -1,5 +1,6 @@ package com.jsowell.pile.vo.web; +import com.jsowell.common.annotation.Excel; import lombok.Data; import java.math.BigDecimal; @@ -13,16 +14,36 @@ import java.math.BigDecimal; @Data public class OccupyOrderVO { private String id; + @Excel(name = "占桩订单号") private String occupyCode; + private String status; + + @Excel(name = "会员ID") private String memberId; + private String stationId; + private String plateNumber; + + @Excel(name = "站点名称") private String stationName; + + @Excel(name = "占桩开始时间") private String startTime; + + @Excel(name = "占桩结束时间") private String endTime; + + @Excel(name = "支付状态") private String payStatus; + + @Excel(name = "订单金额") private BigDecimal orderAmount; + + @Excel(name = "充电桩编号") private String pileSn; + + @Excel(name = "充电桩枪口号") private String connectorCode; } From 0edba2c8f60b4b1c8e22ea31cf75c223dee5d6d8 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Thu, 13 Nov 2025 10:19:01 +0800 Subject: [PATCH 03/11] update --- .../java/com/jsowell/framework/config/ThreadPoolConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jsowell-framework/src/main/java/com/jsowell/framework/config/ThreadPoolConfig.java b/jsowell-framework/src/main/java/com/jsowell/framework/config/ThreadPoolConfig.java index 612ac7476..ec59169f6 100644 --- a/jsowell-framework/src/main/java/com/jsowell/framework/config/ThreadPoolConfig.java +++ b/jsowell-framework/src/main/java/com/jsowell/framework/config/ThreadPoolConfig.java @@ -73,8 +73,8 @@ public class ThreadPoolConfig { @Bean(name = "thirdpartyTaskExecutor") public ThreadPoolTaskExecutor thirdpartyTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setMaxPoolSize(corePoolSize_tp); - executor.setCorePoolSize(maxPoolSize_tp); + executor.setMaxPoolSize(maxPoolSize_tp); + executor.setCorePoolSize(corePoolSize_tp); executor.setQueueCapacity(queueCapacity_tp); executor.setKeepAliveSeconds(keepAliveSeconds_tp); // 线程池对拒绝任务(无线程可用)的处理策略 From 88b14f5b69eca361fdafdd9bc02367595220777e Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Thu, 13 Nov 2025 13:40:13 +0800 Subject: [PATCH 04/11] =?UTF-8?q?add=E6=96=B0=E5=A2=9E=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E4=B8=8E=E4=BF=9D=E9=99=A9=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8C=BA=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pile/OrderBasicInfoController.java | 25 ++++- .../pile/service/OrderBasicInfoService.java | 2 + .../impl/OrderBasicInfoServiceImpl.java | 102 +++++++++++++++++- 3 files changed, 124 insertions(+), 5 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java index caf599418..26d7bea34 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java @@ -22,10 +22,7 @@ import com.jsowell.pile.service.OrderSplitRecordService; import com.jsowell.pile.service.PileMerchantInfoService; import com.jsowell.pile.service.PileStationInfoService; import com.jsowell.pile.util.UserUtils; -import com.jsowell.pile.vo.web.OrderListVO; -import com.jsowell.pile.vo.web.SplitAggregateDataVO; -import com.jsowell.pile.vo.web.SplitConfigOrderVO; -import com.jsowell.pile.vo.web.SplitRecordInfoVO; +import com.jsowell.pile.vo.web.*; import com.jsowell.service.OrderService; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -364,4 +361,24 @@ public class OrderBasicInfoController extends BaseController { logger.info("订单保险金额退款 params:{}, result:{}", JSON.toJSONString(orderBasicInfo), response); return response; } + + /** + * 订单数量与保险金额时间区统计 + * @param dto + * @return + */ + @PostMapping("/queryOrderInsuranceAmountByTime") + public RestApiResponse queryOrderInsuranceAmountByTime(@RequestBody QueryOrderDTO dto) { + RestApiResponse response = null; + try { + //stationId ,merchantIdList,stationIdList,merchantId,startTime,endTime + OrderCountByTimeVO result = orderBasicInfoService.queryOrderInsuranceAmountByTime(dto); + response = new RestApiResponse<>(result); + } catch (Exception e) { + logger.error("时间区间查询订单统计 error", e); + } + logger.info("时间区间查询订单统计 result:{}", response); + return response; + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java index e97e30425..3c5f083d4 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java @@ -631,4 +631,6 @@ public interface OrderBasicInfoService{ * @return */ List getOrderDetailByStationIdsForMonth(List stationIds , String startTime , String endTime); + + OrderCountByTimeVO queryOrderInsuranceAmountByTime(QueryOrderDTO dto); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index e66c25841..3d672c745 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -77,7 +77,11 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -599,7 +603,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { // 结算时间设置为当前时间 orderInfo.setSettlementTime(new Date()); - + // 启动失败原因 orderInfo.setReason(failedReasonMsg); // 订单退款(结算订单) @@ -5939,5 +5943,101 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { public List getOrderDetailByStationIdsForMonth(List stationIds , String startTime , String endTime) { return orderBasicInfoMapper.getOrderDetailByStationIdsForMonth(stationIds, startTime, endTime); } + + /** + * 订单数量与保险金额时间区统计 + * @param dto + * @return + */ + @Override + public OrderCountByTimeVO queryOrderInsuranceAmountByTime(QueryOrderDTO dto) { + if (dto == null) { + dto = new QueryOrderDTO(); + } + + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS); + + // 开始时间默认:本月第一天 + if (StringUtils.isEmpty(dto.getStartTime())) { + LocalDate firstDayOfMonth = LocalDate.now().withDayOfMonth(1); + LocalDateTime monthStart = LocalDateTime.of(firstDayOfMonth, LocalTime.MIN); + dto.setStartTime(monthStart.format(dateTimeFormatter)); + } + + // 结束时间默认:当前时间 + if (StringUtils.isEmpty(dto.getEndTime())) { + dto.setEndTime(LocalDateTime.now().format(dateTimeFormatter)); + } + + // 查询订单数据 + List orderList = orderBasicInfoMapper.selectOrderBasicInfoList(dto); + + List result = new ArrayList<>(); + BigDecimal totalInsuranceAmount = BigDecimal.ZERO; + int totalCount = 0; + + try { + LocalDateTime queryStart = LocalDateTime.parse(dto.getStartTime(), dateTimeFormatter); + LocalDateTime queryEnd = LocalDateTime.parse(dto.getEndTime(), dateTimeFormatter); + + // 按月分组订单 + Map> ordersByMonth = orderList.stream() + .collect(Collectors.groupingBy(order -> { + if (order.getCreateTime() != null) { + LocalDateTime createTime = LocalDateTime.parse(order.getCreateTime(), dateTimeFormatter); + return YearMonth.from(createTime); + } else { + logger.warn("订单创建时间为空,订单号:{}", order.getOrderCode()); + return YearMonth.from(LocalDateTime.now()); + } + })); + + // 循环每个月 + YearMonth currentMonth = YearMonth.from(queryStart); + YearMonth endMonth = YearMonth.from(queryEnd); + + while (!currentMonth.isAfter(endMonth)) { + LocalDateTime monthStartTime = currentMonth.atDay(1).atStartOfDay(); + LocalDateTime monthEndTime = currentMonth.plusMonths(1).atDay(1).atStartOfDay(); + + List ordersInMonth = ordersByMonth.getOrDefault(currentMonth, Collections.emptyList()); + int monthCount = ordersInMonth.size(); + + BigDecimal monthInsuranceAmount = ordersInMonth.stream() + .map(OrderListVO::getInsuranceAmount) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + OrderCountByTimeVO.OrderCountByTimeListVO vo = new OrderCountByTimeVO.OrderCountByTimeListVO(); + vo.setStartTime(monthStartTime.format(dateTimeFormatter)); + vo.setEndTime(monthEndTime.format(dateTimeFormatter)); + vo.setCount(monthCount); + vo.setOrderCount(monthCount); + vo.setInsuranceAmount(monthInsuranceAmount); + + result.add(vo); + + totalCount += monthCount; + totalInsuranceAmount = totalInsuranceAmount.add(monthInsuranceAmount); + + currentMonth = currentMonth.plusMonths(1); + } + + // 排序 + result.sort(Comparator.comparing(OrderCountByTimeVO.OrderCountByTimeListVO::getStartTime)); + + } catch (Exception e) { + logger.error("统计订单数量失败", e); + } + + // 封装返回 + OrderCountByTimeVO orderCountByTimeVO = new OrderCountByTimeVO(); + orderCountByTimeVO.setOrderCountByTimeList(result); + orderCountByTimeVO.setTotalCount(totalCount); + orderCountByTimeVO.setTotalInsuranceAmount(totalInsuranceAmount); + + logger.info("按月查询订单数量结果:{}", JSONObject.toJSONString(orderCountByTimeVO)); + return orderCountByTimeVO; + } } From 38fde97b7b0ad20b613bbece862197caa402d466 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Thu, 13 Nov 2025 14:25:11 +0800 Subject: [PATCH 05/11] update --- .../pile/mapper/OrderBasicInfoMapper.java | 9 +- .../impl/OrderBasicInfoServiceImpl.java | 128 +++++++----------- .../mapper/pile/OrderBasicInfoMapper.xml | 17 +++ 3 files changed, 75 insertions(+), 79 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java index d410460d1..75f496d21 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java @@ -1,10 +1,7 @@ package com.jsowell.pile.mapper; -import com.alipay.api.domain.ChargeOrderInfo; import com.jsowell.pile.domain.OrderBasicInfo; import com.jsowell.pile.domain.OrderDetail; -import com.jsowell.pile.domain.OrderSplitRecord; -import com.jsowell.pile.domain.UserFrequentedStationInfo; import com.jsowell.pile.dto.*; import com.jsowell.pile.dto.nanrui.NRQueryOrderDTO; import com.jsowell.pile.dto.ningxiajiaotou.NXJTQueryOrdersInfoDTO; @@ -431,4 +428,10 @@ public interface OrderBasicInfoMapper { @Param("endTime") String endTime ); + /** + * 按月份统计订单数量和保险金额 + * @param dto 查询条件,startTime/endTime 必须是 yyyy-MM 拼装后的时间段 + * @return List + */ + List selectOrderCountAndInsuranceByMonth(@Param("dto") QueryOrderDTO dto); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 3d672c745..9351a8f0e 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -5955,89 +5955,65 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { dto = new QueryOrderDTO(); } - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS); - - // 开始时间默认:本月第一天 - if (StringUtils.isEmpty(dto.getStartTime())) { - LocalDate firstDayOfMonth = LocalDate.now().withDayOfMonth(1); - LocalDateTime monthStart = LocalDateTime.of(firstDayOfMonth, LocalTime.MIN); - dto.setStartTime(monthStart.format(dateTimeFormatter)); - } - - // 结束时间默认:当前时间 - if (StringUtils.isEmpty(dto.getEndTime())) { - dto.setEndTime(LocalDateTime.now().format(dateTimeFormatter)); - } - - // 查询订单数据 - List orderList = orderBasicInfoMapper.selectOrderBasicInfoList(dto); - - List result = new ArrayList<>(); - BigDecimal totalInsuranceAmount = BigDecimal.ZERO; - int totalCount = 0; + // 只允许 yyyy-MM 格式 + DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); + DateTimeFormatter fullFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); try { - LocalDateTime queryStart = LocalDateTime.parse(dto.getStartTime(), dateTimeFormatter); - LocalDateTime queryEnd = LocalDateTime.parse(dto.getEndTime(), dateTimeFormatter); - - // 按月分组订单 - Map> ordersByMonth = orderList.stream() - .collect(Collectors.groupingBy(order -> { - if (order.getCreateTime() != null) { - LocalDateTime createTime = LocalDateTime.parse(order.getCreateTime(), dateTimeFormatter); - return YearMonth.from(createTime); - } else { - logger.warn("订单创建时间为空,订单号:{}", order.getOrderCode()); - return YearMonth.from(LocalDateTime.now()); - } - })); - - // 循环每个月 - YearMonth currentMonth = YearMonth.from(queryStart); - YearMonth endMonth = YearMonth.from(queryEnd); - - while (!currentMonth.isAfter(endMonth)) { - LocalDateTime monthStartTime = currentMonth.atDay(1).atStartOfDay(); - LocalDateTime monthEndTime = currentMonth.plusMonths(1).atDay(1).atStartOfDay(); - - List ordersInMonth = ordersByMonth.getOrDefault(currentMonth, Collections.emptyList()); - int monthCount = ordersInMonth.size(); - - BigDecimal monthInsuranceAmount = ordersInMonth.stream() - .map(OrderListVO::getInsuranceAmount) - .filter(Objects::nonNull) - .reduce(BigDecimal.ZERO, BigDecimal::add); - - OrderCountByTimeVO.OrderCountByTimeListVO vo = new OrderCountByTimeVO.OrderCountByTimeListVO(); - vo.setStartTime(monthStartTime.format(dateTimeFormatter)); - vo.setEndTime(monthEndTime.format(dateTimeFormatter)); - vo.setCount(monthCount); - vo.setOrderCount(monthCount); - vo.setInsuranceAmount(monthInsuranceAmount); - - result.add(vo); - - totalCount += monthCount; - totalInsuranceAmount = totalInsuranceAmount.add(monthInsuranceAmount); - - currentMonth = currentMonth.plusMonths(1); + if (StringUtils.isNotEmpty(dto.getStartTime())) { + YearMonth startMonth = YearMonth.parse(dto.getStartTime(), monthFormatter); + dto.setStartTime(startMonth.atDay(1).atStartOfDay().format(fullFormatter)); + } + if (StringUtils.isNotEmpty(dto.getEndTime())) { + YearMonth endMonth = YearMonth.parse(dto.getEndTime(), monthFormatter).plusMonths(1); + dto.setEndTime(endMonth.atDay(1).atStartOfDay().format(fullFormatter)); } - - // 排序 - result.sort(Comparator.comparing(OrderCountByTimeVO.OrderCountByTimeListVO::getStartTime)); - } catch (Exception e) { - logger.error("统计订单数量失败", e); + throw new IllegalArgumentException("时间格式错误,应为 yyyy-MM"); } - // 封装返回 - OrderCountByTimeVO orderCountByTimeVO = new OrderCountByTimeVO(); - orderCountByTimeVO.setOrderCountByTimeList(result); - orderCountByTimeVO.setTotalCount(totalCount); - orderCountByTimeVO.setTotalInsuranceAmount(totalInsuranceAmount); + // 默认本月 + if (StringUtils.isEmpty(dto.getStartTime()) || StringUtils.isEmpty(dto.getEndTime())) { + YearMonth currentMonth = YearMonth.now(); + dto.setStartTime(currentMonth.atDay(1).atStartOfDay().format(fullFormatter)); + dto.setEndTime(currentMonth.plusMonths(1).atDay(1).atStartOfDay().format(fullFormatter)); + } + + // 查询数据库聚合结果(仅一次) + List stats = orderBasicInfoMapper.selectOrderCountAndInsuranceByMonth(dto); + + // 封装结果 + BigDecimal totalInsuranceAmount = BigDecimal.ZERO; + int totalCount = 0; + List result = new ArrayList<>(); + + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + for (OrderMonthStatVO stat : stats) { + YearMonth ym = YearMonth.parse(stat.getMonth(), DateTimeFormatter.ofPattern("yyyy-MM")); + + OrderCountByTimeVO.OrderCountByTimeListVO vo = new OrderCountByTimeVO.OrderCountByTimeListVO(); + vo.setStartTime(ym.atDay(1).atStartOfDay().format(dateTimeFormatter)); + vo.setEndTime(ym.plusMonths(1).atDay(1).atStartOfDay().format(dateTimeFormatter)); + vo.setCount(stat.getOrderCount()); + vo.setOrderCount(stat.getOrderCount()); + vo.setInsuranceAmount(stat.getTotalInsuranceAmount()); + + result.add(vo); + + totalCount += stat.getOrderCount(); + totalInsuranceAmount = totalInsuranceAmount.add(stat.getTotalInsuranceAmount()); + } + + // 汇总 + OrderCountByTimeVO vo = new OrderCountByTimeVO(); + vo.setOrderCountByTimeList(result); + vo.setTotalCount(totalCount); + vo.setTotalInsuranceAmount(totalInsuranceAmount); + + logger.info("按月统计结果: {}", JSONObject.toJSONString(vo)); + return vo; - logger.info("按月查询订单数量结果:{}", JSONObject.toJSONString(orderCountByTimeVO)); - return orderCountByTimeVO; } } diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml index 3e6626bd0..897c6fc42 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml @@ -3451,4 +3451,21 @@ AND DATE_ADD(#{endTime,jdbcType=VARCHAR}, INTERVAL 1 DAY) ORDER BY t1.create_time DESC + + + + + From 80862d5c1dad99c02fe45d98ddfb215e78cbf6f2 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Thu, 13 Nov 2025 14:25:25 +0800 Subject: [PATCH 06/11] update --- .../jsowell/web/controller/pile/OrderBasicInfoController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java index 26d7bea34..27c259283 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java @@ -371,7 +371,6 @@ public class OrderBasicInfoController extends BaseController { public RestApiResponse queryOrderInsuranceAmountByTime(@RequestBody QueryOrderDTO dto) { RestApiResponse response = null; try { - //stationId ,merchantIdList,stationIdList,merchantId,startTime,endTime OrderCountByTimeVO result = orderBasicInfoService.queryOrderInsuranceAmountByTime(dto); response = new RestApiResponse<>(result); } catch (Exception e) { From 7f433e06c2bfb463545c13f1325b2d72ed7ee388 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Thu, 13 Nov 2025 14:25:39 +0800 Subject: [PATCH 07/11] update --- .../com/jsowell/pile/vo/web/OrderMonthStatVO.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java new file mode 100644 index 000000000..53e7d172f --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java @@ -0,0 +1,11 @@ +package com.jsowell.pile.vo.web; + +import lombok.Data; +import java.math.BigDecimal; + +@Data +public class OrderMonthStatVO { + private String month; // 2025-10 + private Integer orderCount; + private BigDecimal totalInsuranceAmount; +} From d672eff8c8474b76017f0c5f798a264026682403 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Thu, 13 Nov 2025 15:07:55 +0800 Subject: [PATCH 08/11] update --- .../impl/OrderBasicInfoServiceImpl.java | 30 +++++++++---------- .../jsowell/pile/vo/web/OrderMonthStatVO.java | 4 +-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 9351a8f0e..c62a59489 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -5955,18 +5955,19 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { dto = new QueryOrderDTO(); } - // 只允许 yyyy-MM 格式 DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); - DateTimeFormatter fullFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); try { + // 处理 startTime if (StringUtils.isNotEmpty(dto.getStartTime())) { YearMonth startMonth = YearMonth.parse(dto.getStartTime(), monthFormatter); - dto.setStartTime(startMonth.atDay(1).atStartOfDay().format(fullFormatter)); + dto.setStartTime(startMonth.atDay(1).atStartOfDay().format(dateTimeFormatter)); } + // 处理 endTime,取下个月月初,保证 < endTime 不丢数据 if (StringUtils.isNotEmpty(dto.getEndTime())) { - YearMonth endMonth = YearMonth.parse(dto.getEndTime(), monthFormatter).plusMonths(1); - dto.setEndTime(endMonth.atDay(1).atStartOfDay().format(fullFormatter)); + YearMonth endMonth = YearMonth.parse(dto.getEndTime(), monthFormatter); + dto.setEndTime(endMonth.plusMonths(1).atDay(1).atStartOfDay().format(dateTimeFormatter)); } } catch (Exception e) { throw new IllegalArgumentException("时间格式错误,应为 yyyy-MM"); @@ -5975,42 +5976,41 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { // 默认本月 if (StringUtils.isEmpty(dto.getStartTime()) || StringUtils.isEmpty(dto.getEndTime())) { YearMonth currentMonth = YearMonth.now(); - dto.setStartTime(currentMonth.atDay(1).atStartOfDay().format(fullFormatter)); - dto.setEndTime(currentMonth.plusMonths(1).atDay(1).atStartOfDay().format(fullFormatter)); + dto.setStartTime(currentMonth.atDay(1).atStartOfDay().format(dateTimeFormatter)); + dto.setEndTime(currentMonth.plusMonths(1).atDay(1).atStartOfDay().format(dateTimeFormatter)); } - // 查询数据库聚合结果(仅一次) + // 查询数据库聚合结果 List stats = orderBasicInfoMapper.selectOrderCountAndInsuranceByMonth(dto); - // 封装结果 + // 封装返回结果 BigDecimal totalInsuranceAmount = BigDecimal.ZERO; int totalCount = 0; List result = new ArrayList<>(); - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - for (OrderMonthStatVO stat : stats) { - YearMonth ym = YearMonth.parse(stat.getMonth(), DateTimeFormatter.ofPattern("yyyy-MM")); + YearMonth ym = YearMonth.parse(stat.getMonth(), monthFormatter); OrderCountByTimeVO.OrderCountByTimeListVO vo = new OrderCountByTimeVO.OrderCountByTimeListVO(); vo.setStartTime(ym.atDay(1).atStartOfDay().format(dateTimeFormatter)); vo.setEndTime(ym.plusMonths(1).atDay(1).atStartOfDay().format(dateTimeFormatter)); vo.setCount(stat.getOrderCount()); vo.setOrderCount(stat.getOrderCount()); - vo.setInsuranceAmount(stat.getTotalInsuranceAmount()); + BigDecimal insuranceAmount = stat.getInsuranceAmount() == null ? BigDecimal.ZERO : stat.getInsuranceAmount(); + vo.setInsuranceAmount(totalInsuranceAmount); result.add(vo); totalCount += stat.getOrderCount(); - totalInsuranceAmount = totalInsuranceAmount.add(stat.getTotalInsuranceAmount()); + totalInsuranceAmount = totalInsuranceAmount.add(insuranceAmount); } - // 汇总 OrderCountByTimeVO vo = new OrderCountByTimeVO(); vo.setOrderCountByTimeList(result); vo.setTotalCount(totalCount); vo.setTotalInsuranceAmount(totalInsuranceAmount); + logger.info("按月统计结果: {}", JSONObject.toJSONString(vo)); return vo; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java index 53e7d172f..fc96649a1 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderMonthStatVO.java @@ -5,7 +5,7 @@ import java.math.BigDecimal; @Data public class OrderMonthStatVO { - private String month; // 2025-10 + private String month; private Integer orderCount; - private BigDecimal totalInsuranceAmount; + private BigDecimal insuranceAmount; } From a96c374b948f907bb9dd7c0d4ab6b949bf14535f Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Thu, 13 Nov 2025 16:15:48 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=8A=B6=E6=80=81=E5=8F=AA=E6=9C=89=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C=E6=8E=92?= =?UTF-8?q?=E9=99=A4=E4=B8=AA=E4=BA=BA=E6=A1=A9=E7=9A=84=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jsowell/pile/dto/QueryOrderDTO.java | 5 +++++ .../impl/OrderBasicInfoServiceImpl.java | 19 +++++++++++++++++++ .../mapper/pile/OrderBasicInfoMapper.xml | 6 ++++++ 3 files changed, 30 insertions(+) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java index a0b7afae7..f1710ad94 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryOrderDTO.java @@ -107,4 +107,9 @@ public class QueryOrderDTO extends BaseEntity { * 车牌号 */ private String plateNumber; + + /** + * 排除的站点Id列表 + */ + private List excludeStationIdList; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index e66c25841..ca934bc53 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -291,6 +291,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { */ @Override public List selectOrderBasicInfoList(QueryOrderDTO dto) { + excludePersonalPileStation(dto); // 筛选个人桩站点 List orderListVOS = orderBasicInfoMapper.selectOrderBasicInfoList(dto); if (CollectionUtils.isEmpty(orderListVOS)) { return orderListVOS; @@ -339,6 +340,24 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { return orderListVOS; } + /** + * 如果查询订单状态只有异常的情况下,排除个人桩的异常订单 + */ + private void excludePersonalPileStation(QueryOrderDTO dto) { + // 如果orderStatus不等于异常,直接返回 + if (!OrderStatusEnum.ABNORMAL.getValue().equals(dto.getOrderStatus())) { + return; + } + // 如果dto中除了订单状态还有其他查询条件,则返回 + if (dto.getMerchantId() != null || dto.getStationId() != null || dto.getOrderCode() != null + || dto.getMobileNumber() != null || dto.getTransactionCode() != null || dto.getPileSn() != null + || dto.getPlateNumber() != null) { + return; + } + // 设置个人桩站id, 148-个人桩站点; 684-7KW小直流个人桩站点 + dto.setExcludeStationIdList(Lists.newArrayList(148, 684)); + } + private void batchQueryFeeAmt(List orderListVOS) { // 批量查手续费 List orderCodeList = orderListVOS.stream().map(OrderListVO::getOrderCode).collect(Collectors.toList()); diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml index 3e6626bd0..083a3976b 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml @@ -1988,6 +1988,12 @@ #{stationDeptId} + + and t1.station_id not in + + #{excludeStationId} + + order by t1.create_time desc From 68c947574d3bee1a620d9de6bb5aad4fb3b5645b Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Fri, 14 Nov 2025 10:43:48 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E7=94=B5=E5=8D=95=E8=BD=A6=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=EF=BC=8C=E6=8C=89=E5=AE=9E=E9=99=85=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DelayMerchantProgramLogic.java | 59 +++++++++++-------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index ac7a4f5e3..debabc431 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -609,32 +609,43 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { // 查询订单信息 OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode()); // 订单消费金额, 除了充满自停是需要计算实际消费, 其他金额都是按次收费 - BigDecimal orderAmount; + BigDecimal orderAmount = BigDecimal.ZERO; // 耗电量 BigDecimal consumedEnergy = message.getConsumedEnergy(); - if (fullOfSelfStopping.compareTo(orderBasicInfo.getPayAmount()) == 0) { - // 计费模板, 只取平时段的价格 - BigDecimal flatElectricityPrice = orderDetail.getFlatElectricityPrice() != null ? orderDetail.getFlatElectricityPrice() : BigDecimal.ZERO; // x元/每度 - // BigDecimal flatServicePrice = orderDetail.getFlatServicePrice() != null ? orderDetail.getFlatServicePrice() : BigDecimal.ZERO; // x元/每度 - BigDecimal flatServicePrice = BigDecimal.ZERO; // x元/每度 服务费默认0 - // 单价 = 电费单价 + 服务费单价 - BigDecimal price = flatElectricityPrice.add(flatServicePrice); - // 如果耗电量或单价为空或者为0,则订单消费为0 - // if (consumedEnergy == null || consumedEnergy.compareTo(BigDecimal.ZERO) == 0 || price.compareTo(BigDecimal.ZERO) == 0) { - // logger.info("计算电单车退款逻辑,耗电量或计费模板为空,不执行退款逻辑, orderCode:{}, 耗电量:{}, 每度电费:{}", orderBasicInfo.getOrderCode(), consumedEnergy, price); - // return; - // } - // 计算实际消费, 保留两位小数 - orderAmount = consumedEnergy.multiply(price).setScale(2, RoundingMode.UP); - } else { - // 2025.07.28如果耗电量为 0,也进行退款 - if (consumedEnergy.compareTo(BigDecimal.ZERO) == 0) { - orderAmount = BigDecimal.ZERO; - }else { - // 其他金额、并且耗电量不为 0 ,都是按次收费, 不退款 - orderAmount = orderBasicInfo.getPayAmount(); - } - } + + // 计算实际消费金额 + // 计费模板, 只取平时段的价格 + BigDecimal flatElectricityPrice = orderDetail.getFlatElectricityPrice() != null ? orderDetail.getFlatElectricityPrice() : BigDecimal.ZERO; // x元/每度 + // BigDecimal flatServicePrice = orderDetail.getFlatServicePrice() != null ? orderDetail.getFlatServicePrice() : BigDecimal.ZERO; // x元/每度 + BigDecimal flatServicePrice = BigDecimal.ZERO; // x元/每度 服务费默认0 + // 单价 = 电费单价 + 服务费单价 + BigDecimal price = flatElectricityPrice.add(flatServicePrice); + // 计算实际消费, 保留两位小数 + orderAmount = consumedEnergy.multiply(price).setScale(2, RoundingMode.UP); + + // if (fullOfSelfStopping.compareTo(orderBasicInfo.getPayAmount()) == 0) { + // // 计费模板, 只取平时段的价格 + // BigDecimal flatElectricityPrice = orderDetail.getFlatElectricityPrice() != null ? orderDetail.getFlatElectricityPrice() : BigDecimal.ZERO; // x元/每度 + // // BigDecimal flatServicePrice = orderDetail.getFlatServicePrice() != null ? orderDetail.getFlatServicePrice() : BigDecimal.ZERO; // x元/每度 + // BigDecimal flatServicePrice = BigDecimal.ZERO; // x元/每度 服务费默认0 + // // 单价 = 电费单价 + 服务费单价 + // BigDecimal price = flatElectricityPrice.add(flatServicePrice); + // // 如果耗电量或单价为空或者为0,则订单消费为0 + // // if (consumedEnergy == null || consumedEnergy.compareTo(BigDecimal.ZERO) == 0 || price.compareTo(BigDecimal.ZERO) == 0) { + // // logger.info("计算电单车退款逻辑,耗电量或计费模板为空,不执行退款逻辑, orderCode:{}, 耗电量:{}, 每度电费:{}", orderBasicInfo.getOrderCode(), consumedEnergy, price); + // // return; + // // } + // // 计算实际消费, 保留两位小数 + // orderAmount = consumedEnergy.multiply(price).setScale(2, RoundingMode.UP); + // } else { + // // 2025.07.28如果耗电量为 0,也进行退款 + // if (consumedEnergy.compareTo(BigDecimal.ZERO) == 0) { + // orderAmount = BigDecimal.ZERO; + // }else { + // // 其他金额、并且耗电量不为 0 ,都是按次收费, 不退款 + // orderAmount = orderBasicInfo.getPayAmount(); + // } + // } // 退款金额 = 支付金额 - 优惠后总消费金额 BigDecimal refundAmount = orderBasicInfo.getPayAmount().subtract(orderAmount); From e5ced1e3c7b1a935ece0530c2cb417761ab2ce99 Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Fri, 14 Nov 2025 11:08:10 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=BC=80=E5=A7=8B=E6=97=B6=E9=97=B4=E5=92=8C?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E6=97=B6=E9=97=B4=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jsowell/service/MemberService.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java index 602ac28a1..764a6d83e 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java @@ -33,7 +33,6 @@ import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.enums.ykc.ScenarioEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.AdapayUtil; -import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.JWTUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; @@ -62,7 +61,10 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.text.ParseException; -import java.util.*; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; @Service @@ -476,19 +478,20 @@ public class MemberService { // 获取分页信息 long pageNum = dto.getPageNum() == 0 ? 1L : dto.getPageNum(); long pageSize = dto.getPageSize() == 0 ? 10L : dto.getPageSize(); - String tradeDate = dto.getTradeDate(); + String tradeDate = dto.getTradeDate() + " 00:00:00";; + String endDate = dto.getEndDate() + " 23:59:59"; // 获取年、月 - String[] split = StringUtils.split(tradeDate, "-"); - int year = Integer.parseInt(split[0]); - int month = Integer.parseInt(split[1]); + // String[] split = StringUtils.split(tradeDate, "-"); + // int year = Integer.parseInt(split[0]); + // int month = Integer.parseInt(split[1]); // 根据年月获取当月第一天和最后一天 - tradeDate = DateUtils.getFirstDay(year, month, DateUtils.YYYY_MM_DD); - String lastDay = DateUtils.getLastDay(year, month, DateUtils.YYYY_MM_DD); + // tradeDate = DateUtils.getFirstDay(year, month, DateUtils.YYYY_MM_DD); + // String lastDay = DateUtils.getLastDay(year, month, DateUtils.YYYY_MM_DD); // sql语句查询日期需要多加一天 - Date date = DateUtils.addDays(DateUtils.parseDate(lastDay, DateUtils.YYYY_MM_DD), 1); - lastDay = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date); + // Date date = DateUtils.addDays(DateUtils.parseDate(lastDay, DateUtils.YYYY_MM_DD), 1); + // lastDay = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date); dto.setTradeDate(tradeDate); - dto.setEndDate(lastDay); + dto.setEndDate(endDate); // PageHelper.startPage(pageNum, pageSize); // List list = memberBasicInfoService.getMemberWalletDetail(dto); List list = memberBasicInfoService.getMemberWalletDetailV2(dto);