订单改版中--未完成代码

This commit is contained in:
andy 2025-05-26 16:45:35 +08:00
parent dfeb83d111
commit f44d78c94c
63 changed files with 4225 additions and 2857 deletions

View File

@ -37,6 +37,21 @@ public class Result<T> implements Serializable {
return this;
}
public Result<T> error(String errMsg) {
this.status = 1;
this.code = CodeMsg.ERROR.getCode();
this.msg = errMsg;
return this;
}
public Result<T> error(String errMsg, T data) {
this.status = 1;
this.code = CodeMsg.ERROR.getCode();
this.msg = errMsg;
this.data = data;
return this;
}
public Result<T> error(CodeMsg codeMsg) {
this.status = 1;
this.code = codeMsg.getCode();

View File

@ -1,4 +1,4 @@
package com.evotech.hd.common.core.Dto;
package com.evotech.hd.common.core.Dto.device;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.evotech.hd.common.core.Dto.result.home;
package com.evotech.hd.common.core.Dto.home;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@ -1,4 +1,4 @@
package com.evotech.hd.common.core.Dto.result.home;
package com.evotech.hd.common.core.Dto.home;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.evotech.hd.common.core.Dto.result.home;
package com.evotech.hd.common.core.Dto.home;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -0,0 +1,52 @@
package com.evotech.hd.common.core.Dto.order;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
*
*
* @ClassName:OrderListVo
* @date: 2025年05月16日 13:54
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@Schema(name = "订单列表")
public class OrderListVo {
@Schema(description = "唯一标识")
private Integer pkId;
@Schema(description = "订单编号")
private String orderNo;
@Schema(name = "订单类型", description = "1=换电;2=充电")
private Integer orderType;
@Schema(name = "车牌号")
private String plateNum;
@Schema(name = "换电站")
private String stationName;
@Schema(name = "预约人")
private String perName;
@Schema(name = "订单时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date orderTime;
@Schema(name = "订单状态", description = "订单状态1-已创建2-换电中3-换电完成4-充电中5-充电完成6-待结算7-已完成9-已取消, -1-退款")
private Integer orderStatus;
@Schema(name = "交易编码", description = "第三方收款返回的唯一标识")
private String notifyOrderNo;
}

View File

@ -0,0 +1,53 @@
package com.evotech.hd.common.core.Dto.request.order;
import com.evotech.hd.common.core.entity.BasePageRequest;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
*
*
* @ClassName:OrderRequest
* @date: 2025年05月16日 15:28
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@Schema(name = "查询订单请求参数", hidden = true)
@EqualsAndHashCode(callSuper=false)
public class OrderRequest extends BasePageRequest {
@Schema(description = "订单编码")
private String orderNo;
@Schema(description = "车牌号")
private String plateNum;
@Schema(description = "订单时间开始", example = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date orderTimeBegin;
@Schema(description = "订单时间结束")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date orderTimeEnd;
@Schema(description = "换电站编码")
private String stationCode;
@Schema(description = "交易编码")
private String tradeNo;
@Schema(description = "订单状态1-已创建2-换电中3-换电完成4-充电中5-充电完成6-待结算7-已完成9-已取消")
private String status;
}

View File

@ -2,6 +2,16 @@ package com.evotech.hd.common.core.constant;
public interface HDConstant {
/***
* 全局删除标识-已删除
*/
final static Integer DELETE_YES = 1;
/***
* 全局删除标识-未删除
*/
final static Integer DELETE_NO = 0;
/***
* 大华设备相关CONSTANT
*/
@ -12,6 +22,108 @@ public interface HDConstant {
}
/***
* 订单相关参数
*/
final class OrderConstant{
/***
* 计费方式-ODO(里程数)
*/
public static final int FEE_TYPE_ODO = 1;
/***
* 计费方式-SOC(电池百分比)
*/
public static final int FEE_TYPE_SOC = 2;
/***
* 计费方式-电量
*/
public static final int FEE_TYPE_DL = 3;
/***
* 换电模式 全自动
*/
public static final Integer CHANGE_MODE_AUTOMATIC = 1;
/***
* 换电模式 半自动
*/
public static final Integer CHANGE_MODE_AUTOMATIC_SEMI = 2;
/***
* 换电模式 人工干预
*/
public static final Integer CHANGE_MODE_ARTIFICIAL = 3;
/***
* 换电车道 A
*/
public static final Integer CHANGE_LANE_A = 1;
/***
* 换电车道 B
*/
public static final Integer CHANGE_LANE_B = 2;
/***
* 订单类型-充电
*/
public static final Integer ORDER_TYPE_CHARGING = 2;
/***
* 订单类型-换电
*/
public static final Integer ORDER_TYPE_SWAP = 1;
/***
* 支付方式-支付宝支付
*/
public static final String PAY_TYPE_ALI_PAY = "aliPay";
/***
* 支付方式-微信支付
*/
public static final String PAY_TYPE_WECHAT_PAY = "wechatPay";
/***
* 支付方式-余额支付
*/
public static final String PAY_TYPE_BALANCE_PAY = "balancePay";
//
// /***
// * 订单状态-已创建
// */
// public static final Integer ORDER_STATUS_CREATE = 1;
// /***
// * 订单状态-换电中
// */
// public static final Integer ORDER_STATUS_BATTERY_SWAPPING = 2;
// /***
// * 订单状态-换电完成
// */
// public static final Integer ORDER_STATUS_BATTERY_SWAPPING_END = 3;
// /***
// * 订单状态-充电中
// */
// public static final Integer ORDER_STATUS_CHARGING = 4;
// /***
// * 订单状态-充电完成
// */
// public static final Integer ORDER_STATUS_CHARGING_END = 5;
// /***
// * 订单状态-待结算
// */
// public static final Integer ORDER_STATUS_TO_BE_SETTLED = 6;
// /***
// * 订单状态-已完成
// */
// public static final Integer ORDER_STATUS_END = 7;
// /***
// * 订单状态-已取消
// */
// public static final Integer ORDER_STATUS_CLOSE = 9;
// /***
// * 订单状态-退款
// */
// public static final Integer ORDER_STATUS_REFUND = -1;
}
/***
* 大华设备相关CONSTANT
*/
@ -33,7 +145,6 @@ public interface HDConstant {
}
/***
* 权限相关CONSTANT
*/
@ -113,14 +224,14 @@ public interface HDConstant {
*/
String JWT_PAYLOAD_KEY = "payload";
/**
* jwt中添加的属性
*/
String USER_ID_KEY = "uid";
String ROLE_CODE_KEY = "rcodes";
/**
* 登陆验证码缓存key
* hd:login:captcha: + captchaId
@ -132,37 +243,37 @@ public interface HDConstant {
* key: hd:login:jti:token
*/
String LOGIN_CACHE_KEY_PREFIX = "hd:login:";
/**
* 缓存系统token有效时间s
*/
String HD_CACHE_TOKEN_EXP_KEY = "hd:cache:tokenExp";
/**
* 资源权限类型
*/
String RESOURCE_TYPE_PERM = "PER";
String RESOURCE_TYPE_MENU = "MENU";
/**
* 交换数据非对称加密RSA秘钥前缀
*/
String HD_STATION_SECRET_KEY_RSA_PREFIX = "hd:station:secretKey:rsa:";
/**
* 交换数据对称加密AES秘钥前缀
* 交换数据对称加密AES秘钥前缀
*/
String HD_STATION_SECRET_KEY_AES_PREFIX = "hd:station:secretKey:aes:";
/**
* 微信服务请求头中权限验证字段
*/
String WECHAT_SERVER_AUTHORIZATION_KEY = "WXUID";
String WECHAT_SERVER_TOKEN_KEY = "WXTOKEN";
/**
* 微信登录缓存数据前缀
*/

View File

@ -1,43 +1,43 @@
package com.evotech.hd.common.core.dao.cloud;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.common.core.Dto.request.HomeRequestDto;
import com.evotech.hd.common.core.Dto.result.home.*;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.permission.DataScope;
import com.evotech.hd.common.core.permission.DataScopes;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
* @author zrb
* @since 2024-11-22
*/
@DataScopes({
@DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE),
@DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE),
})
//@DataScopeOpenMethod(openMethod = true, methodName = {"homeFindHalfYearAmountData"})
public interface OrderSwapBatteryDao extends BaseMapper<OrderSwapBattery> {
List<HomeOrderSwapBatteryProportionDto> homeFindProportionData(@Param("params") HomeRequestDto params);
List<HomeOrderSwapBatteryAmountDto> homeFindAmountData(@Param("params") HomeRequestDto params);
List<HomeOrderSwapBatteryHalfYearDto> homeFindHalfYearOrderData(@Param("params") HomeRequestDto params);
// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, tableAlias = "osb", permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE)
List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearAmountData(@Param("params") HomeRequestDto params);
//因为站端不需要显示金额, 所有重新写一个
List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearStationAmountData(@Param("params") HomeRequestDto params);
Long homeFindOrderCountData(@Param("date") Date date);
Double homeFindOrderAmountData(@Param("date") Date date);
List<HomeOrderInfo> findOrderListByStatus(@Param("status") Integer status);
}
//package com.evotech.hd.common.core.dao.cloud;
//
//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
//import com.evotech.hd.common.core.Dto.request.HomeRequestDto;
//import com.evotech.hd.common.core.Dto.result.home.*;
//import com.evotech.hd.common.core.constant.HDConstant;
//import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
//import com.evotech.hd.common.core.permission.DataScope;
//import com.evotech.hd.common.core.permission.DataScopes;
//import org.apache.ibatis.annotations.Param;
//
//import java.util.Date;
//import java.util.List;
//
///**
// * @author zrb
// * @since 2024-11-22
// */
//@DataScopes({
// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE),
// @DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE),
//})
////@DataScopeOpenMethod(openMethod = true, methodName = {"homeFindHalfYearAmountData"})
//public interface OrderSwapBatteryDao extends BaseMapper<OrderSwapBattery> {
//
//
// List<HomeOrderSwapBatteryProportionDto> homeFindProportionData(@Param("params") HomeRequestDto params);
//
// List<HomeOrderSwapBatteryAmountDto> homeFindAmountData(@Param("params") HomeRequestDto params);
//
// List<HomeOrderSwapBatteryHalfYearDto> homeFindHalfYearOrderData(@Param("params") HomeRequestDto params);
//
//// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, tableAlias = "osb", permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE)
// List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearAmountData(@Param("params") HomeRequestDto params);
// //因为站端不需要显示金额, 所有重新写一个
// List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearStationAmountData(@Param("params") HomeRequestDto params);
//
// Long homeFindOrderCountData(@Param("date") Date date);
//
// Double homeFindOrderAmountData(@Param("date") Date date);
//
// List<HomeOrderInfo> findOrderListByStatus(@Param("status") Integer status);
//}

View File

@ -2,18 +2,12 @@ package com.evotech.hd.common.core.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import jakarta.validation.constraints.Min;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
@ -23,25 +17,16 @@ import java.util.Date;
*/
@Data
@Schema(name = "BaseEntity", description = "基础实体类")
public class BaseEntity implements Serializable {
public class BaseEntity extends IdEntity {
private static final long serialVersionUID = 1L;
@TableId(value = "pk_id", type = IdType.AUTO)
@Hidden
private Integer pkId;
@Schema(description = "创建人", hidden = true)
@TableField(fill = FieldFill.INSERT)
private String creater;
@Schema(description = "创建时间", hidden = true)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private Date ctime;
@Schema(description = "更新人", hidden = true)
@TableField(fill = FieldFill.UPDATE)
private String updater;

View File

@ -0,0 +1,39 @@
package com.evotech.hd.common.core.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
*
*
* @ClassName:IdEntity
* @date: 2025年05月16日 11:08
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
public class IdEntity implements Serializable {
@TableId(value = "pk_id", type = IdType.AUTO)
@Hidden
private Integer pkId;
@Schema(description = "创建时间", hidden = true)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private Date ctime;
}

View File

@ -1,27 +1,19 @@
package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.IdType;
import cn.hutool.core.date.DatePattern;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import cn.hutool.core.date.DatePattern;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* @author zrb
* @since 2024-10-17
@ -44,6 +36,9 @@ public class BatteryStationHdFeeStandard extends BaseEntity implements Serializa
@Schema(description = "换电站编码")
private String stationName;
@Schema(description = "基本服务费")
private BigDecimal serviceFee;
@Schema(description = "开始日期", requiredMode = RequiredMode.REQUIRED, example = DatePattern.PURE_DATE_PATTERN)
@NotBlank(message = "开始时间不能为空")
private String dayBegin;
@ -61,6 +56,9 @@ public class BatteryStationHdFeeStandard extends BaseEntity implements Serializa
@Schema(description = "每度电收费")
private BigDecimal eachKwhFee;
@Schema(description = "正常换电服务费")
private BigDecimal commonRemainFee;

View File

@ -1,26 +1,19 @@
package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import cn.hutool.core.date.DatePattern;
import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import cn.hutool.core.date.DatePattern;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalTime;
/**
* @author zrb
@ -42,6 +35,9 @@ public class BatteryStationHdFeeStandardDetail extends BaseEntity implements Ser
@NotNull
private Integer standardId;
@Schema(description = "服务费")
private BigDecimal serviceFee;
@Schema(description = "每公里收费")
private BigDecimal eachKmFee;
@ -61,6 +57,5 @@ public class BatteryStationHdFeeStandardDetail extends BaseEntity implements Ser
@DateTimeFormat(pattern = DatePattern.NORM_TIME_PATTERN)
private LocalTime timeEnd;
@Schema(description = "谷段服务费")
private BigDecimal timeServiceFee;
}

View File

@ -1,162 +1,162 @@
package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author zrb
* @since 2024-11-22
*/
@Data
@TableName("hd_cloud_manage.yt_t_order_swap_battery")
@Schema(name = "换电订单信息表")
public class OrderSwapBattery extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "预约订单ID")
private Integer orderPreId;
@Schema(description = "预约用户")
private String orderPreUid;
@Schema(description = "预约用户名称")
private String orderPreUname;
@Schema(description = "预约用户手机")
private String orderPrePhone;
@Schema(description = "类型1-换电2-充电", requiredMode = RequiredMode.REQUIRED)
@NotNull(message = "订单类型不能为空")
private Integer orderType;
@Schema(description = "订单编码", hidden = true)
private String orderNo;
@Schema(description = "车牌号", requiredMode = RequiredMode.REQUIRED)
@NotBlank(message = "车牌号不能为空")
private String plateNum;
@Schema(description = "订单时间", example = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date orderTime;
@Schema(description = "换电站编码", requiredMode = RequiredMode.REQUIRED)
@NotBlank(message = "换电站编码不能为空")
private String stationCode;
@Schema(description = "换电站名称", requiredMode = RequiredMode.REQUIRED)
@NotBlank(message = "换电站名称不能为空")
private String stationName;
@Schema(description = "金额账号")
private String accountCode;
@Schema(description = "订单金额")
private Integer amount;
@Schema(description = "订单状态1-已创建2-换电中3-换电完成4-充电中5-充电完成6-待结算7-已完成9-已取消, -1-退款")
private Integer status;
@Schema(description = "计算费用方式1-ODO2-SOC3-按电量")
private Integer feeType;
@Schema(description = "基础费用")
private BigDecimal basicFee;
@Schema(description = "服务开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date serviceTimeBegin;
@Schema(description = "服务结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date serviceTimeEnd;
@Schema(description = "服务费")
private BigDecimal serviceFee;
@Schema(description = "费用标准")
private String feeStandardJson;
@Schema(description = "费用标准详情")
@TableField(exist = false)
private BatteryStationHdFeeStandard feeStandardDetail;
@Schema(description = "上次租赁电池时车辆里程")
private BigDecimal lastRentBatCarOdo;
@Schema(description = "归还电池时车辆里程")
private BigDecimal nowReturnBatCarOdo;
@Schema(description = "按ODO换电费")
private BigDecimal odoAmount;
@Schema(description = "充电开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date chargeTimeBegin;
@Schema(description = "充电结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date chargeTimeEnd;
@Schema(description = "总充电量")
private BigDecimal electAmount;
@Schema(description = "租借电池包仓位")
private Integer rentBatNo;
@Schema(description = "租用电池包编码")
private String rentBatCode;
@Schema(description = "租用电池包SOC")
private Integer rentBatSoc;
@Schema(description = "归还电池包编码")
private String returnBatCode;
@Schema(description = "归还电池包仓位")
private Integer returnBatNo;
@Schema(description = "归还电池包SOC")
private Integer returnBatSoc;
@Schema(description = "归还电池租出时soc")
private Integer returnBatRentSoc;
@Schema(description = "归还电池租出的换电站编码")
private String returnBatRentStationCode;
@Schema(description = "归还电池租出的换电站")
private String returnBatRentStationName;
@Schema(description = "换电模式1-全自动2-半自动3-人工干预 ")
private Integer changeMode;
@Schema(description = "换电车道 1-A 车道;2-B 车道")
private Integer changeLane;
@Schema(description = "删除状态1-已删除0-未删除", hidden = true)
private Integer delFlag;
@Schema(description = "交易编码", hidden = true)
private String tradeNo;
@Schema(description = "备注信息")
private String remark;
}
//package com.evotech.hd.common.core.entity.cloud;
//
//import com.baomidou.mybatisplus.annotation.TableField;
//import com.baomidou.mybatisplus.annotation.TableName;
//import com.evotech.hd.common.core.entity.BaseEntity;
//import com.fasterxml.jackson.annotation.JsonFormat;
//import io.swagger.v3.oas.annotations.media.Schema;
//import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
//import jakarta.validation.constraints.NotBlank;
//import jakarta.validation.constraints.NotNull;
//import lombok.Data;
//import org.springframework.format.annotation.DateTimeFormat;
//
//import java.io.Serializable;
//import java.math.BigDecimal;
//import java.util.Date;
//
///**
// * @author zrb
// * @since 2024-11-22
// */
//@Data
//@TableName("hd_cloud_manage.yt_t_order_swap_battery")
//@Schema(name = "换电订单信息表")
//public class OrderSwapBattery extends BaseEntity implements Serializable {
//
// private static final long serialVersionUID = 1L;
//
// @Schema(description = "预约订单ID")
// private Integer orderPreId;
//
// @Schema(description = "预约用户")
// private String orderPreUid;
//
// @Schema(description = "预约用户名称")
// private String orderPreUname;
//
// @Schema(description = "预约用户手机")
// private String orderPrePhone;
//
// @Schema(description = "类型1-换电2-充电", requiredMode = RequiredMode.REQUIRED)
// @NotNull(message = "订单类型不能为空")
// private Integer orderType;
//
// @Schema(description = "订单编码", hidden = true)
// private String orderNo;
//
// @Schema(description = "车牌号", requiredMode = RequiredMode.REQUIRED)
// @NotBlank(message = "车牌号不能为空")
// private String plateNum;
//
// @Schema(description = "订单时间", example = "yyyy-MM-dd HH:mm:ss")
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
// private Date orderTime;
//
// @Schema(description = "换电站编码", requiredMode = RequiredMode.REQUIRED)
// @NotBlank(message = "换电站编码不能为空")
// private String stationCode;
//
// @Schema(description = "换电站名称", requiredMode = RequiredMode.REQUIRED)
// @NotBlank(message = "换电站名称不能为空")
// private String stationName;
//
// @Schema(description = "金额账号")
// private String accountCode;
//
// @Schema(description = "订单金额")
// private Integer amount;
//
// @Schema(description = "订单状态1-已创建2-换电中3-换电完成4-充电中5-充电完成6-待结算7-已完成9-已取消, -1-退款")
// private Integer status;
//
// @Schema(description = "计算费用方式1-ODO2-SOC3-按电量")
// private Integer feeType;
//
// @Schema(description = "基础费用")
// private BigDecimal basicFee;
//
// @Schema(description = "服务开始时间")
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
// private Date serviceTimeBegin;
//
// @Schema(description = "服务结束时间")
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
// private Date serviceTimeEnd;
//
// @Schema(description = "服务费")
// private BigDecimal serviceFee;
//
// @Schema(description = "费用标准")
// private String feeStandardJson;
// @Schema(description = "费用标准详情")
// @TableField(exist = false)
// private BatteryStationHdFeeStandard feeStandardDetail;
//
// @Schema(description = "上次租赁电池时车辆里程")
// private BigDecimal lastRentBatCarOdo;
//
// @Schema(description = "归还电池时车辆里程")
// private BigDecimal nowReturnBatCarOdo;
//
// @Schema(description = "按ODO换电费")
// private BigDecimal odoAmount;
//
// @Schema(description = "充电开始时间")
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
// private Date chargeTimeBegin;
//
// @Schema(description = "充电结束时间")
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
// private Date chargeTimeEnd;
//
// @Schema(description = "总充电量")
// private BigDecimal electAmount;
//
// @Schema(description = "租借电池包仓位")
// private Integer rentBatNo;
//
// @Schema(description = "租用电池包编码")
// private String rentBatCode;
//
// @Schema(description = "租用电池包SOC")
// private Integer rentBatSoc;
//
// @Schema(description = "归还电池包编码")
// private String returnBatCode;
//
// @Schema(description = "归还电池包仓位")
// private Integer returnBatNo;
//
// @Schema(description = "归还电池包SOC")
// private Integer returnBatSoc;
//
// @Schema(description = "归还电池租出时soc")
// private Integer returnBatRentSoc;
//
// @Schema(description = "归还电池租出的换电站编码")
// private String returnBatRentStationCode;
//
// @Schema(description = "归还电池租出的换电站")
// private String returnBatRentStationName;
//
// @Schema(description = "换电模式1-全自动2-半自动3-人工干预 ")
// private Integer changeMode;
//
// @Schema(description = "换电车道 1-A 车道;2-B 车道")
// private Integer changeLane;
//
// @Schema(description = "删除状态1-已删除0-未删除", hidden = true)
// private Integer delFlag;
//
// @Schema(description = "交易编码", hidden = true)
// private String tradeNo;
//
// @Schema(description = "备注信息")
// private String remark;
//}

View File

@ -0,0 +1,16 @@
package com.evotech.hd.common.core.enums;
/**
* 枚举
*
* @ClassName:BaseEnum
* @date: 2025年05月19日 15:36
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface BaseEnum<K, V> {
K getKey();
V getValue();
}

View File

@ -1,10 +1,10 @@
package com.evotech.hd.common.core.enums;
public enum OrderStatusEnums {
public enum OrderStatusEnums implements BaseEnum<Integer, String> {
CREATE(1, "已创建"),
SWAP(2, "换电开始"),
SWAP(2, "换电"),
SWAPOVER(3, "换电完成"),
@ -16,7 +16,12 @@ public enum OrderStatusEnums {
FINISH(7, "已完成"),
CANCLE(9, "已取消");
CANCLE(9, "已取消"),
REFUND(-1, "订单退款"),
;
Integer code;
@ -36,4 +41,14 @@ public enum OrderStatusEnums {
this.name = name;
}
@Override
public Integer getKey() {
return this.code;
}
@Override
public String getValue() {
return this.name;
}
}

View File

@ -45,7 +45,6 @@ public class Collections implements Serializable{
/**
* @DES 检查集合为空
* @author andy.shi
* @company 龙腾工作室
* @createDate 2020年12月25日下午2:14:43
* @methodName Collections.isEmpty
* @param list
@ -59,7 +58,6 @@ public class Collections implements Serializable{
/**
* @DES 检查集合不为空
* @author andy.shi
* @company 龙腾工作室
* @createDate 2020年12月25日下午2:15:07
* @methodName Collections.isNotEmpty
* @param collection
@ -73,7 +71,6 @@ public class Collections implements Serializable{
/**
* 将list进行分页
* @author Andy.shi
* @company 龙腾工作室
* @date 2020年9月15日上午9:37:07
* @param <T> 泛型, 根据传入的对对象类型,返回类型
* @param list 需要分组的集合
@ -109,7 +106,6 @@ public class Collections implements Serializable{
/**
* 创建对象
* @author Andy.shi
* @company 龙腾工作室
* @date 2020年9月15日上午9:37:07
* @param <T>
* @return
@ -121,7 +117,6 @@ public class Collections implements Serializable{
/**
* @DES 数组转对象
* @author andy.shi
* @company 龙腾工作室
* @createDate 2020年12月25日下午2:09:14
* @methodName Collections.asList
* @param objs
@ -157,7 +152,6 @@ public class Collections implements Serializable{
/**
* 去除集合的重复项
* @author Andy.shi
* @company 龙腾工作室
* @date 2020年9月24日上午9:09:07
* @param <T> 泛型,字段的类型, 如果是对象, 请重写hashCode() equals()
* @param list1 去重的集合1
@ -172,7 +166,6 @@ public class Collections implements Serializable{
/**
* 去除集合的重复项
* @author Andy.shi
* @company 龙腾工作室
* @date 2020年9月24日上午9:13:09
* @param <T> 泛型,字段的类型, 如果是对象, 请重写hashCode() equals()
* @param listArray 去重的集合数组
@ -203,7 +196,6 @@ public class Collections implements Serializable{
/**
* 获取重复数据
* @author Andy.shi
* @company 龙腾工作室
* @date 2020年9月24日上午9:46:03
* @param <T> 泛型,字段的类型, 如果是对象, 请重写hashCode() equals()
* @param list1 查重的集合1
@ -217,7 +209,6 @@ public class Collections implements Serializable{
/**
* 获取重复数据
* @author Andy.shi
* @company 龙腾工作室
* @date 2020年9月24日上午9:44:30
* @param <T> 泛型,字段的类型, 如果是对象, 请重写hashCode() equals()
* @param listArray 需要查重的集合数组
@ -281,7 +272,6 @@ public class Collections implements Serializable{
/**
* @DES 组装map数据对象
* @author andy.shi
* @company 龙腾工作室
* @createDate 2020年12月25日下午1:37:05
* @methodName MapLists.createMap
* @param args

View File

@ -1,10 +1,12 @@
package com.evotech.hd.common.core.utils;
import java.util.Date;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.util.Date;
public class CommonUtil {
@ -47,6 +49,12 @@ public class CommonUtil {
return prefix + "1100";
}
public static BigDecimal yuanToFen(BigDecimal yuan){
if(ObjectUtils.isEmpty(yuan)){
return new BigDecimal(0);
}
return yuan.multiply(new BigDecimal(100));
}
}

View File

@ -0,0 +1,40 @@
package com.evotech.hd.common.web.util;
import com.evotech.hd.common.core.enums.BaseEnum;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
*
* @ClassName:EnumUtils
* @date: 2025年05月19日 15:30
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public class EnumUtils extends org.apache.commons.lang3.EnumUtils{
public static <E extends BaseEnum<K,V>, K, V> E getEnumProperty(final Class<E> enumClass, final K k) {
List<E> el = new ArrayList<>(Arrays.asList(enumClass.getEnumConstants()));
for (E e: el){
if(e.getKey().equals(k)){
return e;
}
}
return null;
}
public static <E extends BaseEnum<K,V>, K,V> V getEnumPropertyValue(final Class<E> enumClass, final K k) {
List<E> el = new ArrayList<>(Arrays.asList(enumClass.getEnumConstants()));
for (E e: el){
if(e.getKey().equals(k)){
return e.getValue();
}
}
return (V)"未知属性";
}
}

View File

@ -148,10 +148,10 @@ public class HomeController {
// return homeService.homeData7(type);
// }
@Operation(hidden = true)
@GetMapping("/login/data")
public void loginData() {
homeService.loginData();
}
//
// @Operation(hidden = true)
// @GetMapping("/login/data")
// public void loginData() {
// homeService.loginData();
// }
}

View File

@ -2,7 +2,7 @@ package com.evotech.hd.cloud.controller.dh;
import com.evotech.hd.cloud.service.DHDeviceService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.DeviceDto;
import com.evotech.hd.common.core.Dto.device.DeviceDto;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -0,0 +1,57 @@
package com.evotech.hd.cloud.controller.order;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
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.validation.Valid;
import jakarta.validation.constraints.NotNull;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.util.List;
/**
* 预约订单管理类
* @ClassName:OrderPerController
* @date: 2025年05月16日 13:51
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Tag(name = "预约订单")
@ApiSupport(order = 22)
@RestController
@RequestMapping("/order/per")
public class OrderPerController {
@Operation(summary = "增加预约")
@PostMapping("/add")
@ApiOperationSupport(order = 1)
public Result<Integer> addPre(@Valid @ParameterObject OrderSwapBatteryPre osbp) {
return orderSwapBatteryService.addPre(osbp);
}
@Operation(summary = "取消预约")
@PostMapping("/cancel")
@ApiOperationSupport(order = 2)
public Result<Integer> cancelPre(@NotNull Integer id) {
return orderSwapBatteryService.cancelPre(id, null);
}
@Operation(summary = "查询预约")
@GetMapping("/list")
@ApiOperationSupport(order = 3)
public Result<List<OrderSwapBatteryPre>> listPre(@ParameterObject PageListSwapOrderPreRequest plsopr) throws ParseException {
return orderSwapBatteryService.listPre(plsopr);
}
}

View File

@ -1,28 +1,19 @@
package com.evotech.hd.cloud.controller.order;
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;
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.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.order.OrderListVo;
import com.evotech.hd.common.core.entity.cloud.request.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;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.*;
import java.text.ParseException;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "换电订单")
@ApiSupport(order = 22)
@ -31,139 +22,95 @@ import java.util.List;
public class OrderSwapBatteryController {
@Resource
private OrderSwapBatteryService orderSwapBatteryService;
@Operation(summary = "增加预约")
@PostMapping("/pre/add")
@ApiOperationSupport(order = 1)
public Result<Integer> addPre(@Valid @ParameterObject OrderSwapBatteryPre osbp) {
return orderSwapBatteryService.addPre(osbp);
}
@Operation(summary = "取消预约")
@PostMapping("/pre/cancel")
@ApiOperationSupport(order = 2)
public Result<Integer> cancelPre(@NotNull Integer id) {
return orderSwapBatteryService.cancelPre(id, null);
}
@Operation(summary = "查询预约")
@GetMapping("/pre/list")
@ApiOperationSupport(order = 3)
public Result<List<OrderSwapBatteryPre>> listPre(@ParameterObject PageListSwapOrderPreRequest plsopr) throws ParseException {
return orderSwapBatteryService.listPre(plsopr);
}
@Operation(summary = "增加")
@PostMapping("/add")
@ApiOperationSupport(order = 4)
public Result<Integer> add(@Valid @ParameterObject OrderSwapBattery osb) {
return orderSwapBatteryService.add(osb);
}
@Operation(summary = "删除")
@PostMapping("/del")
@ApiOperationSupport(order = 5)
public Result<Integer> delete(Integer id) {
return orderSwapBatteryService.delete(id);
}
@Operation(summary = "修改")
@PostMapping({"/update"})
@ApiOperationSupport(order = 6)
public Result<Integer> update(@ParameterObject OrderSwapBattery osb) {
return orderSwapBatteryService.update(osb);
}
private OrderService orderService;
@Operation(summary = "查询")
@GetMapping("/list")
@ApiOperationSupport(order = 7)
public Result<List<OrderSwapBattery>> list(@ParameterObject PageListSwapOrderRequest plsor) {
return orderSwapBatteryService.list(plsor);
public Result<Page<OrderListVo>> list(@ParameterObject PageListSwapOrderRequest plsor) {
return orderService.pageList(plsor);
}
@Operation(summary = "查询公司订单")
@GetMapping("/listcompanyorder")
@ApiOperationSupport(order = 8)
@Hidden
@Deprecated
public Result<List<OrderSwapBattery>> listByCompany(@ParameterObject PageListSwapOrderRequest plsor) {
return orderSwapBatteryService.listByCompany(plsor);
}
@Operation(summary = "查询换电步骤")
@GetMapping("/step/list")
@ApiOperationSupport(order = 9)
public Result<List<OrderSwapBatteryStep>> listStep(@NotBlank String orderNo) {
return orderSwapBatteryService.listStep(orderNo);
}
@Operation(summary = "费用计算")
@PostMapping({"/cost"})
@ApiOperationSupport(order = 9)
public Result<String> calculateCost(@NotBlank @RequestParam OrderSwapBattery osb) {
return orderSwapBatteryService.calculateCost(osb);
}
@Operation(summary = "个人账户余额支付")
@PostMapping({"/wallet/pay"})
@ApiOperationSupport(order = 11)
public Result<String> walletPay(@RequestParam String orderNo, String wuid, String uname) {
return orderSwapBatteryService.walletPay(orderNo, wuid, uname);
}
@Operation(summary = "公司订单余额支付")
@PostMapping({"/companywallet/pay"})
@ApiOperationSupport(order = 12)
public Result<String> companyWalletPay(@RequestParam String orderNo, String wuid, String uname) {
// TODO
return null;
}
@Operation(summary = "公司订单扫码支付")
@PostMapping({"/wechat/nativepay"})
@ApiOperationSupport(order = 13)
public Result<String> companyNativePay(@RequestBody NativePayVO prePay) {
return orderSwapBatteryService.companyNativePay(prePay);
}
@Operation(summary = "扫码支付订单查询状态")
@GetMapping("/paystatus/query")
@ApiOperationSupport(order = 14)
public Result<String> orderQuery(String outTradeNo) {
return orderSwapBatteryService.orderQuery(outTradeNo);
}
@Operation(summary = "站端取消订单")
@PostMapping("/pre/cancelOrder")
@ApiOperationSupport(order = 15)
public Result<Integer> cancelOrder(@NotNull String orderNo) {
return orderSwapBatteryService.cancelOrder(orderNo, null);
}
@Operation(summary = "开始换电")
@PostMapping("/startSwap")
@ApiOperationSupport(order = 16)
public Result<Boolean> startSwap(@RequestParam String wuid,String orderId) {
return orderSwapBatteryService.startSwap(wuid,orderId);
}
@Operation(summary = "获取开始换电回复")
@PostMapping("/getStartSwap")
@ApiOperationSupport(order = 17)
public Result<BatterySwapResponse> getStartSwap(@RequestParam String wuid, String orderId) {
return orderSwapBatteryService.getStartSwap(wuid,orderId);
}
@Operation(summary = "未完成订单查询plateNum")
@GetMapping("/checkList")
@ApiOperationSupport(order = 18)
public Result<Integer> checkList(@ParameterObject PageListSwapOrderRequest plsor) {
return orderSwapBatteryService.checkList(plsor);
}
// @Operation(summary = "查询公司订单")
// @GetMapping("/listcompanyorder")
// @ApiOperationSupport(order = 8)
// @Hidden
// @Deprecated
// public Result<List<OrderSwapBattery>> listByCompany(@ParameterObject PageListSwapOrderRequest plsor) {
// return orderSwapBatteryService.listByCompany(plsor);
// }
//
// @Operation(summary = "查询换电步骤")
// @GetMapping("/step/list")
// @ApiOperationSupport(order = 9)
// public Result<List<OrderSwapBatteryStep>> listStep(@NotBlank String orderNo) {
// return orderSwapBatteryService.listStep(orderNo);
// }
//
// @Operation(summary = "费用计算")
// @PostMapping({"/cost"})
// @ApiOperationSupport(order = 9)
// public Result<String> calculateCost(@NotBlank @RequestParam OrderSwapBattery osb) {
// return orderSwapBatteryService.calculateCost(osb);
// }
//
//
// @Operation(summary = "个人账户余额支付")
// @PostMapping({"/wallet/pay"})
// @ApiOperationSupport(order = 11)
// public Result<String> walletPay(@RequestParam String orderNo, String wuid, String uname) {
// return orderSwapBatteryService.walletPay(orderNo, wuid, uname);
// }
//
//
// @Operation(summary = "公司订单余额支付")
// @PostMapping({"/companywallet/pay"})
// @ApiOperationSupport(order = 12)
// public Result<String> companyWalletPay(@RequestParam String orderNo, String wuid, String uname) {
// // TODO
// return null;
// }
//
//
// @Operation(summary = "公司订单扫码支付")
// @PostMapping({"/wechat/nativepay"})
// @ApiOperationSupport(order = 13)
// public Result<String> companyNativePay(@RequestBody NativePayVO prePay) {
// return orderSwapBatteryService.companyNativePay(prePay);
// }
//
// @Operation(summary = "扫码支付订单查询状态")
// @GetMapping("/paystatus/query")
// @ApiOperationSupport(order = 14)
// public Result<String> orderQuery(String outTradeNo) {
// return orderSwapBatteryService.orderQuery(outTradeNo);
// }
//
// @Operation(summary = "站端取消订单")
// @PostMapping("/pre/cancelOrder")
// @ApiOperationSupport(order = 15)
// public Result<Integer> cancelOrder(@NotNull String orderNo) {
// return orderSwapBatteryService.cancelOrder(orderNo, null);
// }
// @Operation(summary = "开始换电")
// @PostMapping("/startSwap")
// @ApiOperationSupport(order = 16)
// public Result<Boolean> startSwap(@RequestParam String wuid,String orderId) {
// return orderSwapBatteryService.startSwap(wuid,orderId);
// }
// @Operation(summary = "获取开始换电回复")
// @PostMapping("/getStartSwap")
// @ApiOperationSupport(order = 17)
// public Result<BatterySwapResponse> getStartSwap(@RequestParam String wuid, String orderId) {
// return orderSwapBatteryService.getStartSwap(wuid,orderId);
// }
//
// @Operation(summary = "未完成订单查询plateNum")
// @GetMapping("/checkList")
// @ApiOperationSupport(order = 18)
// public Result<Integer> checkList(@ParameterObject PageListSwapOrderRequest plsor) {
// return orderSwapBatteryService.checkList(plsor);
// }
}

View File

@ -1,172 +1,172 @@
package com.evotech.hd.cloud.controller.test;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.cloud.dao.BatteryStationDao;
import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao;
import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
import com.evotech.hd.cloud.device.dh.DHRequestUtil;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateChargingDataExchangeProcessor;
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
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.OrderSwapBattery;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @desc:
* @ClassName:TestController
* @date: 2025年04月18日 14:40
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@RestController
@RequestMapping("/test")
public class TestController {
@Resource
private BatteryStationDao batteryStationDao;
private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
@Resource
private OrderSwapBatteryPreDao orderSwapBatteryPreDao;
@Resource
private SwapOrderBasicFeeComponent orderBasicFeeComponent;
@Resource
MqttStateChargingDataExchangeProcessor mqttStateChargingDataRequestExchangeProcessor;
@Autowired
private ApplicationContext applicationContext;
//package com.evotech.hd.cloud.controller.test;
//
//import cn.hutool.core.date.DatePattern;
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.RandomUtil;
//import cn.hutool.json.JSONUtil;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.evotech.hd.cloud.dao.BatteryStationDao;
//import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao;
//import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
//import com.evotech.hd.cloud.device.dh.DHRequestUtil;
//import com.evotech.hd.cloud.mqtt.message.MessageTopic;
//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
//import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
//import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateChargingDataExchangeProcessor;
//import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
//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.OrderSwapBattery;
//import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
//import com.evotech.hd.common.core.utils.Collections;
//import jakarta.annotation.Resource;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.ApplicationContext;
//import org.springframework.web.bind.annotation.*;
//
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//
///**
// * @desc:
// * @ClassName:TestController
// * @date: 2025年04月18日 14:40
// * @author: andy.shi
// * @contact: 17330188597
// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
// */
//@RestController
//@RequestMapping("/test")
//public class TestController {
//
// @Resource
// VehicleService vehicleService;
// private BatteryStationDao batteryStationDao;
// private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
// @Resource
// MongoDBService mongoDBService;
@PostMapping("/mongodb/save")
public Result mongodbSave() {
mqttStateChargingDataRequestExchangeProcessor.exchange(null,null,JSONUtil.parseObj("{batCode:123,orderNo:123321}"));
return new Result().success("搞定");
}
@PostMapping("/mongodb/list")
public Result mongoList() {
// mongoDBService.find("123", ChargingData.class, Collections.asMap(MongoConstant.REGEX+MongoConstant.SEPARATION+"value","\"batCode\":124"))
return new Result().success("");
}
@PostMapping("/mqtt/test")
public Result mqttTest(@RequestBody JSONObject json) {
MessageTopic topic = new MessageTopic();
topic.setDataDirection(json.getString("dataDirection"));
topic.setMessageType(json.getString("messageType"));
topic.setStationCode(json.getString("stationCode"));
MqttMessageHeader header = new MqttMessageHeader();
header.setFunction(json.getString("function"));
cn.hutool.json.JSONObject dataBody = JSONUtil.parseObj(json.getJSONObject("dataBoy"));
Map<String, MqttStrategyExchangeProcessor> mqttMessageRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyExchangeProcessor.class);
for (MqttStrategyExchangeProcessor processor : mqttMessageRequestExchangeProcessorMap.values()) {
if(processor.accept(header.getFunction())){
processor.exchange(topic, header, dataBody);
}
}
return new Result().success("搞定");
}
@GetMapping("/station")
public Result list() {
System.out.println("======>>开始......");
BatteryStation station = batteryStationDao.selectOne(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode,"FD12795455"));
// 查这天这个站的预约
List<OrderSwapBatteryPre> orderPreList = orderSwapBatteryPreDao.selectList(new QueryWrapper<OrderSwapBatteryPre>().eq("station_code", station.getCode()).eq("status", 1).eq("ucode","e2fb21b6447e10006f19a23e06b67914"));
// 根据预约生成订单
if (orderPreList.isEmpty()) {
System.out.println("没有预约单");
}
OrderSwapBatteryPre orderPre = orderPreList.get(0);
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.setOrderTime(new Date());
order.setOrderNo(orderNo(station.getCode(), order.getOrderTime()));
order.setPlateNum(orderPre.getPlateNum());
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);
System.out.println(JSONUtil.toJsonStr(order));
return new Result().success(order);
}
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;
}
@PostMapping("/device/live")
public Result deviceLive(@RequestParam String deviceId, @RequestParam String channelId) {
return new Result().success(DHRequestUtil.live(deviceId, channelId));
}
@PostMapping("/device/liveInfo")
public Result deviceLiveInfo(@RequestParam String deviceId, @RequestParam String channelId) {
return new Result().success(DHRequestUtil.liveInfo(deviceId, channelId));
}
@PostMapping("/device/delLive")
public Result delLive(@RequestParam String liveToken) {
return new Result().success(DHRequestUtil.delLive(liveToken));
}
@PostMapping("/device/list")
public Result deviceList(@RequestParam Integer page, @RequestParam Integer pageSize) {
return new Result().success(DHRequestUtil.deviceList(Collections.asMap("pageNum", page, "pageSize", pageSize)));
}
@PostMapping("/device/createDeviceStreamUrl")
public Result createDeviceStreamUrl(@RequestParam String deviceId, @RequestParam String channelId) {
return new Result().success(DHRequestUtil.createDeviceStreamUrl(deviceId, channelId));
}
@PostMapping("/store/list")
public Result storeList(@RequestParam Integer page, @RequestParam Integer pageSize) {
return new Result().success(DHRequestUtil.storeList(page, pageSize));
}
}
// private OrderSwapBatteryPreDao orderSwapBatteryPreDao;
// @Resource
// private SwapOrderBasicFeeComponent orderBasicFeeComponent;
// @Resource
// MqttStateChargingDataExchangeProcessor mqttStateChargingDataRequestExchangeProcessor;
// @Autowired
// private ApplicationContext applicationContext;
//// @Resource
//// VehicleService vehicleService;
//// @Resource
//// MongoDBService mongoDBService;
//
// @PostMapping("/mongodb/save")
// public Result mongodbSave() {
// mqttStateChargingDataRequestExchangeProcessor.exchange(null,null,JSONUtil.parseObj("{batCode:123,orderNo:123321}"));
// return new Result().success("搞定");
// }
//
// @PostMapping("/mongodb/list")
// public Result mongoList() {
//// mongoDBService.find("123", ChargingData.class, Collections.asMap(MongoConstant.REGEX+MongoConstant.SEPARATION+"value","\"batCode\":124"))
// return new Result().success("");
// }
//
//
// @PostMapping("/mqtt/test")
// public Result mqttTest(@RequestBody JSONObject json) {
// MessageTopic topic = new MessageTopic();
// topic.setDataDirection(json.getString("dataDirection"));
// topic.setMessageType(json.getString("messageType"));
// topic.setStationCode(json.getString("stationCode"));
// MqttMessageHeader header = new MqttMessageHeader();
// header.setFunction(json.getString("function"));
// cn.hutool.json.JSONObject dataBody = JSONUtil.parseObj(json.getJSONObject("dataBoy"));
//
// Map<String, MqttStrategyExchangeProcessor> mqttMessageRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyExchangeProcessor.class);
// for (MqttStrategyExchangeProcessor processor : mqttMessageRequestExchangeProcessorMap.values()) {
// if(processor.accept(header.getFunction())){
// processor.exchange(topic, header, dataBody);
// }
// }
// return new Result().success("搞定");
// }
//
//
//
// @GetMapping("/station")
// public Result list() {
// System.out.println("======>>开始......");
// BatteryStation station = batteryStationDao.selectOne(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode,"FD12795455"));
// // 查这天这个站的预约
// List<OrderSwapBatteryPre> orderPreList = orderSwapBatteryPreDao.selectList(new QueryWrapper<OrderSwapBatteryPre>().eq("station_code", station.getCode()).eq("status", 1).eq("ucode","e2fb21b6447e10006f19a23e06b67914"));
// // 根据预约生成订单
// if (orderPreList.isEmpty()) {
// System.out.println("没有预约单");
// }
// OrderSwapBatteryPre orderPre = orderPreList.get(0);
// 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.setOrderTime(new Date());
// order.setOrderNo(orderNo(station.getCode(), order.getOrderTime()));
// order.setPlateNum(orderPre.getPlateNum());
//
// 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);
//
// System.out.println(JSONUtil.toJsonStr(order));
// return new Result().success(order);
// }
//
//
// 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;
// }
//
// @PostMapping("/device/live")
// public Result deviceLive(@RequestParam String deviceId, @RequestParam String channelId) {
// return new Result().success(DHRequestUtil.live(deviceId, channelId));
// }
//
// @PostMapping("/device/liveInfo")
// public Result deviceLiveInfo(@RequestParam String deviceId, @RequestParam String channelId) {
// return new Result().success(DHRequestUtil.liveInfo(deviceId, channelId));
// }
//
// @PostMapping("/device/delLive")
// public Result delLive(@RequestParam String liveToken) {
// return new Result().success(DHRequestUtil.delLive(liveToken));
// }
//
// @PostMapping("/device/list")
// public Result deviceList(@RequestParam Integer page, @RequestParam Integer pageSize) {
// return new Result().success(DHRequestUtil.deviceList(Collections.asMap("pageNum", page, "pageSize", pageSize)));
// }
//
// @PostMapping("/device/createDeviceStreamUrl")
// public Result createDeviceStreamUrl(@RequestParam String deviceId, @RequestParam String channelId) {
// return new Result().success(DHRequestUtil.createDeviceStreamUrl(deviceId, channelId));
// }
//
// @PostMapping("/store/list")
// public Result storeList(@RequestParam Integer page, @RequestParam Integer pageSize) {
// return new Result().success(DHRequestUtil.storeList(page, pageSize));
// }
//
//}

View File

@ -0,0 +1,46 @@
package com.evotech.hd.cloud.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.cloud.entity.order.Order;
import com.evotech.hd.common.core.Dto.home.*;
import com.evotech.hd.common.core.Dto.request.HomeRequestDto;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.permission.DataScope;
import com.evotech.hd.common.core.permission.DataScopes;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
* 接口
*
* @ClassName:OrderMapper
* @date: 2025年05月16日 14:00
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@DataScopes({
@DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE),
@DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE),
})
//@DataScopeOpenMethod(openMethod = true, methodName = {"homeFindHalfYearAmountData"})
public interface OrderDao extends BaseMapper<Order> {
List<HomeOrderSwapBatteryProportionDto> homeFindProportionData(@Param("params") HomeRequestDto params);
List<HomeOrderSwapBatteryAmountDto> homeFindAmountData(@Param("params") HomeRequestDto params);
//
List<HomeOrderSwapBatteryHalfYearDto> homeFindHalfYearOrderData(@Param("params") HomeRequestDto params);
// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, tableAlias = "osb", permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE)
List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearAmountData(@Param("params") HomeRequestDto params);
//因为站端不需要显示金额, 所有重新写一个
List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearStationAmountData(@Param("params") HomeRequestDto params);
Long homeFindOrderCountData(@Param("date") Date date);
Double homeFindOrderAmountData(@Param("date") Date date);
List<HomeOrderInfo> findOrderListByStatus(@Param("status") Integer status);
}

View File

@ -0,0 +1,16 @@
package com.evotech.hd.cloud.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.cloud.entity.order.OrderDetail;
/**
* 接口
*
* @ClassName:OrderDetailDap
* @date: 2025年05月17日 11:09
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface OrderDetailDao extends BaseMapper<OrderDetail> {
}

View File

@ -4,15 +4,13 @@ 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;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* @author zrb
@ -57,4 +55,15 @@ public class MessageMqtt implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date ctime;
public MessageMqtt() {
}
public MessageMqtt(String stationCode, String direction, String type, String messageFunction, Date ctime) {
this.stationCode = stationCode;
this.direction = direction;
this.type = type;
this.messageFunction = messageFunction;
this.ctime = ctime;
}
}

View File

@ -0,0 +1,59 @@
package com.evotech.hd.cloud.entity.order;
import com.evotech.hd.common.core.entity.IdEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
*
*
* @ClassName:BaseOrder
* @date: 2025年05月16日 11:11
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
public class BaseOrder extends IdEntity {
/***
* 订单编码
*/
private String orderNo;
/***
* 订单金额
*/
private Integer orderAmount;
/***
* 订单状态, 具体参考 HDConstant.OrderConstant.ORDER_STATUS_*
*/
private Integer status;
/***
* 支付方式 具体参考 HDConstant.OrderConstant.PAY_TYPE_*
*/
private String payType;
/***
* 支付时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date payTime;
/***
* 支付人的wuId
*/
private String wuId;
/***
* 第三方返回的唯一订单标识
*/
private String notifyOrderNo;
/***
* 支付的回调信息
*/
private String notifyInfo;
}

