diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/HomeDataOrderSwapCollateDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/HomeDataOrderSwapCollateDao.java new file mode 100644 index 0000000..aad3750 --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/HomeDataOrderSwapCollateDao.java @@ -0,0 +1,12 @@ +package com.evotech.hd.common.core.dao.cloud; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evotech.hd.common.core.entity.cloud.HomeDataOrderSwapCollate; + +/** + * @author zrb + * @since 2025-03-07 + */ +public interface HomeDataOrderSwapCollateDao extends BaseMapper { + +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/HomeDataTradeCollateDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/HomeDataTradeCollateDao.java new file mode 100644 index 0000000..e6db676 --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/HomeDataTradeCollateDao.java @@ -0,0 +1,13 @@ +package com.evotech.hd.common.core.dao.cloud; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evotech.hd.common.core.entity.cloud.HomeDataTradeCollate; + +/** + * @author zrb + * @since 2025-03-08 + */ +public interface HomeDataTradeCollateDao extends BaseMapper { + +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/PreOrderRelationSwapOrderDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/PreOrderRelationSwapOrderDao.java new file mode 100644 index 0000000..fc6fd01 --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/PreOrderRelationSwapOrderDao.java @@ -0,0 +1,12 @@ +package com.evotech.hd.common.core.dao.cloud; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evotech.hd.common.core.entity.cloud.PreOrderRelationSwapOrder; + +/** + * @author zrb + * @since 2024-11-20 + */ +public interface PreOrderRelationSwapOrderDao extends BaseMapper { + +} diff --git a/resource-server/src/main/java/com/evotech/hd/resource/dao/BatteryTypeDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/resource/BatteryTypeDao.java similarity index 60% rename from resource-server/src/main/java/com/evotech/hd/resource/dao/BatteryTypeDao.java rename to base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/resource/BatteryTypeDao.java index cc714c9..9ef79bb 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/dao/BatteryTypeDao.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/resource/BatteryTypeDao.java @@ -1,7 +1,7 @@ -package com.evotech.hd.resource.dao; +package com.evotech.hd.common.core.dao.resource; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.evotech.hd.resource.entity.BatteryType; +import com.evotech.hd.common.core.entity.resource.BatteryType; /** * @author zrb diff --git a/resource-server/src/main/java/com/evotech/hd/resource/dao/CarTypeDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/resource/CarTypeDao.java similarity index 60% rename from resource-server/src/main/java/com/evotech/hd/resource/dao/CarTypeDao.java rename to base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/resource/CarTypeDao.java index 7aef5e5..cbcbdff 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/dao/CarTypeDao.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/resource/CarTypeDao.java @@ -1,7 +1,7 @@ -package com.evotech.hd.resource.dao; +package com.evotech.hd.common.core.dao.resource; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.evotech.hd.resource.entity.CarType; +import com.evotech.hd.common.core.entity.resource.CarType; /** * @author zrb diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationDc.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationDc.java index 3327bd6..862638d 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationDc.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationDc.java @@ -62,14 +62,20 @@ public class BatteryStationDc implements Serializable { @NotNull(message = "状态不能为空") private Integer status; - @Schema(description = "换电站编码") - private String stationCode; + @Schema(description = "轨迹点类型:1-电站,2-车辆") + private Integer pointType; - @Schema(description = "换电站名称") - private String stationName; + @Schema(description = "轨迹点编码") + private String pointCode; + + @Schema(description = "轨迹点名称") + private String pointName; @Schema(description = "当前电量") private Integer soc; + + @Schema(description = "电池仓位号") + private Integer dccNo; @Schema(description = "删除标志:1-已删除,0-未删除", hidden = true) private Integer delFlag; diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryTrace.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryTrace.java index 4d5ceea..5b16888 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryTrace.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryTrace.java @@ -51,6 +51,12 @@ public class BatteryTrace implements Serializable { @Schema(description = "轨迹点名称", requiredMode = RequiredMode.REQUIRED) @NotBlank private String pointName; + + @Schema(description = "电池编码") + private String orderNo; + + @Schema(description = "轨迹点类型:1-电站,2-车辆") + private Integer soc; @Schema(description = "结束时间", example = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/HomeDataOrderSwapCollate.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/HomeDataOrderSwapCollate.java new file mode 100644 index 0000000..07f221b --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/HomeDataOrderSwapCollate.java @@ -0,0 +1,48 @@ +package com.evotech.hd.common.core.entity.cloud; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author zrb + * @since 2025-03-07 + */ +@Data +@TableName("yt_t_home_data_order_swap_collate") +@Schema(name = "首页数据-换电订单中间表") +public class HomeDataOrderSwapCollate implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId("pk_id") + private Integer pkId; + + @Schema(description = "站编码") + private String stationCode; + + @Schema(description = "站名称") + private String stationName; + + @Schema(description = "日期") + private String day; + + @Schema(description = "数量") + private Integer quantity; + + @Schema(description = "状态:1-进行中,未结算的,2-结算完成,3-取消的") + private Integer status; + + @Schema(description = "创建时间", hidden = true) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date ctime; +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/HomeDataTradeCollate.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/HomeDataTradeCollate.java new file mode 100644 index 0000000..65c529f --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/HomeDataTradeCollate.java @@ -0,0 +1,49 @@ +package com.evotech.hd.common.core.entity.cloud; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author zrb + * @since 2025-03-08 + */ +@Data +@TableName("yt_t_home_data_trade_collate") +@Schema(name = "首页数据-交易中间表") +public class HomeDataTradeCollate implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "pk_id", type = IdType.AUTO) + private Integer pkId; + + @Schema(description = "日期") + private String day; + + @Schema(description = "交易类型:1-充值,2-订单消费,9-提现") + private Integer tradeType; + + @Schema(description = "支付方式:1-账户余额,2-微信,3-支付宝,4-网银,5 -充电补偿") + private Integer payType; + + @Schema(description = "数量") + private Integer quantity; + + @Schema(description = "交易金额") + private Integer tradeAmount; + + @Schema(description = "创建时间", hidden = true) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date ctime; +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/PageListSwapOrderRequest.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/PageListSwapOrderRequest.java index 8870ee6..02a0317 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/PageListSwapOrderRequest.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/PageListSwapOrderRequest.java @@ -51,6 +51,9 @@ public class PageListSwapOrderRequest extends BasePageRequest { @Schema(description = "订单状态:1-已创建,2-换电中,3-换电完成,4-充电中,5-充电完成,6-待结算,7-已完成,9-已取消") private String status; + + @Schema(description = "公司编码") + private String ccode; diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/PreOrderRelationSwapOrder.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/PreOrderRelationSwapOrder.java new file mode 100644 index 0000000..a047d32 --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/PreOrderRelationSwapOrder.java @@ -0,0 +1,48 @@ +package com.evotech.hd.common.core.entity.cloud; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +/** + * @author zrb + * @since 2024-11-06 + */ +@Getter +@Setter +@TableName("hd_cloud_manage.yt_t_pre_order_relation_swap_order") +@Schema(name = "扫码支付时关联的换电订单号") +public class PreOrderRelationSwapOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "pk_id", type = IdType.AUTO) + private Integer pkId; + + @Schema(description = "微信支付方式") + private String payApiType = "NATIVE"; + + @Schema(description = "本地订单号") + private String outTradeNo; + + @Schema(description = "订单描述") + private String description; + + @Schema(description = "换电订单号") + private String orderNo; + + @Schema(description = "创建时间", hidden = true) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date ctime; +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/VehicleInfo.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/VehicleInfo.java index f8db9b8..c6d8fb5 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/VehicleInfo.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/VehicleInfo.java @@ -97,6 +97,12 @@ public class VehicleInfo implements Serializable { @Schema(description = "删除状态,1-已删除,0-未删除", hidden = true) private Integer delFlag; + @Schema(description = "电池编码") + private String batCode; + + @Schema(description = "电量") + private Integer batSoc; + @Schema(description = "公司名称") private String cname; diff --git a/resource-server/src/main/java/com/evotech/hd/resource/entity/BatteryType.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/BatteryType.java similarity index 96% rename from resource-server/src/main/java/com/evotech/hd/resource/entity/BatteryType.java rename to base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/BatteryType.java index f05a931..7834347 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/entity/BatteryType.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/BatteryType.java @@ -1,4 +1,4 @@ -package com.evotech.hd.resource.entity; +package com.evotech.hd.common.core.entity.resource; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -22,7 +22,7 @@ import lombok.Setter; */ @Getter @Setter -@TableName("yt_d_battery_type") +@TableName("hd_resource.yt_d_battery_type") @Schema(name = "电池型号表") public class BatteryType implements Serializable { diff --git a/resource-server/src/main/java/com/evotech/hd/resource/entity/CarType.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/CarType.java similarity index 95% rename from resource-server/src/main/java/com/evotech/hd/resource/entity/CarType.java rename to base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/CarType.java index cf788d4..7a2ed83 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/entity/CarType.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/CarType.java @@ -1,4 +1,4 @@ -package com.evotech.hd.resource.entity; +package com.evotech.hd.common.core.entity.resource; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -22,7 +22,7 @@ import lombok.Setter; */ @Getter @Setter -@TableName("yt_d_car_type") +@TableName("hd_resource.yt_d_car_type") @Schema(name = "车辆类型") public class CarType implements Serializable { diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/wechat/WechatPayPreOrder.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/wechat/WechatPayPreOrder.java index 636be13..6b4b5b7 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/wechat/WechatPayPreOrder.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/wechat/WechatPayPreOrder.java @@ -29,6 +29,9 @@ public class WechatPayPreOrder implements Serializable { @Schema(description = "用户编码") private String wuid; + + @Schema(description = "公司编码") + private String ccode; private String openid; diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/CommonUtil.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/CommonUtil.java index 709850d..9bd1eca 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/CommonUtil.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/CommonUtil.java @@ -14,7 +14,7 @@ public class CommonUtil { */ /** * 交易编码:30位,预留2位不用 - * @param type 1-微信支付 9-余额支付 + * @param type 交易类型:1-充值,2-订单付款-余额,21-订单付款-JSAPI,21-订单付款-NATIVE, 9-提现 * @return */ public static String payTradeNo(Integer type) { @@ -24,21 +24,27 @@ public class CommonUtil { } /** - * 余额支付交易编码 1-充值,2-订单消费,9-提现 + * type:交易类型:1-充值,2-订单付款-余额,21-订单付款-JSAPI,21-订单付款-NATIVE, 9-提现 * @return */ public static String tradeNoPrefix(Integer type) { String prefix = "YTHD"; if (type == 1) { - return prefix + "1001"; + return prefix + "1010"; } if (type == 2) { - return prefix + "1002"; + return prefix + "1020"; + } + if (type == 21) { + return prefix + "1021"; + } + if (type == 22) { + return prefix + "1022"; } if (type == 9) { - return prefix + "1009"; + return prefix + "1090"; } - return prefix + "1010"; + return prefix + "1100"; } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/XCXUtil.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/XCXUtil.java index 7faad9c..83f6b41 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/XCXUtil.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/utils/XCXUtil.java @@ -14,12 +14,11 @@ public class XCXUtil { /** * 微信支付订单号 - * @param stationCode + * @param type 交易类型:1-充值,2-订单付款-余额,21-订单付款-JSAPI,21-订单付款-NATIVE, 9-提现 * @return */ - public static String payOutTradeNo(String stationCode) { - return CommonUtil.payTradeNo(1); -// String prefix = "YTHD" + (StringUtils.hasText(stationCode)?stationCode.substring(stationCode.length() - 4):"1001"); + public static String payOutTradeNo(Integer type) { + return CommonUtil.payTradeNo(type); } } diff --git a/cloud-manage-server/pom.xml b/cloud-manage-server/pom.xml index 9e0c0b5..ca0d200 100644 --- a/cloud-manage-server/pom.xml +++ b/cloud-manage-server/pom.xml @@ -83,6 +83,7 @@ cn.hutool hutool-crypto + diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java index 317cb26..80f559e 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java @@ -5,10 +5,12 @@ import java.util.List; import org.springdoc.core.annotations.ParameterObject; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.common.core.entity.Result; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; @@ -18,6 +20,7 @@ import com.evotech.hd.common.core.entity.cloud.PageListSwapOrderRequest; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -83,7 +86,16 @@ public class OrderSwapBatteryController { @GetMapping("/list") @ApiOperationSupport(order = 7) public Result> list(@ParameterObject PageListSwapOrderRequest plsor) { - return orderSwapBatteryService.list(plsor); + return orderSwapBatteryService.list(plsor); + } + + @Operation(summary = "查询公司订单") + @GetMapping("/listcompanyorder") + @ApiOperationSupport(order = 7) + @Hidden + @Deprecated + public Result> listByCompany(@ParameterObject PageListSwapOrderRequest plsor) { + return orderSwapBatteryService.listByCompany(plsor); } @Operation(summary = "查询换电步骤") @@ -109,11 +121,26 @@ public class OrderSwapBatteryController { } - @Operation(summary = "公司账户余额支付") + @Operation(summary = "公司订单余额支付") @PostMapping({"/companywallet/pay"}) @ApiOperationSupport(order = 11) public Result companyWalletPay(@RequestParam String orderNo, String wuid, String uname) { return orderSwapBatteryService.calculateCost(orderNo); } + + + @Operation(summary = "公司订单扫码支付") + @PostMapping({"/wechat/nativepay"}) + @ApiOperationSupport(order = 12) + public Result companyNativePay(@RequestBody NativePayVO prePay) { + return orderSwapBatteryService.companyNativePay(prePay); + } + + @Operation(summary = "扫码支付订单查询状态") + @GetMapping("/paystatus/query") + @ApiOperationSupport(order = 13) + public Result orderQuery(String outTradeNo) { + return orderSwapBatteryService.orderQuery(outTradeNo); + } } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/HomeDataManualCollateController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/HomeDataManualCollateController.java new file mode 100644 index 0000000..e15834d --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/HomeDataManualCollateController.java @@ -0,0 +1,43 @@ +package com.evotech.hd.cloud.controller.test; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.evotech.hd.cloud.service.HomeDataManualCollateService; +import com.evotech.hd.common.core.entity.Result; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; + +@Tag(name = "首页数据手动整理中间表") +@ApiSupport(order = 701) +@RestController +@RequestMapping("/home/data/manual") +public class HomeDataManualCollateController { + + @Resource + private HomeDataManualCollateService homeDataManualCollateService; + + @Operation(summary = "换电订单按日期整理") + @PostMapping("/swaporder/collate") + @ApiOperationSupport(order = 1) + public Result orderSwapDataCollate(@RequestParam(required = true) String dayBegin, @RequestParam(required = true)String dayEnd, @RequestParam(required = false)String stationCode) { + return homeDataManualCollateService.orderSwapDataCollate(dayBegin, dayEnd, stationCode); + } + + + @Operation(summary = "交易按日期整理") + @PostMapping("/trade/collate") + @ApiOperationSupport(order = 2) + public Result tradeDataCollate(String dayBegin, String dayEnd) { + return homeDataManualCollateService.tradeDataCollate(dayBegin, dayEnd); + } + + + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/HomeStationOrderData.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/HomeStationOrderData.java new file mode 100644 index 0000000..b034113 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/HomeStationOrderData.java @@ -0,0 +1,16 @@ +package com.evotech.hd.cloud.entity; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(name = "HomeData3中的数据") +public class HomeStationOrderData { + + private String stationCode; + + private String stationName; + + private Integer quantity; + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData3.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData3.java index 8ebf6f1..e77d12f 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData3.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData3.java @@ -1,6 +1,8 @@ package com.evotech.hd.cloud.entity.vo; -import java.util.Map; +import java.util.List; + +import com.evotech.hd.cloud.entity.HomeStationOrderData; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -9,18 +11,22 @@ import lombok.Data; @Schema(name = "订单") public class HomeData3 { + private String dayBegin; + + private String dayEnd; + @Schema(description = "总订单数") - private Integer totalOrder; + private Integer quantity; @Schema(description = "完成订单数") - private Integer finishedOrder; + private Integer finishedQuantity; @Schema(description = "进行中的订单数") - private Integer toDoOrder; + private Integer toDoQuantity; @Schema(description = "作废订单数") - private Integer cancleOrder; + private Integer cancleQuantity; - private Map stationRatio; + private List stationOrderDataList; } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData4.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData4.java index 4d02d77..4875f5c 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData4.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData4.java @@ -7,11 +7,21 @@ import lombok.Data; @Schema(name = "交易") public class HomeData4 { - @Schema(description = "总交易数") - private Integer totalTrade; + private String dayBegin; - @Schema(description = "成功交易数") - private Integer totalSuccessTrade; + private String dayEnd; + + @Schema(description = "交易数量") + private Integer quantity; + + @Schema(description = "充值交易数量") + private Integer chargeTradeQuantity; + + @Schema(description = "订单交易数量") + private Integer orderTradeQuantity; + + @Schema(description = "退款交易数量") + private Integer refundTradeQuantity; @Schema(description = "收入总钱数") private Integer totalMoney; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData5.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData5.java index feb1179..070d05f 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData5.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData5.java @@ -11,7 +11,7 @@ public class HomeData5 { private String month; @Schema(description = "数量") - private Integer totalOrder; + private Integer quantity; @Schema(description = "金额") private Integer totalMoney; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData6.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData6.java index 4683223..8cb77bf 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData6.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData6.java @@ -10,15 +10,21 @@ public class HomeData6 { @Schema(description = "年月") private String month; - @Schema(description = "总交易数") - private Integer totalTrade; + @Schema(description = "余额支付交易数") + private Integer walletQuantity; - @Schema(description = "成功交易数") - private Integer totalSuccessTrade; + @Schema(description = "余额支付金额") + private Integer walletMoney; - @Schema(description = "收入总钱数") - private Integer totalMoney; + @Schema(description = "收入金额") + private Integer inMoney; - @Schema(description = "支出总钱数") - private Integer totalRefund; + @Schema(description = "收入交易数") + private Integer inQuantity; + + @Schema(description = "退款金额") + private Integer refundMoney; + + @Schema(description = "退款交易数") + private Integer refundQuantity; } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData7.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData7.java index 7f914a7..8d11cca 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData7.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeData7.java @@ -11,20 +11,26 @@ public class HomeData7 { private String month; @Schema(description = "订单数量") - private Integer totalOrder; + private Integer quantity; @Schema(description = "同比订单数量") - private Integer lastMonthTotalOrder; + private Integer lastMonthQuantity; @Schema(description = "环比订单数量") - private Integer lastYearTotalOrder; + private Integer lastYearQuantity; - @Schema(description = "交易数量") - private Integer totalTrade; + @Schema(description = "前年订单数量") + private Integer last2YearQuantity; - @Schema(description = "同比交易数量") - private Integer lastMonthTotalTrade; + @Schema(description = "交易金额") + private Integer tradeAmount; - @Schema(description = "环比交易数量") - private Integer lastYearTotalTrade; + @Schema(description = "同比交易金额") + private Integer lastMonthTradeAmount; + + @Schema(description = "环比交易金额") + private Integer lastYearTradeAmount; + + @Schema(description = "前年交易金额") + private Integer last2YearTradeAmount; } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/NativePayVO.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/NativePayVO.java index e28d749..de66213 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/NativePayVO.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/NativePayVO.java @@ -16,10 +16,12 @@ import lombok.Data; @Schema(name = "Native下单参数") public class NativePayVO { - @Schema(description = "用户编码", requiredMode = RequiredMode.REQUIRED) - @NotBlank + @Schema(description = "用户编码") private String wuid; + @Schema(description = "公司编码") + private String ccode; + @Schema(description = "订单总描述", requiredMode = RequiredMode.REQUIRED) @NotBlank private String description; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java index b9a4134..cdc1567 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java @@ -21,7 +21,7 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -@Component +//@Component @Order(value = 20) @Slf4j public class MqttConnectInit implements ApplicationRunner { diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java index f0ac6e5..e8969d4 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatusData.java @@ -8,8 +8,14 @@ import lombok.Data; @Data public class OrderStatusData { - @Schema(description = "总充电量") + @Schema(description = "充电电池编码 - 状态5 数据") + private String batCode; + + @Schema(description = "总充电量 - 状态5 数据") private BigDecimal electAmount; + + @Schema(description = "充电电池soc - 状态5 数据") + private Integer soc; @Schema(description = "租借电池包仓位") private Integer rentBatNo; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java index d6bb9cf..8bc9e4c 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java @@ -144,8 +144,20 @@ public class MessageUtilService { */ public JSONObject getAESKey(String stationCode) { JSONObject jo = new JSONObject(); - Object o1 = redisUtil.get(HDConstant.HD_STATION_SECRET_KEY_AES_PREFIX + stationCode + ":key"); - Object o2 = redisUtil.get(HDConstant.HD_STATION_SECRET_KEY_AES_PREFIX + stationCode + ":iv"); + Object o1 = null; + try { + o1 = redisUtil.get(HDConstant.HD_STATION_SECRET_KEY_AES_PREFIX + stationCode + ":key"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Object o2 = null; + try { + o2 = redisUtil.get(HDConstant.HD_STATION_SECRET_KEY_AES_PREFIX + stationCode + ":iv"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } if (!ObjectUtil.isEmpty(o1) && !ObjectUtil.isEmpty(o2)) { jo.set("aesSecretKey", o1.toString()); jo.set("aesIv", o2.toString()); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java index 66723af..d41b4a3 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java @@ -27,7 +27,6 @@ import com.evotech.hd.cloud.mqtt.message.dto.newer.req.order.OrderByPlateNumResp import com.evotech.hd.cloud.mqtt.message.dto.newer.req.order.OrderData; import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.cloud.utils.CommonUtil; -import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent; import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; @@ -57,8 +56,6 @@ public class RequestMessageService { private OrderSwapBatteryPreDao orderSwapBatteryPreDao; @Resource private OrderSwapBatteryService orderSwapBatteryService; - @Resource - private SwapOrderBasicFeeComponent orderBasicFeeComponent; @Async("taskExecutor") public void request(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { @@ -130,8 +127,8 @@ public class RequestMessageService { osb.setStatus(1); osb.setStationCode(osbp.getStationCode()); osb.setStationName(osbp.getStationName()); - // 加上费用标准 - osb = orderBasicFeeComponent.orderBasicFee(osb); +// // 加上费用标准 - 移到订单服务中了 +// osb = orderBasicFeeComponent.orderBasicFee(osb); orderSwapBatteryService.add(osb); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java index 4b124e8..bf69d56 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java @@ -7,8 +7,10 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.evotech.hd.cloud.dao.BatteryStationDcDao; import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao; +import com.evotech.hd.cloud.dao.VehicleInfoDao; import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; @@ -18,19 +20,24 @@ import com.evotech.hd.cloud.mqtt.message.dto.newer.state.SwapStep; import com.evotech.hd.cloud.service.BatteryStationDcService; import com.evotech.hd.cloud.utils.components.HDStepDictComponent; import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; +import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; import com.evotech.hd.common.core.entity.cloud.BatteryTrace; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep; +import com.evotech.hd.common.core.entity.cloud.VehicleInfo; + import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; /** * state消息 处理 */ @Service +@Slf4j public class StateMessageService { @Resource @@ -45,6 +52,11 @@ public class StateMessageService { private BatteryStationDcService batteryStationDcService; @Resource private HDStepDictComponent hdStepDictComponent; + @Resource + private VehicleInfoDao vehicleInfoDao; + @Resource + private BatteryStationDcDao batteryStationDcDao; + @Async("taskExecutor") public void state(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { @@ -95,6 +107,28 @@ public class StateMessageService { step.setCreater("SYS"); step.setStepName(hdStepDictComponent.hdStepDictName(step.getStep())); orderSwapBatteryStepDao.insert(step); + // 修改车上电池编码 + VehicleInfo vi = new VehicleInfo(); + vi.setBatCode(statusData.getRentBatCode()); + vi.setBatSoc(statusData.getRentBatSoc()); + vehicleInfoDao.update(vi, new QueryWrapper().eq("plate_num", osb.getPlateNum())); + // 修改2块电池的信息 + BatteryStationDc dc1 = new BatteryStationDc(); + BatteryStationDc dc2 = new BatteryStationDc(); + dc1.setStatus(1); + dc1.setPointType(2); + dc1.setPointCode(osb.getPlateNum()); + dc1.setPointName(osb.getPlateNum()); + dc1.setSoc(statusData.getRentBatSoc()); + dc1.setDccNo(0); + batteryStationDcDao.update(dc1, new QueryWrapper().eq("bat_code", statusData.getRentBatCode())); + dc2.setStatus(2); + dc2.setPointType(1); + dc2.setPointCode(osb.getStationCode()); + dc2.setPointName(osb.getStationName()); + dc2.setSoc(statusData.getReturnBatSoc()); + dc2.setDccNo(statusData.getReturnBatNo()); + batteryStationDcDao.update(dc2, new QueryWrapper().eq("bat_code", statusData.getReturnBatCode())); // 添加2块电池的溯源记录 addBatteryTrace(orderStatus, statusData, osb); break; @@ -105,6 +139,11 @@ public class StateMessageService { case 5: // 修改订单状态和数据 alterOrderStatus(orderStatus, statusData); + // 修改电池状态 + BatteryStationDc dc = new BatteryStationDc(); + dc.setStatus(3); + dc.setSoc(statusData.getSoc()); + batteryStationDcDao.update(dc, new QueryWrapper().eq("bat_code", statusData.getBatCode())); break; default: break; @@ -119,7 +158,9 @@ public class StateMessageService { */ private void addBatteryTrace(OrderStatus orderStatus, OrderStatusData statusData, OrderSwapBattery osb) { BatteryTrace bt1 = new BatteryTrace(); + bt1.setOrderNo(orderStatus.getOrderNo()); bt1.setBatCode(statusData.getRentBatCode()); + bt1.setSoc(statusData.getRentBatSoc()); bt1.setBeginTime(orderStatus.getStatusTime()); bt1.setPointType(2); bt1.setPointCode(osb.getPlateNum()); @@ -128,6 +169,7 @@ public class StateMessageService { BatteryTrace bt2 = new BatteryTrace(); BeanUtils.copyProperties(bt1, bt2); bt2.setBatCode(statusData.getReturnBatCode()); + bt2.setSoc(statusData.getRentBatSoc()); bt2.setPointType(1); bt2.setPointCode(osb.getStationCode()); bt2.setPointName(osb.getStationName()); @@ -168,9 +210,21 @@ public class StateMessageService { private OrderSwapBattery alterOrderStatus(OrderStatus orderStatus, OrderStatusData statusData) { OrderSwapBattery osb = orderSwapBatteryDao.selectOne(new QueryWrapper().eq("order_no", orderStatus.getOrderNo())); osb.setStatus(orderStatus.getStatus()); - if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5) { + if (orderStatus.getStatus() == 2) { + osb.setServiceTimeBegin(orderStatus.getStatusTime()); + } + if (orderStatus.getStatus() == 3) { + osb.setServiceTimeEnd(orderStatus.getStatusTime()); BeanUtils.copyProperties(statusData, osb); } + if (orderStatus.getStatus() == 4) { + osb.setChargeTimeBegin(orderStatus.getStatusTime()); + } + if (orderStatus.getStatus() == 5) { + osb.setChargeTimeEnd(orderStatus.getStatusTime()); + osb.setElectAmount(statusData.getElectAmount()); + } + osb.setUptime(null); orderSwapBatteryDao.updateById(osb); return osb; } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/HomeDataManualCollateService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/HomeDataManualCollateService.java new file mode 100644 index 0000000..272747e --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/HomeDataManualCollateService.java @@ -0,0 +1,11 @@ +package com.evotech.hd.cloud.service; + +import com.evotech.hd.common.core.entity.Result; + +public interface HomeDataManualCollateService { + + public Result orderSwapDataCollate(String dayBegin, String dayEnd, String stationCode); + + public Result tradeDataCollate(String dayBegin, String dayEnd); + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java index 6543cae..8ae9e35 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java @@ -2,6 +2,7 @@ package com.evotech.hd.cloud.service; import java.util.List; +import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.common.core.entity.Result; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; @@ -24,6 +25,8 @@ public interface OrderSwapBatteryService { public Result> list(PageListSwapOrderRequest plsor); + public Result> listByCompany(PageListSwapOrderRequest plsor); + public Result> listStep(String orderNo); public Result calculateCost(String orderNo); @@ -31,5 +34,9 @@ public interface OrderSwapBatteryService { public Result calculateCost(OrderSwapBattery osb); public Result walletPay(String orderNo, String wuid, String uname); + + public Result companyNativePay(NativePayVO prePay); + + public Result orderQuery(String outTradeNo); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java index 8281d28..ca123e0 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java @@ -40,9 +40,9 @@ public class BatteryStationDcServiceImpl implements BatteryStationDcService { bt.setBatCode(bsdc.getBatCode()); bt.setBeginTime(d); bt.setCreater("SYS"); - bt.setPointType(bsdc.getSourceFrom()); - bt.setPointCode(bt.getPointType() == 1? bsdc.getStationCode():bsdc.getSourceCode()); - bt.setPointName(bt.getPointType() == 1? bsdc.getStationName():bsdc.getSourceCode()); + bt.setPointType(bsdc.getPointType()); + bt.setPointCode(bsdc.getPointCode()); + bt.setPointName(bsdc.getPointName()); addTrace(bt); return new Result().success(n); } @@ -76,7 +76,7 @@ public class BatteryStationDcServiceImpl implements BatteryStationDcService { page = batteryStationDcDao.selectPage(page, new QueryWrapper() .eq("del_flag", 0) .eq(StringUtils.hasText(plbsdcr.getProxyId()), "proxy_id", plbsdcr.getProxyId()) - .eq(StringUtils.hasText(plbsdcr.getStationCode()), "station_code", plbsdcr.getStationCode())); + .eq(StringUtils.hasText(plbsdcr.getStationCode()), "point_code", plbsdcr.getStationCode())); if (page.getRecords().isEmpty()) { return new Result>().error(CodeMsg.DATABASE_RESULT_NULL); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationHdFeeStandardDetailServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationHdFeeStandardDetailServiceImpl.java index 6936ce0..c5e03bc 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationHdFeeStandardDetailServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationHdFeeStandardDetailServiceImpl.java @@ -25,7 +25,7 @@ public class BatteryStationHdFeeStandardDetailServiceImpl implements BatteryStat boolean b = batteryStationHdFeeStandardDetailDao.exists(new QueryWrapper() .or(i -> i.and(j -> j.le("time_begin", bsfsd.getTimeBegin()).ge("time_end", bsfsd.getTimeBegin())) .or(j -> j.le("time_begin", bsfsd.getTimeEnd()).ge("time_end", bsfsd.getTimeEnd())) - .or(j -> j.ge("day_begin", bsfsd.getTimeBegin()).le("day_end", bsfsd.getTimeEnd()))) + .or(j -> j.ge("time_begin", bsfsd.getTimeBegin()).le("time_end", bsfsd.getTimeEnd()))) .eq("standard_id", bsfsd.getStandardId())); if (b) { return new Result().error("换电站费用标准明细时间冲突!"); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeDataManualCollateServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeDataManualCollateServiceImpl.java new file mode 100644 index 0000000..9c7d723 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeDataManualCollateServiceImpl.java @@ -0,0 +1,163 @@ +package com.evotech.hd.cloud.service.impl; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.evotech.hd.cloud.dao.TradeDetailDao; +import com.evotech.hd.cloud.service.HomeDataManualCollateService; +import com.evotech.hd.common.core.dao.cloud.HomeDataOrderSwapCollateDao; +import com.evotech.hd.common.core.dao.cloud.HomeDataTradeCollateDao; +import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; +import com.evotech.hd.common.core.entity.Result; +import com.evotech.hd.common.core.entity.cloud.HomeDataOrderSwapCollate; +import com.evotech.hd.common.core.entity.cloud.HomeDataTradeCollate; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; +import com.evotech.hd.common.core.entity.cloud.TradeDetail; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; + + +@Service +@Slf4j +public class HomeDataManualCollateServiceImpl implements HomeDataManualCollateService { + + @Resource + private HomeDataOrderSwapCollateDao homeDataOrderSwapCollateDao; + @Resource + private OrderSwapBatteryDao orderSwapBatteryDao; + @Resource + private TradeDetailDao tradeDetailDao; + @Resource + private HomeDataTradeCollateDao homeDataTradeCollateDao; + + @Override + public Result orderSwapDataCollate(String dayBegin, String dayEnd, String stationCode) { + if (Integer.valueOf(dayEnd) < Integer.valueOf(dayBegin)) { + return new Result().error("日期填写错误"); + } + // 天数 + List dayStringList = new ArrayList(); + dayStringList.add(dayBegin); + Date begin = DateUtil.parse(dayBegin, DatePattern.PURE_DATE_PATTERN); + long count = DateUtil.betweenDay(begin, DateUtil.parse(dayEnd, DatePattern.PURE_DATE_PATTERN), true); + for (int i = 1; i <= count; i++) { + dayStringList.add(DateUtil.format(DateUtil.offsetDay(begin, i), DatePattern.PURE_DATE_PATTERN)); + } + // 循环处理 + for (int i = 0; i < dayStringList.size(); i++) { + String dayString = dayStringList.get(i); + Date day = DateUtil.parse(dayString, DatePattern.PURE_DATE_PATTERN); + List orderList = orderSwapBatteryDao.selectList(new QueryWrapper() + .eq(StringUtils.hasText(stationCode), "station_code", stationCode) + .eq("del_flag", 0) + .ge("order_time", DateUtil.beginOfDay(day)) + .le("order_time", DateUtil.endOfDay(day))); + if (orderList.isEmpty()) { + continue; + } + orderList = orderList.stream().map(item -> { + if (item.getStatus() < 7) { + item.setStatus(1); + } else if (item.getStatus() == 7) { + item.setStatus(2); + } else if (item.getStatus() == 9) { + item.setStatus(3); + } + return item; + }).toList(); + + Map>> map = orderList.stream().collect(Collectors.groupingBy(OrderSwapBattery::getStationCode, Collectors.groupingBy(OrderSwapBattery::getStatus))); + Date d = new Date(); + List orderSwapCollateList = new ArrayList(); + for (Map.Entry>> m : map.entrySet()) { + String stationCodeKey = m.getKey(); + Map> statusMap = m.getValue(); + for (Map.Entry> entry : statusMap.entrySet()) { + Integer status = entry.getKey(); + List dayStatusOrderList = entry.getValue(); + HomeDataOrderSwapCollate orderSwapCollate = new HomeDataOrderSwapCollate(); + orderSwapCollate.setDay(dayString); + orderSwapCollate.setCtime(d); + orderSwapCollate.setQuantity(dayStatusOrderList.size()); + orderSwapCollate.setStationCode(stationCodeKey); + orderSwapCollate.setStationName(dayStatusOrderList.get(0).getStationName()); + orderSwapCollate.setStatus(status); + orderSwapCollateList.add(orderSwapCollate); + } + } + + // 插入数据 + homeDataOrderSwapCollateDao.delete(new QueryWrapper().eq("day", dayString)); + homeDataOrderSwapCollateDao.insert(orderSwapCollateList); + + log.info("\r\n===>>> {} 订单数据 {} 条,整理出记录 {} 条", dayString, orderList.size(), orderSwapCollateList.size()); + } + + return new Result().success("整理了 " + dayStringList.size() + " 天的订单数据"); + } + + @Override + public Result tradeDataCollate(String dayBegin, String dayEnd) { + if (Integer.valueOf(dayEnd) < Integer.valueOf(dayBegin)) { + return new Result().error("日期填写错误"); + } + // 天数 + List dayStringList = new ArrayList(); + dayStringList.add(dayBegin); + Date begin = DateUtil.parse(dayBegin, DatePattern.PURE_DATE_PATTERN); + long count = DateUtil.betweenDay(begin, DateUtil.parse(dayEnd, DatePattern.PURE_DATE_PATTERN), true); + for (int i = 1; i <= count; i++) { + dayStringList.add(DateUtil.format(DateUtil.offsetDay(begin, i), DatePattern.PURE_DATE_PATTERN)); + } + // 循环处理 + for (int i = 0; i < dayStringList.size(); i++) { + String dayString = dayStringList.get(i); + Date day = DateUtil.parse(dayString, DatePattern.PURE_DATE_PATTERN); + List tradeList = tradeDetailDao.selectList(new QueryWrapper() + .eq("del_flag", 0) + .ge("pay_time", DateUtil.beginOfDay(day)) + .le("pay_time", DateUtil.endOfDay(day))); + if (tradeList.isEmpty()) { + continue; + } + Map>> map = tradeList.stream().collect(Collectors.groupingBy(TradeDetail::getTradeType, Collectors.groupingBy(TradeDetail::getPayType))); + Date d = new Date(); + List tradeCollateList = new ArrayList(); + for (Map.Entry>> m : map.entrySet()) { + Integer tradeType = m.getKey(); + Map> payTypeMap = m.getValue(); + for (Map.Entry> entry : payTypeMap.entrySet()) { + Integer payType = entry.getKey(); + List dayPayTypeTradeList = entry.getValue(); + HomeDataTradeCollate tradeCollate = new HomeDataTradeCollate(); + tradeCollate.setDay(dayString); + tradeCollate.setCtime(d); + tradeCollate.setQuantity(dayPayTypeTradeList.size()); + tradeCollate.setTradeType(tradeType); + tradeCollate.setPayType(payType); + tradeCollate.setTradeAmount(dayPayTypeTradeList.stream().collect(Collectors.summingInt(item -> item.getTradeAmount()))); + tradeCollateList.add(tradeCollate); + } + + } + + // 插入数据 + homeDataTradeCollateDao.delete(new QueryWrapper().eq("day", dayString)); + homeDataTradeCollateDao.insert(tradeCollateList); + + log.info("\r\n===>>> {} 订单数据 {} 条,整理出记录 {} 条", dayString, tradeList.size(), tradeCollateList.size()); + } + return new Result().success("整理了 " + dayStringList.size() + " 天的订单数据"); + } + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java index ddfa860..e1c30c0 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java @@ -14,8 +14,8 @@ import com.evotech.hd.cloud.dao.BatteryStationDao; import com.evotech.hd.cloud.dao.BatteryStationDcDao; import com.evotech.hd.cloud.dao.BatteryStationRobotDao; import com.evotech.hd.cloud.dao.CompanyDao; -import com.evotech.hd.cloud.dao.TradeDetailDao; import com.evotech.hd.cloud.dao.VehicleInfoDao; +import com.evotech.hd.cloud.entity.HomeStationOrderData; import com.evotech.hd.cloud.entity.request.HomeDataRequest; import com.evotech.hd.cloud.entity.vo.HomeData1; import com.evotech.hd.cloud.entity.vo.HomeData2; @@ -25,7 +25,8 @@ import com.evotech.hd.cloud.entity.vo.HomeData5; import com.evotech.hd.cloud.entity.vo.HomeData6; import com.evotech.hd.cloud.entity.vo.HomeData7; import com.evotech.hd.cloud.service.HomeService; -import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; +import com.evotech.hd.common.core.dao.cloud.HomeDataOrderSwapCollateDao; +import com.evotech.hd.common.core.dao.cloud.HomeDataTradeCollateDao; import com.evotech.hd.common.core.dao.resource.ProxyOperaterDao; import com.evotech.hd.common.core.dao.wechat.WechatUserDao; import com.evotech.hd.common.core.entity.Result; @@ -33,14 +34,12 @@ import com.evotech.hd.common.core.entity.cloud.BatteryStation; import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; import com.evotech.hd.common.core.entity.cloud.BatteryStationRobot; import com.evotech.hd.common.core.entity.cloud.Company; -import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; -import com.evotech.hd.common.core.entity.cloud.TradeDetail; +import com.evotech.hd.common.core.entity.cloud.HomeDataOrderSwapCollate; +import com.evotech.hd.common.core.entity.cloud.HomeDataTradeCollate; import com.evotech.hd.common.core.entity.cloud.VehicleInfo; import com.evotech.hd.common.core.entity.resource.ProxyOperater; import com.evotech.hd.common.core.entity.wechat.WechatUser; -import com.evotech.hd.common.core.enums.OrderStatusEnums; import com.evotech.hd.common.core.enums.PayTypeEnums; -import com.evotech.hd.common.core.enums.TradeResultEnums; import com.evotech.hd.common.core.enums.TradeTypeEnums; import cn.hutool.core.date.DatePattern; @@ -65,10 +64,14 @@ public class HomeServiceImpl implements HomeService { private WechatUserDao wechatUserDao; @Resource private VehicleInfoDao vehicleInfoDao; +// @Resource +// private OrderSwapBatteryDao orderSwapBatteryDao; +// @Resource +// private TradeDetailDao tradeDetailDao; @Resource - private OrderSwapBatteryDao orderSwapBatteryDao; + private HomeDataOrderSwapCollateDao homeDataOrderSwapCollateDao; @Resource - private TradeDetailDao tradeDetailDao; + private HomeDataTradeCollateDao homeDataTradeCollateDao; @Override public Result homeData1(HomeDataRequest hd) { @@ -127,26 +130,36 @@ public class HomeServiceImpl implements HomeService { return new Result().error("时间范围未填写!"); } HomeData3 data = new HomeData3(); - // 订单 - List orderList = orderSwapBatteryDao.selectList(new QueryWrapper() - .eq(StringUtils.hasText(hd.getStationCode()), "station_code", hd.getStationCode()) - .ge("order_time", hd.getTimeBegin()) - .le("order_time", hd.getTimeEnd())); - data.setTotalOrder(orderList.size()); + data.setDayBegin(DateUtil.format(hd.getTimeBegin(), DatePattern.PURE_DATE_PATTERN)); + data.setDayEnd(DateUtil.format(hd.getTimeEnd(), DatePattern.PURE_DATE_PATTERN)); + List collateList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() + .ge("day", data.getDayBegin()) + .le("day", data.getDayEnd())); + Integer total = collateList.stream().collect(Collectors.summingInt(i -> i.getQuantity())); + data.setQuantity(total); + Integer todo = collateList.stream().filter(i -> i.getStatus() == 1).collect(Collectors.summingInt(i -> i.getQuantity())); + data.setToDoQuantity(todo); + Integer finish = collateList.stream().filter(i -> i.getStatus() == 2).collect(Collectors.summingInt(i -> i.getQuantity())); + data.setFinishedQuantity(finish); + Integer cancle = collateList.stream().filter(i -> i.getStatus() == 3).collect(Collectors.summingInt(i -> i.getQuantity())); + data.setCancleQuantity(cancle); - long count1 = orderList.stream().filter(i -> i.getStatus() < 7).count(); - data.setToDoOrder((int)count1); - long count2 = orderList.stream().filter(i -> i.getStatus() == 7).count(); - data.setFinishedOrder((int)count2); - long count3 = orderList.stream().filter(i -> i.getStatus() == 9).count(); - data.setCancleOrder((int)count3); - - Map map = orderList.parallelStream().map(i -> { - i.setStationCode(i.getStationCode() + "---" + i.getStationName()); - return i; - }).collect(Collectors.groupingBy(OrderSwapBattery::getStationCode, Collectors.counting())); - data.setStationRatio(map); + Map map = collateList.stream() + .collect(Collectors.groupingBy(HomeDataOrderSwapCollate::getStationCode, + Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + List stationList = batteryStationDao.selectList(new QueryWrapper()); + List stationOrderDataList = new ArrayList(); + for (Map.Entry entry : map.entrySet()) { + HomeStationOrderData stationOrderData = new HomeStationOrderData(); + String stationCode = entry.getKey(); + String name = stationList.stream().filter(i -> stationCode.equals(i.getCode())).findFirst().get().getName(); + stationOrderData.setStationCode(stationCode); + stationOrderData.setStationName(name); + stationOrderData.setQuantity(entry.getValue()); + stationOrderDataList.add(stationOrderData); + } + data.setStationOrderDataList(stationOrderDataList);; return new Result().success(data); } @@ -156,19 +169,26 @@ public class HomeServiceImpl implements HomeService { return new Result().error("时间范围未填写!"); } HomeData4 data = new HomeData4(); + data.setDayBegin(DateUtil.format(hd.getTimeBegin(), DatePattern.PURE_DATE_PATTERN)); + data.setDayEnd(DateUtil.format(hd.getTimeEnd(), DatePattern.PURE_DATE_PATTERN)); // 交易 - List tradeList = tradeDetailDao.selectList(new QueryWrapper() - .ge("pay_time", hd.getTimeBegin()) - .le("pay_time", hd.getTimeEnd())); - data.setTotalTrade(tradeList.size()); - tradeList = tradeList.stream().filter(i -> TradeResultEnums.SUCCESS.getName().equals(i.getPayResult())).toList(); - data.setTotalSuccessTrade(tradeList.size()); + List collateList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", data.getDayBegin()) + .le("day", data.getDayEnd())); + Integer quantity = collateList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getQuantity)); + data.setQuantity(quantity); + Integer chargeTradeQuantity = collateList.stream().filter(i -> i.getTradeType() == 1).collect(Collectors.summingInt(HomeDataTradeCollate::getQuantity)); + data.setChargeTradeQuantity(chargeTradeQuantity); + Integer orderTradeQuantity = collateList.stream().filter(i -> i.getTradeType() == 2).collect(Collectors.summingInt(HomeDataTradeCollate::getQuantity)); + data.setOrderTradeQuantity(orderTradeQuantity); + Integer refundTradeQuantity = collateList.stream().filter(i -> i.getTradeType() == 3).collect(Collectors.summingInt(HomeDataTradeCollate::getQuantity)); + data.setRefundTradeQuantity(refundTradeQuantity); - int czSum = tradeList.stream().filter(i -> i.getTradeType() == 1).mapToInt(i -> i.getTradeAmount()).sum(); - int paySum = tradeList.stream().filter(i -> i.getTradeType() == 2 && i.getPayType() != 1).mapToInt(i -> i.getTradeAmount()).sum(); - data.setTotalMoney(czSum + paySum); + Integer chargeAmount = collateList.stream().filter(i -> i.getTradeType() == 1).collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)); + Integer orderAmount = collateList.stream().filter(i -> i.getTradeType() == 2 && i.getPayType() != 1).collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)); + data.setTotalMoney(chargeAmount + orderAmount); - int refundSum = tradeList.stream().filter(i -> i.getTradeType() == 9).mapToInt(i -> i.getTradeAmount()).sum(); + int refundSum = collateList.stream().filter(i -> i.getTradeType() == 9).collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)); data.setTotalRefund(refundSum); return new Result().success(data); @@ -185,27 +205,29 @@ public class HomeServiceImpl implements HomeService { monthArr[i] = DateUtil.format(DateUtil.offsetMonth(d, -i), DatePattern.SIMPLE_MONTH_FORMATTER); } - Date beginTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(d, -6)); - List orderList = orderSwapBatteryDao.selectList(new QueryWrapper() + String beginDay = DateUtil.format(DateUtil.beginOfMonth(DateUtil.offsetMonth(d, -6)), DatePattern.PURE_DATE_FORMAT); + List collateList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() .eq(StringUtils.hasText(hd.getStationCode()), "station_code", hd.getStationCode()) - .ge("order_time", beginTime)); + .ge("day", beginDay)); - Map map1 = orderList.parallelStream().filter(i -> i.getDelFlag() == 0 && i.getStatus() <= 7) - .collect(Collectors.groupingBy(i -> DateUtil.format(i.getOrderTime(), DatePattern.SIMPLE_MONTH_FORMATTER), Collectors.counting())); + Map map1 = collateList.stream() + .collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + System.out.println(map1); - Map map2 = orderList.parallelStream().filter(i -> i.getDelFlag() == 0 && i.getStatus() <= 7).filter(i -> i.getAmount() != null) - .collect(Collectors.groupingBy(i -> DateUtil.format(i.getOrderTime(), DatePattern.SIMPLE_MONTH_FORMATTER), - Collectors.reducing(0, OrderSwapBattery::getAmount, Integer::sum) - )); + // 订单对应的钱,先不要了 +// Map map2 = orderList.parallelStream().filter(i -> i.getDelFlag() == 0 && i.getStatus() <= 7).filter(i -> i.getAmount() != null) +// .collect(Collectors.groupingBy(i -> DateUtil.format(i.getOrderTime(), DatePattern.SIMPLE_MONTH_FORMATTER), +// Collectors.reducing(0, OrderSwapBattery::getAmount, Integer::sum) +// )); for (int i = 0; i < monthArr.length; i++) { HomeData5 data = new HomeData5(); data.setMonth(monthArr[i]); - data.setTotalOrder(map1.get(monthArr[i]) == null ? 0 : map1.get(monthArr[i]).intValue()); - data.setTotalMoney(map2.get(monthArr[i]) == null ? 0 : map2.get(monthArr[i])); + data.setQuantity(map1.get(monthArr[i]) == null ? 0 : map1.get(monthArr[i])); list.add(data); } + list = list.stream().sorted((i1, i2) -> i1.getMonth().compareTo(i2.getMonth())).toList(); return new Result>().success(list); } @@ -221,31 +243,41 @@ public class HomeServiceImpl implements HomeService { monthArr[i] = DateUtil.format(DateUtil.offsetMonth(d, -i), DatePattern.SIMPLE_MONTH_FORMATTER); } - Date beginTime = DateUtil.beginOfMonth(DateUtil.offsetMonth(d, -6)); - List tradeList = tradeDetailDao.selectList(new QueryWrapper() - .eq("del_flag", 0) - .ge("pay_time", beginTime)); - // 成功交易 - List successList = tradeList.stream().filter(i -> TradeResultEnums.SUCCESS.getName().equals(i.getPayResult())).toList(); + String beginDay = DateUtil.format(DateUtil.beginOfMonth(DateUtil.offsetMonth(d, -6)), DatePattern.PURE_DATE_FORMAT); + List collateList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", beginDay)); + // 余额支付 + Map map0 = collateList.stream().filter(i -> i.getTradeType() == TradeTypeEnums.PAYORDER.getCode() && i.getPayType() == PayTypeEnums.WALLET.getCode()) + .collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + Map map01 = collateList.stream().filter(i -> i.getTradeType() == TradeTypeEnums.PAYORDER.getCode() && i.getPayType() == PayTypeEnums.WALLET.getCode()) + .collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataTradeCollate::getQuantity))); + // 收入 - Map map1 = successList.parallelStream().filter(i -> i.getTradeType() == TradeTypeEnums.RECHARGE.getCode() - || - (i.getTradeType() == TradeTypeEnums.PAYORDER.getCode() && i.getPayType() != PayTypeEnums.WALLET.getCode()) - ) - .collect(Collectors.groupingBy(i -> DateUtil.format(i.getPayTime(), DatePattern.SIMPLE_MONTH_FORMATTER), - Collectors.reducing(0, TradeDetail::getTradeAmount, Integer::sum))); + Map map1 = collateList.stream().filter(i -> i.getTradeType() == TradeTypeEnums.RECHARGE.getCode() || + (i.getTradeType() == TradeTypeEnums.PAYORDER.getCode() && i.getPayType() != PayTypeEnums.WALLET.getCode())) + .collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + Map map11 = collateList.stream().filter(i -> i.getTradeType() == TradeTypeEnums.RECHARGE.getCode() || + (i.getTradeType() == TradeTypeEnums.PAYORDER.getCode() && i.getPayType() != PayTypeEnums.WALLET.getCode())) + .collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataTradeCollate::getQuantity))); // 退款 - Map map2 = successList.parallelStream().filter(i -> i.getTradeType() == TradeTypeEnums.REFUND.getCode()) - .collect(Collectors.groupingBy(i -> DateUtil.format(i.getPayTime(), DatePattern.SIMPLE_MONTH_FORMATTER), - Collectors.reducing(0, TradeDetail::getTradeAmount, Integer::sum))); + Map map2 = collateList.stream().filter(i -> i.getTradeType() == TradeTypeEnums.REFUND.getCode()) + .collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + Map map21 = collateList.stream().filter(i -> i.getTradeType() == TradeTypeEnums.REFUND.getCode()) + .collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataTradeCollate::getQuantity))); for (int i = 0; i < monthArr.length; i++) { HomeData6 data = new HomeData6(); data.setMonth(monthArr[i]); - data.setTotalMoney(map1.get(monthArr[i]) == null ? 0 : map1.get(monthArr[i])); - data.setTotalRefund(map2.get(monthArr[i]) == null ? 0 : map2.get(monthArr[i])); + data.setWalletMoney(map0.get(monthArr[i]) == null ? 0 : map0.get(monthArr[i])); + data.setWalletQuantity(map01.get(monthArr[i]) == null ? 0 : map01.get(monthArr[i])); + data.setInMoney(map1.get(monthArr[i]) == null ? 0 : map1.get(monthArr[i])); + data.setInQuantity(map11.get(monthArr[i]) == null ? 0 : map11.get(monthArr[i])); + data.setRefundMoney(map2.get(monthArr[i]) == null ? 0 : map2.get(monthArr[i])); + data.setRefundQuantity(map21.get(monthArr[i]) == null ? 0 : map21.get(monthArr[i])); + list.add(data); } + list = list.stream().sorted((i1, i2) -> i1.getMonth().compareTo(i2.getMonth())).toList(); return new Result>().success(list); } @@ -257,42 +289,81 @@ public class HomeServiceImpl implements HomeService { if (type == 1) { Date beginOfMonth = DateUtil.beginOfMonth(d); Date lastBeginOfMonth = DateUtil.offsetMonth(beginOfMonth, -1); - data.setMonth(DateUtil.format(lastBeginOfMonth, DatePattern.SIMPLE_MONTH_FORMATTER)); Date last2BeginOfMonth = DateUtil.offsetMonth(lastBeginOfMonth, -1); + String beginDayOfMonth = DateUtil.format(beginOfMonth, DatePattern.PURE_DATE_FORMATTER); + String lastBeginDayOfMonth = DateUtil.format(lastBeginOfMonth, DatePattern.PURE_DATE_FORMATTER); + String last2BeginDayOfMonth = DateUtil.format(last2BeginOfMonth, DatePattern.PURE_DATE_FORMATTER); + data.setMonth(lastBeginDayOfMonth.substring(0, 6)); // 订单 - Long monthCount = orderSwapBatteryDao.selectCount(new QueryWrapper() - .ne("status", OrderStatusEnums.CANCLE.getCode()) - .ge("order_time", lastBeginOfMonth) - .lt("order_time", beginOfMonth)); - Long lastMonthCount = orderSwapBatteryDao.selectCount(new QueryWrapper() - .ne("status", OrderStatusEnums.CANCLE.getCode()) - .ge("order_time", last2BeginOfMonth) - .lt("order_time", lastBeginOfMonth)); - Long lastYearCount = orderSwapBatteryDao.selectCount(new QueryWrapper() - .ne("status", OrderStatusEnums.CANCLE.getCode()) - .ge("order_time", DateUtil.offsetYear(lastBeginOfMonth, -1)) - .lt("order_time", DateUtil.offsetYear(beginOfMonth, -1))); - data.setTotalOrder(monthCount.intValue()); - data.setLastMonthTotalOrder(lastMonthCount.intValue()); - data.setLastYearTotalOrder(lastYearCount.intValue()); + List monthList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() +// .ne("status", OrderStatusEnums.CANCLE.getCode()) + .ge("day", lastBeginDayOfMonth) + .lt("day", beginDayOfMonth)); + data.setQuantity(monthList.isEmpty()?0:monthList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + List lastMonthList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() +// .ne("status", OrderStatusEnums.CANCLE.getCode()) + .ge("day", last2BeginDayOfMonth) + .lt("day", lastBeginDayOfMonth)); + data.setLastMonthQuantity(lastMonthList.isEmpty()?0:lastMonthList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + List lastYearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() +// .ne("status", OrderStatusEnums.CANCLE.getCode()) + .ge("day", DateUtil.format(DateUtil.offsetYear(lastBeginOfMonth, -1), DatePattern.PURE_DATE_FORMATTER)) + .lt("day", DateUtil.format(DateUtil.offsetYear(beginOfMonth, -1), DatePattern.PURE_DATE_FORMATTER))); + data.setLastYearQuantity(lastYearList.isEmpty()?0:lastYearList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + // 交易 + List tradeList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", lastBeginDayOfMonth) + .lt("day", beginDayOfMonth)); + data.setTradeAmount(tradeList.isEmpty()?0:tradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + List lastMonthTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", last2BeginDayOfMonth) + .lt("day", lastBeginDayOfMonth)); + data.setLastMonthTradeAmount(lastMonthTradeList.isEmpty()?0:lastMonthTradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + List lastYearTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", DateUtil.format(DateUtil.offsetYear(lastBeginOfMonth, -1), DatePattern.PURE_DATE_FORMATTER)) + .lt("day", DateUtil.format(DateUtil.offsetYear(beginOfMonth, -1), DatePattern.PURE_DATE_FORMATTER))); + data.setLastYearTradeAmount(lastYearTradeList.isEmpty()?0:lastYearTradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); return new Result().success(data); } // 按年 Date beginOfYear = DateUtil.beginOfYear(d); Date lastBeginOfYear = DateUtil.offsetYear(beginOfYear, -1); - data.setMonth(DateUtil.year(lastBeginOfYear) + ""); Date last2BeginOfYear = DateUtil.offsetYear(lastBeginOfYear, -1); - Long yearCount = orderSwapBatteryDao.selectCount(new QueryWrapper() - .ne("status", OrderStatusEnums.CANCLE.getCode()) - .ge("order_time", lastBeginOfYear) - .lt("order_time", beginOfYear)); - Long lastYearCount = orderSwapBatteryDao.selectCount(new QueryWrapper() - .ne("status", OrderStatusEnums.CANCLE.getCode()) - .ge("order_time", last2BeginOfYear) - .lt("order_time", lastBeginOfYear)); - data.setTotalOrder(yearCount.intValue()); - data.setLastYearTotalOrder(lastYearCount.intValue()); + String beginDayOfYear = DateUtil.format(beginOfYear, DatePattern.PURE_DATE_FORMATTER); + String lastBeginDayOfYear = DateUtil.format(lastBeginOfYear, DatePattern.PURE_DATE_FORMATTER); + String last2BeginDayOfYear = DateUtil.format(last2BeginOfYear, DatePattern.PURE_DATE_FORMATTER); + // 订单 + List yearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() +// .ne("status", OrderStatusEnums.CANCLE.getCode()) + .ge("day", beginDayOfYear) + .lt("day", DateUtil.format(d, DatePattern.PURE_DATE_FORMATTER))); + data.setQuantity(yearList.isEmpty()?0:yearList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + List lastYearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() +// .ne("status", OrderStatusEnums.CANCLE.getCode()) + .ge("day", lastBeginDayOfYear) + .lt("day", beginDayOfYear)); + data.setLastYearQuantity(lastYearList.isEmpty()?0:lastYearList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + List last2YearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper() +// .ne("status", OrderStatusEnums.CANCLE.getCode()) + .ge("day", last2BeginDayOfYear) + .lt("day", lastBeginDayOfYear)); + data.setLast2YearQuantity(last2YearList.isEmpty()?0:last2YearList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity))); + + // 交易 + List tradeList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", beginDayOfYear) + .lt("day", DateUtil.format(d, DatePattern.PURE_DATE_FORMATTER))); + data.setTradeAmount(tradeList.isEmpty()?0:tradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + List lastYearTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", lastBeginDayOfYear) + .lt("day", beginDayOfYear)); + data.setLastYearTradeAmount(lastYearTradeList.isEmpty()?0:lastYearTradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + List last2YearTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper() + .ge("day", last2BeginDayOfYear) + .lt("day", lastBeginDayOfYear)); + data.setLast2YearTradeAmount(last2YearTradeList.isEmpty()?0:last2YearTradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount))); + return new Result().success(data); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java index 4cd9e41..958a6b2 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java @@ -17,10 +17,12 @@ import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao; import com.evotech.hd.cloud.dao.VehicleInfoDao; import com.evotech.hd.cloud.dao.WalletAccountDao; +import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.cloud.service.TradeService; import com.evotech.hd.cloud.service.WalletAccountService; import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService; +import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent; import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; import com.evotech.hd.common.core.dao.wechat.WechatUserDao; @@ -65,6 +67,9 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService { private WalletAccountService walletAccountService; @Resource private TradeService tradeService; + @Resource + private WechatService wechatService; + @Override @@ -132,6 +137,8 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService { @Override public Result add(OrderSwapBattery osb) { + // 加上费用标准 + osb = orderBasicFeeComponent.orderBasicFee(osb); osb.setCtime(new Date()); int n = orderSwapBatteryDao.insert(osb); if (n == 1) { @@ -167,7 +174,13 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService { Page page = new Page(plsor.getPageNo(), plsor.getPageSize()); List plateNumList = new ArrayList(); - if (StringUtils.hasText(plsor.getPlateNums())) { + if (StringUtils.hasText(plsor.getCcode())) { + List vehicleList = vehicleInfoDao.selectList(new QueryWrapper().eq("ccode", plsor.getCcode())); + if (vehicleList.isEmpty()) { + return new Result>().error("未发现该公司车辆"); + } + plateNumList = vehicleList.stream().map(i -> i.getPlateNum()).toList(); + } else if (StringUtils.hasText(plsor.getPlateNums())) { plateNumList = Arrays.asList(plsor.getPlateNums().split(",")); } List statusList = new ArrayList(); @@ -193,6 +206,33 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService { } return new Result>().success(page); } + + @Override + public Result> listByCompany(PageListSwapOrderRequest plsor) { + if (!StringUtils.hasText(plsor.getCcode())) { + return new Result>().error("参数错误"); + } + if (plsor.getOrderTimeBegin() == null || plsor.getOrderTimeEnd() == null) { + return new Result>().error("参数错误"); + } + Page page = new Page(plsor.getPageNo(), plsor.getPageSize()); + List vehicleList = vehicleInfoDao.selectList(new QueryWrapper().eq("ccode", plsor.getCcode())); + if (vehicleList.isEmpty()) { + return new Result>().error("未发现该公司车辆"); + } + List plateNumList = vehicleList.stream().map(i -> i.getPlateNum()).toList(); + page = orderSwapBatteryDao.selectPage(page, new QueryWrapper() + .in("plate_num", plateNumList) + .in(StringUtils.hasText(plsor.getStatus()), "status", plsor.getStatus()) + .ge("order_time", plsor.getOrderTimeBegin()) + .le("order_time", plsor.getOrderTimeEnd()) + .ne("del_flag", 1) + .orderByDesc("pk_id")); + if (page.getRecords().isEmpty()) { + return new Result>().error(CodeMsg.DATABASE_RESULT_NULL); + } + return new Result>().success(page); + } @Override public Result> listStep(String orderNo) { @@ -331,4 +371,14 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService { return new Result().success("OK"); } + @Override + public Result companyNativePay(NativePayVO prePay) { + return wechatService.wechatNativePay(prePay); + } + + @Override + public Result orderQuery(String outTradeNo) { + return wechatService.orderQuery(2, outTradeNo); + } + } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/WechatPayNotifyHandleService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/WechatPayNotifyHandleService.java index d9312d7..32217ec 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/WechatPayNotifyHandleService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/WechatPayNotifyHandleService.java @@ -1,6 +1,5 @@ package com.evotech.hd.cloud.service.newthread; -import java.util.Arrays; import java.util.List; import org.springframework.stereotype.Service; @@ -10,7 +9,9 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.evotech.hd.cloud.dao.WalletAccountDao; import com.evotech.hd.cloud.dao.WalletAccountDetailDao; import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; +import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; +import com.evotech.hd.common.core.entity.cloud.PreOrderRelationSwapOrder; import com.evotech.hd.common.core.entity.cloud.TradeDetail; import com.evotech.hd.common.core.entity.cloud.WalletAccount; import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail; @@ -33,6 +34,8 @@ public class WechatPayNotifyHandleService { private GZHTemplateMessageService templateMessageService; @Resource private OrderSwapBatteryDao orderSwapBatteryDao; + @Resource + private PreOrderRelationSwapOrderDao preOrderRelationSwapOrderDao; // @Async("taskExecutor") @@ -68,6 +71,7 @@ public class WechatPayNotifyHandleService { wallet.setTotalAmount(wad.getAfterTotalAmount()); wallet.setRechargeAmount(wad.getAfterRechargeAmount()); wallet.setGiftAmount(wad.getAfterGiftAmount()); + wallet.setUptime(null); walletAccountDao.updateById(wallet); // 发送公众号消息 @@ -114,7 +118,8 @@ public class WechatPayNotifyHandleService { * @param tradeDetail */ private void nativePayHandle(TradeDetail tradeDetail) { - List orderNoList = Arrays.asList(tradeDetail.getOrderNo().split(",")); + List list = preOrderRelationSwapOrderDao.selectList(new QueryWrapper().eq("out_trade_no", tradeDetail.getOutTradeNo())); + List orderNoList = list.stream().map(i -> i.getOrderNo()).toList(); List orderList = orderSwapBatteryDao.selectList(new QueryWrapper() .eq("status", 6).in("order_no", orderNoList)); if (orderList.size() != orderNoList.size()) { @@ -126,7 +131,6 @@ public class WechatPayNotifyHandleService { orderSwapBatteryDao.update(new UpdateWrapper().in("pk_id", idList) .set("status", OrderStatusEnums.FINISH.getCode()) .set("trade_no", tradeDetail.getOutTradeNo())); - // 发送公众号消息,发给企业绑定的微信号 // templateMessageService.orderMessageSend(one, 3); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java index 462d27b..efab67b 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java @@ -5,8 +5,10 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.common.core.entity.Result; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; @@ -39,5 +41,13 @@ public interface WechatService { @PostMapping(value = "/wechat/gzh/msg/send/recharge", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public Result rechargeMessage(@ParameterObject TradeDetail trade, @RequestParam Integer money); + + @PostMapping(value = "/wechat/wechatpay/native/prepay", + consumes = {MediaType.APPLICATION_JSON_VALUE}) + public Result wechatNativePay(@RequestBody NativePayVO prePay); + + @GetMapping(value = "/wechat/wechatpay/native/order/query", + consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) + public Result orderQuery(@RequestParam Integer type, @RequestParam String outTradeNo); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/HomeDataOrderSwapTask.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/HomeDataOrderSwapTask.java new file mode 100644 index 0000000..95914a0 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/HomeDataOrderSwapTask.java @@ -0,0 +1,47 @@ +package com.evotech.hd.cloud.task; + +import java.util.Date; +import java.util.List; + +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.evotech.hd.cloud.service.HomeDataManualCollateService; +import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +public class HomeDataOrderSwapTask { + + @Resource + private HomeDataManualCollateService homeDataManualCollateService; + @Resource + private OrderSwapBatteryDao orderSwapBatteryDao; + + + @Scheduled(cron ="0 0 2 * * ?") + public void orderSwapCollate() { + log.info("\r\n===>>>开始整理订单数据"); + Date d = new Date(); + List list = orderSwapBatteryDao.selectList(new QueryWrapper() + .or(i -> i.and(j -> j.ge("order_time", DateUtil.beginOfDay(d)).le("order_time", DateUtil.endOfDay(d))) + .or(j -> j.ge("uptime", DateUtil.beginOfDay(d)).le("uptime", DateUtil.endOfDay(d))))); + List dayStringList = list.stream().map(i -> DateUtil.format(i.getOrderTime(), DatePattern.PURE_DATE_PATTERN)).distinct().toList(); + for (int i = 0; i < dayStringList.size(); i++) { + String dayString = dayStringList.get(i); + homeDataManualCollateService.orderSwapDataCollate(dayString, dayString, null); + } + + log.info("\r\n===>>>订单数据整理完成"); + } + + + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java index 05acf64..2414861 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java @@ -16,7 +16,7 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -@Component +//@Component @Slf4j public class OrderCostCalculateTask { diff --git a/cloud-manage-server/src/main/resources/application.yml b/cloud-manage-server/src/main/resources/application.yml index 40c9406..b6ffe04 100644 --- a/cloud-manage-server/src/main/resources/application.yml +++ b/cloud-manage-server/src/main/resources/application.yml @@ -27,7 +27,7 @@ spring: username: nacos password: nacos discovery: - register-enabled: true + register-enabled: false #server-addr: 10.10.1.6:8848 #ip: 10.10.1.2 # 因添加了context-path,admin-server要想发现正确路径,需要加这个 diff --git a/cloud-manage-server/src/main/resources/mapper/BatteryStationDcMapper.xml b/cloud-manage-server/src/main/resources/mapper/BatteryStationDcMapper.xml index a242814..cad3413 100644 --- a/cloud-manage-server/src/main/resources/mapper/BatteryStationDcMapper.xml +++ b/cloud-manage-server/src/main/resources/mapper/BatteryStationDcMapper.xml @@ -12,8 +12,11 @@ - + + + + @@ -23,7 +26,7 @@ - pk_id, type_code, bat_code, production_date, registration_date, source_from, source_code, status, soc, del_flag, ctime, creater, uptime, updater + pk_id, type_code, bat_code, production_date, registration_date, source_from, source_code, status, point_type, point_code, point_name, soc, dcc_no, del_flag, ctime, creater, uptime, updater diff --git a/cloud-manage-server/src/test/java/com/evotech/hd/cloud/AddTestData.java b/cloud-manage-server/src/test/java/com/evotech/hd/cloud/AddTestData.java new file mode 100644 index 0000000..6463f91 --- /dev/null +++ b/cloud-manage-server/src/test/java/com/evotech/hd/cloud/AddTestData.java @@ -0,0 +1,1045 @@ +package com.evotech.hd.cloud; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import org.eclipse.paho.client.mqttv3.MqttClient; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.evotech.hd.cloud.controller.test.service.MqttConfigService; +import com.evotech.hd.cloud.controller.test.service.MqttTestUtil; +import com.evotech.hd.cloud.dao.BatteryStationDao; +import com.evotech.hd.cloud.dao.BatteryStationDcDao; +import com.evotech.hd.cloud.dao.CompanyDao; +import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; +import com.evotech.hd.cloud.dao.TradeDetailDao; +import com.evotech.hd.cloud.dao.VehicleInfoDao; +import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao; +import com.evotech.hd.cloud.dao.WalletAccountDao; +import com.evotech.hd.cloud.dao.WalletAccountDetailDao; +import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum; +import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; +import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; +import com.evotech.hd.cloud.mqtt.message.MyMqttMessage; +import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatus; +import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData; +import com.evotech.hd.cloud.mqtt.message.dto.newer.state.SwapStep; +import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService; +import com.evotech.hd.cloud.service.BatteryStationDcService; +import com.evotech.hd.cloud.service.OrderSwapBatteryService; +import com.evotech.hd.cloud.service.WalletAccountService; +import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent; +import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; +import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao; +import com.evotech.hd.common.core.dao.resource.BatteryTypeDao; +import com.evotech.hd.common.core.dao.resource.CarTypeDao; +import com.evotech.hd.common.core.dao.wechat.WechatUserDao; +import com.evotech.hd.common.core.entity.Result; +import com.evotech.hd.common.core.entity.cloud.BatteryStation; +import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; +import com.evotech.hd.common.core.entity.cloud.Company; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; +import com.evotech.hd.common.core.entity.cloud.PreOrderRelationSwapOrder; +import com.evotech.hd.common.core.entity.cloud.TradeDetail; +import com.evotech.hd.common.core.entity.cloud.VehicleInfo; +import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation; +import com.evotech.hd.common.core.entity.cloud.WalletAccount; +import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail; +import com.evotech.hd.common.core.entity.resource.BatteryType; +import com.evotech.hd.common.core.entity.resource.CarType; +import com.evotech.hd.common.core.entity.wechat.WechatUser; +import com.evotech.hd.common.core.enums.CodeMsg; +import com.evotech.hd.common.core.enums.OrderStatusEnums; +import com.evotech.hd.common.core.enums.TradeTypeEnums; +import com.evotech.hd.common.core.utils.CommonUtil; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; +import cn.hutool.crypto.symmetric.SymmetricCrypto; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import jakarta.annotation.Resource; + +@SpringBootTest +public class AddTestData { + + @Resource + private BatteryStationDao batteryStationDao; + @Resource + private BatteryTypeDao batteryTypeDao; + @Resource + private BatteryStationDcService batteryStationDcService; + @Resource + private CompanyDao companyDao; + @Resource + private CarTypeDao carTypeDao; + @Resource + private VehicleInfoDao vehicleInfoDao; + @Resource + private WechatUserDao wechatUserDao; + @Resource + private VehicleWechatUserRelationDao vehicleWechatUserRelationDao; + @Resource + private OrderSwapBatteryPreDao orderSwapBatteryPreDao; + @Resource + private OrderSwapBatteryService orderSwapBatteryService; + @Resource + private SwapOrderBasicFeeComponent orderBasicFeeComponent; + @Resource + private OrderSwapBatteryDao orderSwapBatteryDao; + @Resource + private MqttTestUtil mqttTestUtil; + @Resource + private MqttConfigService mqttService; + @Resource + private MessageUtilService messageUtilService; + @Resource + private BatteryStationDcDao batteryStationDcDao; + @Resource + private WalletAccountService walletAccountService; + @Resource + private WalletAccountDao walletAccountDao; + @Resource + private WalletAccountDetailDao walletAccountDetailDao; + @Resource + private TradeDetailDao tradeDetailDao; + @Resource + private PreOrderRelationSwapOrderDao preOrderRelationSwapOrderDao; + + + + + + private MqttClient testClient; + + + +// @Test + void addDC() { + System.out.println("======>>开始......"); + // 1. 查 站 + List stationList = batteryStationDao.selectList(new QueryWrapper()); + // 2. 按站添加 + List btList = batteryTypeDao.selectList(new QueryWrapper()); + System.out.println("======222>>" + btList.size()); + for (int i = 0; i < stationList.size(); i++) { + BatteryStation station = stationList.get(i); + Date d = new Date(); + String f1 = DateUtil.format(d, DatePattern.PURE_DATE_PATTERN); + for (int j = 0; j < 60; j++) { + BatteryStationDc dc = new BatteryStationDc(); + int random = RandomUtil.randomInt(0, btList.size()); + BatteryType bt = btList.get(random); + dc.setBatCode("YTDC" + bt.getTypeCode() + f1 + RandomUtil.randomStringUpper(14)); + dc.setCreater("TEST"); + dc.setProductionDate(DateUtil.format(DateUtil.offsetDay(d, -RandomUtil.randomInt(1, 100)), DatePattern.PURE_DATE_PATTERN)); + dc.setRegistrationDate(f1); + dc.setSoc(150); + dc.setStatus(3); + dc.setSourceCode(station.getCode()); + dc.setSourceFrom(1); + dc.setPointType(1); + dc.setPointCode(station.getCode()); + dc.setPointName(station.getName()); + dc.setTypeCode(bt.getTypeCode()); + dc.setTypeName(bt.getTypeName()); + + batteryStationDcService.add(dc); + } + + + } + + } + +// @Test + void addCars1() { + System.out.println("======>>开始c......"); + // 查询公司 + List companyList = companyDao.selectList(new QueryWrapper()); + // 车辆类型 + List carTypeList = carTypeDao.selectList(new QueryWrapper()); + // 电池类型 + List btList = batteryTypeDao.selectList(new QueryWrapper()); + // 添加车辆 + String[] colorArr = {"赤", "橙", "黄", "绿", "青", "蓝", "紫"}; + for (int i = 0; i < companyList.size(); i++) { + Company company = companyList.get(i); + Date d = new Date(); + Date d1 = DateUtil.offsetYear(d, -3); + for (int j = 1; j <= 40; j++) { + VehicleInfo vi = new VehicleInfo(); + int random = RandomUtil.randomInt(0, carTypeList.size()); + CarType ct = carTypeList.get(random); + vi.setTypeCode(ct.getTypeCode()); + vi.setVinNo(RandomUtil.randomStringUpper(16)); + vi.setFrameworkNo(RandomUtil.randomStringUpper(18)); + vi.setOwnerType(2); + vi.setCcode(company.getCcode()); + vi.setCname(company.getCname()); + vi.setOwnerId(vi.getCcode()); + vi.setOwnerName(vi.getCname()); + vi.setPlateNum(carNo(company, j)); + vi.setEngineNo(RandomUtil.randomStringUpper(20)); + vi.setSeatsCount(RandomUtil.randomInt(2, 6)); + vi.setCarColor(colorArr[RandomUtil.randomInt(0, colorArr.length)]); + vi.setCarArea(company.getAddressCity()); + vi.setProductionDate(DateUtil.format(DateUtil.offsetDay(d1, -RandomUtil.randomInt(30, 120)), DatePattern.PURE_DATE_PATTERN)); + vi.setPurchaseDate(DateUtil.format(d1, DatePattern.PURE_DATE_PATTERN)); + vi.setBoardDate(vi.getPurchaseDate()); + vi.setRegistrationDate(DateUtil.format(DateUtil.offsetDay(d1, 1), DatePattern.PURE_DATE_PATTERN)); + vi.setDelFlag(0); + vehicleInfoDao.insert(vi); + // 添加对应车辆的电池 + BatteryStationDc dc = new BatteryStationDc(); + int randomBtType = RandomUtil.randomInt(0, btList.size()); + BatteryType bt = btList.get(randomBtType); + dc.setBatCode("YTDC" + bt.getTypeCode() + vi.getProductionDate() + RandomUtil.randomStringUpper(14)); + dc.setCreater("TEST"); + dc.setProductionDate(vi.getProductionDate()); + dc.setRegistrationDate(vi.getRegistrationDate()); + dc.setSoc(150); + dc.setStatus(1); + dc.setSourceCode(vi.getPlateNum()); + dc.setSourceFrom(2); + dc.setTypeCode(bt.getTypeCode()); + dc.setTypeName(bt.getTypeName()); + + batteryStationDcService.add(dc); + } + + } + + + } + + private String carNo(Company c, Integer i) { + String divisionNo = c.getDivisionNo(); + String prefix = "冀"; + if ("130100".equals(divisionNo)) { + prefix += "AD1"; + } + if ("130200".equals(divisionNo)) { + prefix += "BD2"; + } + if ("130300".equals(divisionNo)) { + prefix += "CD3"; + } + if ("130400".equals(divisionNo)) { + prefix += "DD4"; + } + if ("130500".equals(divisionNo)) { + prefix += "ED5"; + } + if ("130600".equals(divisionNo)) { + prefix += "FD6"; + } + + String suffix = String.format("%04d", i); + return prefix + suffix; + } + +// @Test + void companyRelation() { + // 查询公司 + List companyList = companyDao.selectList(new QueryWrapper()); + + for (int i = 0; i < companyList.size(); i++) { + Company company = companyList.get(i); +// Date d = new Date(); + List vehicleList = vehicleInfoDao.selectList(new QueryWrapper().eq("ccode", company.getCcode())); + for (int j = 0; j < vehicleList.size(); j++) { + VehicleInfo vi = vehicleList.get(j); + // 人车关联 +// int randomInt = RandomUtil.randomInt(4000 - (i+1)*(j+1)); + Long count = wechatUserDao.selectCount(new QueryWrapper().isNull("pcode")); + int randomInt = RandomUtil.randomInt(1, count.intValue()); + WechatUser user = wechatUserDao.selectOne(new QueryWrapper().isNull("pcode").last("limit " + randomInt + ", 1")); + VehicleWechatUserRelation relation = new VehicleWechatUserRelation(); + relation.setUcode(user.getWuid()); + relation.setUname(user.getName()); + relation.setOpenid(user.getOpenid()); + relation.setPlateNum(vi.getPlateNum()); + relation.setPhone(user.getPhoneNumber()); + relation.setOwnerType(1); + relation.setCreater("TEST"); + relation.setCtime(new Date()); + vehicleWechatUserRelationDao.insert(relation); + // 公司绑人 + user.setPcode(company.getCcode()); + user.setPname(company.getCname()); + user.setType(2); + user.setUptime(null); + wechatUserDao.updateById(user); + } + + } + } + + +// @Test + void addCars2() { + // 车辆类型 + List carTypeList = carTypeDao.selectList(new QueryWrapper()); + // 电池类型 + List btList = batteryTypeDao.selectList(new QueryWrapper()); + // 添加车辆 + String[] colorArr = {"赤", "橙", "黄", "绿", "青", "蓝", "紫"}; + Date d = new Date(); + Date d1 = DateUtil.offsetYear(d, -3); + for (int i = 1761; i < 3009; i++) { + VehicleInfo vi = new VehicleInfo(); + int random = RandomUtil.randomInt(0, carTypeList.size()); + CarType ct = carTypeList.get(random); + vi.setTypeCode(ct.getTypeCode()); + vi.setVinNo(RandomUtil.randomStringUpper(16)); + vi.setFrameworkNo(RandomUtil.randomStringUpper(18)); + vi.setOwnerType(1); + List relationList = vehicleWechatUserRelationDao.selectList(new QueryWrapper()); + List ucodeList = relationList.stream().map(item -> item.getUcode()).distinct().toList(); + Long count = wechatUserDao.selectCount(new QueryWrapper().isNull("pcode")); + int randomInt = RandomUtil.randomInt(1, count.intValue() - ucodeList.size()); + WechatUser user = wechatUserDao.selectOne(new QueryWrapper() + .isNull("pcode") + .notIn("wuid", ucodeList) + .last("limit " + randomInt + ", 1")); + vi.setOwnerId(user.getWuid()); + vi.setOwnerName(user.getName()); + vi.setPhone(user.getPhoneNumber()); + vi.setPlateNum("冀AD9" + String.format("%04d", i)); + vi.setEngineNo(RandomUtil.randomStringUpper(20)); + vi.setSeatsCount(RandomUtil.randomInt(2, 6)); + vi.setCarColor(colorArr[RandomUtil.randomInt(0, colorArr.length)]); + vi.setCarArea("石家庄市"); + vi.setProductionDate(DateUtil.format(DateUtil.offsetDay(d1, -RandomUtil.randomInt(30, 120)), DatePattern.PURE_DATE_PATTERN)); + vi.setPurchaseDate(DateUtil.format(d1, DatePattern.PURE_DATE_PATTERN)); + vi.setBoardDate(vi.getPurchaseDate()); + vi.setRegistrationDate(DateUtil.format(DateUtil.offsetDay(d1, 1), DatePattern.PURE_DATE_PATTERN)); + vi.setDelFlag(0); + vi.setCreater("TEST"); + vi.setCtime(new Date()); + vehicleInfoDao.insert(vi); + // 添加人车关联关系 + VehicleWechatUserRelation relation = new VehicleWechatUserRelation(); + relation.setUcode(user.getWuid()); + relation.setUname(user.getName()); + relation.setOpenid(user.getOpenid()); + relation.setPlateNum(vi.getPlateNum()); + relation.setPhone(user.getPhoneNumber()); + relation.setOwnerType(1); + relation.setCreater("TEST"); + relation.setCtime(new Date()); + vehicleWechatUserRelationDao.insert(relation); + + // 添加对应车辆的电池 + BatteryStationDc dc = new BatteryStationDc(); + int randomBtType = RandomUtil.randomInt(0, btList.size()); + BatteryType bt = btList.get(randomBtType); + dc.setBatCode("YTDC" + bt.getTypeCode() + vi.getProductionDate() + RandomUtil.randomStringUpper(14)); + dc.setCreater("TEST"); + dc.setProductionDate(vi.getProductionDate()); + dc.setRegistrationDate(vi.getRegistrationDate()); + dc.setSoc(150); + dc.setStatus(1); + dc.setSourceCode(vi.getPlateNum()); + dc.setSourceFrom(2); + dc.setTypeCode(bt.getTypeCode()); + dc.setTypeName(bt.getTypeName()); + dc.setCtime(new Date()); + + batteryStationDcService.add(dc); + } + } + + +// @Test + void addPreOrders() { + System.out.println("======>>开始......"); + // 1. 查 站 + List stationList = batteryStationDao.selectList(new QueryWrapper()); + // 2. 按时间、站添加 + Date d = new Date(); + Date d1 = DateUtil.offsetYear(d, -4); + long count = DateUtil.betweenDay(d1, d, true); + int n = 1; + for (int i = 0; i < count; i++) { + Date day = DateUtil.offsetDay(d1, i); + for (int j = 0; j < stationList.size(); j++) { + BatteryStation station = stationList.get(j); + for (int k = 0; k < 84; k++) { + OrderSwapBatteryPre osbp = new OrderSwapBatteryPre(); + osbp.setSource(2); + osbp.setSourceId(station.getCode()); + // 车 + VehicleInfo vehicle = vehicleInfoDao.selectOne(new QueryWrapper().last("limit " + n + ", 1")); + // 人 + VehicleWechatUserRelation relation = vehicleWechatUserRelationDao.selectOne(new QueryWrapper() + .eq("plate_num", vehicle.getPlateNum()).last("limit 1")); + osbp.setUcode(relation.getUcode()); + osbp.setUname(relation.getUname()); + osbp.setPlateNum(vehicle.getPlateNum()); + osbp.setPhone(relation.getPhone()); + osbp.setStationCode(station.getCode()); + osbp.setStationName(station.getName()); + osbp.setReservationTime(new Date()); + osbp.setSwapDay(DateUtil.format(day, DatePattern.PURE_DATE_FORMATTER)); + osbp.setSwapDuration("6:00-20:00"); + osbp.setStatus(1); + osbp.setCtime(osbp.getReservationTime()); + osbp.setCreater("TEST"); + orderSwapBatteryPreDao.insert(osbp); + n++; + if (n == 3250) { + n = 1; + } + } + + } + + } + + } + + +// @Test + void addOrders() { + System.out.println("======>>开始......"); + // 1. 查 站 + List stationList = batteryStationDao.selectList(new QueryWrapper().eq("del_flag", 0)); + // 2. 按时间、站添加 + Date d1 = new Date(); + Date d2 = DateUtil.offsetYear(d1, -4); + long count = DateUtil.betweenDay(d2, d1, true); + for (int i = 0; i < count; i++) { + Date day = DateUtil.offsetDay(DateUtil.offsetYear(new Date(), -4), i); + String dayString = DateUtil.format(day, DatePattern.PURE_DATE_PATTERN); + for (int j = 0; j < stationList.size(); j++) { + BatteryStation station = stationList.get(j); + // 查这天,这个站的预约 + List orderPreList = orderSwapBatteryPreDao.selectList(new QueryWrapper() + .eq("station_code", station.getCode()) + .eq("swap_day", dayString) + .eq("status", 1)); + // 根据预约生成订单 + if (orderPreList.isEmpty()) { + continue; + } + Date orderTime = DateUtil.offsetMinute(DateUtil.offsetHour(DateUtil.beginOfDay(day), 6), RandomUtil.randomInt(1, 60)); + for (int k = 0; k < orderPreList.size(); k++) { + OrderSwapBatteryPre orderPre = orderPreList.get(k); + OrderSwapBattery order = new OrderSwapBattery(); + order.setOrderType(1); + order.setCtime(new Date()); + order.setCreater("TEST"); + order.setOrderPreId(orderPre.getPkId()); + order.setOrderPreUid(orderPre.getUcode()); + order.setOrderPreUname(orderPre.getUname()); + order.setOrderPrePhone(orderPre.getPhone()); + order.setOrderNo(orderNo(station.getCode(), orderTime)); + order.setPlateNum(orderPre.getPlateNum()); + order.setOrderTime(orderTime); + order.setStationCode(orderPre.getStationCode()); + order.setStationName(orderPre.getStationName()); + order.setStatus(1); + order.setFeeType(3); + order.setDelFlag(0); + order.setRemark("测试用的"); + order.setChangeMode(1); + order.setChangeLane(1); + + // 加上费用标准 + order = orderBasicFeeComponent.orderBasicFee(order); + orderSwapBatteryDao.insert(order); + + orderTime = DateUtil.offsetMinute(orderTime, 10); + } + + } + + } + + } + + + private String orderNo(String stationCode, Date d) { + String orderNoPrefix = "YTSO"; + String orderNoMiddle1 = stationCode.length() <= 8?stationCode : stationCode.substring(stationCode.length() - 8); + String orderNoMiddle2 = DateUtil.format(d, DatePattern.PURE_DATETIME_MS_FORMATTER); + String orderNoSuffix = RandomUtil.randomNumbers(2) + RandomUtil.randomChar("ABCDEF"); + return orderNoPrefix + orderNoMiddle1 + orderNoMiddle2 + orderNoSuffix; + } + +// @Test + void orderHandle1() { + // 挑 1000条订单,取消 + for (int i = 0; i < 2000; i++) { + int randomInt = RandomUtil.randomInt(100, 730000); + OrderSwapBattery one = orderSwapBatteryDao.selectOne(new QueryWrapper().eq("status", 1).last("limit " + randomInt + ", 1")); + OrderSwapBattery order = new OrderSwapBattery(); + order.setPkId(one.getPkId()); + order.setStatus(OrderStatusEnums.CANCLE.getCode()); + orderSwapBatteryDao.updateById(order); + } + + + } + +// @Test + void orderHandle2() { + testClient = mqttService.connect(); + // 1. 查 站 + List stationList = batteryStationDao.selectList(new QueryWrapper().eq("del_flag", 0)); + Date d1 = new Date(); + Date d2 = DateUtil.offsetYear(DateUtil.offsetDay(d1, -2), -4); + long count = DateUtil.betweenDay(d2, d1, true); + for (int i = 0; i < count; i++) { + Date day = DateUtil.offsetDay(d2, i); + for (int j = 0; j < stationList.size(); j++) { + BatteryStation station = stationList.get(j); + // 查这天,这个站的订单 + List orderList = orderSwapBatteryDao.selectList(new QueryWrapper() + .eq("station_code", station.getCode()) + .eq("status", 1) + .ge("order_time", DateUtil.beginOfDay(day)) + .le("order_time", DateUtil.endOfDay(day))); + if (orderList.isEmpty()) { + continue; + } + // 这个站的电池 + List selectList = batteryStationDcDao.selectList(new QueryWrapper() + .eq("status", 3) + .eq("point_code", station.getCode()) + .eq("del_flag", 0)); + LinkedList dcList = new LinkedList(selectList); + for (int k = 0; k < orderList.size(); k++) { + OrderSwapBattery order = orderList.get(k); + // 反馈订单状态 + // 状态2 + OrderStatus orderStatus = new OrderStatus(); + orderStatus.setOrderNo(order.getOrderNo()); + orderStatus.setStatus(2); + orderStatus.setStatusTime(DateUtil.offsetSecond(order.getOrderTime(), RandomUtil.randomInt(10, 15))); + orderStatusHandle(orderStatus, null, order.getStationCode()); + // 步骤2 - 车辆到达指定位置 + SwapStep swapStep = new SwapStep(); + swapStep.setOrderNo(order.getOrderNo()); + swapStep.setStep(2); + swapStep.setStepTime(DateUtil.offsetSecond(orderStatus.getStatusTime(), RandomUtil.randomInt(30, 35))); + swapStep(swapStep, order.getStationCode()); + // 步骤3 - 启动对中机构 + swapStep.setStep(3); + swapStep.setStepTime(DateUtil.offsetSecond(swapStep.getStepTime(), 5)); + swapStep(swapStep, order.getStationCode()); + // 步骤4 - 取新电池 + swapStep.setStep(4); + swapStep.setStepTime(DateUtil.offsetSecond(swapStep.getStepTime(), 5)); + swapStep(swapStep, order.getStationCode()); + // 步骤5 - 拆旧电池 + swapStep.setStep(5); + swapStep.setStepTime(DateUtil.offsetSecond(swapStep.getStepTime(), RandomUtil.randomInt(50, 65))); + swapStep(swapStep, order.getStationCode()); + // 步骤6 - 装新电池 + swapStep.setStep(6); + swapStep.setStepTime(DateUtil.offsetSecond(swapStep.getStepTime(), RandomUtil.randomInt(30, 40))); + swapStep(swapStep, order.getStationCode()); + // 步骤7 - 放旧电池 + swapStep.setStep(7); + swapStep.setStepTime(DateUtil.offsetSecond(swapStep.getStepTime(), RandomUtil.randomInt(60, 70))); + swapStep(swapStep, order.getStationCode()); + // 状态3 - 换电完成 + try { + Thread.sleep(500L); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + orderStatus.setStatus(3); + orderStatus.setStatusTime(DateUtil.offsetSecond(swapStep.getStepTime(), RandomUtil.randomInt(5, 10))); + // 电池信息 + // 原电池 + VehicleInfo vi = vehicleInfoDao.selectOne(new QueryWrapper().eq("plate_num", order.getPlateNum())); + BatteryStationDc dc1 = batteryStationDcDao.selectOne(new QueryWrapper().eq("del_flag", 0).eq("bat_code", vi.getBatCode())); + // 新电池 + BatteryStationDc dc2 = dcList.removeFirst(); + OrderStatusData statusData = new OrderStatusData(); + statusData.setRentBatNo(dc2.getDccNo()); + statusData.setRentBatCode(dc2.getBatCode()); + statusData.setRentBatSoc(dc2.getSoc()); + statusData.setReturnBatCode(dc1.getBatCode()); + statusData.setReturnBatNo(dc2.getDccNo()); + statusData.setReturnBatSoc(10); + statusData.setReturnBatRentSoc(vi.getBatSoc()); + orderStatusHandle(orderStatus, statusData, order.getStationCode()); + // 状态4 - 开始充电 + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + orderStatus.setStatus(4); + orderStatus.setStatusTime(DateUtil.offsetMinute(orderStatus.getStatusTime(), RandomUtil.randomInt(4, 7))); + orderStatusHandle(orderStatus, null, order.getStationCode()); + // 状态5 - 充电完成 + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + orderStatus.setStatus(5); + orderStatus.setStatusTime(DateUtil.offsetMinute(orderStatus.getStatusTime(), RandomUtil.randomInt(90, 100))); + OrderStatusData statusData5 = new OrderStatusData(); + statusData5.setBatCode(dc1.getBatCode()); + statusData5.setElectAmount(new BigDecimal(RandomUtil.randomInt(100, 140))); + statusData5.setSoc(100); + orderStatusHandle(orderStatus, statusData5, order.getStationCode()); + + + try { + Thread.sleep(500L); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + BatteryStationDc dc3 = batteryStationDcDao.selectOne(new QueryWrapper().eq("del_flag", 0).eq("bat_code", vi.getBatCode())); + dcList.addLast(dc3); + } + + } + + } + + + } + + /** + * 反馈订单状态 + */ + private void orderStatusHandle(OrderStatus orderStatus, OrderStatusData statusData, String stationCode) { + orderStatus.setStatusData(statusData); + JSONObject jo = JSONUtil.parseObj(orderStatus); + String topic = mqttTestUtil.getTopic(stationCode, MqttMessageTypeEnum.STATE.getType()); + MqttMessageHeader header = mqttTestUtil.getHeader(StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction()); + +// mqttTestUtil.publishMessage(stationCode, jo, topic, header); + publishMessage(stationCode, jo, topic, header); + + } + + private void publishMessage(String stationCode, JSONObject jo, String topic, MqttMessageHeader header) { + // 1. 获取AES + JSONObject aesJo = messageUtilService.getAESKey(stationCode); + SymmetricCrypto aes = new AES(Mode.CBC, Padding.PKCS5Padding, aesJo.getStr("aesSecretKey").getBytes(), aesJo.getStr("aesIv").getBytes()); + // 2. 数据 + MyMqttMessage message = new MyMqttMessage(); + message.setHeader(header); + message.setDataBody(jo); + String encrypt = aes.encryptBase64(JSONUtil.toJsonStr(message)); + // 3. 发送MQTT消息 + mqttService.publish(testClient, encrypt, topic); + } + + /** + * 反馈换电步骤 + */ + private void swapStep(SwapStep swapStep, String stationCode) { + JSONObject jo = JSONUtil.parseObj(swapStep); + + String topic = mqttTestUtil.getTopic(stationCode, MqttMessageTypeEnum.STATE.getType()); + MqttMessageHeader header = mqttTestUtil.getHeader(StateFunctionTypesEnum.FUN_SWAPSTEP.getFunction()); + + publishMessage(stationCode, jo, topic, header); + } + + + /** + * 添加钱包 + */ +// @Test + void addWallet1() { + System.out.println("======>>开始c......"); + // 1. 公司账户钱包 + // 查询公司 + List companyList = companyDao.selectList(new QueryWrapper()); + for (int i = 0; i < companyList.size(); i++) { + Company c = companyList.get(i); + WalletAccount wa = new WalletAccount(); + wa.setOwnerType(2); + wa.setOwnerId(c.getCcode()); + wa.setStatus(1); + walletAccountService.add(wa); + // 假装充值 + // 交易 + wa = walletAccountDao.selectOne(new QueryWrapper().eq("owner_id", c.getCcode())); + Date d = new Date(); + TradeDetail td = new TradeDetail(); + td.setAppid("wx2ab384cf1e6f85a1"); + td.setTrader(c.getCname()); + td.setTraderCode(c.getCcode()); + td.setWallet(wa.getCode()); + td.setMchid("1695885921"); + td.setDelFlag(0); + td.setDescription("TEST-假装公司充值交易"); + td.setOutTradeNo(CommonUtil.payTradeNo(1)); + td.setTradeType(1); + td.setTradeAmount(RandomUtil.randomInt(100000000, 950000000)); + td.setPayType(4); + td.setPayResult("SUCCESS"); + td.setPayMsg("OK"); + td.setPayTime(d); + td.setCtime(d); + td.setCreater("TEST"); + tradeDetailDao.insert(td); + // 钱包 + // 添加明细 + WalletAccountDetail wad = new WalletAccountDetail(); + // TODO 写一个算法,计算充值的减多少,赠送的减多少,总金额减多少 + wad.setTradeRechargeAmount(td.getTradeAmount()); + wad.setTradeGiftAmount(0); + wad.setTradeTotalAmount(wad.getTradeRechargeAmount() + wad.getTradeGiftAmount()); + + wad.setPreTotalAmount(wa.getTotalAmount()); + wad.setPreRechargeAmount(wa.getRechargeAmount()); + wad.setPreGiftAmount(wa.getGiftAmount()); + + wad.setAfterRechargeAmount(wad.getPreRechargeAmount() + Math.abs(wad.getTradeRechargeAmount())); + wad.setAfterTotalAmount(wad.getPreTotalAmount() + Math.abs(wad.getTradeTotalAmount())); + wad.setAfterGiftAmount(wad.getPreGiftAmount() + Math.abs(wad.getTradeGiftAmount())); + + wad.setTradeGiftAmount(0); + wad.setCode(wa.getCode()); + wad.setTradeType(td.getTradeType()); + wad.setTradeNo(td.getOutTradeNo()); + wad.setCtime(new Date()); + walletAccountDetailDao.insert(wad); + // 改余额 + wa.setTotalAmount(wad.getAfterTotalAmount()); + wa.setRechargeAmount(wad.getAfterRechargeAmount()); + wa.setGiftAmount(wad.getAfterGiftAmount()); + wa.setUptime(null); + walletAccountDao.updateById(wa); + } + + } + + + /** + * 添加钱包 + */ +// @Test + void addWallet2() { + System.out.println("======>>开始c......"); + // 1. 个人账户钱包 + // 查询人 + Long count = wechatUserDao.selectCount(new QueryWrapper()); + for (int i = 0; i < count; i++) { + int offset = 1 + i; + WechatUser user = wechatUserDao.selectOne(new QueryWrapper().last("limit " + offset + ", 1")); + boolean exists = walletAccountDao.exists(new QueryWrapper().eq("owner_id", user.getWuid())); + if (exists) { + continue; + } + WalletAccount wa = new WalletAccount(); + wa.setOwnerType(1); + wa.setOwnerId(user.getWuid()); + wa.setStatus(1); + walletAccountService.add(wa); + // 假装充值 + // 交易 + wa = walletAccountDao.selectOne(new QueryWrapper().eq("owner_id", user.getWuid())); + Date d = new Date(); + TradeDetail td = new TradeDetail(); + td.setAppid("wx2ab384cf1e6f85a1"); + td.setTrader(user.getName()); + td.setTraderCode(user.getWuid()); + td.setWallet(wa.getCode()); + td.setMchid("1695885921"); + td.setDelFlag(0); + td.setDescription("TEST-假装个人充值交易"); + td.setOutTradeNo(CommonUtil.payTradeNo(1)); + td.setTradeType(1); + td.setTradeAmount(RandomUtil.randomInt(20000000, 150000000)); + td.setPayType(4); + td.setPayResult("SUCCESS"); + td.setPayMsg("OK"); + td.setPayTime(d); + td.setCtime(d); + td.setCreater("TEST"); + tradeDetailDao.insert(td); + // 钱包 + // 添加明细 + WalletAccountDetail wad = new WalletAccountDetail(); + // TODO 写一个算法,计算充值的减多少,赠送的减多少,总金额减多少 + wad.setTradeRechargeAmount(td.getTradeAmount()); + wad.setTradeGiftAmount(0); + wad.setTradeTotalAmount(wad.getTradeRechargeAmount() + wad.getTradeGiftAmount()); + + wad.setPreTotalAmount(wa.getTotalAmount()); + wad.setPreRechargeAmount(wa.getRechargeAmount()); + wad.setPreGiftAmount(wa.getGiftAmount()); + + wad.setAfterRechargeAmount(wad.getPreRechargeAmount() + Math.abs(wad.getTradeRechargeAmount())); + wad.setAfterTotalAmount(wad.getPreTotalAmount() + Math.abs(wad.getTradeTotalAmount())); + wad.setAfterGiftAmount(wad.getPreGiftAmount() + Math.abs(wad.getTradeGiftAmount())); + + wad.setTradeGiftAmount(0); + wad.setCode(wa.getCode()); + wad.setTradeType(td.getTradeType()); + wad.setTradeNo(td.getOutTradeNo()); + wad.setCtime(new Date()); + walletAccountDetailDao.insert(wad); + // 改余额 + wa.setTotalAmount(wad.getAfterTotalAmount()); + wa.setRechargeAmount(wad.getAfterRechargeAmount()); + wa.setGiftAmount(wad.getAfterGiftAmount()); + wa.setUptime(null); + walletAccountDao.updateById(wa); + } + + } + + + @Test + void calFee() { + // 计算订单费用 + System.out.println("\r\n===>>>开始查找订单计算费用"); + // 查询状态为5的订单 + Boolean flag = true; + int n = 0; + while (flag) { + OrderSwapBattery order = orderSwapBatteryDao.selectOne(new QueryWrapper() + .eq("status", 5).ne("del_flag", 1) + .ge("order_time", "2024-10-01 00:00:00") + .le("order_time", "2025-01-01 00:00:00") + .last("limit 1")); + if (order == null) { + flag = false; + } else { + System.out.println("\r\n===>>>订单号:" + order.getOrderNo()); + Result res = orderSwapBatteryService.calculateCost(order); + if ( CodeMsg.SUCCESS.getCode().equals(res.getCode())) { + n += 1; + } + } + } + + System.out.println("\r\n===>>>订单计算费用完成:" + n + " 条数据"); + } + + + +// @Test + void payOrder() { + // 支付订单 + System.out.println("\r\n===>>>开始查找订单计算费用"); + Boolean flag = true; + while (flag) { + OrderSwapBattery order = orderSwapBatteryDao.selectOne(new QueryWrapper() + .eq("status", 6).ne("del_flag", 1) + .ge("order_time", "2024-01-01 00:00:00") + .le("order_time", "2024-07-01 00:00:00") + .last("limit 1")); + if (order == null) { + flag = false; + return; + } + if (order.getAmount() <= 0) { + return; + } + String plateNum = order.getPlateNum(); + VehicleInfo vi = vehicleInfoDao.selectOne(new QueryWrapper().eq("plate_num", plateNum)); + if (vi.getOwnerType() == 1) { + System.out.println("---111---"); + // 1. 个人订单 + wallatPayOrder(order); + } else if (vi.getOwnerType() == 2) { + System.out.println("---222---"); + // 公司订单 + Company c = companyDao.selectOne(new QueryWrapper().eq("ccode", vi.getCcode())); + if (c == null) { + return; + } + wallatPayOrderCompany(order, c); + } + } + } + + private void wallatPayOrderCompany(OrderSwapBattery order, Company c) { + // 公司车辆 + List viList = vehicleInfoDao.selectList(new QueryWrapper().eq("ccode", c.getCcode())); + List plateNumList = viList.stream().map(item -> item.getPlateNum()).toList(); + // 找该公司今天的订单 一块支付 + Date begin = DateUtil.beginOfDay(order.getOrderTime()); + Date end = DateUtil.offsetDay(begin, 1); + List orderList = orderSwapBatteryDao.selectList(new QueryWrapper() + .eq("status", 6).ne("del_flag", 1) + .ge("order_time", begin) + .le("order_time", end) + .in("plate_num", plateNumList)); + + // 公司钱包 + WalletAccount wa = walletAccountDao.selectOne(new QueryWrapper().eq("owner_id", c.getCcode())); + if (wa == null) { + return; + } + // 假装余额支付 + // 交易 + Integer amount = orderList.stream().collect(Collectors.summingInt(OrderSwapBattery::getAmount)); + Date d = new Date(); + TradeDetail td = new TradeDetail(); + td.setAppid("wx2ab384cf1e6f85a1"); + td.setTrader(c.getCname()); + td.setTraderCode(c.getCcode()); + td.setWallet(wa.getCode()); + td.setMchid("1695885921"); + td.setDelFlag(0); + String ddd = DateUtil.format(begin, DatePattern.PURE_DATE_PATTERN); + td.setDescription("TEST-假装余额支付公司车辆 " + ddd + " 订单"); + td.setOutTradeNo(CommonUtil.payTradeNo(2)); + td.setTradeType(TradeTypeEnums.PAYORDER.getCode()); + td.setTradeAmount(amount); + td.setPayType(1); + td.setPayResult("SUCCESS"); + td.setPayMsg("OK"); + td.setPayTime(d); + td.setCtime(d); + td.setCreater("TEST"); + tradeDetailDao.insert(td); + // 钱包 + // 添加明细 + WalletAccountDetail wad = new WalletAccountDetail(); + wad.setCode(wa.getCode()); + wad.setTradeType(td.getTradeType()); + wad.setTradeNo(td.getOutTradeNo()); + + wad.setPreTotalAmount(wa.getTotalAmount()); + wad.setPreRechargeAmount(wa.getRechargeAmount()); + wad.setPreGiftAmount(wa.getGiftAmount()); + + wad.setTradeRechargeAmount(-td.getTradeAmount()); + wad.setTradeGiftAmount(0); + wad.setTradeTotalAmount(wad.getTradeRechargeAmount() + wad.getTradeGiftAmount()); + + wad.setAfterRechargeAmount(wad.getPreRechargeAmount() + wad.getTradeRechargeAmount()); + wad.setAfterTotalAmount(wad.getPreTotalAmount() + wad.getTradeTotalAmount()); + wad.setAfterGiftAmount(wad.getPreGiftAmount() + wad.getTradeGiftAmount()); + + wad.setCreater("TEST"); + wad.setCtime(new Date()); + walletAccountDetailDao.insert(wad); + // 改余额 + wa.setTotalAmount(wad.getAfterTotalAmount()); + wa.setRechargeAmount(wad.getAfterRechargeAmount()); + wa.setGiftAmount(wad.getAfterGiftAmount()); + wa.setUptime(null); + walletAccountDao.updateById(wa); + + // 交易订单关系 + List list = new ArrayList(); + for (int i = 0; i < orderList.size(); i++) { + PreOrderRelationSwapOrder relationOrder = new PreOrderRelationSwapOrder(); + relationOrder.setPayApiType(null); + relationOrder.setOrderNo(orderList.get(i).getOrderNo()); + relationOrder.setCtime(d); + relationOrder.setDescription(td.getDescription()); + relationOrder.setOutTradeNo(td.getOutTradeNo()); + list.add(relationOrder); + } + preOrderRelationSwapOrderDao.insert(list); + + // 修改订单 + List idList = orderList.stream().map(i -> i.getPkId()).toList(); + orderSwapBatteryDao.update(new UpdateWrapper().in("pk_id", idList) + .set("status", OrderStatusEnums.FINISH.getCode()) + .set("trade_no", td.getOutTradeNo())); + } + + + + + private void wallatPayOrder(OrderSwapBattery order) { + // 付款人 + String wuid = order.getOrderPreUid(); + WechatUser user = wechatUserDao.selectOne(new QueryWrapper().eq("wuid", wuid)); + // 付款人钱包 + WalletAccount wa = walletAccountDao.selectOne(new QueryWrapper().eq("owner_id", wuid)); + if (wa == null) { + return; + } + // 假装余额支付 + // 交易 + Date d = new Date(); + TradeDetail td = new TradeDetail(); + td.setAppid("wx2ab384cf1e6f85a1"); + td.setTrader(user.getName()); + td.setTraderCode(user.getWuid()); + td.setWallet(wa.getCode()); + td.setMchid("1695885921"); + td.setDelFlag(0); + td.setDescription("TEST-假装余额支付订单"); + td.setOutTradeNo(CommonUtil.payTradeNo(2)); + td.setTradeType(TradeTypeEnums.PAYORDER.getCode()); + td.setTradeAmount(order.getAmount()); + td.setPayType(1); + td.setPayResult("SUCCESS"); + td.setPayMsg("OK"); + td.setPayTime(d); + td.setOrderNo(order.getOrderNo()); + td.setCtime(d); + td.setCreater("TEST"); + tradeDetailDao.insert(td); + // 钱包 + // 添加明细 + WalletAccountDetail wad = new WalletAccountDetail(); + wad.setCode(wa.getCode()); + wad.setTradeType(td.getTradeType()); + wad.setTradeNo(td.getOutTradeNo()); + + wad.setPreTotalAmount(wa.getTotalAmount()); + wad.setPreRechargeAmount(wa.getRechargeAmount()); + wad.setPreGiftAmount(wa.getGiftAmount()); + + wad.setTradeRechargeAmount(-td.getTradeAmount()); + wad.setTradeGiftAmount(0); + wad.setTradeTotalAmount(wad.getTradeRechargeAmount() + wad.getTradeGiftAmount()); + + wad.setAfterRechargeAmount(wad.getPreRechargeAmount() + wad.getTradeRechargeAmount()); + wad.setAfterTotalAmount(wad.getPreTotalAmount() + wad.getTradeTotalAmount()); + wad.setAfterGiftAmount(wad.getPreGiftAmount() + wad.getTradeGiftAmount()); + + wad.setCreater("TEST"); + wad.setCtime(new Date()); + walletAccountDetailDao.insert(wad); + // 改余额 + wa.setTotalAmount(wad.getAfterTotalAmount()); + wa.setRechargeAmount(wad.getAfterRechargeAmount()); + wa.setGiftAmount(wad.getAfterGiftAmount()); + wa.setUptime(null); + walletAccountDao.updateById(wa); + + // 修改订单 + afterPayAlterOrder(td, order); + } + + private void afterPayAlterOrder(TradeDetail tradeDetail, OrderSwapBattery one) { + OrderSwapBattery osb = new OrderSwapBattery(); + osb.setPkId(one.getPkId()); + osb.setStatus(OrderStatusEnums.FINISH.getCode()); + osb.setTradeNo(tradeDetail.getOutTradeNo()); + orderSwapBatteryDao.updateById(osb); + } + + +} diff --git a/cloud-manage-server/src/test/java/com/evotech/hd/cloud/ApplicationTest.java b/cloud-manage-server/src/test/java/com/evotech/hd/cloud/ApplicationTest.java new file mode 100644 index 0000000..2b0b517 --- /dev/null +++ b/cloud-manage-server/src/test/java/com/evotech/hd/cloud/ApplicationTest.java @@ -0,0 +1,28 @@ +package com.evotech.hd.cloud; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.evotech.hd.cloud.dao.BatteryStationDcDao; +import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; + +import jakarta.annotation.Resource; + +@SpringBootTest +public class ApplicationTest { + + @Resource + private BatteryStationDcDao batteryStationDcDao; + + @Test + void dcTest() { + // 修改电池状态 + BatteryStationDc dc = new BatteryStationDc(); + dc.setStatus(3); + dc.setSoc(100); + batteryStationDcDao.update(dc, new QueryWrapper().eq("bat_code", "YTDCCB1A2025021789U21YN6WO68KM")); + + } + +} diff --git a/gateway-server/src/main/java/com/evotech/hd/gateway/utils/ResponseUtils.java b/gateway-server/src/main/java/com/evotech/hd/gateway/utils/ResponseUtils.java index 11becf5..e8c7bdb 100644 --- a/gateway-server/src/main/java/com/evotech/hd/gateway/utils/ResponseUtils.java +++ b/gateway-server/src/main/java/com/evotech/hd/gateway/utils/ResponseUtils.java @@ -1,6 +1,9 @@ package com.evotech.hd.gateway.utils; import cn.hutool.json.JSONUtil; + +import java.nio.charset.StandardCharsets; + import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.HttpHeaders; @@ -11,8 +14,6 @@ import com.evotech.hd.common.core.entity.Result; import reactor.core.publisher.Mono; -import java.nio.charset.StandardCharsets; - public class ResponseUtils { diff --git a/pom.xml b/pom.xml index be7bff9..f8180ba 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ 3.35.0 3.3.4 - 5.8.32 + 5.8.35 1.8.8 2.0.0 diff --git a/resource-server/src/main/java/com/evotech/hd/resource/controller/BatteryTypeController.java b/resource-server/src/main/java/com/evotech/hd/resource/controller/BatteryTypeController.java index f19cd23..318d4dd 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/controller/BatteryTypeController.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/controller/BatteryTypeController.java @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController; import com.evotech.hd.common.core.entity.BasePageRequest; import com.evotech.hd.common.core.entity.Result; -import com.evotech.hd.resource.entity.BatteryType; +import com.evotech.hd.common.core.entity.resource.BatteryType; import com.evotech.hd.resource.service.BatteryTypeService; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport; diff --git a/resource-server/src/main/java/com/evotech/hd/resource/controller/CarTypeController.java b/resource-server/src/main/java/com/evotech/hd/resource/controller/CarTypeController.java index cae7fa9..9237ec2 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/controller/CarTypeController.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/controller/CarTypeController.java @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController; import com.evotech.hd.common.core.entity.BasePageRequest; import com.evotech.hd.common.core.entity.Result; -import com.evotech.hd.resource.entity.CarType; +import com.evotech.hd.common.core.entity.resource.CarType; import com.evotech.hd.resource.service.CarTypeService; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport; diff --git a/resource-server/src/main/java/com/evotech/hd/resource/service/BatteryTypeService.java b/resource-server/src/main/java/com/evotech/hd/resource/service/BatteryTypeService.java index f7e3dcd..506e138 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/service/BatteryTypeService.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/service/BatteryTypeService.java @@ -4,7 +4,7 @@ import java.util.List; import com.evotech.hd.common.core.entity.BasePageRequest; import com.evotech.hd.common.core.entity.Result; -import com.evotech.hd.resource.entity.BatteryType; +import com.evotech.hd.common.core.entity.resource.BatteryType; public interface BatteryTypeService { diff --git a/resource-server/src/main/java/com/evotech/hd/resource/service/CarTypeService.java b/resource-server/src/main/java/com/evotech/hd/resource/service/CarTypeService.java index 284ae93..7b6caaf 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/service/CarTypeService.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/service/CarTypeService.java @@ -4,7 +4,7 @@ import java.util.List; import com.evotech.hd.common.core.entity.BasePageRequest; import com.evotech.hd.common.core.entity.Result; -import com.evotech.hd.resource.entity.CarType; +import com.evotech.hd.common.core.entity.resource.CarType; public interface CarTypeService { diff --git a/resource-server/src/main/java/com/evotech/hd/resource/service/impl/BatteryTypeServiceImpl.java b/resource-server/src/main/java/com/evotech/hd/resource/service/impl/BatteryTypeServiceImpl.java index 5d5c004..372165b 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/service/impl/BatteryTypeServiceImpl.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/service/impl/BatteryTypeServiceImpl.java @@ -7,11 +7,11 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.evotech.hd.common.core.dao.resource.BatteryTypeDao; import com.evotech.hd.common.core.entity.BasePageRequest; import com.evotech.hd.common.core.entity.Result; +import com.evotech.hd.common.core.entity.resource.BatteryType; import com.evotech.hd.common.core.enums.CodeMsg; -import com.evotech.hd.resource.dao.BatteryTypeDao; -import com.evotech.hd.resource.entity.BatteryType; import com.evotech.hd.resource.service.BatteryTypeService; import jakarta.annotation.Resource; diff --git a/resource-server/src/main/java/com/evotech/hd/resource/service/impl/CarTypeServiceImpl.java b/resource-server/src/main/java/com/evotech/hd/resource/service/impl/CarTypeServiceImpl.java index 421340c..dde0dbb 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/service/impl/CarTypeServiceImpl.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/service/impl/CarTypeServiceImpl.java @@ -7,11 +7,11 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.evotech.hd.common.core.dao.resource.CarTypeDao; import com.evotech.hd.common.core.entity.BasePageRequest; import com.evotech.hd.common.core.entity.Result; +import com.evotech.hd.common.core.entity.resource.CarType; import com.evotech.hd.common.core.enums.CodeMsg; -import com.evotech.hd.resource.dao.CarTypeDao; -import com.evotech.hd.resource.entity.CarType; import com.evotech.hd.resource.service.CarTypeService; import jakarta.annotation.Resource; diff --git a/wechat-server/pom.xml b/wechat-server/pom.xml index 63d05fd..7eed564 100644 --- a/wechat-server/pom.xml +++ b/wechat-server/pom.xml @@ -72,6 +72,17 @@ cn.hutool hutool-json + + cn.hutool + hutool-extra + + + com.google.zxing + core + 3.5.3 + + + diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/entity/NativePayVO.java b/wechat-server/src/main/java/com/evotech/hd/wechat/entity/NativePayVO.java index 771bd67..5c04e2b 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/entity/NativePayVO.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/entity/NativePayVO.java @@ -18,10 +18,12 @@ import lombok.Data; @Schema(name = "Native下单参数") public class NativePayVO { - @Schema(description = "用户编码", requiredMode = RequiredMode.REQUIRED) - @NotBlank + @Schema(description = "用户编码") private String wuid; + @Schema(description = "公司编码") + private String ccode; + @Schema(description = "订单总描述", requiredMode = RequiredMode.REQUIRED) @NotBlank private String description; diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/entity/PrePayVO.java b/wechat-server/src/main/java/com/evotech/hd/wechat/entity/PrePayVO.java index a06ef02..1a8dc85 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/entity/PrePayVO.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/entity/PrePayVO.java @@ -22,6 +22,9 @@ public class PrePayVO { @NotBlank private String wuid; + @Schema(description = "公司编码") + private String ccode; + @Schema(description = "订单总描述", requiredMode = RequiredMode.REQUIRED) @NotBlank private String description; diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatNativePayServiceImpl.java b/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatNativePayServiceImpl.java index a6d1c85..d5a9631 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatNativePayServiceImpl.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatNativePayServiceImpl.java @@ -1,5 +1,6 @@ package com.evotech.hd.wechat.service.impl; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -9,11 +10,11 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao; import com.evotech.hd.common.core.dao.wechat.WechatUserDao; import com.evotech.hd.common.core.entity.Result; +import com.evotech.hd.common.core.entity.cloud.PreOrderRelationSwapOrder; import com.evotech.hd.common.core.entity.wechat.WechatPayPreOrder; -import com.evotech.hd.common.core.entity.wechat.WechatUser; import com.evotech.hd.common.core.utils.XCXUtil; import com.evotech.hd.wechat.config.XcxProperties; import com.evotech.hd.wechat.entity.NativePayVO; @@ -36,6 +37,8 @@ import com.wechat.pay.java.service.payments.nativepay.model.SceneInfo; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; @@ -54,14 +57,35 @@ public class WechatNativePayServiceImpl implements WechatNativePayService { private WechatUserDao wechatUserDao; @Resource private WechatPayComponent wechatPayComponent; + @Resource + private PreOrderRelationSwapOrderDao preOrderRelationSwapOrderDao; @Override public Result nativePrepay(NativePayVO prePay) { // 校验用户 - WechatUser wuser = wechatUserDao.selectOne(new QueryWrapper().eq("wuid", prePay.getWuid())); - if (wuser == null || !StringUtils.hasText(wuser.getOpenid())) { - return new Result().error("用户信息错误"); +// WechatUser wuser = wechatUserDao.selectOne(new QueryWrapper().eq("wuid", prePay.getWuid())); +// if (wuser == null || !StringUtils.hasText(wuser.getOpenid())) { +// return new Result().error("用户信息错误"); +// } + // 处理附加数据 + String outTradeNo = XCXUtil.payOutTradeNo(22); + JSONObject jo = JSONUtil.parseObj(prePay.getAttach()); + String[] orderNoArr = jo.getStr("orderNo").split(","); + List list = new ArrayList(); + for (int i = 0; i < orderNoArr.length; i++) { + PreOrderRelationSwapOrder relationOrder = new PreOrderRelationSwapOrder(); + relationOrder.setOrderNo(orderNoArr[i]); + relationOrder.setCtime(new Date()); + relationOrder.setDescription(prePay.getDescription()); + relationOrder.setOutTradeNo(outTradeNo); + list.add(relationOrder); } + preOrderRelationSwapOrderDao.insert(list); + + jo.remove("orderNo"); + prePay.setAttach(jo.toJSONString(0)); + + WechatPayPreOrder preOrder = new WechatPayPreOrder(); // 组装数据 PrepayRequest request = new PrepayRequest(); @@ -74,7 +98,7 @@ public class WechatNativePayServiceImpl implements WechatNativePayService { request.setMchid(xcxProperties.getMchid()); request.setDescription(prePay.getDescription()); request.setNotifyUrl(xcxProperties.getNativeNotifyUrl()); - request.setOutTradeNo(XCXUtil.payOutTradeNo(prePay.getStationCode())); + request.setOutTradeNo(outTradeNo); // 金额 Amount amount = new Amount(); // amount.setTotal(prePay.getMoney()); @@ -107,9 +131,17 @@ public class WechatNativePayServiceImpl implements WechatNativePayService { // System.out.println("\r\n=====response>>>>>" + response); // 写表 BeanUtils.copyProperties(request, preOrder); - wechatPayComponent.wechatPrePayLog(prePay.getWuid(), prePay.getCostPrice(), preOrder, JSONUtil.toJsonStr(response)); + wechatPayComponent.wechatPrePayLog(prePay.getWuid(), prePay.getCcode(), prePay.getCostPrice(), preOrder, JSONUtil.toJsonStr(response)); - return new Result().success(response); + JSONObject jo1 = JSONUtil.createObj(); + QrConfig config = new QrConfig(600, 600); + // 设置边距,即二维码和背景之间的边距 + config.setMargin(2); + String qrAsBase64String = QrCodeUtil.generateAsBase64(response.getCodeUrl(), config, "png"); + jo1.set("codeUrl", qrAsBase64String); + jo1.set("OutTradeNo", outTradeNo); + + return new Result().success(jo1); } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatPayServiceImpl.java b/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatPayServiceImpl.java index bc4f635..81607ad 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatPayServiceImpl.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/service/impl/WechatPayServiceImpl.java @@ -92,7 +92,7 @@ public class WechatPayServiceImpl implements WechatPayService { request.setMchid(xcxProperties.getMchid()); request.setDescription(prePay.getDescription()); request.setNotifyUrl(xcxProperties.getNotifyUrl()); - request.setOutTradeNo(XCXUtil.payOutTradeNo(prePay.getStationCode())); + request.setOutTradeNo(XCXUtil.payOutTradeNo(21)); // 金额 Amount amount = new Amount(); // amount.setTotal(prePay.getMoney()); @@ -127,7 +127,7 @@ public class WechatPayServiceImpl implements WechatPayService { // System.out.println("\r\n=====response>>>>>" + response); // 写表 BeanUtils.copyProperties(request, preOrder); - wechatPayComponent.wechatPrePayLog(prePay.getWuid(), prePay.getCostPrice(), preOrder, JSONUtil.toJsonStr(response)); + wechatPayComponent.wechatPrePayLog(prePay.getWuid(), prePay.getCcode(), prePay.getCostPrice(), preOrder, JSONUtil.toJsonStr(response)); return new Result().success(response); } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/utils/wechatpay/WechatPayComponent.java b/wechat-server/src/main/java/com/evotech/hd/wechat/utils/wechatpay/WechatPayComponent.java index ed1f103..be10928 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/utils/wechatpay/WechatPayComponent.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/utils/wechatpay/WechatPayComponent.java @@ -39,11 +39,12 @@ public class WechatPayComponent { * @param preOrder * @param jsonStrResponse */ - public void wechatPrePayLog(String wuid, Integer costPrice, WechatPayPreOrder preOrder, + public void wechatPrePayLog(String wuid, String ccode, Integer costPrice, WechatPayPreOrder preOrder, String jsonStrResponse) { preOrder.setPrePayResponse(jsonStrResponse); preOrder.setType(Transaction.TradeTypeEnum.NATIVE.name()); preOrder.setWuid(wuid); + preOrder.setCcode(ccode); preOrder.setCostPrice(costPrice); preOrder.setCtime(new Date()); preOrderDao.insert(preOrder); @@ -73,7 +74,7 @@ public class WechatPayComponent { tradeDetail.setTraderCode(payAttach.getTraderCode()); tradeDetail.setWallet(payAttach.getWalletCode()); tradeDetail.setDescription(payAttach.getDescription()); - if (payAttach.getType() == TradeTypeEnums.PAYORDER.getCode()) { + if (payAttach.getType() == TradeTypeEnums.PAYORDER.getCode() && Transaction.TradeTypeEnum.JSAPI.equals(transaction.getTradeType())) { tradeDetail.setOrderNo(payAttach.getOrderNo()); tradeDetail.setOrderCount(payAttach.getOrderNo().split(",").length); } @@ -91,7 +92,7 @@ public class WechatPayComponent { tradeDetail.setPayResult(transaction.getTradeState().name()); tradeDetail.setPayMsg(transaction.getTradeStateDesc()); - tradeDetail.setPayTime(DateUtil.parseUTC(transaction.getSuccessTime())); + tradeDetail.setPayTime(DateUtil.parseISO8601(transaction.getSuccessTime())); // 2. 处理订单,看要不要异步 cloudService.wechatPayNotifyHandle(tradeDetail); diff --git a/wechat-server/src/test/java/com/evotech/hd/wechat/WechatServerApplicationTests.java b/wechat-server/src/test/java/com/evotech/hd/wechat/WechatServerApplicationTests.java index 79582dc..cc0e8f0 100644 --- a/wechat-server/src/test/java/com/evotech/hd/wechat/WechatServerApplicationTests.java +++ b/wechat-server/src/test/java/com/evotech/hd/wechat/WechatServerApplicationTests.java @@ -1,10 +1,17 @@ package com.evotech.hd.wechat; +import java.util.Date; + import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import com.evotech.hd.common.core.dao.wechat.WechatUserDao; +import com.evotech.hd.common.core.entity.wechat.WechatUser; +import com.evotech.hd.common.core.utils.XCXUtil; +import com.evotech.hd.wechat.config.XcxProperties; import com.evotech.hd.wechat.service.AccessTokenService; +import cn.hutool.core.util.RandomUtil; import jakarta.annotation.Resource; @SpringBootTest @@ -12,12 +19,34 @@ class WechatServerApplicationTests { @Resource private AccessTokenService accessTokenService; + @Resource + private XcxProperties xcxProperties; + @Resource + private WechatUserDao wechatUserDao; +// @Test +// void contextLoads() { +// String res = accessTokenService.getAccessToken(); +// System.out.println(res); +// } + @Test - void contextLoads() { - String res = accessTokenService.getAccessToken(); - System.out.println(res); + void addUsers() { + for (int i = 0; i < 4000; i++) { + WechatUser user = new WechatUser(); + user.setOpenid("HD" + RandomUtil.randomString(28)); + user.setAppid(xcxProperties.getAppid()); + user.setWuid(XCXUtil.wechatUid(xcxProperties.getAppid(), user.getOpenid())); + user.setUnionid("hbyt-" + RandomUtil.randomString(22)); + user.setPhoneNumber("18888" + String.format("%06d", i)); + user.setNickName("昵称" + i); + user.setName("测试名称" + i); + user.setGender(RandomUtil.randomInt(1, 3)); + user.setCtime(new Date()); + wechatUserDao.insert(user); + } + } }