1. 增加流程测试数据,从预约-换电-充电-结算整个流程

2. 生成测试数据,大数据量测试
3. 增加企业用户批量订单支付功能
4. 调整首页数据查询方式,增加 订单和交易的 中间表 来进行按日期等条件的多维度中间表数据,提升首页数据的查询数据
5. 优化系统实现流程
6. 修改换电流程中的2处bug
This commit is contained in:
Administrator 2025-03-15 14:11:56 +08:00
parent 151220705c
commit d095c7d457
62 changed files with 2113 additions and 198 deletions

View File

@ -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<HomeDataOrderSwapCollate> {
}

View File

@ -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<HomeDataTradeCollate> {
}

View File

@ -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<PreOrderRelationSwapOrder> {
}

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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")

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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 {

View File

@ -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 {

View File

@ -29,6 +29,9 @@ public class WechatPayPreOrder implements Serializable {
@Schema(description = "用户编码")
private String wuid;
@Schema(description = "公司编码")
private String ccode;
private String openid;

View File

@ -14,7 +14,7 @@ public class CommonUtil {
*/
/**
* 交易编码30位预留2位不用
* @param type 1-微信支付 9-余额支付
* @param type 交易类型1-充值2-订单付款-余额21-订单付款-JSAPI21-订单付款-NATIVE 9-提现
* @return
*/
public static String payTradeNo(Integer type) {
@ -24,21 +24,27 @@ public class CommonUtil {
}
/**
* 余额支付交易编码 1-充值2-订单消费9-提现
* type交易类型1-充值2-订单付款-余额21-订单付款-JSAPI21-订单付款-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";
}

View File

@ -14,12 +14,11 @@ public class XCXUtil {
/**
* 微信支付订单号
* @param stationCode
* @param type 交易类型1-充值2-订单付款-余额21-订单付款-JSAPI21-订单付款-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);
}
}

View File

@ -83,6 +83,7 @@
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -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<OrderSwapBattery>> list(@ParameterObject PageListSwapOrderRequest plsor) {
return orderSwapBatteryService.list(plsor);
return orderSwapBatteryService.list(plsor);
}
@Operation(summary = "查询公司订单")
@GetMapping("/listcompanyorder")
@ApiOperationSupport(order = 7)
@Hidden
@Deprecated
public Result<List<OrderSwapBattery>> 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<String> companyWalletPay(@RequestParam String orderNo, String wuid, String uname) {
return orderSwapBatteryService.calculateCost(orderNo);
}
@Operation(summary = "公司订单扫码支付")
@PostMapping({"/wechat/nativepay"})
@ApiOperationSupport(order = 12)
public Result<String> companyNativePay(@RequestBody NativePayVO prePay) {
return orderSwapBatteryService.companyNativePay(prePay);
}
@Operation(summary = "扫码支付订单查询状态")
@GetMapping("/paystatus/query")
@ApiOperationSupport(order = 13)
public Result<String> orderQuery(String outTradeNo) {
return orderSwapBatteryService.orderQuery(outTradeNo);
}
}

View File

@ -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<String> 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<String> tradeDataCollate(String dayBegin, String dayEnd) {
return homeDataManualCollateService.tradeDataCollate(dayBegin, dayEnd);
}
}

View File

@ -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;
}

View File

@ -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<String, Long> stationRatio;
private List<HomeStationOrderData> stationOrderDataList;
}

View File

@ -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;

View File

@ -11,7 +11,7 @@ public class HomeData5 {
private String month;
@Schema(description = "数量")
private Integer totalOrder;
private Integer quantity;
@Schema(description = "金额")
private Integer totalMoney;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -21,7 +21,7 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@Component
//@Component
@Order(value = 20)
@Slf4j
public class MqttConnectInit implements ApplicationRunner {

View File

@ -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;

View File

@ -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());

View File

@ -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);
}

View File

@ -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<VehicleInfo>().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<BatteryStationDc>().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<BatteryStationDc>().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<BatteryStationDc>().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<OrderSwapBattery>().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;
}

View File

@ -0,0 +1,11 @@
package com.evotech.hd.cloud.service;
import com.evotech.hd.common.core.entity.Result;
public interface HomeDataManualCollateService {
public Result<String> orderSwapDataCollate(String dayBegin, String dayEnd, String stationCode);
public Result<String> tradeDataCollate(String dayBegin, String dayEnd);
}

View File

@ -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<OrderSwapBattery>> list(PageListSwapOrderRequest plsor);
public Result<List<OrderSwapBattery>> listByCompany(PageListSwapOrderRequest plsor);
public Result<List<OrderSwapBatteryStep>> listStep(String orderNo);
public Result<String> calculateCost(String orderNo);
@ -31,5 +34,9 @@ public interface OrderSwapBatteryService {
public Result<String> calculateCost(OrderSwapBattery osb);
public Result<String> walletPay(String orderNo, String wuid, String uname);
public Result<String> companyNativePay(NativePayVO prePay);
public Result<String> orderQuery(String outTradeNo);
}

View File

@ -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<Integer>().success(n);
}
@ -76,7 +76,7 @@ public class BatteryStationDcServiceImpl implements BatteryStationDcService {
page = batteryStationDcDao.selectPage(page, new QueryWrapper<BatteryStationDc>()
.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<List<BatteryStationDc>>().error(CodeMsg.DATABASE_RESULT_NULL);
}

View File

@ -25,7 +25,7 @@ public class BatteryStationHdFeeStandardDetailServiceImpl implements BatteryStat
boolean b = batteryStationHdFeeStandardDetailDao.exists(new QueryWrapper<BatteryStationHdFeeStandardDetail>()
.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<Integer>().error("换电站费用标准明细时间冲突!");

View File

@ -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<String> orderSwapDataCollate(String dayBegin, String dayEnd, String stationCode) {
if (Integer.valueOf(dayEnd) < Integer.valueOf(dayBegin)) {
return new Result<String>().error("日期填写错误");
}
// 天数
List<String> dayStringList = new ArrayList<String>();
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<OrderSwapBattery> orderList = orderSwapBatteryDao.selectList(new QueryWrapper<OrderSwapBattery>()
.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<String, Map<Integer, List<OrderSwapBattery>>> map = orderList.stream().collect(Collectors.groupingBy(OrderSwapBattery::getStationCode, Collectors.groupingBy(OrderSwapBattery::getStatus)));
Date d = new Date();
List<HomeDataOrderSwapCollate> orderSwapCollateList = new ArrayList<HomeDataOrderSwapCollate>();
for (Map.Entry<String, Map<Integer, List<OrderSwapBattery>>> m : map.entrySet()) {
String stationCodeKey = m.getKey();
Map<Integer, List<OrderSwapBattery>> statusMap = m.getValue();
for (Map.Entry<Integer, List<OrderSwapBattery>> entry : statusMap.entrySet()) {
Integer status = entry.getKey();
List<OrderSwapBattery> 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<HomeDataOrderSwapCollate>().eq("day", dayString));
homeDataOrderSwapCollateDao.insert(orderSwapCollateList);
log.info("\r\n===>>> {} 订单数据 {} 条,整理出记录 {} 条", dayString, orderList.size(), orderSwapCollateList.size());
}
return new Result<String>().success("整理了 " + dayStringList.size() + " 天的订单数据");
}
@Override
public Result<String> tradeDataCollate(String dayBegin, String dayEnd) {
if (Integer.valueOf(dayEnd) < Integer.valueOf(dayBegin)) {
return new Result<String>().error("日期填写错误");
}
// 天数
List<String> dayStringList = new ArrayList<String>();
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<TradeDetail> tradeList = tradeDetailDao.selectList(new QueryWrapper<TradeDetail>()
.eq("del_flag", 0)
.ge("pay_time", DateUtil.beginOfDay(day))
.le("pay_time", DateUtil.endOfDay(day)));
if (tradeList.isEmpty()) {
continue;
}
Map<Integer, Map<Integer, List<TradeDetail>>> map = tradeList.stream().collect(Collectors.groupingBy(TradeDetail::getTradeType, Collectors.groupingBy(TradeDetail::getPayType)));
Date d = new Date();
List<HomeDataTradeCollate> tradeCollateList = new ArrayList<HomeDataTradeCollate>();
for (Map.Entry<Integer, Map<Integer, List<TradeDetail>>> m : map.entrySet()) {
Integer tradeType = m.getKey();
Map<Integer, List<TradeDetail>> payTypeMap = m.getValue();
for (Map.Entry<Integer, List<TradeDetail>> entry : payTypeMap.entrySet()) {
Integer payType = entry.getKey();
List<TradeDetail> 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<HomeDataTradeCollate>().eq("day", dayString));
homeDataTradeCollateDao.insert(tradeCollateList);
log.info("\r\n===>>> {} 订单数据 {} 条,整理出记录 {} 条", dayString, tradeList.size(), tradeCollateList.size());
}
return new Result<String>().success("整理了 " + dayStringList.size() + " 天的订单数据");
}
}

View File

@ -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> homeData1(HomeDataRequest hd) {
@ -127,26 +130,36 @@ public class HomeServiceImpl implements HomeService {
return new Result<HomeData3>().error("时间范围未填写!");
}
HomeData3 data = new HomeData3();
// 订单
List<OrderSwapBattery> orderList = orderSwapBatteryDao.selectList(new QueryWrapper<OrderSwapBattery>()
.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<HomeDataOrderSwapCollate> collateList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
.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<String, Long> map = orderList.parallelStream().map(i -> {
i.setStationCode(i.getStationCode() + "---" + i.getStationName());
return i;
}).collect(Collectors.groupingBy(OrderSwapBattery::getStationCode, Collectors.counting()));
data.setStationRatio(map);
Map<String, Integer> map = collateList.stream()
.collect(Collectors.groupingBy(HomeDataOrderSwapCollate::getStationCode,
Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity)));
List<BatteryStation> stationList = batteryStationDao.selectList(new QueryWrapper<BatteryStation>());
List<HomeStationOrderData> stationOrderDataList = new ArrayList<HomeStationOrderData>();
for (Map.Entry<String, Integer> 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<HomeData3>().success(data);
}
@ -156,19 +169,26 @@ public class HomeServiceImpl implements HomeService {
return new Result<HomeData4>().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<TradeDetail> tradeList = tradeDetailDao.selectList(new QueryWrapper<TradeDetail>()
.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<HomeDataTradeCollate> collateList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.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<HomeData4>().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<OrderSwapBattery> orderList = orderSwapBatteryDao.selectList(new QueryWrapper<OrderSwapBattery>()
String beginDay = DateUtil.format(DateUtil.beginOfMonth(DateUtil.offsetMonth(d, -6)), DatePattern.PURE_DATE_FORMAT);
List<HomeDataOrderSwapCollate> collateList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
.eq(StringUtils.hasText(hd.getStationCode()), "station_code", hd.getStationCode())
.ge("order_time", beginTime));
.ge("day", beginDay));
Map<String, Long> 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<String, Integer> map1 = collateList.stream()
.collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity)));
System.out.println(map1);
Map<String, Integer> 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<String, Integer> 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<List<HomeData5>>().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<TradeDetail> tradeList = tradeDetailDao.selectList(new QueryWrapper<TradeDetail>()
.eq("del_flag", 0)
.ge("pay_time", beginTime));
// 成功交易
List<TradeDetail> 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<HomeDataTradeCollate> collateList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.ge("day", beginDay));
// 余额支付
Map<String, Integer> 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<String, Integer> 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<Object, Integer> 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<String, Integer> 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<String, Integer> 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<Object, Integer> 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<String, Integer> map2 = collateList.stream().filter(i -> i.getTradeType() == TradeTypeEnums.REFUND.getCode())
.collect(Collectors.groupingBy(i -> i.getDay().substring(0, 6), Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)));
Map<String, Integer> 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<List<HomeData6>>().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<OrderSwapBattery>()
.ne("status", OrderStatusEnums.CANCLE.getCode())
.ge("order_time", lastBeginOfMonth)
.lt("order_time", beginOfMonth));
Long lastMonthCount = orderSwapBatteryDao.selectCount(new QueryWrapper<OrderSwapBattery>()
.ne("status", OrderStatusEnums.CANCLE.getCode())
.ge("order_time", last2BeginOfMonth)
.lt("order_time", lastBeginOfMonth));
Long lastYearCount = orderSwapBatteryDao.selectCount(new QueryWrapper<OrderSwapBattery>()
.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<HomeDataOrderSwapCollate> monthList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
// .ne("status", OrderStatusEnums.CANCLE.getCode())
.ge("day", lastBeginDayOfMonth)
.lt("day", beginDayOfMonth));
data.setQuantity(monthList.isEmpty()?0:monthList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity)));
List<HomeDataOrderSwapCollate> lastMonthList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
// .ne("status", OrderStatusEnums.CANCLE.getCode())
.ge("day", last2BeginDayOfMonth)
.lt("day", lastBeginDayOfMonth));
data.setLastMonthQuantity(lastMonthList.isEmpty()?0:lastMonthList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity)));
List<HomeDataOrderSwapCollate> lastYearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
// .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<HomeDataTradeCollate> tradeList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.ge("day", lastBeginDayOfMonth)
.lt("day", beginDayOfMonth));
data.setTradeAmount(tradeList.isEmpty()?0:tradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)));
List<HomeDataTradeCollate> lastMonthTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.ge("day", last2BeginDayOfMonth)
.lt("day", lastBeginDayOfMonth));
data.setLastMonthTradeAmount(lastMonthTradeList.isEmpty()?0:lastMonthTradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)));
List<HomeDataTradeCollate> lastYearTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.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<HomeData7>().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<OrderSwapBattery>()
.ne("status", OrderStatusEnums.CANCLE.getCode())
.ge("order_time", lastBeginOfYear)
.lt("order_time", beginOfYear));
Long lastYearCount = orderSwapBatteryDao.selectCount(new QueryWrapper<OrderSwapBattery>()
.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<HomeDataOrderSwapCollate> yearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
// .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<HomeDataOrderSwapCollate> lastYearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
// .ne("status", OrderStatusEnums.CANCLE.getCode())
.ge("day", lastBeginDayOfYear)
.lt("day", beginDayOfYear));
data.setLastYearQuantity(lastYearList.isEmpty()?0:lastYearList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity)));
List<HomeDataOrderSwapCollate> last2YearList = homeDataOrderSwapCollateDao.selectList(new QueryWrapper<HomeDataOrderSwapCollate>()
// .ne("status", OrderStatusEnums.CANCLE.getCode())
.ge("day", last2BeginDayOfYear)
.lt("day", lastBeginDayOfYear));
data.setLast2YearQuantity(last2YearList.isEmpty()?0:last2YearList.stream().collect(Collectors.summingInt(HomeDataOrderSwapCollate::getQuantity)));
// 交易
List<HomeDataTradeCollate> tradeList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.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<HomeDataTradeCollate> lastYearTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.ge("day", lastBeginDayOfYear)
.lt("day", beginDayOfYear));
data.setLastYearTradeAmount(lastYearTradeList.isEmpty()?0:lastYearTradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)));
List<HomeDataTradeCollate> last2YearTradeList = homeDataTradeCollateDao.selectList(new QueryWrapper<HomeDataTradeCollate>()
.ge("day", last2BeginDayOfYear)
.lt("day", lastBeginDayOfYear));
data.setLast2YearTradeAmount(last2YearTradeList.isEmpty()?0:last2YearTradeList.stream().collect(Collectors.summingInt(HomeDataTradeCollate::getTradeAmount)));
return new Result<HomeData7>().success(data);
}

View File

@ -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<Integer> 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<OrderSwapBattery> page = new Page<OrderSwapBattery>(plsor.getPageNo(), plsor.getPageSize());
List<String> plateNumList = new ArrayList<String>();
if (StringUtils.hasText(plsor.getPlateNums())) {
if (StringUtils.hasText(plsor.getCcode())) {
List<VehicleInfo> vehicleList = vehicleInfoDao.selectList(new QueryWrapper<VehicleInfo>().eq("ccode", plsor.getCcode()));
if (vehicleList.isEmpty()) {
return new Result<List<OrderSwapBattery>>().error("未发现该公司车辆");
}
plateNumList = vehicleList.stream().map(i -> i.getPlateNum()).toList();
} else if (StringUtils.hasText(plsor.getPlateNums())) {
plateNumList = Arrays.asList(plsor.getPlateNums().split(","));
}
List<Integer> statusList = new ArrayList<Integer>();
@ -193,6 +206,33 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
}
return new Result<List<OrderSwapBattery>>().success(page);
}
@Override
public Result<List<OrderSwapBattery>> listByCompany(PageListSwapOrderRequest plsor) {
if (!StringUtils.hasText(plsor.getCcode())) {
return new Result<List<OrderSwapBattery>>().error("参数错误");
}
if (plsor.getOrderTimeBegin() == null || plsor.getOrderTimeEnd() == null) {
return new Result<List<OrderSwapBattery>>().error("参数错误");
}
Page<OrderSwapBattery> page = new Page<OrderSwapBattery>(plsor.getPageNo(), plsor.getPageSize());
List<VehicleInfo> vehicleList = vehicleInfoDao.selectList(new QueryWrapper<VehicleInfo>().eq("ccode", plsor.getCcode()));
if (vehicleList.isEmpty()) {
return new Result<List<OrderSwapBattery>>().error("未发现该公司车辆");
}
List<String> plateNumList = vehicleList.stream().map(i -> i.getPlateNum()).toList();
page = orderSwapBatteryDao.selectPage(page, new QueryWrapper<OrderSwapBattery>()
.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<List<OrderSwapBattery>>().error(CodeMsg.DATABASE_RESULT_NULL);
}
return new Result<List<OrderSwapBattery>>().success(page);
}
@Override
public Result<List<OrderSwapBatteryStep>> listStep(String orderNo) {
@ -331,4 +371,14 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
return new Result<String>().success("OK");
}
@Override
public Result<String> companyNativePay(NativePayVO prePay) {
return wechatService.wechatNativePay(prePay);
}
@Override
public Result<String> orderQuery(String outTradeNo) {
return wechatService.orderQuery(2, outTradeNo);
}
}

View File

@ -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<String> orderNoList = Arrays.asList(tradeDetail.getOrderNo().split(","));
List<PreOrderRelationSwapOrder> list = preOrderRelationSwapOrderDao.selectList(new QueryWrapper<PreOrderRelationSwapOrder>().eq("out_trade_no", tradeDetail.getOutTradeNo()));
List<String> orderNoList = list.stream().map(i -> i.getOrderNo()).toList();
List<OrderSwapBattery> orderList = orderSwapBatteryDao.selectList(new QueryWrapper<OrderSwapBattery>()
.eq("status", 6).in("order_no", orderNoList));
if (orderList.size() != orderNoList.size()) {
@ -126,7 +131,6 @@ public class WechatPayNotifyHandleService {
orderSwapBatteryDao.update(new UpdateWrapper<OrderSwapBattery>().in("pk_id", idList)
.set("status", OrderStatusEnums.FINISH.getCode())
.set("trade_no", tradeDetail.getOutTradeNo()));
// 发送公众号消息发给企业绑定的微信号
// templateMessageService.orderMessageSend(one, 3);
}

View File

@ -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<String> rechargeMessage(@ParameterObject TradeDetail trade, @RequestParam Integer money);
@PostMapping(value = "/wechat/wechatpay/native/prepay",
consumes = {MediaType.APPLICATION_JSON_VALUE})
public Result<String> wechatNativePay(@RequestBody NativePayVO prePay);
@GetMapping(value = "/wechat/wechatpay/native/order/query",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Result<String> orderQuery(@RequestParam Integer type, @RequestParam String outTradeNo);
}

View File

@ -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<OrderSwapBattery> list = orderSwapBatteryDao.selectList(new QueryWrapper<OrderSwapBattery>()
.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<String> 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===>>>订单数据整理完成");
}
}

View File

@ -16,7 +16,7 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@Component
//@Component
@Slf4j
public class OrderCostCalculateTask {

View File

@ -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-pathadmin-server要想发现正确路径需要加这个

View File

@ -12,8 +12,11 @@
<result column="source_from" property="sourceFrom" />
<result column="source_code" property="sourceCode" />
<result column="status" property="status" />
<result column="station_code" property="stationCode" />
<result column="point_type" property="pointType" />
<result column="point_code" property="pointCode" />
<result column="point_name" property="pointName" />
<result column="soc" property="soc" />
<result column="dcc_no" property="dccNo" />
<result column="del_flag" property="delFlag" />
<result column="ctime" property="ctime" />
<result column="creater" property="creater" />
@ -23,7 +26,7 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
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
</sql>
<select id="getDcByStationCode" resultMap="BaseResultMap">
@ -32,7 +35,7 @@
FROM
yt_t_battery_station_dc
WHERE
station_code = #{stationCode}
point_code = #{stationCode}
</select>
</mapper>

File diff suppressed because it is too large Load Diff

View File

@ -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<BatteryStationDc>().eq("bat_code", "YTDCCB1A2025021789U21YN6WO68KM"));
}
}

View File

@ -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 {

View File

@ -36,7 +36,7 @@
<redission.version>3.35.0</redission.version>
<spring-boot-admin.version>3.3.4</spring-boot-admin.version>
<!-- Commons component Settings -->
<hutool.version>5.8.32</hutool.version>
<hutool.version>5.8.35</hutool.version>
<sentinel.version>1.8.8</sentinel.version>
<seata.version>2.0.0</seata.version>
<!--<fastjson.version>2.0.9</fastjson.version>-->

View File

@ -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;

View File

@ -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;

View File

@ -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 {

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -72,6 +72,17 @@
<groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-extra</artifactId>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>
<build>

View File

@ -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;

View File

@ -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;

View File

@ -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<String> nativePrepay(NativePayVO prePay) {
// 校验用户
WechatUser wuser = wechatUserDao.selectOne(new QueryWrapper<WechatUser>().eq("wuid", prePay.getWuid()));
if (wuser == null || !StringUtils.hasText(wuser.getOpenid())) {
return new Result<String>().error("用户信息错误");
// WechatUser wuser = wechatUserDao.selectOne(new QueryWrapper<WechatUser>().eq("wuid", prePay.getWuid()));
// if (wuser == null || !StringUtils.hasText(wuser.getOpenid())) {
// return new Result<String>().error("用户信息错误");
// }
// 处理附加数据
String outTradeNo = XCXUtil.payOutTradeNo(22);
JSONObject jo = JSONUtil.parseObj(prePay.getAttach());
String[] orderNoArr = jo.getStr("orderNo").split(",");
List<PreOrderRelationSwapOrder> list = new ArrayList<PreOrderRelationSwapOrder>();
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<String>().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<String>().success(jo1);
}

View File

@ -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<String>().success(response);
}

View File

@ -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);

View File

@ -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);
}
}
}