View File

@ -0,0 +1,77 @@
package com.evotech.hd.cloud.entity.order;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
*
*
* @ClassName:SwapOrder
* @date: 2025年05月16日 11:29
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName(value = "yt_t_product_order", schema = "hd_cloud_manage")
public class Order extends BaseOrder{
private Integer orderPreId;
/***
* 预约用户ID
*/
private Integer preUid;
/***
* 预约用户名称
*/
private String preName;
/***
* 订单类型, 具体参考 HDConstant.OrderConstant.ORDER_TYPE_*
*/
private Integer orderType;
/***
* 车牌号
*/
private String plateNum;
/***
* 下单时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date orderTime;
/***
* '换电站编码'
*/
private String stationCode;
/***
* ''换电站名称''
*/
private String stationName;
/***
* 订单状态, 具体参考 HDConstant.DELETE_*
*/
private Integer delFlag;
/***
* 备注信息
*/
private String remark;
/***
* 变更时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
}

View File

@ -0,0 +1,108 @@
package com.evotech.hd.cloud.entity.order;
import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.IdEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
*
*
* @ClassName:OrderDetail
* @date: 2025年05月17日 9:10
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@TableName(value = "yt_t_order_detail", schema = "hd_cloud_manage")
@EqualsAndHashCode(callSuper=false)
public class OrderDetail extends IdEntity {
private Integer orderId;
/***
* 计费类型, 具体参考 HDConstant.OrderConstant.FEE_TYPE_*
*/
private Integer feeType;
/***
* 订单金额 (此金额是当前订单的金额, 不包含基础服务费, 所以不是订单总额)
*/
private Integer orderFee;
/***
* 服务费
*/
private Integer serviceFee;
/***
* 单价()
*/
private Integer unitPrice;
/***
* 服务开始时间
*/
private Date serviceTimeBegin;
/***
* 服务结束时间
*/
private Date serviceTimeEnd;
/***
* 订单开始时间
*/
private Date orderTimeBegin;
/***
* 订单结束时间
*/
private Date orderTimeEnd;
/***
* 费用标准详情
*/
private String feeStandard;
/***
* 耗电量; 如果是soc结算 则是soc的差值, ODO则是里程
*/
private Double electricityQuantity;
/***
* 开始充电的电量
*/
private Double electStart;
/***
* 结束充电的电量
*/
private Double electEnd;
/***
* 租借电池包仓位
*/
private String rentBatNo;
/***
* 租借电池包编码
*/
private String rentBatCode;
/***
* 租借电池包SOC
*/
private Double rentBatSOC;
/***
* 归还电池包仓位
*/
private String returnBatNo;
/***
* 归还电池包编码
*/
private String returnBatCode;
/***
* 归还电池包SOC
*/
private Double returnBatSOC;
/***
* 换电模式 HDConstant.OrderConstant.CHANGE_MODE_*
*/
private Integer changeMode;
/***
* 换电车道 HDConstant.OrderConstant.CHANGE_LANE_*
*/
private Integer changeLane;
}

View File

@ -0,0 +1,21 @@
package com.evotech.hd.cloud.entity.order;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 充值订单类
* @ClassName:RechargeOrder
* @date: 2025年05月16日 11:06
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName(value = "yt_t_recharge_order", schema = "hd_cloud_manage")
public class RechargeOrder extends BaseOrder {
}

View File

@ -1,6 +1,6 @@
package com.evotech.hd.cloud.entity.vo;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderInfo;
import com.evotech.hd.common.core.Dto.home.HomeOrderInfo;
import com.evotech.hd.common.core.utils.Collections;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.evotech.hd.cloud.entity.vo;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryProportionDto;
import com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryProportionDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.evotech.hd.cloud.entity.vo;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto;
import com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryHalfYearAmountDto;
import com.evotech.hd.common.core.utils.Collections;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -1,7 +1,7 @@
package com.evotech.hd.cloud.entity.vo;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryProportionDto;
import com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryHalfYearAmountDto;
import com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryProportionDto;
import com.evotech.hd.common.core.utils.Collections;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.evotech.hd.cloud.entity.vo;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto;
import com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryHalfYearAmountDto;
import com.evotech.hd.common.core.utils.Collections;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@ -0,0 +1,33 @@
package com.evotech.hd.cloud.entity.vo;
import com.evotech.hd.cloud.entity.MessageMqtt;
import lombok.Data;
import java.util.Date;
/**
*
*
* @ClassName:MqttMessageParam
* @date: 2025年05月19日 10:26
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
public class MqttMessageParam extends MessageMqtt {
/***
* 订单编号
*/
String orderNo;
public MqttMessageParam() {
}
public MqttMessageParam(String orderNo, String stationCode, String direction, String type, String messageFunction, Date ctime) {
super(stationCode, direction, type, messageFunction, ctime);
this.orderNo = orderNo;
}
}

View File

@ -43,6 +43,12 @@ public class MqttResponse<T> implements Serializable {
this.msg=errorMessage;
return this;
}
public MqttResponse<T> error(T data, String errorMessage){
this.code=ERROR;
this.msg=errorMessage;
this.data=data;
return this;
}
public MqttResponse<T> paramsError(String errorMessage){
this.code=PARAMS_ERROR;

View File

@ -23,13 +23,10 @@ import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.CarInfoResponse;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.order.*;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.OrderSwapBatteryService;
import com.evotech.hd.cloud.service.WechatUserService;
import com.evotech.hd.cloud.utils.CommonUtil;
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.BatteryStationDc;
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.VehicleWechatUserRelation;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
@ -62,13 +59,13 @@ public class RequestMessageService {
private MessageUtilService messageUtilService;
@Resource
private BatteryStationDcDao batteryStationDcDao;
@Resource
private OrderSwapBatteryDao orderSwapBatteryDao;
// @Resource
// private OrderSwapBatteryDao orderSwapBatteryDao;
@Resource
private OrderSwapBatteryPreDao orderSwapBatteryPreDao;
@Resource
private OrderSwapBatteryService orderSwapBatteryService;
// @Resource
// private OrderSwapBatteryService orderSwapBatteryService;
@Resource
private RedisUtil redisUtil;
@Autowired
@ -93,10 +90,10 @@ public class RequestMessageService {
OrderByPlateNumReq orderByPlateNumReq = JSONUtil.toBean(dataBody, OrderByPlateNumReq.class);
handleOrderByPlateNum(topic, header, orderByPlateNumReq);
break;
case FUN_CANCELORDER:
CancelOrderReq cancelOrder = JSONUtil.toBean(dataBody, CancelOrderReq.class);
handlOrderCancel(topic,header,cancelOrder);
break;
// case FUN_CANCELORDER:
// CancelOrderReq cancelOrder = JSONUtil.toBean(dataBody, CancelOrderReq.class);
// handlOrderCancel(topic,header,cancelOrder);
// break;
case FUN_STARTSWAP:
BatterySwapResponse battery = JSONUtil.toBean(dataBody, BatterySwapResponse.class);
handlStartSwap(topic,header,battery);
@ -144,28 +141,28 @@ public class RequestMessageService {
* @param header
* @param cancelOrder
*/
private void handlOrderCancel(MessageTopic topic, MqttMessageHeader header, CancelOrderReq cancelOrder) {
Date d = new Date();
CancelOrderResponse response = new CancelOrderResponse();
Result<Integer> integerResult = orderSwapBatteryService.cancelOrder(cancelOrder.getOrderNo(), 9);
if (integerResult.getStatus()==0){
response.setCode(0);
response.setMsg(integerResult.getMsg());
response.setOrderNo(cancelOrder.getOrderNo());
}else {
response.setCode(1);
response.setMsg(integerResult.getMsg());
response.setOrderNo("OK");
}
// 发送
topic.setDataDirection("M2S");
topic.setMessageType(MqttMessageTypeEnum.RESPONSE.getType());
header.setFunction(RequestFunctionTypesEnum.FUN_CANCELORDER.getReFunction());
header.setTimeStamp(DateUtil.format(d, DatePattern.NORM_DATETIME_FORMATTER));
log.info("\r\n=====>>>站端取消订单--MQTT发送到消息主题{},头部信息:{}订单编码;{},message:{}", topic,header, cancelOrder.getOrderNo(),JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
messageUtilService.publishAESMessage(topic, header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
}
// private void handlOrderCancel(MessageTopic topic, MqttMessageHeader header, CancelOrderReq cancelOrder) {
// Date d = new Date();
// CancelOrderResponse response = new CancelOrderResponse();
//
// Result<Integer> integerResult = orderSwapBatteryService.cancelOrder(cancelOrder.getOrderNo(), 9);
// if (integerResult.getStatus()==0){
// response.setCode(0);
// response.setMsg(integerResult.getMsg());
// response.setOrderNo(cancelOrder.getOrderNo());
// }else {
// response.setCode(1);
// response.setMsg(integerResult.getMsg());
// response.setOrderNo("OK");
// }
// // 发送
// topic.setDataDirection("M2S");
// topic.setMessageType(MqttMessageTypeEnum.RESPONSE.getType());
// header.setFunction(RequestFunctionTypesEnum.FUN_CANCELORDER.getReFunction());
// header.setTimeStamp(DateUtil.format(d, DatePattern.NORM_DATETIME_FORMATTER));
// log.info("\r\n=====>>>站端取消订单--MQTT发送到消息主题{},头部信息:{}订单编码;{},message:{}", topic,header, cancelOrder.getOrderNo(),JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
// messageUtilService.publishAESMessage(topic, header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
// }
/**
* 站端添加预约单

View File

@ -0,0 +1,51 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
/**
* 取消订单请求类
*
* @ClassName:MqttRequestCancelOrderExchangeProcessorImpl
* @date: 2025年05月19日 14:51
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class MqttRequestCancelOrderExchangeProcessorImpl implements MqttStrategyExchangeProcessor {
@Resource
OrderService orderService;
@Override
public boolean accept(String functionName) {
return RequestFunctionTypesEnum.FUN_CANCELORDER.getFunction().equals(functionName);
}
@Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
String orderNo = dataBody.getStr("orderNo");
Assert.hasText(orderNo, "orderNo is null");
Result<Boolean> updateResult = orderService.updateStatus(orderNo, 9);
MqttResponse<String> response = null;
if(updateResult.getData()){
response = new MqttResponse().success(JSONUtil.toJsonStr(Collections.asMap("orderNo", orderNo)));
}else{
response = new MqttResponse().error(JSONUtil.toJsonStr(Collections.asMap("orderNo", orderNo)),updateResult.getMsg());
}
sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CANCELORDER, response);
}
}

View File

@ -0,0 +1,93 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.order.OrdeSwapBatteryPreRespose;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.stream.Stream;
/**
* 站端请求创建预约单类
*
* @ClassName:MqttRequestPreOrderExchangeProcessorImpl
* @date: 2025年05月19日 17:41
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyExchangeProcessor {
@Override
public boolean accept(String functionName) {
return RequestFunctionTypesEnum.FUN_PREORDER.getFunction().equals(functionName);
}
@Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
OrderSwapBatteryPre orderSwapBatteryPre = JSONUtil.toBean(dataBody, OrderSwapBatteryPre.class);
OrdeSwapBatteryPreRespose response = new OrdeSwapBatteryPreRespose();
Date d = new Date();
// 1. 基础字段校验
if (validateRequiredFields(orderSwapBatteryPre)) {
// 返回错误消息
response.setStationPreOrderId(orderSwapBatteryPre.getSourceId());
response.setMsg("预约信息不完整");
response.setCode(0);
}else {
//添加预约单
WechatUser wechatUser =wechatUserService.selectUcode(orderSwapBatteryPre.getPhone(),orderSwapBatteryPre.getUname());
//查询用户编码
orderSwapBatteryPre.setUcode(wechatUser.getWuid());
orderSwapBatteryPre.setSource(3);
Result<Integer> integerResult = orderSwapBatteryService.addPre(orderSwapBatteryPre);
//添加失败情况
if (integerResult.getStatus()==0){
response.setStationPreOrderId(orderSwapBatteryPre.getSourceId());
//返回失败状态
response.setMsg(integerResult.getMsg());
response.setCode(0);
}else{
response.setStationPreOrderId(orderSwapBatteryPre.getSourceId());
response.setCode(1);
response.setMsg("OK");
}
}
// 发送
topic.setDataDirection("M2S");
topic.setMessageType(MqttMessageTypeEnum.RESPONSE.getType());
header.setFunction(RequestFunctionTypesEnum.FUN_PREORDER.getReFunction());
header.setTimeStamp(DateUtil.format(d, DatePattern.NORM_DATETIME_FORMATTER));
log.info("\r\n=====>>>站端添加预约单--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
messageUtilService.publishAESMessage(topic, header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
}
private boolean validateRequiredFields(OrderSwapBatteryPre order) {
return Stream.of(
order.getPlateNum(),
order.getPhone(),
order.getStationCode(),
order.getStationName(),
order.getUname(),
order.getSwapDay(),
order.getSwapDuration(),
order.getReservationTime()
).anyMatch(StrUtil::isBlankIfStr);
}
}

View File

@ -7,7 +7,7 @@ import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.OrderSwapBatteryService;
import com.evotech.hd.cloud.service.OrderSwapBatteryPreService;
import com.evotech.hd.cloud.service.VehicleService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@ -32,7 +32,7 @@ public class MqttRequestPushCarInfoExchangeProcessorImpl implements MqttStrategy
@Resource
VehicleService vehicleService;
@Resource
OrderSwapBatteryService orderSwapBatteryService;
OrderSwapBatteryPreService orderSwapBatteryPreService;
@Override
public boolean accept(String functionName) {
@ -56,36 +56,13 @@ public class MqttRequestPushCarInfoExchangeProcessorImpl implements MqttStrategy
//如果response == null 则证明 车辆创建成功了
if(response == null){
//创建预约订单
if (orderSwapBatteryService.addPreByPlateNum(plateNum, topic.getStationCode())){
if (orderSwapBatteryPreService.addPreByPlateNum(plateNum, topic.getStationCode())){
//返回状态信息
response = new MqttResponse().success("预约单初始化完成");
}else{
response = new MqttResponse().error("车辆初始化完成, 但是预约单创建失败了");
}
}
// if (vehicleService.existsVehicleByPlateNum(plateNum)){
// //创建预约订单
// if (orderSwapBatteryService.addPreByPlanNum(plateNum, topic.getStationCode())){
// //返回状态信息
// response = new MqttResponse().success("预约单初始化完成");
// }else{
// response = new MqttResponse().error("车辆初始化完成, 但是预约单创建失败了");
// }
// }else{
// //没有车辆信息, 开始创建
// if(vehicleService.createVehicleByPlateNum(plateNum, topic.getStationCode())){
// //创建预约订单
// if (orderSwapBatteryService.addPreByPlanNum(plateNum, topic.getStationCode())){
// //返回状态信息
// response = new MqttResponse().success("预约单初始化完成");
// }else{
// response = new MqttResponse().error("车辆初始化完成, 但是预约单创建失败了");
// }
// }else{
// response = new MqttResponse().error("创建车辆信息失败了");
// }
//
// }
}else{
response = new MqttResponse().error("参数不全, 没有车牌号信息");
}

View File

@ -43,7 +43,13 @@ public class MqttStateStationStateExchangeProcessor implements MqttStrategyExcha
* fire: 获取消防告警信号 0-未知;1-正常;2-告警
*/
//通知云端站做状态调整
batteryStationService.updateStatusByAlarm(topic.getStationCode(), dataBody.getInt("state"), dataBody.getStr("smoke"), dataBody.getInt("fire"));
saveMongoDB(topic, MongoConstant.STATION_INFO_BASE, header.getFunction(),new StationState(dataBody.toString()));
try {
batteryStationService.updateStatusByAlarm(topic.getStationCode(), dataBody.getInt("state"), dataBody.getStr("smoke"), dataBody.getInt("fire"));
} catch (Exception e) {
log.error("更改云端数据信息出错"+e.getMessage());
}finally {
saveMongoDB(topic, MongoConstant.STATION_INFO_BASE, header.getFunction(),new StationState(dataBody.toString()));
}
}
}

View File

@ -1,6 +1,6 @@
package com.evotech.hd.cloud.service;
import com.evotech.hd.common.core.Dto.DeviceDto;
import com.evotech.hd.common.core.Dto.device.DeviceDto;
import com.evotech.hd.common.core.entity.Result;
import java.util.List;

View File

@ -1,6 +1,5 @@
package com.evotech.hd.cloud.service;
import com.evotech.hd.cloud.entity.request.HomeDataRequest;
import com.evotech.hd.cloud.entity.vo.*;
import com.evotech.hd.common.core.Dto.Result;
@ -43,21 +42,21 @@ public interface HomeService {
* @return
*/
Result<List<HomeAlarmData>> alarmData();
public Result<HomeData1> homeData1(HomeDataRequest hd);
public Result<HomeData2> homeData2();
public Result<HomeData3> homeData3(HomeDataRequest hd);
public Result<HomeData4> homeData4(HomeDataRequest hd);
public Result<List<HomeData5>> homeData5(HomeDataRequest hd);
public Result<List<HomeData6>> homeData6(HomeDataRequest hd);
public Result<HomeData7> homeData7(Integer type);
public void loginData();
//
// public Result<HomeData1> homeData1(HomeDataRequest hd);
//
// public Result<HomeData2> homeData2();
//
// public Result<HomeData3> homeData3(HomeDataRequest hd);
//
// public Result<HomeData4> homeData4(HomeDataRequest hd);
//
// public Result<List<HomeData5>> homeData5(HomeDataRequest hd);
//
// public Result<List<HomeData6>> homeData6(HomeDataRequest hd);
//
// public Result<HomeData7> homeData7(Integer type);
//
// public void loginData();
}

View File

@ -1,11 +1,12 @@
package com.evotech.hd.cloud.service;
import java.util.List;
import com.evotech.hd.cloud.entity.MessageMqtt;
import com.evotech.hd.cloud.entity.request.PageListMessageMqttRequest;
import com.evotech.hd.cloud.entity.vo.MqttMessageParam;
import com.evotech.hd.common.core.entity.Result;
import java.util.List;
public interface MessageMqttService {
public Result<List<MessageMqtt>> list(PageListMessageMqttRequest plmmr);
@ -14,4 +15,6 @@ public interface MessageMqttService {
public Result<Integer> del();
public MessageMqtt getOne(MqttMessageParam param);
}

View File

@ -0,0 +1,37 @@
package com.evotech.hd.cloud.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.evotech.hd.cloud.entity.order.Order;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.order.OrderListVo;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* 订单接口
* @ClassName:OrderService
* @date: 2025年05月16日 13:56
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface OrderService extends IService<Order> {
/***
* 云平台查询订单列表
* @param plsor
* @return
*/
Result<Page<OrderListVo>> pageList(PageListSwapOrderRequest plsor);
/***
* 订单结算
* @param osb
* @return
*/
public Result<String> calculateCost(Order osb);
/***
* 更改订单状态信息
*/
public Result<Boolean> updateStatus(String orderNo, Integer status);
}

View File

@ -0,0 +1,15 @@
package com.evotech.hd.cloud.service;
/**
* 预约单接口
*
* @ClassName:OrderSwapBatteryPreService
* @date: 2025年05月19日 16:16
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface OrderSwapBatteryPreService {
public Boolean addPreByPlateNum(String plateNum, String stationCode);
}

View File

@ -1,63 +1,63 @@
package com.evotech.hd.cloud.service;
import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
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;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import java.text.ParseException;
import java.util.List;
public interface OrderSwapBatteryService {
public Result<Integer> addPre(OrderSwapBatteryPre osbp);
public Result<Integer> cancelPre(Integer id, Integer status);
public Result<List<OrderSwapBatteryPre>> listPre(PageListSwapOrderPreRequest plsopr) throws ParseException;
public Result<Integer> add(OrderSwapBattery osb);
public Result<Integer> delete(Integer id);
public Result<Integer> update(OrderSwapBattery osb);
public Result<List<OrderSwapBattery>> list(PageListSwapOrderRequest plsor);
public Result<List<OrderSwapBattery>> listByCompany(PageListSwapOrderRequest plsor);
public Result<List<OrderSwapBatteryStep>> listStep(String orderNo);
public Result<String> calculateCost1(String orderNo, OrderStatusData statusData);
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);
public Result<Integer> cancelOrder(String orderNo, Integer status);
public Result<Integer> markOrderAsExpired(Integer pkId);
public Result<Boolean> startSwap(String wuid,String orderId);
public Result<BatterySwapResponse> getStartSwap(String wuid, String orderId);
public Result<Integer> checkList(PageListSwapOrderRequest plsor);
public Boolean addPreByPlateNum(String plateNum, String stationCode);
public List<OrderSwapBatteryPre> findOrderSwapBatteryPreList(String stationCode);
Boolean clearOrderSwapBatteryPre(List<Integer> ids);
}
//package com.evotech.hd.cloud.service;
//
//import com.evotech.hd.cloud.entity.vo.NativePayVO;
//import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
//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;
//import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep;
//import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
//import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
//import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
//
//import java.text.ParseException;
//import java.util.List;
//
//public interface OrderSwapBatteryService {
//
// public Result<Integer> addPre(OrderSwapBatteryPre osbp);
//
// public Result<Integer> cancelPre(Integer id, Integer status);
//
// public Result<List<OrderSwapBatteryPre>> listPre(PageListSwapOrderPreRequest plsopr) throws ParseException;
//
// public Result<Integer> add(OrderSwapBattery osb);
//
// public Result<Integer> delete(Integer id);
//
// public Result<Integer> update(OrderSwapBattery osb);
//
// public Result<List<OrderSwapBattery>> list(PageListSwapOrderRequest plsor);
//
// public Result<List<OrderSwapBattery>> listByCompany(PageListSwapOrderRequest plsor);
//
// public Result<List<OrderSwapBatteryStep>> listStep(String orderNo);
//
// public Result<String> calculateCost1(String orderNo, OrderStatusData statusData);
//
// 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);
//
//
// public Result<Integer> cancelOrder(String orderNo, Integer status);
//
// public Result<Integer> markOrderAsExpired(Integer pkId);
//
// public Result<Boolean> startSwap(String wuid,String orderId);
//
// public Result<BatterySwapResponse> getStartSwap(String wuid, String orderId);
//
// public Result<Integer> checkList(PageListSwapOrderRequest plsor);
//
//
// public Boolean addPreByPlateNum(String plateNum, String stationCode);
//
// public List<OrderSwapBatteryPre> findOrderSwapBatteryPreList(String stationCode);
//
// Boolean clearOrderSwapBatteryPre(List<Integer> ids);
//}

View File

@ -0,0 +1,37 @@
package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.common.core.utils.Collections;
import org.springframework.beans.BeanUtils;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
*
* @ClassName:BaseServiceImpl
* @date: 2025年05月16日 14:55
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@SuppressWarnings("unchecked")
public class BaseServiceImpl<M extends BaseMapper<T>, T, D> extends ServiceImpl<M,T> {
Page<D> selectPage(Page<T> page, Wrapper<T> queryWrapper, Function<T,D> function){
Page<D> result = new Page<D>();
page = getBaseMapper().selectPage(page,queryWrapper);
BeanUtils.copyProperties(page, result, "records");
if(Collections.isNotEmpty(result.getRecords())){
result.setRecords(page.getRecords().stream().map(t ->{
return function.apply(t);
}).collect(Collectors.toList()));
}
return result;
}
}

View File

@ -6,7 +6,7 @@ import com.evotech.hd.cloud.device.dh.DHRequestUtil;
import com.evotech.hd.cloud.service.BatteryStationService;
import com.evotech.hd.cloud.service.DHDeviceService;
import com.evotech.hd.cloud.service.rpc.ResourceService;
import com.evotech.hd.common.core.Dto.DeviceDto;
import com.evotech.hd.common.core.Dto.device.DeviceDto;
import com.evotech.hd.common.core.Dto.ResultUtil;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.Result;

View File

@ -1,47 +1,34 @@
package com.evotech.hd.cloud.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.dao.*;
import com.evotech.hd.cloud.entity.request.HomeDataRequest;
import com.evotech.hd.cloud.entity.vo.*;
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
import com.evotech.hd.cloud.service.HomeService;
import com.evotech.hd.common.constant.MongoConstant;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.ResultUtil;
import com.evotech.hd.common.core.Dto.home.HomeOrderInfo;
import com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryAmountDto;
import com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryProportionDto;
import com.evotech.hd.common.core.Dto.request.HomeRequestDto;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderInfo;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryAmountDto;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto;
import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryProportionDto;
import com.evotech.hd.common.core.constant.HDConstant;
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.dao.resource.ProxyOperaterDao;
import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.cloud.*;
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.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.documnet.StationState;
import com.evotech.hd.common.permission.util.RedisPermissionUtils;
import com.evotech.hd.common.redis.utils.RedisUtil;
import com.evotech.hd.common.service.MongoDBService;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -65,13 +52,7 @@ public class HomeServiceImpl implements HomeService {
@Resource
private VehicleInfoDao vehicleInfoDao;
@Resource
private OrderSwapBatteryDao orderSwapBatteryDao;
// @Resource
// private TradeDetailDao tradeDetailDao;
@Resource
private HomeDataOrderSwapCollateDao homeDataOrderSwapCollateDao;
@Resource
private HomeDataTradeCollateDao homeDataTradeCollateDao;
private OrderDao orderDao;
@Resource
private RedisUtil redisUtil;
@ -97,7 +78,7 @@ public class HomeServiceImpl implements HomeService {
Date d = new Date();
HomeRequestDto homeRequestDto = new HomeRequestDto(DateUtil.offsetMonth(d, -5), d);
//订单数量 or 订单金额
List<HomeOrderSwapBatteryAmountDto> orderAmountlist = orderSwapBatteryDao.homeFindAmountData(homeRequestDto);
List<HomeOrderSwapBatteryAmountDto> orderAmountlist = orderDao.homeFindAmountData(homeRequestDto);
if(Collections.isNotEmpty(orderAmountlist)){
HomeOrderSwapBatteryAmountDto totalFinishOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).findFirst().orElse(null);
if(totalFinishOrder != null){
@ -113,7 +94,7 @@ public class HomeServiceImpl implements HomeService {
//计算占比
Map<String, Long> countMap = Collections.emptyMap();
List<HomeOrderSwapBatteryProportionDto> list = orderSwapBatteryDao.homeFindProportionData(homeRequestDto);
List<HomeOrderSwapBatteryProportionDto> list = orderDao.homeFindProportionData(homeRequestDto);
if(Collections.isNotEmpty(list)){
//总订单数
data.setTotalOrderNum(list.stream().collect(Collectors.summingLong(i -> i.getQuantity())));
@ -137,7 +118,7 @@ public class HomeServiceImpl implements HomeService {
});
data.setCountList(countList);
//近半年走势情况
data.setTrendList(orderSwapBatteryDao.homeFindHalfYearAmountData(homeRequestDto).stream().sorted((o1,o2) ->{
data.setTrendList(orderDao.homeFindHalfYearAmountData(homeRequestDto).stream().sorted((o1,o2) ->{
return o1.getMonth().compareTo(o2.getMonth());
}).collect(Collectors.toList()));
return new Result<HomePlatformData2>().success(data);
@ -170,7 +151,7 @@ public class HomeServiceImpl implements HomeService {
Date d = new Date();
HomeRequestDto homeRequestDto = new HomeRequestDto(DateUtil.beginOfMonth(d), d);
//订单数量 or 订单金额
List<HomeOrderSwapBatteryAmountDto> orderAmountlist = orderSwapBatteryDao.homeFindAmountData(homeRequestDto);
List<HomeOrderSwapBatteryAmountDto> orderAmountlist = orderDao.homeFindAmountData(homeRequestDto);
if(Collections.isNotEmpty(orderAmountlist)){
HomeOrderSwapBatteryAmountDto totalFinishOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).findFirst().orElse(null);
if(totalFinishOrder != null){
@ -188,7 +169,7 @@ public class HomeServiceImpl implements HomeService {
homeRequestDto = new HomeRequestDto(DateUtil.offsetMonth(d, -5), d);
//订单数量 or 订单金额
//计算占比
List<HomeOrderSwapBatteryProportionDto> list = orderSwapBatteryDao.homeFindProportionData(homeRequestDto);
List<HomeOrderSwapBatteryProportionDto> list = orderDao.homeFindProportionData(homeRequestDto);
if(Collections.isNotEmpty(list)){
//总订单数
data.setHalfYearTotalOrderNum(list.stream().collect(Collectors.summingLong(i -> i.getQuantity())));
@ -196,7 +177,7 @@ public class HomeServiceImpl implements HomeService {
}
//近半年走势情况
data.setTrendList(orderSwapBatteryDao.homeFindHalfYearAmountData(homeRequestDto).stream().sorted((o1,o2) ->{
data.setTrendList(orderDao.homeFindHalfYearAmountData(homeRequestDto).stream().sorted((o1,o2) ->{
return o1.getMonth().compareTo(o2.getMonth());
}).collect(Collectors.toList()));
return new Result<HomePoxyData2>().success(data);
@ -222,7 +203,7 @@ public class HomeServiceImpl implements HomeService {
//订单数量 or 订单金额
Date d = new Date();
List<HomeOrderSwapBatteryAmountDto> orderAmountlist = orderSwapBatteryDao.homeFindAmountData(new HomeRequestDto(DateUtil.beginOfMonth(d), d));
List<HomeOrderSwapBatteryAmountDto> orderAmountlist = orderDao.homeFindAmountData(new HomeRequestDto(DateUtil.beginOfMonth(d), d));
if(Collections.isNotEmpty(orderAmountlist)){
HomeOrderSwapBatteryAmountDto totalFinishOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).findFirst().orElse(null);
if(totalFinishOrder != null){
@ -235,7 +216,7 @@ public class HomeServiceImpl implements HomeService {
data.setTotalOrderNum(defaultValue(data.getTotalFinishOrderNum(),0l)+defaultValue(data.getTotalPendingOrderNum(), 0l));
}
//近半年走势情况
data.setTrendList(orderSwapBatteryDao.homeFindHalfYearStationAmountData(new HomeRequestDto(DateUtil.offsetMonth(d, -5), d)).stream().sorted((o1,o2) ->{
data.setTrendList(orderDao.homeFindHalfYearStationAmountData(new HomeRequestDto(DateUtil.offsetMonth(d, -5), d)).stream().sorted((o1,o2) ->{
return o1.getMonth().compareTo(o2.getMonth());
}).collect(Collectors.toList()));
return new Result<HomeStationData>().success(data);
@ -249,7 +230,7 @@ public class HomeServiceImpl implements HomeService {
//2 人员
data.setUserNum(wechatUserDao.selectCount(new LambdaQueryWrapper<WechatUser>().select(WechatUser::getPkId)));
//获取待结算订单
List<HomeOrderInfo> orderInfo = orderSwapBatteryDao.findOrderListByStatus(6);
List<HomeOrderInfo> orderInfo = orderDao.findOrderListByStatus(6);
//待结算订单数量
data.setPendingOrderNum(Long.valueOf(orderInfo.size()));
//待结算订单金额
@ -299,187 +280,187 @@ public class HomeServiceImpl implements HomeService {
@Override
public Result<HomeData1> homeData1(HomeDataRequest hd) {
// 1. 运营商
List<ProxyOperater> list1 = proxyOperaterDao.selectList(new LambdaQueryWrapper<ProxyOperater>()
.eq(StringUtils.hasText(hd.getPoCode()), ProxyOperater::getPocode, hd.getPoCode()));
HomeData1 data = new HomeData1();
data.setProxyer(list1.size());
// 2. 换电站
List<BatteryStation> list2 = batteryStationDao.selectList(new LambdaQueryWrapper<BatteryStation>()
.eq(BatteryStation::getDelFlag, 0)
.eq(StringUtils.hasText(hd.getPoCode()), BatteryStation::getProxyId, hd.getPoCode())
.eq(StringUtils.hasText(hd.getStationCode()), BatteryStation::getCode, hd.getStationCode()).select(BatteryStation::getStatus));
data.setTotalStation(list2.size());
int size1 = list2.stream().filter(i -> i.getStatus() == 1).toList().size();
data.setWorkStation(size1);
// 电池
List<BatteryStationDc> list3 = batteryStationDcDao.selectList(new LambdaQueryWrapper<BatteryStationDc>()
.eq(BatteryStationDc::getDelFlag, 0)
.eq(StringUtils.hasText(hd.getStationCode()), BatteryStationDc::getSourceCode, hd.getStationCode()).select(BatteryStationDc::getStatus));
data.setTotalDC(list3.size());
int dcSize1 = list3.stream().filter(i -> i.getStatus() == 2).toList().size();
data.setChargeDC(dcSize1);
int dcSize2 = list3.stream().filter(i -> i.getStatus() == 3).toList().size();
data.setAvailableDC(dcSize2);
// 机器人
List<BatteryStationRobot> list4 = batteryStationRobotDao.selectList(new LambdaQueryWrapper<BatteryStationRobot>()
.eq(StringUtils.hasText(hd.getStationCode()), BatteryStationRobot::getStationCode, hd.getStationCode()).select(BatteryStationRobot::getStatus));
data.setTotalRobot(list4.size());
int robotSize1 = list4.stream().filter(i -> i.getStatus() == 1).toList().size();
data.setAvailableRobot(robotSize1);
return new Result<HomeData1>().success(data);
}
@Override
public Result<HomeData2> homeData2() {
HomeData2 data = new HomeData2();
// 1. 公司
Long count1 = companyDao.selectCount(new LambdaQueryWrapper<Company>().select(Company::getPkId));
data.setConpany(count1.intValue());
// 2. 用户
Long count2 = wechatUserDao.selectCount(new LambdaQueryWrapper<WechatUser>().select(WechatUser::getPkId));
data.setTotalUser(count2.intValue());
// 3. 车辆
Long count3 = vehicleInfoDao.selectCount(new LambdaQueryWrapper<VehicleInfo>().select(VehicleInfo::getPkId));
data.setTotalCar(count3.intValue());
return new Result<HomeData2>().success(data);
}
@Override
public Result<HomeData3> homeData3(HomeDataRequest hd) {
if (hd.getTimeBegin() == null || hd.getTimeEnd() == null) {
return new Result<HomeData3>().error(CodeMsg.PARAM_ERROR,"时间范围未填写!");
}
HomeData3 data = new HomeData3();
data.setDayBegin(DateUtil.format(hd.getTimeBegin(), DatePattern.PURE_DATE_PATTERN));
data.setDayEnd(DateUtil.format(hd.getTimeEnd(), DatePattern.PURE_DATE_PATTERN));
List<HomeOrderSwapBatteryProportionDto> list = orderSwapBatteryDao.homeFindProportionData(new HomeRequestDto(hd.getTimeBegin(), hd.getTimeEnd()));
if(Collections.isNotEmpty(list)){
Long total = list.stream().collect(Collectors.summingLong(i -> i.getQuantity()));
data.setQuantity(total);
}
data.setStationOrderDataList(list);;
return new Result<HomeData3>().success(data);
}
@Override
public Result<HomeData4> homeData4(HomeDataRequest hd) {
if (hd.getTimeBegin() == null || hd.getTimeEnd() == null) {
return new Result<HomeData4>().error(CodeMsg.PARAM_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<HomeOrderSwapBatteryAmountDto> list = orderSwapBatteryDao.homeFindAmountData(new HomeRequestDto(hd.getTimeBegin(), hd.getTimeEnd()));
if(Collections.isNotEmpty(list)){
data.setTotalMoney(list.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).collect(Collectors.summingDouble(i -> i.getAmount())));
data.setTotalRefund(list.stream().filter(i -> Integer.valueOf(-1).equals(i.getStatus())).collect(Collectors.summingDouble(i -> i.getAmount())));
}
return new Result<HomeData4>().success(data);
}
@Override
public Result<List<HomeData5>> homeData5(HomeDataRequest hd) {
Integer id = RedisPermissionUtils.getUserPkId();
String key = HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.IndexConstant.HOME_DATA_5+":"+id;
List<HomeData5> list = Collections.emptyList();
if(!redisUtil.hasKey(key)){
Date d = new Date();
list = orderSwapBatteryDao.homeFindHalfYearOrderData(new HomeRequestDto(DateUtil.offsetMonth(d, -6), d)).stream().map(data->{
HomeData5 homeData5 = new HomeData5();
BeanUtils.copyProperties(data, homeData5);
homeData5.setTotalMoney(new BigDecimal(data.getTotalMoney()).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
return homeData5;
}).sorted((o1,o2) ->{
return o1.getMonth().compareTo(o2.getMonth());
}).collect(Collectors.toList());
redisUtil.set(key, JSONUtil.toJsonStr(list));
}else{
list = JSONUtil.toList(redisUtil.getStringValue(key), HomeData5.class);
}
// 1. 找出6个月\
Date d = new Date();
return new Result<List<HomeData5>>().success(list);
}
@Override
public Result<List<HomeData6>> homeData6(HomeDataRequest hd) {
Integer id = RedisPermissionUtils.getUserPkId();
String key = HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.IndexConstant.HOME_DATA_6+":"+id;
List<HomeData6> list = Collections.emptyList();
if(!redisUtil.hasKey(key)){
Date d = new Date();
Map<String, List<HomeOrderSwapBatteryHalfYearAmountDto>> mapList= orderSwapBatteryDao.homeFindHalfYearAmountData(new HomeRequestDto(DateUtil.offsetMonth(d, -6), d)).stream().collect(Collectors.groupingBy(HomeOrderSwapBatteryHalfYearAmountDto::getMonth));
Iterator<String> it = mapList.keySet().iterator();
while (it.hasNext()){
String month = it.next();
HomeData6 homeData6 = new HomeData6();
homeData6.setMonth(month);
// List<HomeOrderSwapBatteryHalfYearAmountDto> values = mapList.get(month);
// HomeOrderSwapBatteryHalfYearAmountDto wechat = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(2).equals(f.getPayType())).findFirst().orElse(null);
// if(ObjectUtils.isNotEmpty(wechat)){
// homeData6.setInQuantity(wechat.getQuantity());
// homeData6.setInMoney(wechat.getTotalMoney());
// }
//
// HomeOrderSwapBatteryHalfYearAmountDto account = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(1).equals(f.getPayType())).findFirst().orElse(null);
// if(ObjectUtils.isNotEmpty(account)){
// homeData6.setWalletQuantity(account.getQuantity());
// homeData6.setWalletMoney(account.getTotalMoney());
// }
//
// List<HomeOrderSwapBatteryHalfYearAmountDto> refund = values.stream().filter(f -> Integer.valueOf(-1).equals(f.getStatus())).collect(Collectors.toList());
// if(Collections.isNotEmpty(refund)){
// homeData6.setRefundQuantity(refund.stream().collect(Collectors.summingLong(i -> i.getQuantity())));
// homeData6.setRefundMoney(refund.stream().collect(Collectors.summingDouble(i -> i.getTotalMoney())));
// }
list.add(homeData6);
}
list = list.stream().sorted((o1,o2) ->{
return o1.getMonth().compareTo(o2.getMonth());
}).collect(Collectors.toList());
redisUtil.set(key, JSONUtil.toJsonStr(list));
}else{
list = JSONUtil.toList(redisUtil.getStringValue(key), HomeData6.class);
}
return new Result<List<HomeData6>>().success(list);
}
//
// @Override
// public Result<HomeData1> homeData1(HomeDataRequest hd) {
// // 1. 运营商
// List<ProxyOperater> list1 = proxyOperaterDao.selectList(new LambdaQueryWrapper<ProxyOperater>()
// .eq(StringUtils.hasText(hd.getPoCode()), ProxyOperater::getPocode, hd.getPoCode()));
// HomeData1 data = new HomeData1();
// data.setProxyer(list1.size());
// // 2. 换电站
// List<BatteryStation> list2 = batteryStationDao.selectList(new LambdaQueryWrapper<BatteryStation>()
// .eq(BatteryStation::getDelFlag, 0)
// .eq(StringUtils.hasText(hd.getPoCode()), BatteryStation::getProxyId, hd.getPoCode())
// .eq(StringUtils.hasText(hd.getStationCode()), BatteryStation::getCode, hd.getStationCode()).select(BatteryStation::getStatus));
// data.setTotalStation(list2.size());
// int size1 = list2.stream().filter(i -> i.getStatus() == 1).toList().size();
// data.setWorkStation(size1);
// // 电池
// List<BatteryStationDc> list3 = batteryStationDcDao.selectList(new LambdaQueryWrapper<BatteryStationDc>()
// .eq(BatteryStationDc::getDelFlag, 0)
// .eq(StringUtils.hasText(hd.getStationCode()), BatteryStationDc::getSourceCode, hd.getStationCode()).select(BatteryStationDc::getStatus));
// data.setTotalDC(list3.size());
// int dcSize1 = list3.stream().filter(i -> i.getStatus() == 2).toList().size();
// data.setChargeDC(dcSize1);
// int dcSize2 = list3.stream().filter(i -> i.getStatus() == 3).toList().size();
// data.setAvailableDC(dcSize2);
// // 机器人
// List<BatteryStationRobot> list4 = batteryStationRobotDao.selectList(new LambdaQueryWrapper<BatteryStationRobot>()
// .eq(StringUtils.hasText(hd.getStationCode()), BatteryStationRobot::getStationCode, hd.getStationCode()).select(BatteryStationRobot::getStatus));
// data.setTotalRobot(list4.size());
// int robotSize1 = list4.stream().filter(i -> i.getStatus() == 1).toList().size();
// data.setAvailableRobot(robotSize1);
//
// return new Result<HomeData1>().success(data);
// }
//
// @Override
// public Result<HomeData2> homeData2() {
// HomeData2 data = new HomeData2();
// // 1. 公司
// Long count1 = companyDao.selectCount(new LambdaQueryWrapper<Company>().select(Company::getPkId));
// data.setConpany(count1.intValue());
// // 2. 用户
// Long count2 = wechatUserDao.selectCount(new LambdaQueryWrapper<WechatUser>().select(WechatUser::getPkId));
// data.setTotalUser(count2.intValue());
// // 3. 车辆
// Long count3 = vehicleInfoDao.selectCount(new LambdaQueryWrapper<VehicleInfo>().select(VehicleInfo::getPkId));
// data.setTotalCar(count3.intValue());
//
// return new Result<HomeData2>().success(data);
// }
//
// @Override
// public Result<HomeData3> homeData3(HomeDataRequest hd) {
// if (hd.getTimeBegin() == null || hd.getTimeEnd() == null) {
// return new Result<HomeData3>().error(CodeMsg.PARAM_ERROR,"时间范围未填写!");
// }
// HomeData3 data = new HomeData3();
// data.setDayBegin(DateUtil.format(hd.getTimeBegin(), DatePattern.PURE_DATE_PATTERN));
// data.setDayEnd(DateUtil.format(hd.getTimeEnd(), DatePattern.PURE_DATE_PATTERN));
//
// List<HomeOrderSwapBatteryProportionDto> list = orderDao.homeFindProportionData(new HomeRequestDto(hd.getTimeBegin(), hd.getTimeEnd()));
// if(Collections.isNotEmpty(list)){
// Long total = list.stream().collect(Collectors.summingLong(i -> i.getQuantity()));
// data.setQuantity(total);
// }
// data.setStationOrderDataList(list);;
// return new Result<HomeData3>().success(data);
// }
//
// @Override
// public Result<HomeData4> homeData4(HomeDataRequest hd) {
// if (hd.getTimeBegin() == null || hd.getTimeEnd() == null) {
// return new Result<HomeData4>().error(CodeMsg.PARAM_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<HomeOrderSwapBatteryAmountDto> list = orderDao.homeFindAmountData(new HomeRequestDto(hd.getTimeBegin(), hd.getTimeEnd()));
// if(Collections.isNotEmpty(list)){
// data.setTotalMoney(list.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).collect(Collectors.summingDouble(i -> i.getAmount())));
// data.setTotalRefund(list.stream().filter(i -> Integer.valueOf(-1).equals(i.getStatus())).collect(Collectors.summingDouble(i -> i.getAmount())));
// }
// return new Result<HomeData4>().success(data);
// }
//
// @Override
// public Result<List<HomeData5>> homeData5(HomeDataRequest hd) {
// Integer id = RedisPermissionUtils.getUserPkId();
// String key = HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.IndexConstant.HOME_DATA_5+":"+id;
// List<HomeData5> list = Collections.emptyList();
// if(!redisUtil.hasKey(key)){
// Date d = new Date();
// list = orderDao.homeFindHalfYearOrderData(new HomeRequestDto(DateUtil.offsetMonth(d, -6), d)).stream().map(data->{
// HomeData5 homeData5 = new HomeData5();
// BeanUtils.copyProperties(data, homeData5);
// homeData5.setTotalMoney(new BigDecimal(data.getTotalMoney()).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
// return homeData5;
// }).sorted((o1,o2) ->{
// return o1.getMonth().compareTo(o2.getMonth());
// }).collect(Collectors.toList());
// redisUtil.set(key, JSONUtil.toJsonStr(list));
// }else{
// list = JSONUtil.toList(redisUtil.getStringValue(key), HomeData5.class);
// }
// // 1. 找出6个月\
// Date d = new Date();
// return new Result<List<HomeData5>>().success(list);
// }
//
// @Override
// public Result<List<HomeData6>> homeData6(HomeDataRequest hd) {
// Integer id = RedisPermissionUtils.getUserPkId();
// String key = HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.IndexConstant.HOME_DATA_6+":"+id;
// List<HomeData6> list = Collections.emptyList();
// if(!redisUtil.hasKey(key)){
// Date d = new Date();
// Map<String, List<HomeOrderSwapBatteryHalfYearAmountDto>> mapList= orderDao.homeFindHalfYearAmountData(new HomeRequestDto(DateUtil.offsetMonth(d, -6), d)).stream().collect(Collectors.groupingBy(HomeOrderSwapBatteryHalfYearAmountDto::getMonth));
// Iterator<String> it = mapList.keySet().iterator();
// while (it.hasNext()){
// String month = it.next();
// HomeData6 homeData6 = new HomeData6();
// homeData6.setMonth(month);
//// List<HomeOrderSwapBatteryHalfYearAmountDto> values = mapList.get(month);
//// HomeOrderSwapBatteryHalfYearAmountDto wechat = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(2).equals(f.getPayType())).findFirst().orElse(null);
//// if(ObjectUtils.isNotEmpty(wechat)){
//// homeData6.setInQuantity(wechat.getQuantity());
//// homeData6.setInMoney(wechat.getTotalMoney());
//// }
////
//// HomeOrderSwapBatteryHalfYearAmountDto account = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(1).equals(f.getPayType())).findFirst().orElse(null);
//// if(ObjectUtils.isNotEmpty(account)){
//// homeData6.setWalletQuantity(account.getQuantity());
//// homeData6.setWalletMoney(account.getTotalMoney());
//// }
////
//// List<HomeOrderSwapBatteryHalfYearAmountDto> refund = values.stream().filter(f -> Integer.valueOf(-1).equals(f.getStatus())).collect(Collectors.toList());
//// if(Collections.isNotEmpty(refund)){
//// homeData6.setRefundQuantity(refund.stream().collect(Collectors.summingLong(i -> i.getQuantity())));
//// homeData6.setRefundMoney(refund.stream().collect(Collectors.summingDouble(i -> i.getTotalMoney())));
//// }
// list.add(homeData6);
// }
// list = list.stream().sorted((o1,o2) ->{
// return o1.getMonth().compareTo(o2.getMonth());
// }).collect(Collectors.toList());
// redisUtil.set(key, JSONUtil.toJsonStr(list));
// }else{
// list = JSONUtil.toList(redisUtil.getStringValue(key), HomeData6.class);
// }
// return new Result<List<HomeData6>>().success(list);
// }
//
// @Override
// public Result<HomeData7> homeData7(Integer type) {
// HomeData7 data = new HomeData7();
// Date d = new Date();
// // 按月
// Date month = DateUtil.beginOfMonth(d);
// Date beforeMonth = DateUtil.offsetMonth(month, -1);
// Date beforeYearMonth = DateUtil.offsetYear(d, -1);
// data.setMonth(DateUtil.format(month, "yyyy-MM"));
// //订单数量
// data.setQuantity(orderDao.homeFindOrderCountData(month));
// data.setTradeAmount(orderDao.homeFindOrderAmountData(month));
// //环比
// data.setLastMonthQuantity(orderDao.homeFindOrderCountData(beforeMonth));
// data.setLastMonthTradeAmount(orderDao.homeFindOrderAmountData(beforeMonth));
// //同比
// data.setLastYearQuantity(orderDao.homeFindOrderCountData(beforeYearMonth));
// data.setLastYearTradeAmount(orderDao.homeFindOrderAmountData(beforeYearMonth));
// return new Result<HomeData7>().success(data);
// }
@Override
public Result<HomeData7> homeData7(Integer type) {
HomeData7 data = new HomeData7();
Date d = new Date();
// 按月
Date month = DateUtil.beginOfMonth(d);
Date beforeMonth = DateUtil.offsetMonth(month, -1);
Date beforeYearMonth = DateUtil.offsetYear(d, -1);
data.setMonth(DateUtil.format(month, "yyyy-MM"));
//订单数量
data.setQuantity(orderSwapBatteryDao.homeFindOrderCountData(month));
data.setTradeAmount(orderSwapBatteryDao.homeFindOrderAmountData(month));
//环比
data.setLastMonthQuantity(orderSwapBatteryDao.homeFindOrderCountData(beforeMonth));
data.setLastMonthTradeAmount(orderSwapBatteryDao.homeFindOrderAmountData(beforeMonth));
//同比
data.setLastYearQuantity(orderSwapBatteryDao.homeFindOrderCountData(beforeYearMonth));
data.setLastYearTradeAmount(orderSwapBatteryDao.homeFindOrderAmountData(beforeYearMonth));
return new Result<HomeData7>().success(data);
}
@Override
public void loginData() {
HomeDataRequest hd = new HomeDataRequest();
homeData5(hd);
homeData6(hd);
}
// @Override
// public void loginData() {
// HomeDataRequest hd = new HomeDataRequest();
// homeData5(hd);
// homeData6(hd);
// }
}

View File

@ -1,21 +1,23 @@
package com.evotech.hd.cloud.service.impl;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.dao.MessageMqttDao;
import com.evotech.hd.cloud.entity.MessageMqtt;
import com.evotech.hd.cloud.entity.request.PageListMessageMqttRequest;
import com.evotech.hd.cloud.entity.vo.MqttMessageParam;
import com.evotech.hd.cloud.service.MessageMqttService;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
@Service
@ -56,4 +58,16 @@ public class MessageMqttServiceImpl implements MessageMqttService {
return null;
}
@Override
public MessageMqtt getOne(MqttMessageParam param) {
List<MessageMqtt> list = messageMqttDao.selectList(new LambdaQueryWrapper<MessageMqtt>()
.eq(MessageMqtt::getStationCode, param.getStationCode())
.eq(MessageMqtt::getDirection, param.getDirection())
.eq(MessageMqtt::getType, param.getType())
.apply(" DATE_FORMAT(ctime,'%Y-%m-%d') ={0}", DateFormatUtils.format(param.getCtime(), "yyyy-MM-dd"))
.apply(" content->'$.dataBody.orderNo'={1}", param.getOrderNo())
.eq(MessageMqtt::getMessageFunction, param.getMessageFunction()).orderByDesc(MessageMqtt::getCtime));
return (Collections.isNotEmpty(list) ? list.get(0) : null);
}
}

View File

@ -0,0 +1,125 @@
package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.dao.OrderDao;
import com.evotech.hd.cloud.dao.OrderDetailDao;
import com.evotech.hd.cloud.entity.order.Order;
import com.evotech.hd.cloud.entity.order.OrderDetail;
import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.order.OrderListVo;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.web.util.EnumUtils;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.function.Function;
/**
* 订单的业务实现类
*
* @ClassName:OrderServiceImpl
* @date: 2025年05月16日 13:58
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class OrderServiceImpl extends BaseServiceImpl<OrderDao, Order, OrderListVo> implements OrderService {
@Resource
private OrderDetailDao orderDetailDao;
@Resource
private SwapOrderBasicFeeComponent orderBasicFeeComponent;
@Override
public Result<Page<OrderListVo>> pageList(PageListSwapOrderRequest plsor) {
return new Result<Page<OrderListVo>>().success(selectPage(new Page<Order>(plsor.getPageNo(), plsor.getPageSize()), new LambdaQueryWrapper<Order>()
.eq(StringUtils.isNotEmpty(plsor.getOrderNo()), Order::getOrderNo, plsor.getOrderNo())
.eq(StringUtils.isNotEmpty(plsor.getPlateNum()), Order::getPlateNum, plsor.getPlateNum())
.ge(ObjectUtils.isNotEmpty(plsor.getOrderTimeBegin()), Order::getOrderTime, plsor.getOrderTimeBegin())
.le(ObjectUtils.isNotEmpty(plsor.getOrderTimeEnd()), Order::getOrderTime, plsor.getOrderTimeEnd())
.eq(StringUtils.isNotEmpty(plsor.getStationCode()), Order::getStationCode, plsor.getStationCode())
.eq(StringUtils.isNotEmpty(plsor.getTradeNo()), Order::getNotifyOrderNo, plsor.getTradeNo())
.ne(Order::getDelFlag, 1)
.orderByDesc(Order::getOrderTime), new Function<Order, OrderListVo>() {
@Override
public OrderListVo apply(Order order) {
OrderListVo vo = new OrderListVo();
BeanUtils.copyProperties(order, vo);
return vo;
}
}));
}
@Override
public Result<String> calculateCost(Order order) {
//查询详情数据, 检查详情相关数据是否存在
OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()), false);
if(ObjectUtils.isEmpty(orderDetail)){
return new Result<String>().error("当前订单没有订单详情,无法处理");
}
// 2. 检查数据
if (orderDetail.getServiceFee() == null || orderDetail.getUnitPrice() == null) {
orderDetail = orderBasicFeeComponent.orderBasicFee(order, orderDetail);
if (orderDetail.getServiceFee() == null || orderDetail.getUnitPrice() == null) {
return new Result<String>().error("订单费用标准异常!");
}
}
// 2. 检查消耗量
if (orderDetail.getElectricityQuantity() == null) {
orderDetail = orderBasicFeeComponent.calculateElectricityQuantity(order, orderDetail);
if (orderDetail.getElectricityQuantity() == null) {
return new Result<String>().error("订单消费统计信息异常!");
}
}
// 3. 选择费用计算方式 计算费用, 这里计算出来直接就是分
BigDecimal orderFee = new BigDecimal(orderDetail.getUnitPrice()).multiply(new BigDecimal(orderDetail.getElectricityQuantity())).setScale(0, RoundingMode.HALF_UP);
//订单价格
orderDetail.setOrderFee(orderFee.intValue());
// 4. 跟新订单
order.setOrderAmount(orderFee.add(new BigDecimal(orderDetail.getServiceFee())).intValue());
order.setStatus(OrderStatusEnums.TOPAY.getCode());
getBaseMapper().updateById(order);
//更新订单详情
orderDetailDao.updateById(orderDetail);
return new Result<String>().success("");
}
@Override
public Result<Boolean> updateStatus(String orderNo, Integer status) {
//根据订单编码查询此订单
Order order = getBaseMapper().selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
if (order == null) {
return new Result<Boolean>().error("订单不存在", false);
}
// 2.如果当前是关闭状态, 检查当前订单是否只是创建状态, 如果不是创建状态, 返回无法关闭
if (OrderStatusEnums.CANCLE.getCode().equals(status) && !OrderStatusEnums.CREATE.getCode().equals(order.getStatus())) {
return new Result<Boolean>().error("当前状态不允许关闭,订单状态:" + EnumUtils.getEnumPropertyValue(OrderStatusEnums.class, order.getStatus()), false);
}
order.setStatus(status);
order.setUpdateTime(new Date());
// 3.更新订单状态
if (getBaseMapper().updateById(order) > 0){
return new Result<Boolean>().success(true);
}else{
return new Result<Boolean>().error((OrderStatusEnums.CANCLE.getCode().equals(status) ? "取消订单失败" : "订单状态调整失败"), false);
}
}
}

View File

@ -0,0 +1,72 @@
package com.evotech.hd.cloud.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.dao.BatteryStationDao;
import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao;
import com.evotech.hd.cloud.service.OrderSwapBatteryPreService;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
*
*
* @ClassName:OrderSwapBatteryreServiceImpl
* @date: 2025年05月19日 16:18
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Slf4j
@Service
public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBatteryPreDao, OrderSwapBatteryPre> implements OrderSwapBatteryPreService {
@Resource
BatteryStationDao batteryStationDao;
@Override
public Boolean addPreByPlateNum(String plateNum, String stationCode) {
BatteryStation batteryStation = batteryStationDao.selectOne(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, stationCode).select(BatteryStation::getCode, BatteryStation::getName), false);
// 3. 添加预约
Date day = new Date();
OrderSwapBatteryPre osbp = new OrderSwapBatteryPre();
osbp.setSource(3);
osbp.setSourceId(batteryStation.getCode());
osbp.setUcode("hp_station_push");
osbp.setUname("慧鹏站端推送");
osbp.setPhone("12332112345");
osbp.setPlateNum(plateNum);
osbp.setStationCode(batteryStation.getCode());
osbp.setStationName(batteryStation.getName());
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");
osbp.setReservationTime(osbp.getReservationTime() == null ? day : osbp.getReservationTime());
osbp.setCtime(day);
getBaseMapper().insert(osbp);
//特殊渠道反推的数据, 不需要发送通知
// if (n == 1) {
// // 计算过期时间(预约时间后30分钟)
// Date expireTime = DateUtil.offsetMinute(osbp.getReservationTime(), 90);
// // 将预约单ID和过期时间存入Redis,设置过期时间为预约时间后30分钟
// String redisKey = "preorder:expire:" + osbp.getPkId();
// redisUtil.set(redisKey, expireTime);
// // 发送服务号消息没有消息队列先用接口吧
// templateMessageService.preOrderMessageSend(osbp);
// return true;
// }
return true;
}
}

View File

@ -1,12 +1,11 @@
package com.evotech.hd.cloud.task;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.cloud.service.OrderSwapBatteryService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.entity.order.Order;
import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService;
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.OrderSwapBattery;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.enums.CodeMsg;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@ -22,9 +21,7 @@ import java.util.List;
public class OrderCostCalculateTask {
@Resource
private OrderSwapBatteryDao orderSwapBatteryDao;
@Resource
private OrderSwapBatteryService orderSwapBatteryService;
private OrderService orderService;
@Resource
private GZHTemplateMessageService gzhTemplateMessageService;
@ -37,9 +34,9 @@ public class OrderCostCalculateTask {
Boolean flag = true;
int n = 0;
while (flag) {
List<OrderSwapBattery> list = orderSwapBatteryDao.selectList(new QueryWrapper<OrderSwapBattery>()
.eq("status", 5).ne("del_flag", 1)
.ge("order_time", DateUtil.beginOfYear(new Date()))
List<Order> list = orderService.list(new LambdaQueryWrapper<Order>()
.eq(Order::getStatus, 5).ne(Order::getDelFlag, 1)
.ge(Order::getOrderTime, DateUtil.beginOfYear(new Date()))
.last("limit 20"));
if (!list.isEmpty()) {
n = orderCalculate(n, list);
@ -48,16 +45,14 @@ public class OrderCostCalculateTask {
flag = false;
}
}
log.info("\r\n===>>>订单计算费用完成:{} 条数据", n);
}
private int orderCalculate(int n, List<OrderSwapBattery> list) {
private int orderCalculate(int n, List<Order> list) {
for (int i = 0; i < list.size(); i++) {
Result<String> res = orderSwapBatteryService.calculateCost(list.get(i));
Result<String> res = orderService.calculateCost(list.get(i));
if ( CodeMsg.SUCCESS.getCode().equals(res.getCode())) {
n += 1;
// 发送微信消息

View File

@ -3,18 +3,31 @@ package com.evotech.hd.cloud.utils.components;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.dao.BatteryStationHdFeeStandardDao;
import com.evotech.hd.cloud.dao.OrderDetailDao;
import com.evotech.hd.cloud.entity.MessageMqtt;
import com.evotech.hd.cloud.entity.order.Order;
import com.evotech.hd.cloud.entity.order.OrderDetail;
import com.evotech.hd.cloud.entity.vo.MqttMessageParam;
import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.service.MessageMqttService;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.IdEntity;
import com.evotech.hd.common.core.entity.cloud.BatteryStationHdFeeStandard;
import com.evotech.hd.common.core.entity.cloud.BatteryStationHdFeeStandardDetail;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.core.utils.CommonUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
@ -22,6 +35,11 @@ public class SwapOrderBasicFeeComponent {
@Resource
private BatteryStationHdFeeStandardDao batteryStationHdFeeStandardDao;
@Resource
private OrderDetailDao orderDetailDao;
@Resource
private MessageMqttService messageMqttService;
/**
* 计算订单的基本费用和服务费用
@ -30,26 +48,26 @@ public class SwapOrderBasicFeeComponent {
* @param osb 订单对象包含站点代码和订单时间
* @return 更新后的订单对象包含计算后的基本费用和服务费用
*/
public OrderSwapBattery orderBasicFee(OrderSwapBattery osb) {
public OrderDetail orderBasicFee(Order order, OrderDetail orderDetail) {
// 根据换电站编码和订单时间查询费用标准列表
List<BatteryStationHdFeeStandard> list = batteryStationHdFeeStandardDao.listFeeStandard(osb.getStationCode(), DateUtil.format(osb.getOrderTime(), DatePattern.PURE_DATE_FORMATTER));
List<BatteryStationHdFeeStandard> list = batteryStationHdFeeStandardDao.listFeeStandard(order.getStationCode(), DateUtil.format(order.getOrderTime(), DatePattern.PURE_DATE_FORMATTER));
if(CollectionUtils.isEmpty(list)){
list = batteryStationHdFeeStandardDao.orderCreateBeforeFeeEndStandard(osb.getStationCode(), DateUtil.format(osb.getOrderTime(), DatePattern.PURE_DATE_FORMATTER));
list = batteryStationHdFeeStandardDao.orderCreateBeforeFeeEndStandard(order.getStationCode(), DateUtil.format(order.getOrderTime(), DatePattern.PURE_DATE_FORMATTER));
}
if(CollectionUtils.isEmpty(list)){
list = batteryStationHdFeeStandardDao.orderCreateAfterFeeBeginStandard(osb.getStationCode(), DateUtil.format(osb.getOrderTime(), DatePattern.PURE_DATE_FORMATTER));
list = batteryStationHdFeeStandardDao.orderCreateAfterFeeBeginStandard(order.getStationCode(), DateUtil.format(order.getOrderTime(), DatePattern.PURE_DATE_FORMATTER));
}
log.info("换电站编码{}时间{}订单费用计算参数========>{}, 费用标准信息:{}", DateUtil.format(osb.getOrderTime(), DatePattern.PURE_DATE_FORMATTER),osb.getStationCode(),JSONUtil.toJsonStr(osb),JSONUtil.toJsonStr(list));
log.info("换电站编码{}时间{}订单费用计算参数========>{}, 费用标准信息:{}", DateUtil.format(order.getOrderTime(), DatePattern.PURE_DATE_FORMATTER),order.getStationCode(),JSONUtil.toJsonStr(order),JSONUtil.toJsonStr(list));
// 如果费用标准列表不为空说明找到了相关的费用标准
if (!list.isEmpty()) {
// 获取第一个费用标准
BatteryStationHdFeeStandard standard = list.get(0);
Integer serviceFee = CommonUtil.yuanToFen(standard.getServiceFee()).intValue();
Integer unitPrice = getUnitFee(orderDetail.getFeeType(), standard);
String feeStandard = JSONUtil.toJsonStr(standard);
// 获取该标准下的详细费用列表
List<BatteryStationHdFeeStandardDetail> detailList = standard.getDetailList();
List<BatteryStationHdFeeStandard> battery = new ArrayList<>();
battery.add(standard);
// 如果详细费用列表不为空进行时间范围过滤
if (!detailList.isEmpty()) {
// 过滤出当前时间在有效时间范围内的费用详情
@ -58,28 +76,124 @@ public class SwapOrderBasicFeeComponent {
// 如果过滤后的详细费用列表不为空使用第一个有效的费用详情
if (!detailList.isEmpty()) {
BatteryStationHdFeeStandardDetail detail = detailList.get(0);
log.info("当前时间在费用详情有效时间范围内=====>{}", JSONUtil.toJsonStr(detail));
// 设置基本费用和服务费用
osb.setFeeStandardJson(JSONUtil.toJsonStr(detail));
osb.setBasicFee(detail.getEachSocFee());
osb.setServiceFee(detail.getTimeServiceFee());
} else {
// 如果没有有效的详细费用使用标准费用
osb.setFeeStandardJson(JSONUtil.toJsonStr(standard));
osb.setBasicFee(standard.getEachSocFee());
osb.setServiceFee(standard.getCommonRemainFee());
serviceFee = CommonUtil.yuanToFen(detail.getServiceFee()).intValue();
unitPrice = getUnitFee(orderDetail.getFeeType(), detail);
feeStandard = JSONUtil.toJsonStr(detail);
}
}
try {
orderDetail.setServiceFee(serviceFee);
orderDetail.setUnitPrice(unitPrice);
orderDetail.setFeeStandard(feeStandard);
//直接更新数据
orderDetailDao.updateById(orderDetail);
} catch (Exception e) {
log.error("更新费用信息出现错误"+e.getMessage());
}
}
log.info("订单费用计算结果========>{}", JSONUtil.toJsonStr(orderDetail));
return orderDetail;
}
public OrderDetail calculateElectricityQuantity(Order order, OrderDetail orderDetail) {
Double electricityQuantity = 200d;
switch (orderDetail.getFeeType()){
case HDConstant.OrderConstant.FEE_TYPE_ODO:
break;
case HDConstant.OrderConstant.FEE_TYPE_SOC:
//如果租借/归还soc不存在参数, 则需要到mqtt消息中去抓取消息进行反向解析
if(orderDetail.getRentBatSOC() == null || orderDetail.getRentBatSOC() == null){
Map<String, Object> valMap = getMqttValue(MqttMessageTypeEnum.EVENT, EventFunctionTypesEnum.FUN_ORDEREVENT.getFunction(), order, "rentBatSoc", "returnBatSoc");
if(orderDetail.getRentBatSOC() == null && valMap.containsKey("rentBatSoc") && ObjectUtils.isNotEmpty(valMap.get("rentBatSoc"))){
orderDetail.setRentBatSOC(Double.valueOf(String.valueOf(valMap.get("rentBatSoc"))));
}
if(orderDetail.getRentBatSOC() == null && valMap.containsKey("returnBatSoc") && ObjectUtils.isNotEmpty(valMap.get("returnBatSoc"))){
orderDetail.setReturnBatSOC(Double.valueOf(String.valueOf(valMap.get("returnBatSoc"))));
}
}
electricityQuantity = orderDetail.getRentBatSOC() - orderDetail.getReturnBatSOC();
break;
case HDConstant.OrderConstant.FEE_TYPE_DL:
//如果按照电量结算不存在参数, 则需要到mqtt消息中去抓取消息进行反向解析
if(orderDetail.getElectEnd() == null || orderDetail.getElectStart() == null){
Map<String, Object> valMap = getMqttValue(MqttMessageTypeEnum.EVENT, "chargingEvent", order, "electStart", "electEnd");
if(orderDetail.getRentBatSOC() == null && valMap.containsKey("electStart") && ObjectUtils.isNotEmpty(valMap.get("electStart"))){
orderDetail.setElectStart(Double.valueOf(String.valueOf(valMap.get("electStart"))));
}
if(orderDetail.getRentBatSOC() == null && valMap.containsKey("electEnd") && ObjectUtils.isNotEmpty(valMap.get("electEnd"))){
orderDetail.setElectEnd(Double.valueOf(String.valueOf(valMap.get("electEnd"))));
}
}
electricityQuantity = orderDetail.getElectEnd() - orderDetail.getElectStart();
default:
break;
}
try {
orderDetail.setElectricityQuantity(electricityQuantity);
//直接更新数据
orderDetailDao.updateById(orderDetail);
} catch (Exception e) {
log.error("更新消费统计信息出现错误"+e.getMessage());
}
return orderDetail;
}
public <T extends IdEntity> Integer getUnitFee(Integer feeType, T c) {
switch (feeType){
case HDConstant.OrderConstant.FEE_TYPE_ODO:
if(c instanceof BatteryStationHdFeeStandard){
//元转分
return CommonUtil.yuanToFen(((BatteryStationHdFeeStandard)c).getEachKmFee()).intValue();
}
if(c instanceof BatteryStationHdFeeStandardDetail){
//元转分
return CommonUtil.yuanToFen(((BatteryStationHdFeeStandardDetail)c).getEachKmFee()).intValue();
}
case HDConstant.OrderConstant.FEE_TYPE_SOC:
if(c instanceof BatteryStationHdFeeStandard){
//元转分
return CommonUtil.yuanToFen(((BatteryStationHdFeeStandard)c).getEachSocFee()).intValue();
}
if(c instanceof BatteryStationHdFeeStandardDetail){
//元转分
return CommonUtil.yuanToFen(((BatteryStationHdFeeStandardDetail)c).getEachSocFee()).intValue();
}
case HDConstant.OrderConstant.FEE_TYPE_DL:
if(c instanceof BatteryStationHdFeeStandard){
//元转分
return CommonUtil.yuanToFen(((BatteryStationHdFeeStandard)c).getEachKwhFee()).intValue();
}
if(c instanceof BatteryStationHdFeeStandardDetail){
//元转分
return CommonUtil.yuanToFen(((BatteryStationHdFeeStandardDetail)c).getEachKwhFee()).intValue();
}
default:
//默认返回每次2元
return 200;
}
}
private Map<String, Object> getMqttValue(MqttMessageTypeEnum typeEnum, String messageFunction, Order order,String... orgs){
Map<String, Object> valMap = Collections.emptyMap();
MessageMqtt mqtt = messageMqttService.getOne(new MqttMessageParam(order.getOrderNo(), order.getStationCode(), "S2M", typeEnum.getType(), messageFunction, order.getOrderTime()));
if(mqtt != null){
if(org.apache.commons.lang3.StringUtils.isNotEmpty(mqtt.getContent())){
JSONObject content = JSONObject.parseObject(mqtt.getContent());
JSONObject dataBody = content.getJSONObject("dataBody");
if(dataBody != null){
JSONObject statusData = dataBody.getJSONObject("statusData");
if(statusData != null){
for (int i = 0; i < orgs.length; i++) {
String key = orgs[i];
valMap.put(key, statusData.get(key));
}
}
}
} else {
osb.setFeeStandardJson(JSONUtil.toJsonStr(standard));
// 如果没有详细费用直接使用标准费用
log.info("没有详细费用,直接使用标准费用=====>{}", JSONUtil.toJsonStr(standard));
osb.setBasicFee(standard.getEachSocFee());
osb.setServiceFee(standard.getCommonRemainFee());
}
}
// 返回更新后的订单对象
log.info("订单费用计算结果========>{}", JSONUtil.toJsonStr(osb));
return osb;
return valMap;
}
}

View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.evotech.hd.cloud.dao.OrderDao">
<!-- 通用查询映射结果 -->
<resultMap id="homeProportionResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryProportionDto">
<result column="name" property="stationName" />
<result column="code" property="stationCode" />
<result column="quantity" property="quantity" />
<result column="totalAmount" property="totalAmount" />
</resultMap>
<resultMap id="homeAmountResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryAmountDto">
<result column="amount" property="amount" />
<result column="dataCount" property="dataCount" />
<result column="status" property="status" />
</resultMap>
<resultMap id="homeHalfYearResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryHalfYearDto">
<result column="y_m" property="month" />
<result column="quantity" property="quantity" />
<result column="totalMoney" property="totalMoney" />
</resultMap>
<resultMap id="homeHalfYearAmountResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryHalfYearAmountDto">
<result column="y_m" property="month" />
<result column="quantity" property="quantity" />
<result column="totalMoney" property="totalMoney" />
<result column="status" property="status" />
<result column="payType" property="payType" />
</resultMap>
<resultMap id="findOrderListByStatusMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderInfo">
<result column="order_time" property="swapTime" />
<result column="plate_num" property="swapCar" />
<result column="order_pre_uname" property="swapUserName" />
<result column="amount" property="swapAmount" />
</resultMap>
<select id="findOrderListByStatus" resultMap="findOrderListByStatusMap">
select order_time,
plate_num,
order_pre_uname,
amount
from hd_cloud_manage.yt_t_order_swap_battery osb
where del_Flag = 0
<if test="status!= null">
and status !=#{status}
</if>
order by order_time desc
</select>
<select id="homeFindProportionData" resultMap="homeProportionResultMap">
select ifnull(count(osb.pk_id),0) as quantity,
bs.code,
bs.name
from hd_cloud_manage.yt_t_battery_station bs
left join hd_cloud_manage.yt_t_order_swap_battery osb on bs.code = osb.station_code
where DATE_FORMAT(osb.order_time,"%Y-%m-%d") >= DATE_FORMAT(#{params.begin},"%Y-%m-%d")
and DATE_FORMAT(#{params.end},"%Y-%m-%d") >= DATE_FORMAT(osb.order_time,"%Y-%m-%d")
GROUP by bs.code,bs.name
</select>
<select id="homeFindAmountData" resultMap="homeAmountResultMap">
-- select osb.amount,
-- osb.status
select ifnull(sum(osb.amount),0) amount,ifnull(count(osb.pk_id),0) as dataCount,
osb.status
from hd_cloud_manage.yt_t_order_swap_battery osb
where DATE_FORMAT(osb.order_time,"%Y-%m-%d") >= DATE_FORMAT(#{params.begin},"%Y-%m-%d")
and DATE_FORMAT(#{params.end},"%Y-%m-%d") >= DATE_FORMAT(osb.order_time,"%Y-%m-%d")
and osb.amount is not null
GROUP by osb.status
</select>
<select id="homeFindHalfYearOrderData" resultMap="homeHalfYearResultMap">
select
DATE_FORMAT(osb.order_time,"%Y-%m") as y_m,
count(osb.pk_id) as quantity,
sum(osb.amount) as totalMoney
from hd_cloud_manage.yt_t_order_swap_battery osb
where DATE_FORMAT(osb.order_time,"%Y-%m-%d") >= DATE_FORMAT(#{params.begin},"%Y-%m-%d")
and DATE_FORMAT(#{params.end},"%Y-%m-%d") >= DATE_FORMAT(osb.order_time,"%Y-%m-%d")
and osb.amount is not null
and osb.status=7
GROUP by y_m
</select>
<select id="homeFindHalfYearAmountData" resultMap="homeHalfYearAmountResultMap">
select
DATE_FORMAT(osb.order_time,"%Y-%m") as y_m,
ifnull(count(osb.pk_id), 0) as quantity,
sum(ifnull(osb.amount,0)) as totalMoney
from
hd_cloud_manage.yt_t_order_swap_battery osb
where DATE_FORMAT(osb.order_time,"%Y-%m") >= DATE_FORMAT(#{params.begin},"%Y-%m")
and DATE_FORMAT(#{params.end},"%Y-%m") >= DATE_FORMAT(osb.order_time,"%Y-%m")
and osb.amount is not null
and osb.status = 7
GROUP by y_m
</select>
<select id="homeFindHalfYearStationAmountData" resultMap="homeHalfYearAmountResultMap">
select
DATE_FORMAT(osb.order_time,"%Y-%m") as y_m,
ifnull(count(osb.pk_id), 0) as quantity
from
hd_cloud_manage.yt_t_order_swap_battery osb
where DATE_FORMAT(osb.order_time,"%Y-%m") >= DATE_FORMAT(#{params.begin},"%Y-%m")
and DATE_FORMAT(#{params.end},"%Y-%m") >= DATE_FORMAT(osb.order_time,"%Y-%m")
and osb.amount is not null
and osb.status = 7
GROUP by y_m
</select>
<!--<select id="homeFindHalfYearAmountData" resultMap="homeHalfYearAmountResultMap">
select
DATE_FORMAT(osb.order_time,"%Y-%m") as y_m,
ifnull(count(osb.pk_id), 0) as quantity,
sum(ifnull(osb.amount,0)) as totalMoney,
osb.status as status,
td.pay_type as payType
from
hd_cloud_manage.yt_t_order_swap_battery osb
left join
hd_cloud_manage.yt_t_trade_detail td on td.order_no=osb.order_no
where DATE_FORMAT(osb.order_time,"%Y-%m-%d") >= DATE_FORMAT(#{params.begin},"%Y-%m-%d")
and DATE_FORMAT(#{params.end},"%Y-%m-%d") >= DATE_FORMAT(osb.order_time,"%Y-%m-%d")
and osb.amount is not null
and td.pay_type IS not null
and osb.status in (-1,7)
GROUP by y_m,osb.status,td.pay_type
</select>-->
<select id="homeFindOrderCountData" resultType="java.lang.Long" >
select count(osb.pk_id)
from hd_cloud_manage.yt_t_order_swap_battery osb
where DATE_FORMAT(osb.order_time,"%Y-%m") = DATE_FORMAT(#{date},"%Y-%m")
and osb.amount is not null
and osb.status=7
</select>
<select id="homeFindOrderAmountData" resultType="java.lang.Double" >
select sum(osb.amount)
from hd_cloud_manage.yt_t_order_swap_battery osb
where DATE_FORMAT(osb.order_time,"%Y-%m") = DATE_FORMAT(#{date},"%Y-%m")
and osb.amount is not null
and osb.status=7
</select>
</mapper>

View File

@ -3,26 +3,26 @@
<mapper namespace="com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao">
<!-- 通用查询映射结果 -->
<resultMap id="homeProportionResultMap" type="com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryProportionDto">
<resultMap id="homeProportionResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryProportionDto">
<result column="name" property="stationName" />
<result column="code" property="stationCode" />
<result column="quantity" property="quantity" />
<result column="totalAmount" property="totalAmount" />
</resultMap>
<resultMap id="homeAmountResultMap" type="com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryAmountDto">
<resultMap id="homeAmountResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryAmountDto">
<result column="amount" property="amount" />
<result column="dataCount" property="dataCount" />
<result column="status" property="status" />
</resultMap>
<resultMap id="homeHalfYearResultMap" type="com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearDto">
<resultMap id="homeHalfYearResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryHalfYearDto">
<result column="y_m" property="month" />
<result column="quantity" property="quantity" />
<result column="totalMoney" property="totalMoney" />
</resultMap>
<resultMap id="homeHalfYearAmountResultMap" type="com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto">
<resultMap id="homeHalfYearAmountResultMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderSwapBatteryHalfYearAmountDto">
<result column="y_m" property="month" />
<result column="quantity" property="quantity" />
<result column="totalMoney" property="totalMoney" />
@ -30,7 +30,7 @@
<result column="payType" property="payType" />
</resultMap>
<resultMap id="findOrderListByStatusMap" type="com.evotech.hd.common.core.Dto.result.home.HomeOrderInfo">
<resultMap id="findOrderListByStatusMap" type="com.evotech.hd.common.core.Dto.home.HomeOrderInfo">
<result column="order_time" property="swapTime" />
<result column="plate_num" property="swapCar" />
<result column="order_pre_uname" property="swapUserName" />