Compare commits

..

No commits in common. "master" and "order_reconstruction" have entirely different histories.

131 changed files with 861 additions and 6934 deletions

View File

@ -9,20 +9,15 @@
<module name="common-mybatis" /> <module name="common-mybatis" />
<module name="authorization-server" /> <module name="authorization-server" />
<module name="resource-server" /> <module name="resource-server" />
<module name="common-permission" />
<module name="gateway-server" /> <module name="gateway-server" />
<module name="admin-server" /> <module name="admin-server" />
<module name="common-web" /> <module name="common-web" />
<module name="common-mongodb" />
<module name="wechat-server" /> <module name="wechat-server" />
<module name="cloud-manage-server" /> <module name="cloud-manage-server" />
<module name="common-redis" /> <module name="common-redis" />
<module name="common-core" /> <module name="common-core" />
</profile> </profile>
</annotationProcessing> </annotationProcessing>
<bytecodeTargetLevel>
<module name="common-websocket" target="17" />
</bytecodeTargetLevel>
</component> </component>
<component name="JavacSettings"> <component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE"> <option name="ADDITIONAL_OPTIONS_OVERRIDE">
@ -30,12 +25,9 @@
<module name="authorization-server" options="-parameters" /> <module name="authorization-server" options="-parameters" />
<module name="cloud-manage-server" options="-parameters" /> <module name="cloud-manage-server" options="-parameters" />
<module name="common-core" options="-parameters" /> <module name="common-core" options="-parameters" />
<module name="common-mongodb" options="-parameters" />
<module name="common-mybatis" options="-parameters" /> <module name="common-mybatis" options="-parameters" />
<module name="common-permission" options="-parameters" />
<module name="common-redis" options="-parameters" /> <module name="common-redis" options="-parameters" />
<module name="common-web" options="-parameters" /> <module name="common-web" options="-parameters" />
<module name="common-websocket" options="-parameters" />
<module name="gateway-server" options="-parameters" /> <module name="gateway-server" options="-parameters" />
<module name="resource-server" options="-parameters" /> <module name="resource-server" options="-parameters" />
<module name="wechat-server" options="-parameters" /> <module name="wechat-server" options="-parameters" />

View File

@ -4,12 +4,9 @@
<file url="file://$PROJECT_DIR$/admin-server/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/admin-server/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/authorization-server/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/authorization-server/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/common-core/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/base-commons/common-core/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/common-mongodb/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/common-mybatis/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/base-commons/common-mybatis/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/common-permission/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/common-redis/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/base-commons/common-redis/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/common-web/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/base-commons/common-web/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/common-websocket/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/base-commons/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/base-commons/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/base-commons/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/cloud-manage-server/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/cloud-manage-server/src/main/java" charset="UTF-8" />

View File

@ -7,11 +7,6 @@
<option value="$PROJECT_DIR$/pom.xml" /> <option value="$PROJECT_DIR$/pom.xml" />
</list> </list>
</option> </option>
<option name="ignoredFiles">
<set>
<option value="$PROJECT_DIR$/base-commons/common-websocket/pom.xml" />
</set>
</option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_14" project-jdk-name="17 (2)" project-jdk-type="JavaSDK" /> <component name="ProjectRootManager" version="2" languageLevel="JDK_14" project-jdk-name="17 (2)" project-jdk-type="JavaSDK" />
</project> </project>

View File

@ -28,10 +28,7 @@
<groupId>org.hibernate.validator</groupId> <groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId> <artifactId>hibernate-validator</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
@ -74,12 +71,6 @@
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>

View File

@ -22,8 +22,4 @@ public class ResultUtil {
log.error("当前请求出现异常{}", result.getMsg()); log.error("当前请求出现异常{}", result.getMsg());
return null; return null;
} }
public static <T> Boolean verifyCode(Result<T> result){
return CodeMsg.SUCCESS.getCode().equals(result.getCode());
}
} }

View File

@ -1,77 +0,0 @@
package com.evotech.hd.common.core.Dto.order;
import com.evotech.hd.common.core.excel.Excel;
import com.evotech.hd.common.core.utils.Collections;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
*
*
* @ClassName:OrderListVo
* @date: 2025年05月16日 13:54
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
@Schema(name = "电子账单")
public class OrderBillListVo {
/***
* 结算总金额
*/
@Schema(description = "订单总额")
Double orderTotalAmount;
/***
* 站点名称
*/
@Schema(description = "站点名称")
@Excel(name="站点名称")
String stationName;
/***
* 车牌号
*/
@Schema(description = "车牌号")
@Excel(name="车牌号")
String plateNum;
/***
* 换电人
*/
@Schema(description = "换电人")
@Excel(name="换电人")
String preName;
/***
* 换电次数
*/
@Schema(description = "换电次数")
Integer orderNum;
/***
* 换电时间
*/
@Schema(description = "换电时间")
@Excel(name="换电时间", dateFormat ="yyyy-MM-dd HH:mm:ss")
Date orderTime;
/***
* 订单金额
*/
@Schema(description = "订单金额")
Integer orderAmount;
@Excel(name="订单金额", isStatistics = true)
@JsonIgnore
Double orderAmountExcel;
/***
* 订单状态
*/
@Schema(description = "订单状态")
Integer status;
@Schema(description = "换电订单详情")
List<OrderBillListVo> childList = Collections.emptyList();;
}

View File

@ -1,111 +0,0 @@
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:OrderDetailVo
* @date: 2025年07月23日 15:12
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
public class OrderDetailVo {
@Schema(description = "订单编号")
private String orderNo;
@Schema(title = "订单类型", description = "1=换电;2=充电")
private Integer orderType;
@Schema(title = "车牌号")
private String plateNum;
@Schema(title = "订单状态", description = "订单状态1-已创建2-换电中3-换电完成4-充电中5-充电完成6-待结算7-已完成9-已取消, -1-退款")
private Integer status;
@Schema(title = "订单时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date orderTime;
@Schema(title = "换电站")
private String stationName;
@Schema(title = "预约人")
private String perName;
@Schema(title = "交易编码", description = "第三方收款返回的唯一标识")
private String notifyOrderNo;
@Schema(title = "订单总金额")
private Integer amount;
@Schema(title = "计费类型", description="1-ODO, 2-SOC, 3-电量")
private Integer feeType;
@Schema(title = "订单金额")
private Integer orderFee;
@Schema(title = "服务金额")
private Integer serviceFee;
@Schema(title = "服务开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date serviceTimeBegin;
@Schema(title = "服务结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date serviceTimeEnd;
@Schema(title = "订单开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date orderTimeBegin;
@Schema(title = "订单结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date orderTimeEnd;
@Schema(title = "耗电量", description = "耗电量; 如果是soc结算 则是soc的差值, ODO则是里程")
private Double electricityQuantity;
@Schema(title = "开始充电的电量", description = "feeType=3时, 不为空")
private Double electStart;
@Schema(title = "结束充电的电量", description = "feeType=3时, 不为空")
private Double electEnd;
@Schema(title = "租借电池包仓位", description = "feeType=2时, 不为空")
private String rentBatNo;
@Schema(title = "租借电池包编码", description = "feeType=2时, 不为空")
private String rentBatCode;
@Schema(title = "租借电池包SOC", description = "feeType=2时, 不为空")
private Double rentBatSoc;
@Schema(title = "归还电池包仓位", description = "feeType=2时, 不为空")
private String returnBatNo;
@Schema(title = "归还电池包编码", description = "feeType=2时, 不为空")
private String returnBatCode;
@Schema(title = "归还电池包SOC", description = "feeType=2时, 不为空")
private Double returnBatSoc;
@Schema(title = "换电模式", description="1-全自动; 2-半自动; 3-人工干预")
private Integer changeMode;
@Schema(title = "换电车道", description="1-换电车道A; 2-换电车道B")
private Integer changeLane;
}

View File

@ -6,14 +6,12 @@ public interface HDConstant {
* 全局删除标识-已删除 * 全局删除标识-已删除
*/ */
final static Integer DELETE_YES = 1; final static Integer DELETE_YES = 1;
/*** /***
* 全局删除标识-未删除 * 全局删除标识-未删除
*/ */
final static Integer DELETE_NO = 0; final static Integer DELETE_NO = 0;
final static String PUBLIC_KEY="public_key";
final static String PRIVATE_KEY="private_key";
/*** /***
* 大华设备相关CONSTANT * 大华设备相关CONSTANT
*/ */
@ -314,8 +312,4 @@ public interface HDConstant {
* 预约单失效前缀 * 预约单失效前缀
*/ */
String preOrder="pre_order:"; String preOrder="pre_order:";
/***
* 站控推送策略
*/
String STRATEGY_NAME = "站控推送";
} }

View File

@ -1,12 +0,0 @@
package com.evotech.hd.common.core.dao.cloud;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
/**
* @author zrb
* @since 2025-02-10
*/
public interface AlarmTemplateDao extends BaseMapper<AlarmTemplate> {
}

View File

@ -16,6 +16,4 @@ import java.util.List;
public interface BatteryStationCdStrategyDao extends BaseMapper<BatteryStationCdStrategy> { public interface BatteryStationCdStrategyDao extends BaseMapper<BatteryStationCdStrategy> {
List<BatteryStationCdStrategy> listCdStrategy(@Param("stationCode") String stationCode, @Param("status") Integer status); List<BatteryStationCdStrategy> listCdStrategy(@Param("stationCode") String stationCode, @Param("status") Integer status);
BatteryStationCdStrategy getBatteryStationCdStrategyByName(@Param("stationCode") String stationCode, @Param("name") String name);
} }

View File

@ -43,6 +43,4 @@ public interface OrderDao extends BaseMapper<Order> {
Double homeFindOrderAmountData(@Param("date") Date date); Double homeFindOrderAmountData(@Param("date") Date date);
List<HomeOrderInfo> findOrderListByStatus(@Param("status") Integer status); List<HomeOrderInfo> findOrderListByStatus(@Param("status") Integer status);
List<Order> findBillList(@Param("companyCode") String companyCode, @Param("orderTimeEnd")String orderTimeEnd);
} }

View File

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

View File

@ -37,10 +37,4 @@ public class BaseEntity extends IdEntity {
@TableField(fill = FieldFill.UPDATE) @TableField(fill = FieldFill.UPDATE)
private Date uptime; private Date uptime;
public BaseEntity() {
}
public BaseEntity(Integer pkId) {
super(pkId);
}
} }

View File

@ -36,11 +36,4 @@ public class IdEntity implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Date ctime; private Date ctime;
public IdEntity() {
}
public IdEntity(Integer pkId) {
this.pkId = pkId;
}
} }

View File

@ -57,10 +57,6 @@ public class BatteryStation extends BaseEntity implements Serializable {
@Schema(description = "地址-区县") @Schema(description = "地址-区县")
private String addressArea; private String addressArea;
@Schema(description = "区划编码", requiredMode = RequiredMode.REQUIRED)
@NotBlank(message = "区划编码不能为空")
private String divisionNo;
@Schema(description = "注册日期") @Schema(description = "注册日期")
private String registerDate; private String registerDate;

View File

@ -1,16 +1,22 @@
package com.evotech.hd.common.core.entity.cloud; package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity; import com.evotech.hd.common.core.entity.BaseEntity;
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 io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import java.io.Serializable;
/** /**
* @author zrb * @author zrb
* @since 2025-02-10 * @since 2025-02-10
@ -44,18 +50,4 @@ public class BatteryStationCdStrategyDetail extends BaseEntity implements Serial
@Schema(description = "充电功率") @Schema(description = "充电功率")
private Double chargingPower; private Double chargingPower;
/***
* 数据状态, 1正常, 2修改, 3删除
*/
@TableField(exist = false)
private Integer dataType = 1;
public BatteryStationCdStrategyDetail() {
}
public BatteryStationCdStrategyDetail(Integer pkId, Integer dataType) {
super(pkId);
this.dataType = dataType;
}
} }

View File

@ -70,7 +70,7 @@ public class BatteryStationDc extends BaseEntity implements Serializable {
private Integer soc; private Integer soc;
@Schema(description = "电池仓位号") @Schema(description = "电池仓位号")
private String dccNo; private Integer dccNo;
@Schema(description = "删除标志1-已删除0-未删除", hidden = true) @Schema(description = "删除标志1-已删除0-未删除", hidden = true)
private Integer delFlag; private Integer delFlag;

View File

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

View File

@ -1,15 +1,19 @@
package com.evotech.hd.common.core.entity.cloud; package com.evotech.hd.common.core.entity.cloud;
import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity; import com.evotech.hd.common.core.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** /**
* @author zrb * @author zrb
* @since 2024-12-11 * @since 2024-12-11
@ -31,7 +35,6 @@ public class OrderSwapBatteryStep extends BaseEntity implements Serializable {
private String stepName; private String stepName;
@Schema(description = "步骤时间") @Schema(description = "步骤时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date stepTime; private Date stepTime;
} }

View File

@ -24,9 +24,6 @@ public class TradeDetail extends BaseEntity implements Serializable {
@Schema(description = "换电站编码") @Schema(description = "换电站编码")
private String stationCode; private String stationCode;
@Schema(description = "交易人微信Id")
private String plateCompanyCode;
@Schema(description = "交易人name") @Schema(description = "交易人name")
private String trader; private String trader;
@ -39,7 +36,7 @@ public class TradeDetail extends BaseEntity implements Serializable {
@Schema(description = "交易类型1-充值2-订单消费3-退款, 9-提现") @Schema(description = "交易类型1-充值2-订单消费3-退款, 9-提现")
private Integer tradeType; private Integer tradeType;
@Schema(description = "支付方式1-账户余额2-微信3-支付宝4-网银5 -充电补偿, 6-公对公转账") @Schema(description = "支付方式1-账户余额2-微信3-支付宝4-网银5 -充电补偿")
private Integer payType; private Integer payType;
@Schema(description = "微信支付API类型") @Schema(description = "微信支付API类型")
private String wechatPayApiType; private String wechatPayApiType;
@ -71,7 +68,7 @@ public class TradeDetail extends BaseEntity implements Serializable {
@Schema(description = "微信支付订单号") @Schema(description = "微信支付订单号")
private String transactionId; private String transactionId;
@Schema(description = "支付结果,暂用微信结果的枚举类型, 新增 paymentInProgress 结算中类型") @Schema(description = "支付结果,暂用微信结果的枚举类型")
private String payResult; private String payResult;
@Schema(description = "付款人编码,对于个人账户,交易发起人和付款人一般是同一人。公司账户交易发起人是公司,付款人可能是 微信账户") @Schema(description = "付款人编码,对于个人账户,交易发起人和付款人一般是同一人。公司账户交易发起人是公司,付款人可能是 微信账户")
@ -97,8 +94,8 @@ public class TradeDetail extends BaseEntity implements Serializable {
@Schema(description = "订单总描述") @Schema(description = "订单总描述")
private String description; private String description;
@Schema(description = "状态: edit-编辑中, submit-提交. finish-完成, reject-打回")
private String status;
// @Schema(description = "在微信等支付网关创建支付订单时失败,返回的失败原因") // @Schema(description = "在微信等支付网关创建支付订单时失败,返回的失败原因")

View File

@ -28,7 +28,4 @@ public class PageListWalletRequest extends BasePageRequest {
@Schema(description = "引入站点") @Schema(description = "引入站点")
private String stationCode; private String stationCode;
@Schema(description = "客户电话")
private String phone;
} }

View File

@ -1,40 +0,0 @@
package com.evotech.hd.common.core.entity.common;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* AlarmTemplate
*
* @author andy.shi
* @ClassName:AlarmTemplate
* @date: 2025年10月28日 15:01
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName(value = "sys_alarm_template", schema = "hd_cloud_manage")
@Schema(name = "AlarmTemplate", description = "异常通知")
public class AlarmTemplate extends BaseEntity implements Serializable {
@Schema(description = "路径", requiredMode = Schema.RequiredMode.REQUIRED)
String path;
@Schema(description = "通知人员", requiredMode = Schema.RequiredMode.REQUIRED)
String recipientIds;
//通知人员姓名
@TableField(exist = false)
String recipientNames;
@TableField(exist = false)
String area;
@TableField(exist = false)
String message;
}

View File

@ -56,8 +56,4 @@ public class BaseOrder extends IdEntity {
* 支付的回调信息 * 支付的回调信息
*/ */
private String notifyInfo; private String notifyInfo;
/***
* 交易编码
*/
private String tradeNo;
} }

View File

@ -1,6 +1,5 @@
package com.evotech.hd.common.core.entity.order; package com.evotech.hd.common.core.entity.order;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
@ -75,6 +74,4 @@ public class Order extends BaseOrder{
@DateTimeFormat(pattern = "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") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime; private Date updateTime;
@TableField(exist = false)
private OrderDetail orderDetail;
} }

View File

@ -16,8 +16,6 @@ public enum OrderStatusEnums implements BaseEnum<Integer, String> {
FINISH(7, "已完成"), FINISH(7, "已完成"),
SETTLEMENT_IN_PROGRESS(8, "结算中"),
CANCLE(9, "已取消"), CANCLE(9, "已取消"),
REFUND(-1, "订单退款"), REFUND(-1, "订单退款"),
@ -32,8 +30,6 @@ public enum OrderStatusEnums implements BaseEnum<Integer, String> {
String name; String name;
public Integer getCode() { public Integer getCode() {
return code; return code;
} }

View File

@ -9,9 +9,6 @@ public enum PayTypeEnums {
ALIPAY(3, "支付宝"), ALIPAY(3, "支付宝"),
BANK(4, "网银"), BANK(4, "网银"),
CHARGING_COMPENSATION(5, "充电补偿"),
BUSINESS_TO_BUSINESS(6, "公对公"),
OTHER(9, "其他"); OTHER(9, "其他");

View File

@ -18,13 +18,13 @@ public enum SwapBatteryStepEnum implements BaseEnum<Integer, String>{
INSTITUTIONS_FOR_CHINA(3, "对中机构"), INSTITUTIONS_FOR_CHINA(3, "对中机构"),
DISMANTLE_OLD_ELECTRICITY(4, "拆旧"), GET_NEW_ELECTRICITY(4, "取新"),
DISCHARGE_OLD_ELECTRICITY(5, "旧电"), DISMANTLE_OLD_ELECTRICITY(5, "旧电"),
GET_NEW_ELECTRICITY(6, "新电"), INSTALL_NEW_ELECTRICITY(6, "新电"),
INSTALL_NEW_ELECTRICITY(7, "装新"), DISCHARGE_OLD_ELECTRICITY(7, "放旧"),
COMPLETED(8, "完成"), COMPLETED(8, "完成"),

View File

@ -1,203 +0,0 @@
package com.evotech.hd.common.core.excel;
import com.evotech.hd.common.core.excel.handler.ExcelFieldHandlerAdapter;
import com.evotech.hd.common.core.excel.handler.ExcelHandlerAdapter;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
/**
* 自定义导出Excel数据注解
*
* @author evo
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
/**
* 导出时在excel中排序
*/
public int sort() default Integer.MAX_VALUE;
/**
* 导出到Excel中的名字.
*/
public String name() default "";
/**
* 日期格式, : yyyy-MM-dd
*/
public String dateFormat() default "";
/**
* 如果是字典类型请设置字典的type值 (: sys_user_sex)
*/
public String dictType() default "";
/**
* 读取内容转表达式 (: 0=,1=,2=未知)
*/
public String readConverterExp() default "";
/**
* 分隔符读取字符串组内容
*/
public String separator() default ",";
/**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
*/
public int scale() default -1;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/**
* 导出时在excel中每个列的高度
*/
public double height() default 14;
/**
* 导出时在excel中每个列的宽度
*/
public double width() default 16;
/**
* 文字后缀,% 90 变成90%
*/
public String suffix() default "";
/**
* 当值为空时,字段的默认值
*/
public String defaultValue() default "";
/**
* 提示信息
*/
public String prompt() default "";
/**
* 设置只能选择不能输入的列内容.
*/
public String[] combo() default {};
/**
* 是否从字典读数据到combo,默认不读取,如读取需要设置dictType注解.
*/
public boolean comboReadDict() default false;
/**
* 是否需要纵向合并单元格,应对需求:含有list集合单元格)
*/
public boolean needMerge() default false;
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
public boolean isExport() default true;
/**
* 另一个类中的属性名称,支持多级获取,以小数点隔开
*/
public String targetAttr() default "";
/**
* 是否自动统计数据,在最后追加一行统计数据总和
*/
public boolean isStatistics() default false;
/**
* 导出类型0数字 1字符串 2图片
*/
public ColumnType cellType() default ColumnType.STRING;
/**
* 导出列头背景颜色
*/
public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
/**
* 导出列头字体颜色
*/
public IndexedColors headerColor() default IndexedColors.WHITE;
/**
* 导出单元格背景颜色
*/
public IndexedColors backgroundColor() default IndexedColors.WHITE;
/**
* 导出单元格字体颜色
*/
public IndexedColors color() default IndexedColors.BLACK;
/**
* 导出字段对齐方式
*/
public HorizontalAlignment align() default HorizontalAlignment.CENTER;
/**
* 自定义数据处理器
*/
public Class<?> handler() default ExcelHandlerAdapter.class;
/**
* 自定义数据处理器
*/
public boolean customExcelField() default false;
/**
* 自定义数据处理器
*/
public Class<?> excelFieldHandler() default ExcelFieldHandlerAdapter.class;
/**
* 自定义数据处理器参数
*/
public String[] args() default {};
/**
* 字段类型0导出导入1仅导出2仅导入
*/
Type type() default Type.ALL;
public enum Type
{
ALL(0), EXPORT(1), IMPORT(2);
private final int value;
Type(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
public enum ColumnType
{
NUMERIC(0), STRING(1), IMAGE(2), TEXT(3);
private final int value;
ColumnType(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
}

View File

@ -1,18 +0,0 @@
package com.evotech.hd.common.core.excel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Excel注解集
*
* @author evo
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Excels
{
public Excel[] value();
}

View File

@ -1,17 +0,0 @@
package com.evotech.hd.common.core.excel.handler;
import java.util.List;
/**
* 特殊出具处理接口
*
* @ClassName:ExcelFieldHandlerAdapter
* @date: 2025年07月12日 10:40
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface ExcelFieldHandlerAdapter {
List<String> buildExcel();
}

View File

@ -1,24 +0,0 @@
package com.evotech.hd.common.core.excel.handler;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
/**
* Excel数据格式处理适配器
*
* @author evo
*/
public interface ExcelHandlerAdapter
{
/**
* 格式化
*
* @param value 单元格数据值
* @param args excel注解args参数组
* @param cell 单元格对象
* @param wb 工作簿对象
*
* @return 处理后的值
*/
Object format(Object value, String[] args, Cell cell, Workbook wb);
}

View File

@ -1,30 +0,0 @@
package com.evotech.hd.common.core.utils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import java.math.BigDecimal;
/**
*
*
* @ClassName:DataUtils
* @date: 2025年06月03日 10:25
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public class DataUtils {
public static final BigDecimal DEFAULT_VALUE = new BigDecimal(0);
public static <T> T findDefaultValue(T v, T dv){
if(ObjectUtils.isNotEmpty(v)){
return v;
}
return dv;
}
}

View File

@ -26,8 +26,12 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
public void insertFill(MetaObject metaObject) { public void insertFill(MetaObject metaObject) {
try { try {
AuthUser user = RedisPermissionUtils.getUser(); AuthUser user = RedisPermissionUtils.getUser();
if(BeanUtil.isNotEmpty(metaObject) && BeanUtil.isNotEmpty(user)){ if(BeanUtil.isEmpty(user)){
mySetFieldValByName("creater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject); log.info("当前操作位登录, 无需执行");
return;
}
if(BeanUtil.isNotEmpty(metaObject)){
mySetFieldValByName("creater",user.getUid(),metaObject);
mySetFieldValByName("ctime",new Date(),metaObject); mySetFieldValByName("ctime",new Date(),metaObject);
} }
} catch (Exception e) { } catch (Exception e) {
@ -48,8 +52,12 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
public void updateFill(MetaObject metaObject) { public void updateFill(MetaObject metaObject) {
try { try {
AuthUser user = RedisPermissionUtils.getUser(); AuthUser user = RedisPermissionUtils.getUser();
if(BeanUtil.isNotEmpty(metaObject) && BeanUtil.isNotEmpty(user)){ if(BeanUtil.isEmpty(user)){
mySetFieldValByName("updater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject); log.info("当前操作未登录, 无需执行");
return;
}
if(BeanUtil.isNotEmpty(metaObject)){
mySetFieldValByName("updater",user.getUid(),metaObject);
mySetFieldValByName("uptime",new Date(),metaObject); mySetFieldValByName("uptime",new Date(),metaObject);
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -3,15 +3,13 @@ package com.evotech.hd.cloud;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient @EnableDiscoveryClient
@ComponentScan("com.evotech.hd.**") @ComponentScan("com.evotech.hd.**")
@MapperScan({"com.evotech.hd.cloud.dao.**", "com.evotech.hd.common.core.dao.**"}) @MapperScan({"com.evotech.hd.cloud.dao.**", "com.evotech.hd.common.core.dao.**"})

View File

@ -1,80 +0,0 @@
package com.evotech.hd.cloud.controller.alarm;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.entity.request.PageListAlarmTemplateRequest;
import com.evotech.hd.cloud.service.AlarmTemplateService;
import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
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 org.apache.commons.lang3.ObjectUtils;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* AlarmController
*
* @author andy.shi
* @ClassName:AlarmController
* @date: 2025年10月28日 15:13
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Tag(name = "异常通知")
@ApiSupport(order = 48)
@RestController
@RequestMapping("/alarm")
public class AlarmController {
@Autowired
AlarmTemplateService alarmTemplateService;
@Autowired
WechatService wechatService;
@Operation(summary = "增加")
@PostMapping("/add")
@ApiOperationSupport(order = 1)
public Result<Boolean> add(@Valid @ParameterObject AlarmTemplate params) {
return Result.getInstance().build(Boolean.class).success(alarmTemplateService.save(params));
}
@Operation(summary = "删除")
@PostMapping("/del")
@ApiOperationSupport(order = 2)
public Result<Boolean> delete(Integer id) {
return Result.getInstance().build(Boolean.class).success(alarmTemplateService.removeById(id));
}
@Operation(summary = "修改")
@PostMapping({"/update"})
@ApiOperationSupport(order = 3)
public Result<Boolean> update(@ParameterObject AlarmTemplate params) {
return Result.getInstance().build(Boolean.class).success(alarmTemplateService.updateById(params));
}
@Operation(summary = "查询")
@GetMapping("/list")
@ApiOperationSupport(order = 4)
public Result<Page<AlarmTemplate>> list(@ParameterObject PageListAlarmTemplateRequest params) {
return alarmTemplateService.pageList(params);
}
@Operation(summary = "推送通知")
@PostMapping("/send/{path}")
public Result<String> deleteDetail(@RequestBody AlarmTemplate param,@PathVariable("path")String path) {
AlarmTemplate alarmTemplate = alarmTemplateService.getOne(new LambdaQueryWrapper<AlarmTemplate>().eq(AlarmTemplate::getPath, path), false);
if(ObjectUtils.isEmpty(alarmTemplate)){
return Result.getInstance().build(String.class).error("当前路径不存在");
}
alarmTemplate.setArea(param.getArea());
alarmTemplate.setMessage(param.getMessage());
return wechatService.sendGzhToBeSettledAlarmMessage(alarmTemplate);
}
}

View File

@ -28,7 +28,7 @@ public class WechatUserController {
@Operation(summary = "查询") @Operation(summary = "查询")
@GetMapping("/list") @GetMapping("/list")
public Result<Page<WechatUser>> list(@ParameterObject PageListWechatUserRequest plwur) { public Result<Page<WechatUser>> list(@ParameterObject PageListWechatUserRequest plwur) {
return wechatUserService.pageList(plwur); return wechatUserService.list(plwur);
} }

View File

@ -55,7 +55,7 @@ public class OrderPerController {
@PostMapping("/cancel") @PostMapping("/cancel")
@ApiOperationSupport(order = 2) @ApiOperationSupport(order = 2)
public Result<Integer> cancelPre(@NotNull Integer id) { public Result<Integer> cancelPre(@NotNull Integer id) {
return orderSwapBatteryPreService.updateStatusById(id, 3); return orderSwapBatteryPreService.cancelPre(id, 3);
} }

View File

@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.cloud.service.OrderService; import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.order.OrderBillListVo;
import com.evotech.hd.common.core.Dto.order.OrderDetailVo;
import com.evotech.hd.common.core.Dto.order.OrderListVo; import com.evotech.hd.common.core.Dto.order.OrderListVo;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep; 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.BatterySwapResponse;
@ -40,14 +38,6 @@ public class OrderSwapBatteryController {
return orderService.pageList(plsor); return orderService.pageList(plsor);
} }
@Operation(summary = "查询订单详情")
@GetMapping("/{orderNo}")
@ApiOperationSupport(order = 6)
public Result<OrderDetailVo> getOne(@PathVariable(value = "orderNo") String orderNo) {
return orderService.getOneByOrderNo(orderNo);
}
@Operation(summary = "查询换电步骤") @Operation(summary = "查询换电步骤")
@GetMapping("/step/list") @GetMapping("/step/list")
@ApiOperationSupport(order = 9) @ApiOperationSupport(order = 9)
@ -55,7 +45,12 @@ public class OrderSwapBatteryController {
return orderService.listStep(orderNo); return orderService.listStep(orderNo);
} }
@Operation(summary = "个人账户余额支付")
@PostMapping({"/one"})
@ApiOperationSupport(order = 11)
public Result<Order> one(@RequestParam String orderNo) {
return orderService.one(orderNo);
}
@Operation(summary = "个人账户余额支付") @Operation(summary = "个人账户余额支付")
@PostMapping({"/wallet/pay"}) @PostMapping({"/wallet/pay"})
@ -64,6 +59,10 @@ public class OrderSwapBatteryController {
return orderService.walletPay(orderNo, wuid, uname); return orderService.walletPay(orderNo, wuid, uname);
} }
@Operation(summary = "查询公司订单") @Operation(summary = "查询公司订单")
@GetMapping("/listcompanyorder") @GetMapping("/listcompanyorder")
@ApiOperationSupport(order = 8) @ApiOperationSupport(order = 8)
@ -84,13 +83,22 @@ public class OrderSwapBatteryController {
// @Operation(summary = "公司订单扫码支付")
// @PostMapping({"/wechat/nativepay"})
// @ApiOperationSupport(order = 13)
// public Result<String> companyNativePay(@RequestBody NativePayVO prePay) {
// return orderService.companyNativePay(prePay);
// }
@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 orderService.companyNativePay(prePay);
}
@Operation(summary = "扫码支付订单查询状态") @Operation(summary = "扫码支付订单查询状态")
@GetMapping("/paystatus/query") @GetMapping("/paystatus/query")
@ -125,35 +133,4 @@ public class OrderSwapBatteryController {
return orderService.checkList(plsor); return orderService.checkList(plsor);
} }
@Operation(summary = "个人账户余额支付")
@PostMapping({"/one"})
@ApiOperationSupport(order = 11)
public Result<Order> one(@RequestParam String orderNo) {
return orderService.one(orderNo);
}
@Operation(summary = "电子对账单")
@GetMapping("/bill/list")
@ApiOperationSupport(order = 6)
public Result<List<OrderBillListVo>> billList(String companyCode, String orderTimeEnd) {
return orderService.billList(companyCode, orderTimeEnd);
}
@Operation(summary = "下载电子对账单")
@PostMapping("/bill/download")
@ApiOperationSupport(order = 6)
public void billDownload(String companyCode, String orderTimeEnd) {
orderService.excelBillList(companyCode, orderTimeEnd);
}
@Operation(summary = "公司订单扫码支付")
@PostMapping({"/wechat/nativepay"})
@ApiOperationSupport(order = 13)
public Result<String> companyNativePay(@RequestBody NativePayVO prePay) {
return orderService.companyNativePay(prePay);
}
} }

View File

@ -51,20 +51,6 @@ public class TradeController {
return tradeService.update(td); return tradeService.update(td);
} }
@Operation(summary = "提交")
@PostMapping({"/submit"})
@ApiOperationSupport(order = 3)
public Result<Integer> submit(@ParameterObject TradeDetail td) {
return tradeService.submit(td);
}
@Operation(summary = "审核")
@PostMapping({"/approve"})
@ApiOperationSupport(order = 3)
public Result<Integer> approve(Integer id, @RequestParam Integer type) {
return tradeService.approve(id,type);
}
@Operation(summary = "查询") @Operation(summary = "查询")
@GetMapping("/list") @GetMapping("/list")
@ApiOperationSupport(order = 4) @ApiOperationSupport(order = 4)

View File

@ -1,17 +0,0 @@
package com.evotech.hd.cloud.entity.request;
import com.evotech.hd.common.core.entity.BasePageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Schema(name = "查询异常请求参数", hidden = true)
@EqualsAndHashCode(callSuper=false)
public class PageListAlarmTemplateRequest extends BasePageRequest {
@Schema(description = "路径")
private String path;
}

View File

@ -1,5 +1,8 @@
package com.evotech.hd.cloud.entity.vo; package com.evotech.hd.cloud.entity.vo;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
@ -9,9 +12,6 @@ import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import java.util.Date;
import java.util.List;
@Data @Data
@Schema(name = "Native下单参数") @Schema(name = "Native下单参数")
public class NativePayVO { public class NativePayVO {
@ -21,7 +21,6 @@ public class NativePayVO {
@Schema(description = "公司编码") @Schema(description = "公司编码")
private String ccode; private String ccode;
private String companyCode;
@Schema(description = "订单总描述", requiredMode = RequiredMode.REQUIRED) @Schema(description = "订单总描述", requiredMode = RequiredMode.REQUIRED)
@NotBlank @NotBlank
@ -60,7 +59,5 @@ public class NativePayVO {
@Schema(description = "用户设备型号") @Schema(description = "用户设备型号")
private String deviceId; private String deviceId;
@Schema(description = "订单结束时间")
String orderTimeEnd;
} }

View File

@ -7,8 +7,7 @@ public enum EventFunctionTypesEnum {
FUN_CHARGE_RECORD("chargeRecord", "chargeRecordConf", "充电事件记录"), FUN_CHARGE_RECORD("chargeRecord", "chargeRecordConf", "充电事件记录"),
FUN_SWAP_RECORD("swapRecord", "swapRecordConf", "换电事件记录"), FUN_SWAP_RECORD("swapRecord", "swapRecordConf", "换电事件记录"),
FUN_WARN_RECORD("faultRecord", "faultRecordConf", "故障告警事件记录"), FUN_WARN_RECORD("faultRecord", "faultRecordConf", "故障告警事件记录"),
FUN_ORDEREVENT("swapComplete", "swapCompleteConfirm", " 站端换电完成事件"), FUN_ORDEREVENT("swapComplete", "swapCompleteConfirm", " 站端换电完成事件");
FUN_PUSH_STATION_CONTRNL_DATA("", "pushReservation", " 推送站端事件");
String function; String function;
String reFunction; String reFunction;

View File

@ -15,7 +15,6 @@ public enum StateFunctionTypesEnum {
FUN_CHARGING_DATA("chargingData", "", "充电过程实时信息"), FUN_CHARGING_DATA("chargingData", "", "充电过程实时信息"),
FUN_BAT_DATA("batData", "", "电池实时信息"), FUN_BAT_DATA("batData", "", "电池实时信息"),
FUN_STATION_STATE("stationState", "", "站级状态信息"), FUN_STATION_STATE("stationState", "", "站级状态信息"),
FUN_CHARGING_STRATEGY("chargingStrategy", "", "充电策略信息"),
; ;

View File

@ -19,14 +19,6 @@ public class MessageTopic implements Serializable {
private String messageType; private String messageType;
public MessageTopic() {
}
public MessageTopic( String stationCode, String messageType) {
this.stationCode = stationCode;
this.messageType = messageType;
}
@Override @Override
public String toString() { public String toString() {
return businessType + "/" + stationCode + "/" + dataDirection + "/" + messageType; return businessType + "/" + stationCode + "/" + dataDirection + "/" + messageType;

View File

@ -46,7 +46,7 @@ public class MqttResponse<T> implements Serializable {
return this; return this;
} }
public MqttResponse<T> success(T dataBody){ public MqttResponse<T> success(T data){
this.code=SUCCESS; this.code=SUCCESS;
this.msg="成功"; this.msg="成功";
this.data=data; this.data=data;

View File

@ -18,7 +18,7 @@ public class OrderStatusData {
private Integer soc; private Integer soc;
@Schema(description = "租借电池包仓位") @Schema(description = "租借电池包仓位")
private String rentBatNo; private Integer rentBatNo;
@Schema(description = "租用电池包编码") @Schema(description = "租用电池包编码")
private String rentBatCode; private String rentBatCode;
@ -30,7 +30,7 @@ public class OrderStatusData {
private String returnBatCode; private String returnBatCode;
@Schema(description = "归还电池包仓位") @Schema(description = "归还电池包仓位")
private String returnBatNo; private Integer returnBatNo;
@Schema(description = "归还电池包SOC") @Schema(description = "归还电池包SOC")
private Integer returnBatSoc; private Integer returnBatSoc;

View File

@ -4,7 +4,7 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm.MqttStrategyConfirmExchangeProcessor; import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event.MqttStrategyEventExchangeProcessor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -25,11 +25,11 @@ public class EventMessageService {
* event消息 处理 * event消息 处理
*/ */
public void event(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void event(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
Map<String, MqttStrategyConfirmExchangeProcessor> mqttEventExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyConfirmExchangeProcessor.class); Map<String, MqttStrategyEventExchangeProcessor> mqttEventExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyEventExchangeProcessor.class);
if(CollectionUtils.isEmpty(mqttEventExchangeProcessorMap)){ if(CollectionUtils.isEmpty(mqttEventExchangeProcessorMap)){
log.error("mqttEventExchangeProcessorMap is empty, 没有找到当前的请求信息, 请求接口{}, 请求参数{}", JSONUtil.toJsonStr(header), JSONUtil.toJsonStr(dataBody)); log.error("mqttEventExchangeProcessorMap is empty, 没有找到当前的请求信息, 请求接口{}, 请求参数{}", JSONUtil.toJsonStr(header), JSONUtil.toJsonStr(dataBody));
} }
for (MqttStrategyConfirmExchangeProcessor processor : mqttEventExchangeProcessorMap.values()) { for (MqttStrategyEventExchangeProcessor processor : mqttEventExchangeProcessorMap.values()) {
if(processor.accept(header.getFunction())){ if(processor.accept(header.getFunction())){
processor.exchange(topic, header, dataBody); processor.exchange(topic, header, dataBody);
} }

View File

@ -1,7 +1,5 @@
package com.evotech.hd.cloud.mqtt.message.handle; package com.evotech.hd.cloud.mqtt.message.handle;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.KeyUtil; import cn.hutool.crypto.KeyUtil;
@ -13,7 +11,6 @@ import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.symmetric.AES; import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm; import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto; import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -21,11 +18,9 @@ import com.evotech.hd.cloud.dao.BatteryStationSecretKeyDao;
import com.evotech.hd.cloud.entity.BatteryStationSecretKey; import com.evotech.hd.cloud.entity.BatteryStationSecretKey;
import com.evotech.hd.cloud.entity.MessageMqtt; import com.evotech.hd.cloud.entity.MessageMqtt;
import com.evotech.hd.cloud.mqtt.config.MqttPublishMessage; import com.evotech.hd.cloud.mqtt.config.MqttPublishMessage;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.MyMqttMessage; import com.evotech.hd.cloud.mqtt.message.MyMqttMessage;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.service.MessageMqttService; import com.evotech.hd.cloud.service.MessageMqttService;
import com.evotech.hd.common.core.constant.HDConstant; import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.redis.utils.RedisUtil; import com.evotech.hd.common.redis.utils.RedisUtil;
@ -52,21 +47,6 @@ public class MessageUtilService {
private MqttPublishMessage publishMessage; private MqttPublishMessage publishMessage;
public void publishStateMessage(String stationCode, String function, MqttResponse response) {
publishMessage(function, MqttMessageTypeEnum.STATE.getType(),response, stationCode);
}
private void publishMessage(String function, String messageType, MqttResponse response, String stationCode) {
MessageTopic topic = new MessageTopic();
topic.setMessageType(messageType);
topic.setStationCode(stationCode);
topic.setDataDirection("M2S");
MqttMessageHeader header = new MqttMessageHeader();
header.setTimeStamp(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMATTER));
header.setFunction(function);
publishAESMessage(topic, header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
}
/** /**
* 记录MQTT消息 * 记录MQTT消息
@ -100,19 +80,7 @@ public class MessageUtilService {
public void publishRSAMessage(MessageTopic topic, String msg, String stationPublicKey) { public void publishRSAMessage(MessageTopic topic, String msg, String stationPublicKey) {
RSA rsa = SecureUtil.rsa(null, stationPublicKey); RSA rsa = SecureUtil.rsa(null, stationPublicKey);
String encrypt = rsa.encryptBase64(msg, KeyType.PublicKey); String encrypt = rsa.encryptBase64(msg, KeyType.PublicKey);
publishMessage.publish(encrypt, topic.toString());
// 3. 发送MQTT消息
try {
MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString());
try {
addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), JSONUtil.parseObj(msg));
} catch (Exception e) {
log.error("MQTT->>>>>>>>>>>>>记录mqtt消息 发送RSA加密消息 出现了错误{},topic:{}; data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(msg), JSONUtil.toJsonStr(mqttMessage));
throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage());
}
} catch (Exception e) {
log.error("MQTT->>>>>>>>>>>>>发送站端mqtt消息 发送RSA加密消息 出现异常{},topic:{}; data:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(msg));
}
} }
/** /**
@ -135,8 +103,8 @@ public class MessageUtilService {
try { try {
MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString()); MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString());
try { try {
//dataBody.set("header", JSONUtil.toJsonStr(header)); dataBody.set("header", JSONUtil.toJsonStr(header));
addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), JSONUtil.parseObj(message)); addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), dataBody);
} catch (Exception e) { } catch (Exception e) {
log.error("MQTT->>>>>>>>>>>>>记录mqtt消息出现了错误{},topic:{}; header:{}, data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(header),JSONUtil.toJsonStr(dataBody), JSONUtil.toJsonStr(mqttMessage)); log.error("MQTT->>>>>>>>>>>>>记录mqtt消息出现了错误{},topic:{}; header:{}, data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(header),JSONUtil.toJsonStr(dataBody), JSONUtil.toJsonStr(mqttMessage));
throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage()); throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage());

View File

@ -52,9 +52,6 @@ public class MqttMessageHandleService {
// 3.1.2 保存MQTT消息 // 3.1.2 保存MQTT消息
MqttMessageHeader header = messageUtilService.addMqttMessage(topic, message.getId()+"", message.getQos(), jo); MqttMessageHeader header = messageUtilService.addMqttMessage(topic, message.getId()+"", message.getQos(), jo);
JSONObject dataBody = jo.getJSONObject("dataBody"); JSONObject dataBody = jo.getJSONObject("dataBody");
if(dataBody == null){
dataBody = jo.getJSONObject("data");
}
// 3.2 分类处理 // 3.2 分类处理
// 3.2.1 state // 3.2.1 state
if (MqttMessageTypeEnum.STATE.getType().equals(topic.getMessageType())) { if (MqttMessageTypeEnum.STATE.getType().equals(topic.getMessageType())) {

View File

@ -1,216 +0,0 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum;
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.confirm.SwapCompleteConfirm;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.service.OrderService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 换电完成事件数据
*
* @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl
* @date: 2025年05月19日 17:41
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
@Slf4j
public class MqttConfirmSwapCompleteExchangeProcessorImpl implements MqttStrategyConfirmExchangeProcessor {
@Resource
OrderService orderService;
// @Resource
// OrderDetailService orderDetailService;
// @Resource
// private SwapOrderBasicFeeComponent orderBasicFeeComponent;
// @Resource
// private OrderSwapBatteryStepService orderSwapBatteryStepService;
// @Resource
// private VehicleService vehicleService;
// @Resource
// BatteryStationDcService batteryStationDcService;
// @Resource
// WechatService wechatService;
@Override
public boolean accept(String functionName) {
return EventFunctionTypesEnum.FUN_ORDEREVENT.getFunction().equals(functionName);
}
@Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
SwapComplete orderStatus = JSONUtil.toBean(dataBody, SwapComplete.class);
OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class);
MqttResponse<SwapCompleteConfirm> response = new MqttResponse();
SwapCompleteConfirm swapRecordConfirm = new SwapCompleteConfirm();
try {
// 订单状态更新处理
orderService.handleOrderStatus(orderStatus, statusData);
response.setCode(MqttResponse.PUBLIC_SUCCESS);
swapRecordConfirm.setAckStatus(MqttResponse.PUBLIC_SUCCESS);
swapRecordConfirm.setOrderNo(orderStatus.getOrderNo());
} catch (Exception e) {
e.printStackTrace();
log.error("更新订单信息出现错误: {}", e.getMessage());
response.setCode(MqttResponse.PUBLIC_ERROR);
response.setMsg(orderStatus.getOrderNo());
swapRecordConfirm.setAckStatus(MqttResponse.PUBLIC_ERROR);
swapRecordConfirm.setOrderNo(orderStatus.getOrderNo());
swapRecordConfirm.setError(e.getMessage());
}
response.setData(swapRecordConfirm);
if(header != null){
sendAESMessage(topic, header, EventFunctionTypesEnum.FUN_ORDEREVENT, response);
}
}
// /**
// * 订单最终状态的更新
// * @param orderStatus
// * @param statusData
// */
// private void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) {
//
// Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderStatus.getOrderNo()));
// if(ObjectUtils.isEmpty(order)){
// throw new RuntimeException("未找到订单信息");
// }
// //更新订单状态
// order.setStatus(orderStatus.getStatus());
// orderService.updateById(order);
// //修改订单状态及金额
// alterOrderStatus(order, statusData);
// //记录电池信息 or 记录最后的换电步骤
// alterSwapBatteryStep(orderStatus, statusData, order);
// }
//
//
// /**
// * 修改订单状态方法
// * @param order
// * @param statusData
// * @return
// */
// private void alterOrderStatus(Order order, OrderStatusData statusData) {
// if (order.getStatus() == 3 || order.getStatus() == 5) {
// //如果订单是完成. 查询订单详情
// OrderDetail orderDetail = orderDetailService.getOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
// orderDetail.setFeeType(ParamServiceUtils.getSettlementType());
// orderDetail.setOrderTimeEnd(new Date());
// orderDetail.setServiceTimeEnd(new Date());
// //copy属性
// BeanUtils.copyProperties(statusData, orderDetail);
// orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc()));
// orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc()));
// switch (orderDetail.getFeeType()){
// case HDConstant.OrderConstant.FEE_TYPE_DL:
// orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue());
// break;
// case HDConstant.OrderConstant.FEE_TYPE_ODO:
//// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue());
// break;
// case HDConstant.OrderConstant.FEE_TYPE_SOC:
// default:
// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue());
// break;
// }
// //计算费用方式
// log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() );
// //计算费用信息
// orderBasicFeeComponent.orderBasicFee(order, orderDetail);
// //发送换电完成推送
// wechatService.sendGzhSwapOrderSuccessMessage(order);
// orderService.calculateCost(order);
// }
// }
//
//
//
// /**
// * 修改订单费用
// * @param order
// * @param statusData
// * @return
// */
// private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) {
// if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){
// //生成步骤
// orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime());
// // 修改车上电池编码
// vehicleService.update(new UpdateWrapper<VehicleInfo>()
// .set("bat_code", statusData.getRentBatCode())
// .set("bat_soc", statusData.getRentBatSoc())
// .eq("plate_num", order.getPlateNum()));
// //出租电池信息维护
// batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
// .set("status", HDConstant.DcConstant.STATUS_CZ)
// .set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION)
// .set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR)
// .set("point_code", order.getPlateNum())
// .set("point_name", order.getPlateNum())
// .set("dcc_no", 0)
// .eq("bat_code", statusData.getRentBatCode()));
// //归还电池信息维护
// batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
// .set("status", HDConstant.DcConstant.STATUS_CD)
// .set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR)
// .set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION)
// .set("point_code", order.getPlateNum())
// .set("point_name", order.getPlateNum())
// .set("soc", statusData.getReturnBatSoc())
// .set("dcc_no", statusData.getReturnBatNo())
// .eq("bat_code", statusData.getReturnBatCode()));
// // 添加2块电池的溯源记录
// addBatteryTrace(orderStatus, statusData, order);
//
// }
// }
//
//
//
//
//
//
// /**
// * 添加电池轨迹记录
// *
// * @param orderStatus
// * @param statusData
// * @param osb
// */
// private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) {
// BatteryTrace bt1 = new BatteryTrace();
// bt1.setOrderNo(orderStatus.getOrderNo());
// bt1.setBatCode(statusData.getRentBatCode());
// bt1.setSoc(statusData.getRentBatSoc());
// bt1.setBeginTime(orderStatus.getStatusTime());
// bt1.setPointType(2);
// bt1.setPointCode(osb.getPlateNum());
// bt1.setPointName(osb.getPlateNum());
// bt1.setCreater("SYS");
// BatteryTrace bt2 = new BatteryTrace();
// BeanUtils.copyProperties(bt1, bt2);
// bt2.setBatCode(statusData.getReturnBatCode());
// bt2.setSoc(statusData.getRentBatSoc());
// bt2.setPointType(1);
// bt2.setPointCode(osb.getStationCode());
// bt2.setPointName(osb.getStationName());
// batteryStationDcService.addTrace(bt1);
// batteryStationDcService.addTrace(bt2);
// }
//
}

View File

@ -1,30 +0,0 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm;
import cn.hutool.core.date.DatePattern;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
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;
/**
* 接口
*
* @ClassName:MqttStrategyequestExchangeProcessor
* @date: 2025年06月19日 16:29
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface MqttStrategyConfirmExchangeProcessor extends MqttStrategyExchangeProcessor {
default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){
topic.setMessageType(MqttMessageTypeEnum.CONFIRM.getType());
header.setFunction(typesEnum.getReFunction());
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
sendAESMessage(topic, header, response);
}
}

View File

@ -1,29 +0,0 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event;
import cn.hutool.json.JSONObject;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* BaseProcessorImpl
*
* @author andy.shi
* @ClassName:BaseProcessorImpl
* @date: 2025年10月29日 10:46
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
@Slf4j
public class BaseProcessorImpl implements MqttStrategyEventExchangeProcessor {
@Override
public boolean accept(String functionName) {
return false;
}
@Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
}
}

View File

@ -0,0 +1,231 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum;
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.confirm.SwapCompleteConfirm;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.service.*;
import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.cloud.utils.ParamServiceUtils;
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
import com.evotech.hd.common.core.entity.cloud.BatteryTrace;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.common.core.enums.SwapBatteryStepEnum;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
/**
* 换电完成事件数据
*
* @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl
* @date: 2025年05月19日 17:41
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
@Slf4j
public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyEventExchangeProcessor {
@Resource
OrderService orderService;
@Resource
OrderDetailService orderDetailService;
@Resource
private SwapOrderBasicFeeComponent orderBasicFeeComponent;
@Resource
private OrderSwapBatteryStepService orderSwapBatteryStepService;
@Resource
private VehicleService vehicleService;
@Resource
BatteryStationDcService batteryStationDcService;
@Resource
WechatService wechatService;
@Override
public boolean accept(String functionName) {
return EventFunctionTypesEnum.FUN_ORDEREVENT.getFunction().equals(functionName);
}
@Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
SwapComplete orderStatus = JSONUtil.toBean(dataBody, SwapComplete.class);
OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class);
MqttResponse<SwapCompleteConfirm> response = new MqttResponse();
SwapCompleteConfirm swapRecordConfirm = new SwapCompleteConfirm();
try {
// 订单状态更新处理
handleOrderStatus(orderStatus, statusData);
response.setCode(MqttResponse.PUBLIC_SUCCESS);
swapRecordConfirm.setAckStatus(MqttResponse.PUBLIC_SUCCESS);
swapRecordConfirm.setOrderNo(orderStatus.getOrderNo());
} catch (Exception e) {
e.printStackTrace();
log.error("更新订单信息出现错误: {}", e.getMessage());
response.setCode(MqttResponse.PUBLIC_ERROR);
response.setMsg(orderStatus.getOrderNo());
swapRecordConfirm.setAckStatus(MqttResponse.PUBLIC_ERROR);
swapRecordConfirm.setOrderNo(orderStatus.getOrderNo());
swapRecordConfirm.setError(e.getMessage());
}
response.setData(swapRecordConfirm);
sendAESMessage(topic, header, EventFunctionTypesEnum.FUN_ORDEREVENT, response);
}
/**
* 订单最终状态的更新
* @param orderStatus
* @param statusData
*/
private void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) {
Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderStatus.getOrderNo()));
if(ObjectUtils.isEmpty(order)){
throw new RuntimeException("未找到订单信息");
}
//更新订单状态
order.setStatus(orderStatus.getStatus());
orderService.updateById(order);
//修改订单状态及金额
alterOrderStatus(order, statusData);
//记录换电步骤
alterSwapBatteryStep(orderStatus, statusData, order);
}
/**
* 修改订单状态方法
* @param order
* @param statusData
* @return
*/
private void alterOrderStatus(Order order, OrderStatusData statusData) {
if (order.getStatus() == 3 || order.getStatus() == 5) {
//如果订单是完成. 查询订单详情
OrderDetail orderDetail = orderDetailService.getOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
orderDetail.setFeeType(ParamServiceUtils.getSettlementType());
orderDetail.setOrderTimeEnd(new Date());
orderDetail.setServiceTimeEnd(new Date());
//copy属性
BeanUtils.copyProperties(statusData, orderDetail);
orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc()));
orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc()));
switch (orderDetail.getFeeType()){
case HDConstant.OrderConstant.FEE_TYPE_DL:
orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_ODO:
// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_SOC:
default:
orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue());
break;
}
//计算费用方式
log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() );
//计算费用信息
orderBasicFeeComponent.orderBasicFee(order, orderDetail);
//发送换电完成推送
wechatService.sendGzhSwapOrderSuccessMessage(order);
orderService.calculateCost(order);
}
}
/**
* 修改订单费用
* @param order
* @param statusData
* @return
*/
private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) {
if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){
//生成步骤
orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime());
// 修改车上电池编码
vehicleService.update(new UpdateWrapper<VehicleInfo>()
.set("bat_code", statusData.getRentBatCode())
.set("bat_soc", statusData.getRentBatSoc())
.eq("plate_num", order.getPlateNum()));
//出租电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.set("status", HDConstant.DcConstant.STATUS_CZ)
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION)
.set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR)
.set("point_code", order.getPlateNum())
.set("point_name", order.getPlateNum())
.set("dcc_no", 0)
.eq("bat_code", statusData.getRentBatCode()));
//归还电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.set("status", HDConstant.DcConstant.STATUS_CD)
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR)
.set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION)
.set("point_code", order.getPlateNum())
.set("point_name", order.getPlateNum())
.set("soc", statusData.getReturnBatSoc())
.set("dcc_no", statusData.getReturnBatNo())
.eq("bat_code", statusData.getReturnBatCode()));
// 添加2块电池的溯源记录
addBatteryTrace(orderStatus, statusData, order);
}
}
/**
* 添加电池轨迹记录
*
* @param orderStatus
* @param statusData
* @param osb
*/
private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) {
BatteryTrace bt1 = new BatteryTrace();
bt1.setOrderNo(orderStatus.getOrderNo());
bt1.setBatCode(statusData.getRentBatCode());
bt1.setSoc(statusData.getRentBatSoc());
bt1.setBeginTime(orderStatus.getStatusTime());
bt1.setPointType(2);
bt1.setPointCode(osb.getPlateNum());
bt1.setPointName(osb.getPlateNum());
bt1.setCreater("SYS");
BatteryTrace bt2 = new BatteryTrace();
BeanUtils.copyProperties(bt1, bt2);
bt2.setBatCode(statusData.getReturnBatCode());
bt2.setSoc(statusData.getRentBatSoc());
bt2.setPointType(1);
bt2.setPointCode(osb.getStationCode());
bt2.setPointName(osb.getStationName());
batteryStationDcService.addTrace(bt1);
batteryStationDcService.addTrace(bt2);
}
}

View File

@ -11,18 +11,19 @@ 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.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
/** /**
* MqttStrategyEventExchangeProcessor * 接口
* *
* @author andy.shi * @ClassName:MqttStrategyequestExchangeProcessor
* @ClassName:MqttStrategyEventExchangeProcessor * @date: 2025年06月19日 16:29
* @date: 2025年10月29日 10:41 * @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步 * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/ */
public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchangeProcessor { public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchangeProcessor {
default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){ default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){
topic.setMessageType(MqttMessageTypeEnum.EVENT.getType()); topic.setMessageType(MqttMessageTypeEnum.CONFIRM.getType());
header.setFunction(typesEnum.getReFunction()); header.setFunction(typesEnum.getReFunction());
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN))); logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
sendAESMessage(topic, header, response); sendAESMessage(topic, header, response);

View File

@ -1,69 +1,69 @@
//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
//
//import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
//import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; 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.dto.newer.req.MqttResponse;
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryData; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryData;
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq;
//import com.evotech.hd.cloud.service.BatteryStationDcService; import com.evotech.hd.cloud.service.BatteryStationDcService;
//import com.evotech.hd.common.core.constant.HDConstant; import com.evotech.hd.common.core.constant.HDConstant;
//import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
//import jakarta.annotation.Resource; import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
//
//import java.util.Collections; import java.util.Collections;
//import java.util.List; import java.util.List;
//import java.util.stream.Collectors; import java.util.stream.Collectors;
//
///** /**
// * 站端请求电池数据 * 站端请求电池数据
// * *
// * @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl * @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl
// * @date: 2025年05月19日 17:41 * @date: 2025年05月19日 17:41
// * @author: andy.shi * @author: andy.shi
// * @contact: 17330188597 * @contact: 17330188597
// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
// */ */
//@Service @Service
//@Slf4j @Slf4j
//public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
//
// @Resource @Resource
// BatteryStationDcService batteryStationDcService; BatteryStationDcService batteryStationDcService;
//
// @Override @Override
// public boolean accept(String functionName) { public boolean accept(String functionName) {
// return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName); return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName);
// } }
//
// @Override @Override
// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
// BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class); BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class);
// String batCode = batteryInfoReq.getBatCode(); String batCode = batteryInfoReq.getBatCode();
// //直接默认为错误 //直接默认为错误
// MqttResponse<List<BatteryData>> response = new MqttResponse<List<BatteryData>>().createError(batteryInfoReq.getBatteryInfoRequestId()); MqttResponse<List<BatteryData>> response = new MqttResponse<List<BatteryData>>().createError(batteryInfoReq.getBatteryInfoRequestId());
//
// List<BatteryStationDc> list = Collections.emptyList(); List<BatteryStationDc> list = Collections.emptyList();
// if(org.apache.commons.lang3.StringUtils.isNotEmpty(batCode)){ if(org.apache.commons.lang3.StringUtils.isNotEmpty(batCode)){
// list.addAll(batteryStationDcService.list(new LambdaQueryWrapper<BatteryStationDc>().eq(BatteryStationDc::getBatCode, batCode).eq(BatteryStationDc::getDelFlag, HDConstant.DELETE_NO))); list.addAll(batteryStationDcService.list(new LambdaQueryWrapper<BatteryStationDc>().eq(BatteryStationDc::getBatCode, batCode).eq(BatteryStationDc::getDelFlag, HDConstant.DELETE_NO)));
// }else{ }else{
// //如果没有电池编号, 则以当前站的电池数据为准 //如果没有电池编号, 则以当前站的电池数据为准
// list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode())); list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode()));
// } }
// if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
// response.setCode(MqttResponse.PUBLIC_SUCCESS); response.setCode(MqttResponse.PUBLIC_SUCCESS);
// response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList())); response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList()));
// }else { }else {
// response.setMsg("未查询到电池信息"); response.setMsg("未查询到电池信息");
// } }
//
// logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
// sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response); sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response);
// } }
//
//} }

View File

@ -13,14 +13,17 @@ import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse; import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.redis.utils.RedisServiceUtils; import com.evotech.hd.common.redis.utils.RedisServiceUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
/** /**
* 换电信息--站端回复开始换电通知信息类 * 站端回复开始换电通知信息类
* *
* @ClassName:MqttRequestBatterySwapExchangeProcessorImpl * @ClassName:MqttRequestBatterySwapExchangeProcessorImpl
* @date: 2025年06月20日 11:29 * @date: 2025年06月20日 11:29
@ -64,7 +67,11 @@ public class MqttRequestBatterySwapExchangeProcessorImpl implements MqttStrategy
Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo)); Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
//如果是成功, 创建订单详情 //如果是成功, 创建订单详情
if(MqttResponse.PUBLIC_SUCCESS.equals(battery.getCode())){ if(MqttResponse.PUBLIC_SUCCESS.equals(battery.getCode())){
orderDetailService.addOrderDetailByOrder(order.getPkId()); OrderDetail detail = new OrderDetail();
detail.setOrderId(order.getPkId());
detail.setServiceTimeBegin(new Date());
detail.setOrderTimeBegin(new Date());
orderDetailService.save(detail);
}else{ }else{
wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(Collections.asMap("code",0, "msg", battery.getMsg()))); wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(Collections.asMap("code",0, "msg", battery.getMsg())));
} }

View File

@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* 取消订单--取消订单请求类 * 取消订单请求类
* @ClassName:MqttRequestCancelOrderExchangeProcessorImpl * @ClassName:MqttRequestCancelOrderExchangeProcessorImpl
* @date: 2025年05月19日 14:51 * @date: 2025年05月19日 14:51
* @author: andy.shi * @author: andy.shi

View File

@ -1,73 +1,73 @@
//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
//
//import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao; import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
//import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
//import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; 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.dto.newer.req.MqttResponse;
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.CarInfoReq; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.CarInfoReq;
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData;
//import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation; import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
//import jakarta.annotation.Resource; import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
//import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
//
//import java.util.List; import java.util.List;
//import java.util.stream.Collectors; import java.util.stream.Collectors;
//
///** /**
// * 站端请求车辆信息 * 站端请求车辆信息
// * @ClassName:MqttRequestCarInfoExchangeProcessorImpl * @ClassName:MqttRequestCarInfoExchangeProcessorImpl
// * @date: 2025年06月19日 11:21 * @date: 2025年06月19日 11:21
// * @author: andy.shi * @author: andy.shi
// * @contact: 17330188597 * @contact: 17330188597
// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
// */ */
//@Service @Service
//@Slf4j @Slf4j
//public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
//
// @Resource @Resource
// private VehicleWechatUserRelationDao vehicleWechatUserRelationDao; private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
//
// @Override @Override
// public boolean accept(String functionName) { public boolean accept(String functionName) {
// return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName); return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName);
// } }
//
// @Override @Override
// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
// CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class); CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class);
// //直接默认为错误 //直接默认为错误
// MqttResponse<List<VehicleData>> response = new MqttResponse<List<VehicleData>>().createError(carInfoReq.getCarInfoRequestId()); MqttResponse<List<VehicleData>> response = new MqttResponse<List<VehicleData>>().createError(carInfoReq.getCarInfoRequestId());
// String plateNum = carInfoReq.getPlateNum(); String plateNum = carInfoReq.getPlateNum();
// if(StringUtils.isEmpty(plateNum)){ if(StringUtils.isEmpty(plateNum)){
// response.setMsg("没有车牌号参数"); response.setMsg("没有车牌号参数");
// }else{ }else{
// List<VehicleWechatUserRelation> list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper<VehicleWechatUserRelation>().eq( VehicleWechatUserRelation::getPlateNum, plateNum)); List<VehicleWechatUserRelation> list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper<VehicleWechatUserRelation>().eq( VehicleWechatUserRelation::getPlateNum, plateNum));
// if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
// response.setCode(MqttResponse.PUBLIC_SUCCESS); response.setCode(MqttResponse.PUBLIC_SUCCESS);
// response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList())); response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList()));
// }else { }else {
// response.setMsg("未查询到车辆信息"); response.setMsg("未查询到车辆信息");
// } }
// } }
//
// logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
// sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response); sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response);
// } }
//
//
// public static VehicleData convertVehicleData(VehicleWechatUserRelation data){ public static VehicleData convertVehicleData(VehicleWechatUserRelation data){
// VehicleData vd = new VehicleData(); VehicleData vd = new VehicleData();
// BeanUtils.copyProperties(data, vd); BeanUtils.copyProperties(data, vd);
// return vd; return vd;
// } }
//
//
//} }

View File

@ -19,7 +19,7 @@ import org.springframework.stereotype.Service;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
* 预约订单--站端请求创建预约单类 * 站端请求创建预约单类
* *
* @ClassName:MqttRequestPreOrderExchangeProcessorImpl * @ClassName:MqttRequestPreOrderExchangeProcessorImpl
* @date: 2025年05月19日 17:41 * @date: 2025年05月19日 17:41
@ -42,7 +42,7 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
@Override @Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
OrderSwapBatteryPre orderSwapBatteryPre = JSONUtil.toBean(dataBody, OrderSwapBatteryPre.class); OrderSwapBatteryPre orderSwapBatteryPre = JSONUtil.toBean(dataBody, OrderSwapBatteryPre.class);
MqttResponse response = new MqttResponse().error(""); MqttResponse response = new MqttResponse().createError(orderSwapBatteryPre.getSourceId());
// 1. 基础字段校验 // 1. 基础字段校验
if (validateRequiredFields(orderSwapBatteryPre)) { if (validateRequiredFields(orderSwapBatteryPre)) {
response.setMsg("预约信息不完整"); response.setMsg("预约信息不完整");
@ -55,7 +55,6 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
// 创建预约单信息 // 创建预约单信息
orderSwapBatteryPre.setUcode(wechatUser.getWuid()); orderSwapBatteryPre.setUcode(wechatUser.getWuid());
orderSwapBatteryPre.setSource(3); orderSwapBatteryPre.setSource(3);
orderSwapBatteryPre.setStationCode(topic.getStationCode());
Result<Boolean> integerResult = orderSwapBatteryPreService.addOrderSwapBatteryPre(orderSwapBatteryPre); Result<Boolean> integerResult = orderSwapBatteryPreService.addOrderSwapBatteryPre(orderSwapBatteryPre);
//检查结果 //检查结果
if (integerResult.getData()){ if (integerResult.getData()){
@ -86,12 +85,12 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
return Stream.of( return Stream.of(
order.getPlateNum(), order.getPlateNum(),
order.getPhone(), order.getPhone(),
// order.getStationCode(), order.getStationCode(),
// order.getStationName(), order.getStationName(),
order.getUname() order.getUname(),
// order.getSwapDay(), order.getSwapDay(),
// order.getSwapDuration(), order.getSwapDuration(),
// order.getReservationTime() order.getReservationTime()
).anyMatch(StrUtil::isBlankIfStr); ).anyMatch(StrUtil::isBlankIfStr);
} }
} }

View File

@ -15,7 +15,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* 初始化车辆和预约单--接收站端推送的车牌照, 创建车辆信息和预约单 * 接收站端推送的车牌照, 创建车辆信息和预约单
* *
* @ClassName:MqttRequestPushCarCreateMakeAppointmentExchangeProcessorImpl * @ClassName:MqttRequestPushCarCreateMakeAppointmentExchangeProcessorImpl
* @date: 2025年04月30日 15:34 * @date: 2025年04月30日 15:34

View File

@ -20,7 +20,6 @@ import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.enums.OrderStatusEnums; import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.SwapBatteryStepEnum; import com.evotech.hd.common.core.enums.SwapBatteryStepEnum;
import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.redis.utils.RedisServiceUtils; import com.evotech.hd.common.redis.utils.RedisServiceUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -31,7 +30,7 @@ import org.springframework.stereotype.Service;
import java.util.Date; import java.util.Date;
/** /**
* 查询订单--站端根据车牌号查询订单 * 站端根据车牌号查询订单
* *
* @ClassName:MqttRequestQueryOrderExchangeProcessorImpl * @ClassName:MqttRequestQueryOrderExchangeProcessorImpl
* @date: 2025年05月19日 17:41 * @date: 2025年05月19日 17:41
@ -73,7 +72,7 @@ public class MqttRequestQueryOrderExchangeProcessorImpl implements MqttStrategyR
.eq(Order::getPlateNum, orderSwapBatteryPre.getPlateNum()) .eq(Order::getPlateNum, orderSwapBatteryPre.getPlateNum())
.eq(Order::getStationCode, orderSwapBatteryPre.getStationCode()) .eq(Order::getStationCode, orderSwapBatteryPre.getStationCode())
.eq(Order::getOrderPreId, orderSwapBatteryPre.getPkId()) .eq(Order::getOrderPreId, orderSwapBatteryPre.getPkId())
.in(Order::getStatus, Collections.asList(OrderStatusEnums.CREATE.getCode(), OrderStatusEnums.SWAP.getCode()))); .eq(Order::getStatus, OrderStatusEnums.CREATE.getCode()));
if (ObjectUtils.isNotEmpty(order)) { if (ObjectUtils.isNotEmpty(order)) {
response.setCode(MqttResponse.PUBLIC_SUCCESS); response.setCode(MqttResponse.PUBLIC_SUCCESS);
}else{ }else{

View File

@ -16,7 +16,7 @@ import org.springframework.util.StringUtils;
import java.util.List; import java.util.List;
/** /**
* 查询充电策略--Mqtt查询充电策略 * Mqtt查询充电策略
* @ClassName:StrategyMqttMessageRequestExchangeProcessorImpl * @ClassName:StrategyMqttMessageRequestExchangeProcessorImpl
* @date: 2025年04月08日 11:36 * @date: 2025年04月08日 11:36
* @author: andy.shi * @author: andy.shi

View File

@ -1,42 +1,42 @@
//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state; package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state;
//
//import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
//import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao; import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao;
//import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
//import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
//import com.evotech.hd.cloud.utils.components.HDStepDictComponent; import com.evotech.hd.cloud.utils.components.HDStepDictComponent;
//import jakarta.annotation.Resource; import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
//
///** /**
// * 站端反馈订单状态 * 站端反馈订单状态
// * *
// * @ClassName:MqttStateSwapStepDataExchangeProcessor * @ClassName:MqttStateSwapStepDataExchangeProcessor
// * @date: 2025年04月29日 13:26 * @date: 2025年04月29日 13:26
// * @author: andy.shi * @author: andy.shi
// * @contact: 17330188597 * @contact: 17330188597
// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
// */ */
//@Slf4j @Slf4j
//@Service @Service
//public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor { public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor {
//
// @Resource @Resource
// private HDStepDictComponent hdStepDictComponent; private HDStepDictComponent hdStepDictComponent;
// @Resource @Resource
// private OrderSwapBatteryStepDao orderSwapBatteryStepDao; private OrderSwapBatteryStepDao orderSwapBatteryStepDao;
//
// @Override @Override
// public boolean accept(String functionName) { public boolean accept(String functionName) {
// return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName); return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName);
// } }
//
// @Override @Override
// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
//// OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class); // OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class);
//// OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class); // OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class);
// log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题{},换电步骤名称:{}",topic, dataBody.toString()); log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题{},换电步骤名称:{}",topic, dataBody.toString());
// } }
//} }

View File

@ -50,11 +50,16 @@ public class MqttStateSwapStepDataExchangeProcessor implements MqttStrategyState
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
SwapStep swapStep = JSONUtil.toBean(dataBody, SwapStep.class); SwapStep swapStep = JSONUtil.toBean(dataBody, SwapStep.class);
// 记录换电步骤 // 记录换电步骤
// OrderSwapBatteryStep step = new OrderSwapBatteryStep();
// BeanUtils.copyProperties(swapStep, step);
// step.setCtime(new Date());
// step.setCreater("SYS");
// step.setStepName(hdStepDictComponent.hdStepDictName(step.getStep()));
log.info("\r\n=====>>>站端反馈换电步骤--MQTT收到消息主题{},换电步骤名称:{}",topic, hdStepDictComponent.hdStepDictName(swapStep.getStep())); log.info("\r\n=====>>>站端反馈换电步骤--MQTT收到消息主题{},换电步骤名称:{}",topic, hdStepDictComponent.hdStepDictName(swapStep.getStep()));
if(orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(swapStep.getOrderNo(), swapStep.getStep(), swapStep.getStepTime())){ if(orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(swapStep.getOrderNo(), swapStep.getStep(), swapStep.getStepTime())){
Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, swapStep.getOrderNo()).eq(Order::getDelFlag, HDConstant.DELETE_NO)); Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, swapStep.getOrderNo()).eq(Order::getDelFlag, HDConstant.DELETE_NO));
//发送通知到指定客户端 //发送通知到指定客户端
wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(orderSwapBatteryStepService.list(new LambdaQueryWrapper<OrderSwapBatteryStep>().eq(OrderSwapBatteryStep::getOrderNo, order.getOrderNo()).orderByAsc(OrderSwapBatteryStep::getStep)))); wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(orderSwapBatteryStepService.list(new LambdaQueryWrapper<OrderSwapBatteryStep>().eq(OrderSwapBatteryStep::getOrderNo, order.getOrderNo()).orderByAsc(OrderSwapBatteryStep::getStepTime))));
} }
} }
} }

View File

@ -1,20 +0,0 @@
package com.evotech.hd.cloud.open;
import lombok.Data;
/**
*
*
* @ClassName:OpenParams
* @date: 2025年08月19日 15:10
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
public class OpenParams {
private String stationCode;
private String sign;
private String data;
}

View File

@ -1,52 +0,0 @@
package com.evotech.hd.cloud.open;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.open.processor.StrategyFactory;
import com.evotech.hd.cloud.service.BatteryStationSecretKeyService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Base64;
import java.util.Map;
/**
*
*
* @ClassName:OpenStationController
* @date: 2025年08月19日 15:07
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Slf4j
@RestController
@RequestMapping("/open/station")
public class OpenStationController {
@Autowired
BatteryStationSecretKeyService batteryStationSecretKeyService;
@Autowired
private StrategyFactory strategyFactory;
@PostMapping("/message")
public Result message(@Valid @RequestBody OpenParams params){
Map<String, String> secretKeyMap = batteryStationSecretKeyService.getStationSecretKeyByStationCode(params.getStationCode());
if(Collections.isEmpty(secretKeyMap)){
return Result.getInstance().error("未找到当前站端的秘钥信息");
}
Sign verifier = SecureUtil.sign(SignAlgorithm.SHA256withRSA, null, secretKeyMap.get(HDConstant.PUBLIC_KEY));
if(!verifier.verify(params.getData().getBytes(), Base64.getDecoder().decode(params.getSign()))){
return Result.getInstance().error("当前信息已被篡改");
}
return strategyFactory.exchange(JSONObject.parseObject(params.getData()));
}
}

View File

@ -1,47 +0,0 @@
package com.evotech.hd.cloud.open.processor;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.common.core.Dto.Result;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 站控消息处理接口
*
* @ClassName:StationMessageStrategyExchangeProcessor
* @date: 2025年08月20日 10:16
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface StationMessageStrategyExchangeProcessor {
default boolean accept(String method){
return getMethod().stream().filter(data-> data.equalsIgnoreCase(method)).count() > 0;
}
/***
* 默认读取子类除exchange 以外 所有的method
* 可以继承复写
* StationRunningStatusProcessor 子类之有一个exchange 可以复写
* @return
*/
default List<String> getMethod(){
return Arrays.stream(this.getClass().getMethods()).filter(data-> !data.getName().equalsIgnoreCase("exchange")).map(data -> data.getName()).collect(Collectors.toList());
}
/***
* 默认读取子类除exchange 以外 所有的method
* 可以继承复写
* StationRunningStatusProcessor 子类之有一个exchange 可以复写
* @return
*/
default Result exchange(JSONObject json) throws Exception{
Method method = this.getClass().getMethod(json.getString("method"), JSONObject.class);
return (Result) method.invoke(this, json);
}
}

View File

@ -1,85 +0,0 @@
package com.evotech.hd.cloud.open.processor;
/**
*
*
* @ClassName:StrategyFactory
* @date: 2025年08月21日 14:11
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.entity.MessageMqtt;
import com.evotech.hd.cloud.service.MessageMqttService;
import com.evotech.hd.common.core.Dto.Result;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/***
* 策略工厂
*/
@Component
public class StrategyFactory implements InitializingBean, ApplicationContextAware {
private ApplicationContext applicationContext;
private static final Map<String, StationMessageStrategyExchangeProcessor> CONTEXT = new HashMap<>();
private static MessageMqttService messageMqttService;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet(){
// 手动将所有实现注册到工厂容器
applicationContext.getBeansOfType(StationMessageStrategyExchangeProcessor.class)
.values()
.forEach(exchange -> CONTEXT.putIfAbsent(exchange.getClass().getSimpleName().toLowerCase(), exchange));
messageMqttService = applicationContext.getBean(MessageMqttService.class);
}
public Result exchange(JSONObject json) {
try {
StationMessageStrategyExchangeProcessor processor = CONTEXT.get(json.getString("class").toLowerCase());
log(json);
if (ObjectUtils.isEmpty(processor)){
return Result.getInstance().error("当前接口不存在");
}
if(processor.accept(json.getString("method"))){
return processor.exchange(json);
}
return Result.getInstance().error("当前method不存在");
} catch (Exception e) {
Throwable realException = e.getCause();
if(realException != null){
realException.printStackTrace();
}// 获取实际的异常
e.printStackTrace();
return Result.getInstance().error(e.getMessage());
}
}
public void log(JSONObject json){
MessageMqtt messageMqtt = new MessageMqtt();
messageMqtt.setStationCode(json.getString("stationCode"));
messageMqtt.setDirection("M2S");
messageMqtt.setType("状态信息类");
messageMqtt.setMessageFunction(json.getString("method"));
messageMqtt.setTopic(json.getString("class"));
messageMqtt.setContent(json.toJSONString());
messageMqttService.add(messageMqtt);
}
// public void
}

View File

@ -1,62 +0,0 @@
package com.evotech.hd.cloud.open.processor.impl;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.BatteryStationService;
import com.evotech.hd.common.constant.MongoConstant;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.documnet.StationState;
import com.evotech.hd.common.service.MongoDBService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 告警信息处理类
*
* @ClassName:AlarmProcessor
* @date: 2025年08月23日 14:58
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Slf4j
@Service
public class AlarmProcessor implements StationMessageStrategyExchangeProcessor {
@Resource
BatteryStationService batteryStationService;
@Resource
MongoDBService mongoDBService;
@Override
public List<String> getMethod() {
return Collections.asList("alarmMessage");
}
@Override
public Result exchange(JSONObject json) {
// BatteryStation batteryStation = batteryStationDao.selectOne(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, json.getString("stationCode")), false);
try {
/***
* state: 获取运行状态 1-运营;2-调试;3-检修;
* smoke: 获取烟感告警信号, 多个烟感状态,分割, 每个代表一个烟感的状态 0-未知;1-正常;2-告警
* fire: 获取消防告警信号 0-未知;1-正常;2-告警
*/
batteryStationService.updateStatusByAlarm(json.getString("stationCode"), json.getInteger("state"), json.getString("smoke"), json.getInteger("fire"));
} catch (Exception e) {
log.error("更改云端数据信息出错"+e.getMessage());
}finally {
StationState document = new StationState(json.toJSONString());
document.setId(String.valueOf(System.currentTimeMillis()));
document.setStationCode(json.getString("stationCode"));
mongoDBService.save(MongoConstant.STATION_INFO_BASE, StateFunctionTypesEnum.FUN_STATION_STATE.getFunction(), document);
}
return null;
}
}

View File

@ -1,33 +0,0 @@
package com.evotech.hd.cloud.open.processor.impl;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyDetailService;
import com.evotech.hd.common.core.Dto.Result;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* BatteryStrategyProcessor
*
* @author andy.shi
* @ClassName:BatteryStrategyProcessor
* @date: 2025年09月28日 9:18
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class BatteryStrategyProcessor implements StationMessageStrategyExchangeProcessor {
@Resource
BatteryStationCdStrategyDetailService batteryStationCdStrategyDetailService;
/***
* 推送策略
* @param json
* @return
*/
public Result receiveStationStrategy(JSONObject json){
return batteryStationCdStrategyDetailService.addBatteryStationCdStrategyDetailByCloud(json);
}
}

View File

@ -1,27 +0,0 @@
package com.evotech.hd.cloud.open.processor.impl;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.common.core.Dto.Result;
import org.springframework.stereotype.Service;
/**
* BatteryStrategyProcessor
*
* @author andy.shi
* @ClassName:BatteryStrategyProcessor
* @date: 2025年09月28日 9:18
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class KeepaliveProcessor implements StationMessageStrategyExchangeProcessor {
/***
* 心跳检查
* @return
*/
public Result keepalive(JSONObject json){
return Result.getInstance().build(Boolean.class).success(true);
}
}

View File

@ -1,94 +0,0 @@
package com.evotech.hd.cloud.open.processor.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.dao.BatteryStationDao;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.OrderSwapBatteryPreService;
import com.evotech.hd.cloud.service.WechatUserService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 站端新增预约订单
*
* @ClassName:AddOrderSwapBatteryPreProcessor
* @date: 2025年08月20日 15:56
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class OrderSwapBatteryPreProcessor implements StationMessageStrategyExchangeProcessor {
@Resource
WechatUserService wechatUserService;
@Resource
private BatteryStationDao batteryStationDao;
@Resource
OrderSwapBatteryPreService orderSwapBatteryPreService;
/***
* 取消预约单, 禁止删除, 反射调用
* @param json
* @return
*/
public Result orderSwapBatteryPreUpdateStatus(JSONObject json){
return orderSwapBatteryPreService.updateStatusById(json.getInteger("pkId"), json.getInteger("status"));
}
/***
* 新增预约单 禁止删除, 反射调用
* @param json
* @return
*/
public Result orderSwapBatteryPreAdd(JSONObject json){
BatteryStation batteryStation = batteryStationDao.selectOne(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, json.getString("stationCode")), false);
if(ObjectUtils.isEmpty(batteryStation)){
return Result.getInstance().error("未找到站点信息, 站端编码异常");
}
OrderSwapBatteryPre orderSwapBatteryPre = JSONObject.parseObject(json.toJSONString(), OrderSwapBatteryPre.class);
//添加预约单
WechatUser wechatUser =wechatUserService.selectUcode(orderSwapBatteryPre.getPhone(),orderSwapBatteryPre.getUname());
if(ObjectUtils.isEmpty(wechatUser)){
return Result.getInstance().error("未找到预约人信息");
}
orderSwapBatteryPre.setUcode(wechatUser.getWuid());
orderSwapBatteryPre.setUname(wechatUser.getName());
orderSwapBatteryPre.setSourceId(String.valueOf(batteryStation.getPkId()));
Result<Boolean> saveResult = orderSwapBatteryPreService.addOrderSwapBatteryPre(orderSwapBatteryPre);
if(saveResult.getData()){
return Result.getInstance().build(JSONObject.class).success(JSONObject.parseObject(JSONObject.toJSONString(orderSwapBatteryPre)));
}
return Result.getInstance().build(JSONObject.class).error(saveResult.getMsg());
}
/***
* 查询预约单, 禁止删除, 反射调用
* @param json
* @return
*/
public Result findOrderSwapBatteryPre(JSONObject json){
try {
Date limitDate = json.getDate("limitDate");
LambdaQueryWrapper<OrderSwapBatteryPre> query = new LambdaQueryWrapper<OrderSwapBatteryPre>().eq(OrderSwapBatteryPre::getStationCode, json.getString("stationCode")).eq(OrderSwapBatteryPre::getStatus,1).ne(OrderSwapBatteryPre::getSource,3);
if(limitDate != null){
query.apply(" DATE_FORMAT(reservation_time,'%Y-%m-%d') >= {0}", DateFormatUtils.format(limitDate, "yyyy-MM-dd"));
}
List<OrderSwapBatteryPre> orderSwapBatteryPre = orderSwapBatteryPreService.list(query);
return Result.getInstance().build(JSONArray.class).success((JSONArray)JSONArray.toJSON(orderSwapBatteryPre));
} catch (Exception e) {
e.printStackTrace();
return Result.getInstance().build(JSONObject.class).error("查询云端预约单信息失败");
}
}
}

View File

@ -1,129 +0,0 @@
package com.evotech.hd.cloud.open.processor.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm.MqttConfirmSwapCompleteExchangeProcessorImpl;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateSwapStepDataExchangeProcessor;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.OrderDetailService;
import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.cloud.service.OrderSwapBatteryPreService;
import com.evotech.hd.cloud.service.OrderSwapBatteryStepService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.ResultUtil;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.SwapBatteryStepEnum;
import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.redis.utils.RedisServiceUtils;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* 换电订单类
*
* @ClassName:OrderSwapProcessor
* @date: 2025年08月21日 13:19
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class OrderSwapProcessor implements StationMessageStrategyExchangeProcessor {
@Resource
OrderSwapBatteryPreService orderSwapBatteryPreService;
@Resource
OrderService orderService;
@Resource
OrderDetailService orderDetailService;
@Resource
private OrderSwapBatteryStepService orderSwapBatteryStepService;
@Resource
private MqttStateSwapStepDataExchangeProcessor mqttStateSwapStepDataExchangeProcessor;
@Resource
private MqttConfirmSwapCompleteExchangeProcessorImpl mqttEventSwapCompleteExchangeProcessorImpl;
/***
* 新增换电单 禁止删除, 反射调用
* @param json
* @return
*/
public Result orderSwapAdd(JSONObject json){
String errorMsg = "";
OrderSwapBatteryPre orderSwapBatteryPre = orderSwapBatteryPreService.getById(json.getInteger("preId"));
Order order = orderService.getOne(new LambdaQueryWrapper<Order>()
.eq(Order::getPlateNum, orderSwapBatteryPre.getPlateNum())
.eq(Order::getStationCode, orderSwapBatteryPre.getStationCode())
.eq(Order::getOrderPreId, orderSwapBatteryPre.getPkId())
.in(Order::getStatus, Collections.asList(OrderStatusEnums.CREATE.getCode(), OrderStatusEnums.SWAP.getCode())));
if (ObjectUtils.isNotEmpty(order)) {
return Result.getInstance().build(JSONObject.class).success((JSONObject)JSONObject.toJSON(order));
}else{
Result<Order> result = orderService.addOrderByPre(orderSwapBatteryPre);
//如果不等于成功
if(ResultUtil.verifyCode(result)){
order = result.getData();
//走到此处, 证明上面逻辑没有问题, 需要删除预约单过期标识
RedisServiceUtils.del("preorder:expire:"+orderSwapBatteryPre.getPkId());
//更新预约单为到店使用
orderSwapBatteryPre.setStatus(2);
orderSwapBatteryPreService.updateById(orderSwapBatteryPre);
orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(order.getOrderNo(), SwapBatteryStepEnum.VEHICLES_ENTER_STATION.getKey(), new Date());
return Result.getInstance().build(JSONObject.class).success((JSONObject)JSONObject.toJSON(order));
}
errorMsg = result.getMsg();
}
return Result.getInstance().build(JSONObject.class).error(errorMsg, null);
}
/***
* 车辆到位信息
* @param json
* @return
*/
public Result arrivalSignal(JSONObject json){
try {
Order order = orderService.getById(json.getInteger("pkId"));
json.put("orderNo", order.getOrderNo());
mqttStateSwapStepDataExchangeProcessor.exchange(new MessageTopic(json.getString("stationCode")+"_WEB站推送", "http"), null, JSONUtil.parseObj(json.toJSONString()));
return Result.getInstance().build(Boolean.class).success(true);
} catch (Exception e) {
e.printStackTrace();;
return Result.getInstance().build(Boolean.class).error(e.getMessage(), null);
}
}
/***
* 车辆换电完成
* @param json
* @return
*/
public Result orderCompleted(JSONObject json){
try {
Order order = orderService.getById(json.getInteger("pkId"));
OrderStatusData statusData = JSONUtil.toBean(json.toJSONString(), OrderStatusData.class);
SwapComplete orderStatus = new SwapComplete();
orderStatus.setOrderNo(order.getOrderNo());
orderStatus.setStatus(3);
orderStatus.setStatusTime(new Date());
orderStatus.setStatusData(statusData);
// 订单状态更新处理
orderService.handleOrderStatus(orderStatus, statusData);
//再次查询数据信息
order = orderService.getById(json.getInteger("pkId"));
order.setOrderDetail(orderDetailService.getOrderDetailByOrder(order.getPkId()));
return Result.getInstance().build(JSONObject.class).success((JSONObject)JSONObject.toJSON(order));
} catch (Exception e) {
e.printStackTrace();
return Result.getInstance().build(JSONObject.class).error(e.getMessage(), null);
}
}
}

View File

@ -1,49 +0,0 @@
package com.evotech.hd.cloud.open.processor.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.dao.BatteryStationDao;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.BatteryStationService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 站端调整运行.停运状态
*
* @ClassName:StationRunningStatusProcessor
* @date: 2025年08月20日 10:18
* @author: andy.shi
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class StationRunningStatusProcessor implements StationMessageStrategyExchangeProcessor {
@Autowired
BatteryStationService batteryStationService;
@Resource
private BatteryStationDao batteryStationDao;
@Override
public List<String> getMethod() {
return Collections.asList("updateStationRunningStatus");
}
@Override
public Result exchange(JSONObject json) {
BatteryStation batteryStation = batteryStationDao.selectOne(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, json.getString("stationCode")), false);
if(ObjectUtils.isEmpty(batteryStation)){
return Result.getInstance().error("未找到站点信息, 站端编码异常");
}
//修改运行状态, 1为正常运营, 4为指令停运
batteryStation.setStatus(json.getBoolean("status") ? 1 : 4);
return batteryStationService.update(batteryStation);
}
}

View File

@ -1,20 +0,0 @@
package com.evotech.hd.cloud.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.evotech.hd.cloud.entity.request.PageListAlarmTemplateRequest;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
/**
* AlarmTemplateService
*
* @author andy.shi
* @ClassName:AlarmTemplateService
* @date: 2025年10月28日 15:14
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface AlarmTemplateService extends IService<AlarmTemplate> {
public Result<Page<AlarmTemplate>> pageList(PageListAlarmTemplateRequest params);
}

View File

@ -1,21 +0,0 @@
package com.evotech.hd.cloud.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
/**
* BatteryStationCdStrategyDetailService
*
* @author andy.shi
* @ClassName:BatteryStationCdStrategyDetailService
* @date: 2025年09月28日 9:22
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface BatteryStationCdStrategyDetailService extends IService<BatteryStationCdStrategyDetail> {
public Result<JSONObject> addBatteryStationCdStrategyDetailByCloud (JSONObject jsonObject);
}

View File

@ -1,8 +0,0 @@
package com.evotech.hd.cloud.service;
import java.util.Map;
public interface BatteryStationSecretKeyService {
public Map<String, String> getStationSecretKeyByStationCode(String stationCode);
}

View File

@ -13,9 +13,4 @@ import com.evotech.hd.common.core.entity.order.OrderDetail;
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步 * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/ */
public interface OrderDetailService extends IService<OrderDetail> { public interface OrderDetailService extends IService<OrderDetail> {
public OrderDetail addOrderDetailByOrder(Integer orderId);
public OrderDetail getOrderDetailByOrder(Integer orderId);
} }

View File

@ -2,18 +2,14 @@ package com.evotech.hd.cloud.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.order.OrderBillListVo;
import com.evotech.hd.common.core.Dto.order.OrderDetailVo;
import com.evotech.hd.common.core.Dto.order.OrderListVo; import com.evotech.hd.common.core.Dto.order.OrderListVo;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; 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.OrderSwapBatteryStep;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse; import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest; import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.entity.order.Order;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -77,12 +73,4 @@ public interface OrderService extends IService<Order> {
Result<BatterySwapResponse> getStartSwap(String wuid, String orderId); Result<BatterySwapResponse> getStartSwap(String wuid, String orderId);
Result<Order> one(String orderNo); Result<Order> one(String orderNo);
Result<OrderDetailVo> getOneByOrderNo(String orderNo);
Result<List<OrderBillListVo>> billList(String companyCode, String orderTimeEnd);
void excelBillList(String companyCode, String orderTimeEnd);
void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData);
} }

View File

@ -25,7 +25,7 @@ public interface OrderSwapBatteryPreService extends IService<OrderSwapBatteryPre
public Result<Page<OrderSwapBatteryPre>> list(PageListSwapOrderPreRequest plsopr); public Result<Page<OrderSwapBatteryPre>> list(PageListSwapOrderPreRequest plsopr);
public Result<Integer> updateStatusById(Integer id, Integer status); public Result<Integer> cancelPre(Integer id, Integer status);
List<OrderSwapBatteryPre> findOrderSwapBatteryPreList(String stationCode); List<OrderSwapBatteryPre> findOrderSwapBatteryPreList(String stationCode);

View File

@ -16,10 +16,6 @@ public interface TradeService extends IService<TradeDetail> {
public Result<Integer> update(TradeDetail td); public Result<Integer> update(TradeDetail td);
public Result<Integer> submit(TradeDetail td);
public Result<Integer> approve(Integer id, Integer type);
public Result<Page<TradeDetail>> list(PageListTradeRequest pltr); public Result<Page<TradeDetail>> list(PageListTradeRequest pltr);
public List<TradeDetail> tradeList(PageListTradeRequest pltr); public List<TradeDetail> tradeList(PageListTradeRequest pltr);

View File

@ -5,13 +5,9 @@ import com.evotech.hd.cloud.entity.request.PageListWechatUserRequest;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.wechat.WechatUser; import com.evotech.hd.common.core.entity.wechat.WechatUser;
import java.util.List;
public interface WechatUserService { public interface WechatUserService {
public Result<Page<WechatUser>> pageList(PageListWechatUserRequest plwur); public Result<Page<WechatUser>> list(PageListWechatUserRequest plwur);
public Result<List<WechatUser>> list(List<String> wuIds);
public Result<Integer> alterPhone(String wuid, String phone, String name); public Result<Integer> alterPhone(String wuid, String phone, String name);

View File

@ -1,59 +0,0 @@
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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.entity.request.PageListAlarmTemplateRequest;
import com.evotech.hd.cloud.service.AlarmTemplateService;
import com.evotech.hd.cloud.service.WechatUserService;
import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.ResultUtil;
import com.evotech.hd.common.core.dao.cloud.AlarmTemplateDao;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
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.core.utils.DataUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* BatteryStationCdStrategyDetailServiceImpl
*
* @author andy.shi
* @ClassName:BatteryStationCdStrategyDetailServiceImpl
* @date: 2025年09月28日 9:25
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class AlarmTemplateServiceImpl extends ServiceImpl<AlarmTemplateDao, AlarmTemplate> implements AlarmTemplateService {
@Resource
WechatService wechatService;
@Resource
WechatUserService wechatUserService;
@Override
public Result<Page<AlarmTemplate>> pageList(PageListAlarmTemplateRequest params) {
Page<AlarmTemplate> page = new Page<AlarmTemplate>(params.getPageNo(), params.getPageSize());
page = getBaseMapper().selectPage(page, new LambdaQueryWrapper<AlarmTemplate>()
.eq(StringUtils.hasText(params.getPath()), AlarmTemplate::getPath, params.getPath()));
if (page.getRecords().isEmpty()) {
return new Result<Page<AlarmTemplate>>().error(CodeMsg.DATABASE_RESULT_NULL);
}
page.getRecords().forEach(data->{
Result<List<WechatUser>> listResult = wechatUserService.list(Collections.asList(data.getRecipientIds().split(",")));
if(ResultUtil.verifyCode(listResult)){
data.setRecipientNames(DataUtils.findDefaultValue(ResultUtil.getValue(listResult), new ArrayList<WechatUser>()).stream().map(d-> d.getName()+"-"+d.getPhoneNumber()).collect(Collectors.joining(",")));
}
});
return new Result<Page<AlarmTemplate>>().success(page);
}
}

View File

@ -1,58 +0,0 @@
package com.evotech.hd.cloud.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyDetailService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDao;
import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDetailDao;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategy;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* BatteryStationCdStrategyDetailServiceImpl
*
* @author andy.shi
* @ClassName:BatteryStationCdStrategyDetailServiceImpl
* @date: 2025年09月28日 9:25
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class BatteryStationCdStrategyDetailServiceImpl extends ServiceImpl<BatteryStationCdStrategyDetailDao, BatteryStationCdStrategyDetail> implements BatteryStationCdStrategyDetailService {
@Resource
BatteryStationCdStrategyDao batteryStationCdStrategyDao;
@Override
public Result<JSONObject> addBatteryStationCdStrategyDetailByCloud(JSONObject jsonObject) {
//云端数据id
Integer cloudId = jsonObject.getInteger("cloudId");
BatteryStationCdStrategyDetail detail = null;
if(cloudId != null){
detail = getById(cloudId);
}else{
detail = new BatteryStationCdStrategyDetail();
BatteryStationCdStrategy batteryStationCdStrategy = batteryStationCdStrategyDao.getBatteryStationCdStrategyByName(jsonObject.getString("stationCode"), HDConstant.STRATEGY_NAME);
if(batteryStationCdStrategy == null){
batteryStationCdStrategy = new BatteryStationCdStrategy();
batteryStationCdStrategy.setStationCode(jsonObject.getString("stationCode"));
batteryStationCdStrategy.setStationName(jsonObject.getString("stationName"));
batteryStationCdStrategy.setStatus(1);
batteryStationCdStrategy.setName(HDConstant.STRATEGY_NAME);
batteryStationCdStrategy.setMiniLimit(5);
batteryStationCdStrategyDao.insert(batteryStationCdStrategy);
}
detail.setStrategyId(batteryStationCdStrategy.getPkId());
detail.setStationCode(batteryStationCdStrategy.getStationCode());
detail.setStationName(batteryStationCdStrategy.getStationName());
detail.setBeginTime(jsonObject.getString("beginTime"));
detail.setEndTime(jsonObject.getString("endTime"));
detail.setChargingPower(jsonObject.getDouble("chargingPower"));
saveOrUpdate(detail);
}
return Result.getInstance().build(JSONObject.class).success((JSONObject)JSONObject.toJSON(detail));
}
}

View File

@ -1,11 +1,7 @@
package com.evotech.hd.cloud.service.impl; package com.evotech.hd.cloud.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyService; import com.evotech.hd.cloud.service.BatteryStationCdStrategyService;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDao; import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDao;
@ -13,28 +9,23 @@ import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDetailDao;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategy; import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategy;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail; import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
@Service @Service
@Slf4j
public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStrategyService { public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStrategyService {
@Resource @Resource
private BatteryStationCdStrategyDao strategyDao; private BatteryStationCdStrategyDao strategyDao;
@Resource @Resource
private BatteryStationCdStrategyDetailDao strategyDetailDao; private BatteryStationCdStrategyDetailDao strategyDetailDao;
@Resource
private MessageUtilService messageUtilService;
@ -53,17 +44,7 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
public Result<Integer> delete(Integer id) { public Result<Integer> delete(Integer id) {
int n = strategyDao.deleteById(id); int n = strategyDao.deleteById(id);
if (n == 1) { if (n == 1) {
List<BatteryStationCdStrategyDetail> list = strategyDetailDao.selectList(new QueryWrapper<BatteryStationCdStrategyDetail>().eq("strategy_id", id)); strategyDetailDao.delete(new QueryWrapper<BatteryStationCdStrategyDetail>().eq("strategy_id", id));
if(Collections.isNotEmpty(list)){
List<Integer> delIds = Collections.emptyList();
list.stream().forEach(data->{
delIds.add(data.getPkId());
data.setDataType(3);
pushStation(data);
});
strategyDetailDao.deleteByIds(delIds);
}
// strategyDetailDao.delete(new QueryWrapper<BatteryStationCdStrategyDetail>().eq("strategy_id", id));
return new Result<Integer>().success(n); return new Result<Integer>().success(n);
} }
return new Result<Integer>().error("删除充电策略出错!"); return new Result<Integer>().error("删除充电策略出错!");
@ -92,7 +73,6 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
bscsd.setCtime(new Date()); bscsd.setCtime(new Date());
int n = strategyDetailDao.insert(bscsd); int n = strategyDetailDao.insert(bscsd);
if (n == 1) { if (n == 1) {
pushStation(bscsd);
return new Result<Integer>().success(n); return new Result<Integer>().success(n);
} }
return new Result<Integer>().error("添加充电策略详情出错!"); return new Result<Integer>().error("添加充电策略详情出错!");
@ -102,7 +82,6 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
public Result<Integer> deleteDetail(Integer id) { public Result<Integer> deleteDetail(Integer id) {
int n = strategyDetailDao.deleteById(id); int n = strategyDetailDao.deleteById(id);
if (n == 1) { if (n == 1) {
pushStation(new BatteryStationCdStrategyDetail(id, 3));
return new Result<Integer>().success(n); return new Result<Integer>().success(n);
} }
return new Result<Integer>().error("删除充电策略详情出错!"); return new Result<Integer>().error("删除充电策略详情出错!");
@ -112,8 +91,6 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
public Result<Integer> updateDetail(BatteryStationCdStrategyDetail bscsd) { public Result<Integer> updateDetail(BatteryStationCdStrategyDetail bscsd) {
int n = strategyDetailDao.updateById(bscsd); int n = strategyDetailDao.updateById(bscsd);
if (n == 1) { if (n == 1) {
bscsd.setDataType(2);
pushStation(bscsd);
return new Result<Integer>().success(n); return new Result<Integer>().success(n);
} }
return new Result<Integer>().error("更新充电策略详情失败!"); return new Result<Integer>().error("更新充电策略详情失败!");
@ -142,17 +119,4 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
return list; return list;
} }
public void pushStation(BatteryStationCdStrategyDetail strategyDetail){
CompletableFuture.runAsync(() -> {
try {
messageUtilService.publishStateMessage(strategyDetail.getStationCode(), StateFunctionTypesEnum.FUN_CHARGING_STRATEGY.getFunction(), new MqttResponse<BatteryStationCdStrategyDetail>().success(strategyDetail));
} catch (Exception e) {
e.printStackTrace();
log.error("云端修正充电策略推送站端失败, 原因是:{}, 推送数据是: {}" , e.getMessage(), JSONObject.toJSONString(strategyDetail));
}
});
}
} }

View File

@ -1,38 +0,0 @@
package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.cloud.dao.BatteryStationSecretKeyDao;
import com.evotech.hd.cloud.entity.BatteryStationSecretKey;
import com.evotech.hd.cloud.service.BatteryStationSecretKeyService;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
@Slf4j
public class BatteryStationSecretKeyServiceImpl implements BatteryStationSecretKeyService {
@Resource
private BatteryStationSecretKeyDao batteryStationSecretKeyDao;
@Override
public Map<String, String> getStationSecretKeyByStationCode(String stationCode) {
BatteryStationSecretKey existingKey = batteryStationSecretKeyDao.selectOne(
new QueryWrapper<BatteryStationSecretKey>()
.eq("type", 1)
.eq("station_code", stationCode),
false
);
if (existingKey != null) {
// 如果存在密钥对则直接返回
return Collections.asMap(HDConstant.PUBLIC_KEY, existingKey.getPublicKey(),HDConstant.PRIVATE_KEY, existingKey.getPrivateKey());
}
return Collections.emptyMap();
}
}

View File

@ -3,7 +3,7 @@ package com.evotech.hd.cloud.service.impl;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.KeyUtil;
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm; import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -188,7 +188,7 @@ public class BatteryStationServiceImpl implements BatteryStationService {
return new Result<Map<String, String>>().success(map); return new Result<Map<String, String>>().success(map);
} else { } else {
// 如果不存在密钥对则生成新的密钥对 // 如果不存在密钥对则生成新的密钥对
KeyPair keyPair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue()); KeyPair keyPair = KeyUtil.generateKeyPair(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue());
// 将私钥转换为Base64编码的字符串 // 将私钥转换为Base64编码的字符串
String privatekeyBase64String = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()); String privatekeyBase64String = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
// 将公钥转换为Base64编码的字符串 // 将公钥转换为Base64编码的字符串
@ -373,7 +373,7 @@ public class BatteryStationServiceImpl implements BatteryStationService {
//如果消防没有报警, 检查烟感 //如果消防没有报警, 检查烟感
if(!isAlarm){ if(!isAlarm){
//因为烟感有多个, 所以一个烟感报警,及存在报警信息 //因为烟感有多个, 所以一个烟感报警,及存在报警信息
isAlarm = org.apache.commons.lang3.StringUtils.isNotEmpty(smoke) && Collections.asList(smoke.split(",")).contains(MongoConstant.ErrorCode.STATION_ALARM_CODE); isAlarm = Collections.asList(smoke.split(",")).contains(MongoConstant.ErrorCode.STATION_ALARM_CODE);
if(isAlarm){ if(isAlarm){
alarmMsg.append("烟感报警"); alarmMsg.append("烟感报警");
} }

View File

@ -21,13 +21,11 @@ import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.core.entity.resource.ProxyOperater; import com.evotech.hd.common.core.entity.resource.ProxyOperater;
import com.evotech.hd.common.core.entity.wechat.WechatUser; import com.evotech.hd.common.core.entity.wechat.WechatUser;
import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.core.utils.DataUtils;
import com.evotech.hd.common.documnet.StationState; import com.evotech.hd.common.documnet.StationState;
import com.evotech.hd.common.redis.utils.RedisUtil; import com.evotech.hd.common.redis.utils.RedisUtil;
import com.evotech.hd.common.service.MongoDBService; import com.evotech.hd.common.service.MongoDBService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -237,7 +235,7 @@ public class HomeServiceImpl implements HomeService {
//待结算订单数量 //待结算订单数量
data.setPendingOrderNum(Long.valueOf(orderInfo.size())); data.setPendingOrderNum(Long.valueOf(orderInfo.size()));
//待结算订单金额 //待结算订单金额
data.setPendingOrderAmount(orderInfo.stream().collect(Collectors.summingDouble( i-> DataUtils.findDefaultValue(i.getSwapAmount(), DataUtils.DEFAULT_VALUE.doubleValue())))); data.setPendingOrderAmount(orderInfo.stream().collect(Collectors.summingDouble( i-> i.getSwapAmount())));
//待结算订单信息 //待结算订单信息
data.setOrderList(orderInfo); data.setOrderList(orderInfo);
@ -255,29 +253,16 @@ public class HomeServiceImpl implements HomeService {
if(Collections.isNotEmpty(alarmList)){ if(Collections.isNotEmpty(alarmList)){
StationState stationState= alarmList.get(0); StationState stationState= alarmList.get(0);
//报警信息 //报警信息
JSONObject alarmJSONObject = JSONObject.parseObject(stationState.getValue()); JSONObject alarmJSONObject = JSONObject.parseObject(alarmList.get(0).getValue());
Integer fire = alarmJSONObject.getInteger("fire"); Integer fire = alarmJSONObject.getInteger("fire");
List<String> alarmMessage = Collections.emptyList(); if(MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(fire)){
if(ObjectUtils.isNotEmpty(fire) && MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(fire)){ alarm.setAlarmType("消防告警");
alarmMessage.add("消防告警"); }else{
}
String smoke = alarmJSONObject.getString("smoke"); String smoke = alarmJSONObject.getString("smoke");
if(StringUtils.isNotEmpty(smoke) && Collections.asList(smoke.split(",")).contains(String.valueOf(MongoConstant.ErrorCode.STATION_ALARM_CODE))){ if(Collections.asList(smoke.split(",")).contains(String.valueOf(MongoConstant.ErrorCode.STATION_ALARM_CODE))){
alarmMessage.add("烟感告警"); alarm.setAlarmType("烟感告警");
} }
Integer water = alarmJSONObject.getInteger("water");
if(ObjectUtils.isNotEmpty(water) && MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(water)){
alarmMessage.add("水浸告警");
} }
Integer thunder = alarmJSONObject.getInteger("thunder");
if(ObjectUtils.isNotEmpty(thunder) && MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(thunder)){
alarmMessage.add("雷击信号");
}
Integer stop = alarmJSONObject.getInteger("stop");
if(ObjectUtils.isNotEmpty(stop) && MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(stop)){
alarmMessage.add("急停信号");
}
alarm.setAlarmType(String.join(";", alarmMessage));
alarm.setAlarmTime(DateUtil.format(new Date(Long.valueOf(stationState.getId())), "yyyy-MM-dd HH:mm:ss")); alarm.setAlarmTime(DateUtil.format(new Date(Long.valueOf(stationState.getId())), "yyyy-MM-dd HH:mm:ss"));
} }
}); });

View File

@ -1,15 +1,12 @@
package com.evotech.hd.cloud.service.impl; package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.service.OrderDetailService;
import com.evotech.hd.common.core.dao.cloud.OrderDetailDao; import com.evotech.hd.common.core.dao.cloud.OrderDetailDao;
import com.evotech.hd.common.core.entity.order.OrderDetail; import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.cloud.service.OrderDetailService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
/** /**
* 订单详情实现类 * 订单详情实现类
* *
@ -24,23 +21,6 @@ import java.util.Date;
@Slf4j @Slf4j
public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailDao, OrderDetail> implements OrderDetailService { public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailDao, OrderDetail> implements OrderDetailService {
@Override
public OrderDetail addOrderDetailByOrder(Integer orderId) {
OrderDetail orderDetail = getOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, orderId), false);
if(orderDetail == null){
orderDetail = new OrderDetail();
orderDetail.setOrderId(orderId);
orderDetail.setServiceTimeBegin(new Date());
orderDetail.setOrderTimeBegin(new Date());
save(orderDetail);
}
return orderDetail;
}
@Override
public OrderDetail getOrderDetailByOrder(Integer orderId) {
return getOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, orderId), false);
}
} }

View File

@ -7,10 +7,8 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONConfig; import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao;
@ -22,19 +20,17 @@ import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService; import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService;
import com.evotech.hd.cloud.service.*; import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.cloud.service.TaxPointService;
import com.evotech.hd.cloud.service.TradeService;
import com.evotech.hd.cloud.service.WalletAccountService;
import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.cloud.utils.CommonUtil; import com.evotech.hd.cloud.utils.CommonUtil;
import com.evotech.hd.cloud.utils.ExcelUtil;
import com.evotech.hd.cloud.utils.ParamServiceUtils; import com.evotech.hd.cloud.utils.ParamServiceUtils;
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent; import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.order.OrderBillListVo;
import com.evotech.hd.common.core.Dto.order.OrderDetailVo;
import com.evotech.hd.common.core.Dto.order.OrderListVo; import com.evotech.hd.common.core.Dto.order.OrderListVo;
import com.evotech.hd.common.core.constant.HDConstant; import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.dao.cloud.OrderDao; import com.evotech.hd.common.core.dao.cloud.OrderDao;
@ -44,12 +40,10 @@ import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest; import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.order.OrderDetail; import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.common.core.entity.resource.auth.AuthUser; import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.enums.*; import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.core.enums.PayTypeEnums;
import com.evotech.hd.common.core.utils.DataUtils; import com.evotech.hd.common.core.enums.TradeTypeEnums;
import com.evotech.hd.common.permission.util.RedisPermissionUtils;
import com.evotech.hd.common.permission.util.SpringUtil;
import com.evotech.hd.common.redis.utils.RedisServiceUtils; import com.evotech.hd.common.redis.utils.RedisServiceUtils;
import com.evotech.hd.common.web.util.EnumUtils; import com.evotech.hd.common.web.util.EnumUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -57,7 +51,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -102,12 +95,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
private OrderSwapBatteryPreDao orderSwapBatteryPreDao; private OrderSwapBatteryPreDao orderSwapBatteryPreDao;
@Resource @Resource
private MessageUtilService messageUtilService; private MessageUtilService messageUtilService;
@Autowired
private BatteryStationDcService batteryStationDcService;
@Autowired
private OrderSwapBatteryStepService orderSwapBatteryStepService;
@Autowired
private OrderDetailService orderDetailService;
public static OrderListVo convertOrderListVo(Order order){ public static OrderListVo convertOrderListVo(Order order){
@ -126,9 +114,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
.ge(ObjectUtils.isNotEmpty(plsor.getOrderTimeBegin()), Order::getOrderTime, plsor.getOrderTimeBegin()) .ge(ObjectUtils.isNotEmpty(plsor.getOrderTimeBegin()), Order::getOrderTime, plsor.getOrderTimeBegin())
.le(ObjectUtils.isNotEmpty(plsor.getOrderTimeEnd()), Order::getOrderTime, plsor.getOrderTimeEnd()) .le(ObjectUtils.isNotEmpty(plsor.getOrderTimeEnd()), Order::getOrderTime, plsor.getOrderTimeEnd())
.eq(StringUtils.isNotEmpty(plsor.getStationCode()), Order::getStationCode, plsor.getStationCode()) .eq(StringUtils.isNotEmpty(plsor.getStationCode()), Order::getStationCode, plsor.getStationCode())
.eq(StringUtils.isNotEmpty(plsor.getTradeNo()), Order::getTradeNo, plsor.getTradeNo()) .eq(StringUtils.isNotEmpty(plsor.getTradeNo()), Order::getNotifyOrderNo, plsor.getTradeNo())
.eq(StringUtils.isNotEmpty(plsor.getStatus()), Order::getStatus, plsor.getStatus()) .eq(StringUtils.isNotEmpty(plsor.getStatus()), Order::getStatus, plsor.getStatus())
.eq(StringUtils.isNotEmpty(plsor.getUserId()), Order::getPreWechatId, plsor.getUserId())
.ne(Order::getDelFlag, 1) .ne(Order::getDelFlag, 1)
.orderByDesc(Order::getOrderTime)); .orderByDesc(Order::getOrderTime));
@ -162,9 +149,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
} }
// 3. 选择费用计算方式 计算费用, 这里计算出来直接就是分 // 3. 选择费用计算方式 计算费用, 这里计算出来直接就是分
BigDecimal orderFee = new BigDecimal(orderDetail.getUnitPrice()).multiply(new BigDecimal(orderDetail.getElectricityQuantity())).setScale(0, RoundingMode.HALF_UP); BigDecimal orderFee = new BigDecimal(orderDetail.getUnitPrice()).multiply(new BigDecimal(orderDetail.getElectricityQuantity())).setScale(0, RoundingMode.HALF_UP);
if(orderFee.compareTo(new BigDecimal(0)) < 0){
orderFee = new BigDecimal(0);
}
//订单价格 //订单价格
orderDetail.setOrderFee(orderFee.intValue()); orderDetail.setOrderFee(orderFee.intValue());
// 4. 跟新订单 // 4. 跟新订单
@ -213,23 +197,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
order.setPlateNum(orderSwapBatteryPre.getPlateNum()); order.setPlateNum(orderSwapBatteryPre.getPlateNum());
order.setOrderTime(new Date()); order.setOrderTime(new Date());
order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP); order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP);
//站端不会推送换电中事件, 所以根据预约单创建订单, 即为换电中 order.setStatus(OrderStatusEnums.CREATE.getCode());
order.setStatus(OrderStatusEnums.SWAP.getCode());
order.setStationCode(orderSwapBatteryPre.getStationCode()); order.setStationCode(orderSwapBatteryPre.getStationCode());
order.setStationName(orderSwapBatteryPre.getStationName()); order.setStationName(orderSwapBatteryPre.getStationName());
order.setDelFlag(HDConstant.DELETE_NO); order.setDelFlag(HDConstant.DELETE_NO);
// TODO 查询换电站信息拿到计费方式计费信息在充电结束时, 计算 // TODO 查询换电站信息拿到计费方式计费信息在充电结束时, 计算
Boolean saveResult = save(order);
if(saveResult){
try {
orderDetailService.addOrderDetailByOrder(order.getPkId());
} catch (Exception e) {
e.printStackTrace();
log.error("生成换电订单详情出错",e);
}
}
// osb = orderBasicFeeComponent.orderBasicFee(osb); // osb = orderBasicFeeComponent.orderBasicFee(osb);
return (saveResult ? new Result<Order>().success(order) : new Result<Order>().error("订单生成异常", null)); return (save(order) ? new Result<Order>().success(order) : new Result<Order>().error("订单生成异常", null));
} }
@Override @Override
@ -246,13 +220,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
return new Result<Boolean>().error("未找到符合条件的订单"); return new Result<Boolean>().error("未找到符合条件的订单");
} }
try {
orderDetailService.addOrderDetailByOrder(order.getPkId());
} catch (Exception e) {
e.printStackTrace();
log.error("生成换电订单详情出错",e);
}
try { try {
log.info("开始处理换电请求, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid); log.info("开始处理换电请求, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid);
// 构建换电请求消息 // 构建换电请求消息
@ -407,7 +374,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
// 修改订单状态 // 修改订单状态
order.setStatus(OrderStatusEnums.FINISH.getCode()); order.setStatus(OrderStatusEnums.FINISH.getCode());
//交易编码 //交易编码
order.setTradeNo(trade.getOutTradeNo()); //order.setTradeNo(trade.getOutTradeNo());
order.setUpdateTime(new Date()); order.setUpdateTime(new Date());
orderDao.updateById(order); orderDao.updateById(order);
log.info("订单支付成功, 订单编号: {}", order.getOrderNo()); log.info("订单支付成功, 订单编号: {}", order.getOrderNo());
@ -422,19 +389,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
@Override @Override
public Result<String> companyNativePay(NativePayVO prePay) { public Result<String> companyNativePay(NativePayVO prePay) {
return wechatService.wechatNativePay(prePay);
List<Order> list = getBaseMapper().findBillList(prePay.getCcode(), prePay.getOrderTimeEnd());
if(Collections.isNotEmpty(list)){
prePay.setTotal(list.stream().collect(Collectors.summingDouble(d-> DataUtils.findDefaultValue(d.getOrderAmount(), DataUtils.DEFAULT_VALUE.intValue()))).intValue());
prePay.setTotal(1);
Result<String> result = wechatService.wechatNativePay(prePay);
if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){
JSONObject res = JSON.parseObject(result.getData());
settlementInProgress(list, res.getString("OutTradeNo"), PayTypeEnums.WECHAT.getCode());
}
return result;
}
return Result.getInstance().build(String.class).error("为找到订单信息");
} }
@Override @Override
@ -467,20 +422,21 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
@Override @Override
public Result<Integer> checkList(PageListSwapOrderRequest plsor) { public Result<Integer> checkList(PageListSwapOrderRequest plsor) {
Page<Order> page = new Page<Order>(plsor.getPageNo(), plsor.getPageSize()); Page<Order> page = new Page<Order>(plsor.getPageNo(), plsor.getPageSize());
// String strs = "1,2,3,4,5,6"; List<Integer> statusList = new ArrayList<>();
// if (StringUtils.isBlank(strs)) {//订单状态"已完成"之前的状态 String strs = "1,2,3,4,5,6";
// statusList = Arrays.asList(strs.split(",")).stream().map(Integer::valueOf).toList(); if (StringUtils.isBlank(strs)) {//订单状态"已完成"之前的状态
// } statusList = Arrays.asList(strs.split(",")).stream().map(Integer::valueOf).toList();
}
page = orderDao.selectPage(page, new QueryWrapper<Order>() page = orderDao.selectPage(page, new QueryWrapper<Order>()
.eq(StringUtils.isNotBlank(plsor.getOrderNo()), "order_no", plsor.getOrderNo()) .eq(StringUtils.isBlank(plsor.getOrderNo()), "order_no", plsor.getOrderNo())
.eq(StringUtils.isNotBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum()) .eq(StringUtils.isBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum())
.in("status", Collections.asList(1,2,3,4,5,6)) .in(!statusList.isEmpty(), "status", statusList)
.ge(plsor.getOrderTimeBegin() != null, "order_time", plsor.getOrderTimeBegin()) .ge(plsor.getOrderTimeBegin() != null, "order_time", plsor.getOrderTimeBegin())
.le(plsor.getOrderTimeEnd() != null, "order_time", plsor.getOrderTimeEnd()) .le(plsor.getOrderTimeEnd() != null, "order_time", plsor.getOrderTimeEnd())
.eq(StringUtils.isNotBlank(plsor.getStationCode()), "station_code", plsor.getStationCode()) .eq(StringUtils.isBlank(plsor.getStationCode()), "station_code", plsor.getStationCode())
.like(StringUtils.isNotBlank(plsor.getStationName()), "station_name", plsor.getStationName()) .like(StringUtils.isBlank(plsor.getStationName()), "station_name", plsor.getStationName())
.eq(StringUtils.isNotBlank(plsor.getUserId()), "pre_wechat_id", plsor.getUserId()) .eq(StringUtils.isBlank(plsor.getUserId()), "order_pre_uid", plsor.getUserId())
.eq(StringUtils.isNotBlank(plsor.getTradeNo()), "trade_no", plsor.getTradeNo()) .eq(StringUtils.isBlank(plsor.getTradeNo()), "trade_no", plsor.getTradeNo())
.ne("del_flag", 1) .ne("del_flag", 1)
.orderByDesc("pk_id")); .orderByDesc("pk_id"));
if (!page.getRecords().isEmpty()) { if (!page.getRecords().isEmpty()) {
@ -488,8 +444,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
} }
Page<OrderSwapBatteryPre> page1 = new Page<OrderSwapBatteryPre>(plsor.getPageNo(), plsor.getPageSize()); Page<OrderSwapBatteryPre> page1 = new Page<OrderSwapBatteryPre>(plsor.getPageNo(), plsor.getPageSize());
page1 = orderSwapBatteryPreDao.selectPage(page1, new QueryWrapper<OrderSwapBatteryPre>() page1 = orderSwapBatteryPreDao.selectPage(page1, new QueryWrapper<OrderSwapBatteryPre>()
.eq("status", "1") .eq(StringUtils.isBlank("1"), "status", "1")
.eq(StringUtils.isNotBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum()) .eq(StringUtils.isBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum())
.orderByDesc("pk_id")); .orderByDesc("pk_id"));
if (!page1.getRecords().isEmpty()) { if (!page1.getRecords().isEmpty()) {
return new Result<Integer>().error("该车辆有预约成功的订单,请处理后重试!"); return new Result<Integer>().error("该车辆有预约成功的订单,请处理后重试!");
@ -542,240 +498,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
public Result<Order> one(String orderNo) { public Result<Order> one(String orderNo) {
return new Result<Order>().success(getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo))); return new Result<Order>().success(getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo)));
} }
@Override
public Result<OrderDetailVo> getOneByOrderNo(String orderNo) {
OrderDetailVo orderDetailVo = new OrderDetailVo();
Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
BeanUtils.copyProperties(order, orderDetailVo);
orderDetailVo.setPerName(order.getOrderPreUname());
orderDetailVo.setAmount(order.getOrderAmount());
OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
if(ObjectUtils.isNotEmpty(orderDetail)){
BeanUtils.copyProperties(orderDetail, orderDetailVo);
}
return new Result<OrderDetailVo>().success(orderDetailVo);
}
@Override
public Result<List<OrderBillListVo>> billList(String companyCode, String orderTimeEnd) {
List<OrderBillListVo> resultList = Collections.emptyList();
List<Order> list = getBaseMapper().findBillList(companyCode, orderTimeEnd);
if(Collections.isNotEmpty(list)){
Map<String, List<Order>> dataMap = list.stream().collect(Collectors.groupingBy(d->d.getPlateNum()));
for(List<Order> mapList : dataMap.values()){
OrderBillListVo result = new OrderBillListVo();
result.setPlateNum(mapList.get(0).getPlateNum());
result.setOrderTotalAmount(mapList.stream().collect(Collectors.summingDouble(d-> DataUtils.findDefaultValue(d.getOrderAmount(), DataUtils.DEFAULT_VALUE.intValue()))));
result.setStatus(mapList.get(0).getStatus());
result.setOrderNum(mapList.size());
List<OrderBillListVo> childList = Collections.emptyList();
for(Order order : mapList){
OrderBillListVo resultChild = new OrderBillListVo();
BeanUtils.copyProperties(order, resultChild);
resultChild.setPreName(order.getOrderPreUname());
childList.add(resultChild);
}
result.setChildList(childList);
resultList.add(result);
}
}
return Result.getInstance().buildList(OrderBillListVo.class).success(resultList);
}
@Override
public void excelBillList(String companyCode, String orderTimeEnd) {
List<OrderBillListVo> resultList = Collections.emptyList();
List<Order> list = getBaseMapper().findBillList(companyCode, orderTimeEnd);
if(Collections.isNotEmpty(list)){
list = list.stream().sorted(Comparator.comparing(Order::getStationName)).collect(Collectors.toList());
for(Order order : list){
OrderBillListVo result = new OrderBillListVo();
BeanUtils.copyProperties(order, result);
result.setPreName(order.getOrderPreUname());
result.setOrderAmountExcel((result.getOrderAmount() == null || result.getOrderAmount() == 0) ? 0d : new BigDecimal(result.getOrderAmount()).divide(new BigDecimal(100)).doubleValue());
resultList.add(result);
}
}
ExcelUtil<OrderBillListVo> util = new ExcelUtil<OrderBillListVo>(OrderBillListVo.class);
util.exportExcel(SpringUtil.getResponse(), resultList,"电子账单");
settlementInProgress(list, null, PayTypeEnums.BUSINESS_TO_BUSINESS.getCode());
}
public void settlementInProgress(List<Order> list, String outTradeNo, Integer payType){
//执行完导出后. 所有的订单信息,全部更新为结算中
AuthUser user = RedisPermissionUtils.getUser();
TradeDetail trade = new TradeDetail();
trade.setOutTradeNo(StringUtils.isEmpty(outTradeNo) ? com.evotech.hd.common.core.utils.CommonUtil.payTradeNo(2) : outTradeNo);
trade.setTrader(user.getName());
trade.setTraderCode(user.getUid());
trade.setTradeType(TradeTypeEnums.PAYORDER.getCode());
trade.setOrderCount(1);
trade.setTradeAmount(list.stream().collect(Collectors.summingInt(d-> DataUtils.findDefaultValue(d.getOrderAmount(), DataUtils.DEFAULT_VALUE.intValue()))));
trade.setPayType(payType);
trade.setPayResult("paymentInProgress");
trade.setPayTime(new Date());
trade.setStatus("edit");
tradeService.add(trade);
// list.stream().forEach(data ->{
// data.setTradeNo(trade.getOutTradeNo());
// if(PayTypeEnums.BUSINESS_TO_BUSINESS.getCode() == payType){
// data.setStatus(OrderStatusEnums.SETTLEMENT_IN_PROGRESS.getCode());
// }
// });
// updateBatchById(list);
Order order = list.get(0);
order.setTradeNo(trade.getOutTradeNo());
if(PayTypeEnums.BUSINESS_TO_BUSINESS.getCode() == payType){
order.setStatus(OrderStatusEnums.SETTLEMENT_IN_PROGRESS.getCode());
}
updateById(order);
}
/**
* 订单最终状态的更新
* @param orderStatus
* @param statusData
*/
@Override
public void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) {
Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderStatus.getOrderNo()));
if(ObjectUtils.isEmpty(order)){
throw new RuntimeException("未找到订单信息");
}
//更新订单状态
order.setStatus(orderStatus.getStatus());
updateById(order);
//修改订单状态及金额
alterOrderStatus(order, statusData);
//记录电池信息 or 记录最后的换电步骤
alterSwapBatteryStep(orderStatus, statusData, order);
}
/**
* 修改订单状态方法
* @param order
* @param statusData
* @return
*/
private void alterOrderStatus(Order order, OrderStatusData statusData) {
if (order.getStatus() == 3 || order.getStatus() == 5) {
//如果订单是完成. 查询订单详情
OrderDetail orderDetail = orderDetailService.addOrderDetailByOrder(order.getPkId());
orderDetail.setFeeType(ParamServiceUtils.getSettlementType());
orderDetail.setOrderTimeEnd(new Date());
orderDetail.setServiceTimeEnd(new Date());
//copy属性
BeanUtils.copyProperties(statusData, orderDetail);
orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc()));
orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc()));
switch (orderDetail.getFeeType()){
case HDConstant.OrderConstant.FEE_TYPE_DL:
orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_ODO:
// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_SOC:
default:
orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue());
break;
}
//计算费用方式
log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() );
//计算费用信息
orderBasicFeeComponent.orderBasicFee(order, orderDetail);
//发送换电完成推送
wechatService.sendGzhSwapOrderSuccessMessage(order);
calculateCost(order);
}
}
/**
* 修改订单费用
* @param order
* @param statusData
* @return
*/
private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) {
if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){
//生成步骤
orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime());
// 修改车上电池编码
vehicleInfoDao.update(new UpdateWrapper<VehicleInfo>()
.set("bat_code", statusData.getRentBatCode())
.set("bat_soc", statusData.getRentBatSoc())
.eq("plate_num", order.getPlateNum()));
//出租电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.set("status", HDConstant.DcConstant.STATUS_CZ)
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION)
.set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR)
.set("point_code", order.getPlateNum())
.set("point_name", order.getPlateNum())
.set("dcc_no", 0)
.eq("bat_code", statusData.getRentBatCode()));
//归还电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.set("status", HDConstant.DcConstant.STATUS_CD)
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR)
.set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION)
.set("point_code", order.getPlateNum())
.set("point_name", order.getPlateNum())
.set("soc", statusData.getReturnBatSoc())
.set("dcc_no", statusData.getReturnBatNo())
.eq("bat_code", statusData.getReturnBatCode()));
// 添加2块电池的溯源记录
addBatteryTrace(orderStatus, statusData, order);
}
}
/**
* 添加电池轨迹记录
*
* @param orderStatus
* @param statusData
* @param osb
*/
private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) {
BatteryTrace bt1 = new BatteryTrace();
bt1.setOrderNo(orderStatus.getOrderNo());
bt1.setBatCode(statusData.getRentBatCode());
bt1.setSoc(statusData.getRentBatSoc());
bt1.setBeginTime(orderStatus.getStatusTime());
bt1.setPointType(2);
bt1.setPointCode(osb.getPlateNum());
bt1.setPointName(osb.getPlateNum());
bt1.setCreater("SYS");
BatteryTrace bt2 = new BatteryTrace();
BeanUtils.copyProperties(bt1, bt2);
bt2.setBatCode(statusData.getReturnBatCode());
bt2.setSoc(statusData.getRentBatSoc());
bt2.setPointType(1);
bt2.setPointCode(osb.getStationCode());
bt2.setPointName(osb.getStationName());
batteryStationDcService.addTrace(bt1);
batteryStationDcService.addTrace(bt2);
}
} }

View File

@ -9,13 +9,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.dao.BatteryStationDao; import com.evotech.hd.cloud.dao.BatteryStationDao;
import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao;
import com.evotech.hd.cloud.dao.VehicleInfoDao; import com.evotech.hd.cloud.dao.VehicleInfoDao;
import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
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.impl.event.MqttStrategyEventExchangeProcessor;
import com.evotech.hd.cloud.service.OrderSwapBatteryPreService; import com.evotech.hd.cloud.service.OrderSwapBatteryPreService;
import com.evotech.hd.cloud.utils.CloudTemplateMessageUtils; import com.evotech.hd.cloud.utils.CloudTemplateMessageUtils;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
@ -24,7 +17,6 @@ import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.cloud.BatteryStation; import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo; import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest; import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.wechat.WechatUser; import com.evotech.hd.common.core.entity.wechat.WechatUser;
@ -32,7 +24,6 @@ import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.redis.utils.RedisServiceUtils; import com.evotech.hd.common.redis.utils.RedisServiceUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -60,10 +51,7 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
private WechatUserDao wechatUserDao; private WechatUserDao wechatUserDao;
@Resource @Resource
private OrderDao orderDao; private OrderDao orderDao;
@Resource
private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
@Resource
MqttStrategyEventExchangeProcessor mqttStrategyEventExchangeProcessor;
@Override @Override
public Boolean addPreByPlateNum(String plateNum, String stationCode) { public Boolean addPreByPlateNum(String plateNum, String stationCode) {
@ -100,16 +88,11 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
if (vehicleInfo == null) { if (vehicleInfo == null) {
return new Result<Boolean>().error("未找到车辆信息", false); return new Result<Boolean>().error("未找到车辆信息", false);
} }
// 2. 检查预约人 // 2. 检查预约人
if (!wechatUserDao.exists(new LambdaQueryWrapper<WechatUser>().ne(WechatUser::getPhoneNumber, " ").isNotNull(WechatUser::getPhoneNumber).eq(WechatUser::getWuid, orderSwapBatteryPre.getUcode()))) { if (!wechatUserDao.exists(new LambdaQueryWrapper<WechatUser>().ne(WechatUser::getPhoneNumber, " ").isNotNull(WechatUser::getPhoneNumber).eq(WechatUser::getWuid, orderSwapBatteryPre.getUcode()))) {
return new Result<Boolean>().error("用户认证信息不全!", false); return new Result<Boolean>().error("用户认证信息不全!", false);
} }
//检查用户是否拥有当前车辆换电的权限
if (!vehicleWechatUserRelationDao.exists(new LambdaQueryWrapper<VehicleWechatUserRelation>().eq(VehicleWechatUserRelation::getPlateNum, orderSwapBatteryPre.getPlateNum()).eq(VehicleWechatUserRelation::getUcode, orderSwapBatteryPre.getUcode()))){
return new Result<Boolean>().error("当前车辆不在您的名下!", false);
}
//判断换电站是否运营 status 不等于 1 则证明换电站未运营 //判断换电站是否运营 status 不等于 1 则证明换电站未运营
if (batteryStationDao.exists(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, orderSwapBatteryPre.getStationCode()).ne(BatteryStation::getStatus, 1))) { if (batteryStationDao.exists(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, orderSwapBatteryPre.getStationCode()).ne(BatteryStation::getStatus, 1))) {
return new Result<Boolean>().error("该换电站未运营!", false); return new Result<Boolean>().error("该换电站未运营!", false);
@ -149,32 +132,11 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
RedisServiceUtils.set(redisKey, expireTime); RedisServiceUtils.set(redisKey, expireTime);
// 发送服务号消息没有消息队列先用接口吧 // 发送服务号消息没有消息队列先用接口吧
CloudTemplateMessageUtils.sendPreOrderMessage(orderSwapBatteryPre); CloudTemplateMessageUtils.sendPreOrderMessage(orderSwapBatteryPre);
//数据来源不是站端的时候, 同步下发到站控
if(!Integer.valueOf(3).equals(orderSwapBatteryPre.getSource())){
pushStationControl(orderSwapBatteryPre);
}
return new Result<Boolean>().success(true); return new Result<Boolean>().success(true);
} }
return new Result<Boolean>().error("添加预约换电订单出错!", false); return new Result<Boolean>().error("添加预约换电订单出错!", false);
} }
@Async
void pushStationControl(OrderSwapBatteryPre orderSwapBatteryPre){
MessageTopic topic = new MessageTopic();
topic.setStationCode(orderSwapBatteryPre.getStationCode());
MqttResponse<OrderSwapBatteryPre> response = new MqttResponse();
// 订单状态更新处理
response.setCode(MqttResponse.PUBLIC_SUCCESS);
response.setData(orderSwapBatteryPre);
MqttMessageHeader header = new MqttMessageHeader();
header.setTimeStamp(String.valueOf(System.currentTimeMillis()));
header.setIndex(String.valueOf(MqttMessageTypeEnum.EVENT.getId()));
mqttStrategyEventExchangeProcessor.sendAESMessage(topic , header, EventFunctionTypesEnum.FUN_PUSH_STATION_CONTRNL_DATA, response);
}
@Override @Override
public Result<Page<OrderSwapBatteryPre>> list(PageListSwapOrderPreRequest plsopr) { public Result<Page<OrderSwapBatteryPre>> list(PageListSwapOrderPreRequest plsopr) {
Page<OrderSwapBatteryPre> page = new Page<OrderSwapBatteryPre>(plsopr.getPageNo(), plsopr.getPageSize()); Page<OrderSwapBatteryPre> page = new Page<OrderSwapBatteryPre>(plsopr.getPageNo(), plsopr.getPageSize());
@ -195,7 +157,7 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
} }
@Override @Override
public Result<Integer> updateStatusById(Integer id, Integer status) { public Result<Integer> cancelPre(Integer id, Integer status) {
OrderSwapBatteryPre osbp = new OrderSwapBatteryPre(); OrderSwapBatteryPre osbp = new OrderSwapBatteryPre();
osbp.setPkId(id); osbp.setPkId(id);
osbp.setStatus(status != null? status : 3); osbp.setStatus(status != null? status : 3);

View File

@ -1,30 +1,23 @@
package com.evotech.hd.cloud.service.impl; package com.evotech.hd.cloud.service.impl;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.dao.TradeDetailDao; import com.evotech.hd.cloud.dao.TradeDetailDao;
import com.evotech.hd.cloud.entity.request.PageListTradeRequest; import com.evotech.hd.cloud.entity.request.PageListTradeRequest;
import com.evotech.hd.cloud.service.TaxPointService;
import com.evotech.hd.cloud.service.TradeService; import com.evotech.hd.cloud.service.TradeService;
import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService; import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService;
import com.evotech.hd.cloud.service.newthread.WechatPayNotifyHandleService; import com.evotech.hd.cloud.service.newthread.WechatPayNotifyHandleService;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.dao.cloud.OrderDao; import com.evotech.hd.common.core.dao.cloud.OrderDao;
import com.evotech.hd.common.core.entity.cloud.TradeDetail; import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Date; import java.util.Date;
@ -41,8 +34,6 @@ public class TradeServiceImpl extends ServiceImpl<TradeDetailDao, TradeDetail> i
@Resource @Resource
private GZHTemplateMessageService gzhTemplateMessageService; private GZHTemplateMessageService gzhTemplateMessageService;
@Resource @Resource
TaxPointService taxPointService;
@Resource
private OrderDao orderDao; private OrderDao orderDao;
@Override @Override
public Result<Integer> add(TradeDetail td) { public Result<Integer> add(TradeDetail td) {
@ -75,45 +66,6 @@ public class TradeServiceImpl extends ServiceImpl<TradeDetailDao, TradeDetail> i
return new Result<Integer>().error("更新交易失败!"); return new Result<Integer>().error("更新交易失败!");
} }
@Override
public Result<Integer> submit(TradeDetail td) {
td.setStatus("submit");
return update(td);
}
@Override
public Result<Integer> approve(Integer id, Integer type) {
TradeDetail td = new TradeDetail();
td.setStatus(type ==1 ? "finish" : "reject");
td.setPkId(id);
Result<Integer> result = update(td);
if(result.getData() != null && result.getData() ==1){
td = getById(id);
List<Order> orderList = orderDao.selectList(new LambdaQueryWrapper<Order>().eq(Order::getTradeNo, td.getOutTradeNo()));
if(Collections.isNotEmpty(orderList)){
orderList.stream().forEach(data ->{
data.setStatus(OrderStatusEnums.FINISH.getCode());
});
orderDao.updateById(orderList);
//税点信息记录
orderList.stream().forEach(order->{
try {
taxPointService.addTaxPoint(order.getPkId(), order.getOrderNo(), Double.valueOf(order.getOrderAmount()), order.getStationCode());
} catch (Exception e) {
log.error("生成税点信息异常,订单信息{}; 异常信息{}", JSON.toJSONString(order), e.getMessage());
}
});
}
}
return result;
}
@Override @Override
public Result<Page<TradeDetail> > list(PageListTradeRequest pltr) { public Result<Page<TradeDetail> > list(PageListTradeRequest pltr) {
Page<TradeDetail> page = new Page<TradeDetail>(pltr.getPageNo(), pltr.getPageSize()); Page<TradeDetail> page = new Page<TradeDetail>(pltr.getPageNo(), pltr.getPageSize());
@ -168,28 +120,7 @@ public class TradeServiceImpl extends ServiceImpl<TradeDetailDao, TradeDetail> i
Result<String> result = payNotifyHandleService.payNotifyBusinessHandle(tradeDetail); Result<String> result = payNotifyHandleService.payNotifyBusinessHandle(tradeDetail);
//只有当整体数据处理成功之后, 才保存交易记录, 防止出现异常,二次请求进来数据无法处理 //只有当整体数据处理成功之后, 才保存交易记录, 防止出现异常,二次请求进来数据无法处理
if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){ if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){
TradeDetail detail = tradeDetailDao.selectOne(new LambdaQueryWrapper<TradeDetail>().eq(TradeDetail::getOutTradeNo, tradeDetail.getOutTradeNo()).eq(TradeDetail::getDelFlag, HDConstant.DELETE_NO));
tradeDetail.setStatus("finish");
if(ObjectUtils.isEmpty(detail)){
add(tradeDetail); add(tradeDetail);
}else{
detail.setStatus("finish");
detail.setAppid(tradeDetail.getAppid());
detail.setBankType(tradeDetail.getBankType());
detail.setMchid(tradeDetail.getMchid());
detail.setTransactionId(tradeDetail.getTransactionId());
detail.setTradeAmount(tradeDetail.getTradeAmount());
detail.setWechatPayApiType(tradeDetail.getWechatPayApiType());
detail.setPayResult(tradeDetail.getPayResult());
detail.setPayTime(tradeDetail.getPayTime());
detail.setTradeMessage(tradeDetail.getTradeMessage());
detail.setPayWechatId(tradeDetail.getPayWechatId());
detail.setTrader(tradeDetail.getTrader());
detail.setTraderCode(tradeDetail.getTraderCode());
update(detail);
}
} }
return result; return result;
} catch (Exception e) { } catch (Exception e) {

View File

@ -92,7 +92,7 @@ public class VehicleServiceImpl extends ServiceImpl<VehicleInfoDao, VehicleInfo>
.eq(StringUtils.hasText(plvr.getPhone()), "phone", plvr.getPhone()) .eq(StringUtils.hasText(plvr.getPhone()), "phone", plvr.getPhone())
.eq(StringUtils.hasText(plvr.getCcode()), "ccode", plvr.getCcode()) .eq(StringUtils.hasText(plvr.getCcode()), "ccode", plvr.getCcode())
.ne("del_flag", 1) .ne("del_flag", 1)
.orderByDesc("ctime")); .orderByAsc("plate_num"));
if (page.getRecords().isEmpty()) { if (page.getRecords().isEmpty()) {
return new Result<Page<VehicleInfo>>().error(CodeMsg.DATABASE_RESULT_NULL); return new Result<Page<VehicleInfo>>().error(CodeMsg.DATABASE_RESULT_NULL);
} }

View File

@ -24,7 +24,6 @@ import com.evotech.hd.common.core.entity.cloud.vo.WalletAccountVO;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach; import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import com.evotech.hd.common.core.entity.wechat.WechatUser; import com.evotech.hd.common.core.entity.wechat.WechatUser;
import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.DataUtils;
import com.evotech.hd.common.core.utils.SnowflakeUtil; import com.evotech.hd.common.core.utils.SnowflakeUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -120,11 +119,8 @@ public class WalletAccountServiceImpl extends ServiceImpl<WalletAccountDao, Wall
wa1.setGiftAmount(wa.getGiftAmount()); wa1.setGiftAmount(wa.getGiftAmount());
// wa1.setTotalAmount(wa.getTotalAmount()); // wa1.setTotalAmount(wa.getTotalAmount());
wa1.setRechargeAmount(wa.getRechargeAmount()); wa1.setRechargeAmount(wa.getRechargeAmount());
int n = walletAccountDao.update(wa1, new UpdateWrapper<WalletAccount>() int n = walletAccountDao.update(wa1, new QueryWrapper<WalletAccount>()
.set(org.apache.commons.lang3.StringUtils.isNotEmpty(wa.getAccName()), "acc_name",wa.getAccName()) .eq("code", wa.getCode())
.set("gift_amount",wa.getGiftAmount())
.set("recharge_Amount",wa.getRechargeAmount())
.eq(org.apache.commons.lang3.StringUtils.isNotEmpty(wa.getCode()), "code", wa.getCode())
.eq("pk_id", wa.getPkId())); .eq("pk_id", wa.getPkId()));
if (n == 1) { if (n == 1) {
return new Result<Integer>().success(n); return new Result<Integer>().success(n);
@ -135,21 +131,10 @@ public class WalletAccountServiceImpl extends ServiceImpl<WalletAccountDao, Wall
@Override @Override
public Result<Page<WalletAccountVO>> list(PageListWalletRequest plwr) { public Result<Page<WalletAccountVO>> list(PageListWalletRequest plwr) {
if((org.apache.commons.lang3.StringUtils.isNotEmpty(plwr.getPhone()) || org.apache.commons.lang3.StringUtils.isNotEmpty(plwr.getAccName())) && org.apache.commons.lang3.StringUtils.isEmpty(plwr.getOwnerId())){
plwr.setOwnerId("-1");
WechatUser wechatUser = wechatUserDao.selectOne(new QueryWrapper<WechatUser>()
.eq(StringUtils.hasText(plwr.getPhone()), "phone_number", plwr.getPhone())
.or(StringUtils.hasText(plwr.getAccName()), i -> i.and(j -> j.eq("name", plwr.getAccName()))
.or(j -> j.eq("nick_name", plwr.getAccName()))));
if (wechatUser != null) {
plwr.setOwnerId(wechatUser.getWuid());
}
}
Page<WalletAccount> page = new Page<>(plwr.getPageNo(), plwr.getPageSize()); Page<WalletAccount> page = new Page<>(plwr.getPageNo(), plwr.getPageSize());
QueryWrapper<WalletAccount> queryWrapper = new QueryWrapper<WalletAccount>() QueryWrapper<WalletAccount> queryWrapper = new QueryWrapper<WalletAccount>()
.eq(StringUtils.hasText(plwr.getCode()), "code", plwr.getCode()) .eq(StringUtils.hasText(plwr.getCode()), "code", plwr.getCode())
//.like(StringUtils.hasText(plwr.getAccName()), "acc_name", plwr.getAccName()) .like(StringUtils.hasText(plwr.getAccName()), "acc_name", plwr.getAccName())
.eq(StringUtils.hasText(plwr.getStationCode()), "station_code", plwr.getStationCode()) .eq(StringUtils.hasText(plwr.getStationCode()), "station_code", plwr.getStationCode())
.eq(plwr.getOwnerType() != null, "owner_type", plwr.getOwnerType()) .eq(plwr.getOwnerType() != null, "owner_type", plwr.getOwnerType())
.eq(StringUtils.hasText(plwr.getOwnerId()), "owner_id", plwr.getOwnerId()) .eq(StringUtils.hasText(plwr.getOwnerId()), "owner_id", plwr.getOwnerId())
@ -165,7 +150,6 @@ public class WalletAccountServiceImpl extends ServiceImpl<WalletAccountDao, Wall
WalletAccountVO vo = new WalletAccountVO(); WalletAccountVO vo = new WalletAccountVO();
// 复制基本属性 // 复制基本属性
BeanUtil.copyProperties(account, vo); BeanUtil.copyProperties(account, vo);
vo.setTotalAmount(DataUtils.findDefaultValue(account.getGiftAmount(), DataUtils.DEFAULT_VALUE.intValue())+DataUtils.findDefaultValue(account.getRechargeAmount(), DataUtils.DEFAULT_VALUE.intValue()));
// 查询微信用户信息 // 查询微信用户信息
if (StringUtils.hasText(account.getOwnerId())) { if (StringUtils.hasText(account.getOwnerId())) {
WechatUser wechatUser = wechatUserDao.selectOne( WechatUser wechatUser = wechatUserDao.selectOne(

View File

@ -1,6 +1,5 @@
package com.evotech.hd.cloud.service.impl; package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -28,7 +27,7 @@ public class WechatUserServiceImpl implements WechatUserService {
private WechatUserDao wechatUserDao; private WechatUserDao wechatUserDao;
@Override @Override
public Result<Page<WechatUser>> pageList(PageListWechatUserRequest plwur) { public Result<Page<WechatUser>> list(PageListWechatUserRequest plwur) {
Page<WechatUser> page = new Page<WechatUser>(plwur.getPageNo(), plwur.getPageSize()); Page<WechatUser> page = new Page<WechatUser>(plwur.getPageNo(), plwur.getPageSize());
page = wechatUserDao.selectPage(page, new QueryWrapper<WechatUser>() page = wechatUserDao.selectPage(page, new QueryWrapper<WechatUser>()
@ -50,11 +49,6 @@ public class WechatUserServiceImpl implements WechatUserService {
return new Result<Page<WechatUser>>().success(page); return new Result<Page<WechatUser>>().success(page);
} }
@Override
public Result<List<WechatUser>> list(List<String> wuIds) {
return Result.getInstance().buildList(WechatUser.class).success(wechatUserDao.selectList(new LambdaQueryWrapper<WechatUser>().in(WechatUser::getWuid, wuIds)));
}
@Override @Override
public Result<Integer> alterPhone(String wuid, String phone, String name) { public Result<Integer> alterPhone(String wuid, String phone, String name) {
if (!(StringUtils.hasText(phone) || StringUtils.hasText(name))) { if (!(StringUtils.hasText(phone) || StringUtils.hasText(name))) {

View File

@ -13,6 +13,7 @@ import com.evotech.hd.cloud.service.WalletAccountService;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.dao.cloud.OrderDao; import com.evotech.hd.common.core.dao.cloud.OrderDao;
import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao; import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao;
import com.evotech.hd.common.core.entity.cloud.PreOrderRelationSwapOrder;
import com.evotech.hd.common.core.entity.cloud.TradeDetail; import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.cloud.WalletAccount; import com.evotech.hd.common.core.entity.cloud.WalletAccount;
import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail; import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail;
@ -86,7 +87,7 @@ public class WechatPayNotifyHandleService {
} }
if (WechatPayApiTypeEnums.NATIVE.getCode().equals(tradeDetail.getWechatPayApiType())) { if (WechatPayApiTypeEnums.NATIVE.getCode().equals(tradeDetail.getWechatPayApiType())) {
// native支付企业 // native支付企业
return nativePayHandle(tradeDetail); nativePayHandle(tradeDetail);
} }
return new Result<String>().error("未知的支付类型"); return new Result<String>().error("未知的支付类型");
} else if (tradeDetail.getTradeType() == 9) { } else if (tradeDetail.getTradeType() == 9) {
@ -189,40 +190,8 @@ public class WechatPayNotifyHandleService {
* 一般企业多条付款 * 一般企业多条付款
* @param tradeDetail * @param tradeDetail
*/ */
private Result<String> nativePayHandle(TradeDetail tradeDetail) { private void nativePayHandle(TradeDetail tradeDetail) {
try { List<PreOrderRelationSwapOrder> list = preOrderRelationSwapOrderDao.selectList(new QueryWrapper<PreOrderRelationSwapOrder>().eq("out_trade_no", tradeDetail.getOutTradeNo()));
if (TradeResultEnums.SUCCESS.getName().equals(tradeDetail.getPayResult())) {
List<Order> list = orderDao.selectList(new LambdaQueryWrapper<Order>().eq(Order::getTradeNo, tradeDetail.getOutTradeNo()).select(Order::getPkId));
List<Integer> orderIdList = list.stream().map(i -> i.getPkId()).toList();
orderDao.update(new UpdateWrapper<Order>().in("pk_id", orderIdList)
.set("status", OrderStatusEnums.FINISH.getCode()));
try {
list.stream().forEach(order -> {
//税点信息记录
try {
taxPointService.addTaxPoint(order.getPkId(), order.getOrderNo(), Double.valueOf(order.getOrderAmount()), order.getStationCode());
} catch (Exception e) {
log.error("生成税点信息异常,订单信息{}; 异常信息{}", JSON.toJSONString(order), e.getMessage());
}
});
} catch (Exception e) {
log.error("nativePay 生成税点信息异常,异常信息{}", e.getMessage());
}
return new Result<String>().success("ok");
} else {
return new Result<String>().error("微信支付结果未成功" + tradeDetail.getPayResult());
}
}catch (Exception e) {
log.error("===>>>支付订单存在问题:{}", JSONUtil.toJsonStr(tradeDetail));
return new Result<String>().error("支付订单存在问题"+ e.getMessage());
}
/*List<PreOrderRelationSwapOrder> list = preOrderRelationSwapOrderDao.selectList(new QueryWrapper<PreOrderRelationSwapOrder>().eq("out_trade_no", tradeDetail.getOutTradeNo()));
List<String> orderNoList = list.stream().map(i -> i.getOrderNo()).toList(); List<String> orderNoList = list.stream().map(i -> i.getOrderNo()).toList();
List<Order> orderList = orderDao.selectList(new QueryWrapper<Order>() List<Order> orderList = orderDao.selectList(new QueryWrapper<Order>()
.eq("status", 6).in("order_no", orderNoList)); .eq("status", 6).in("order_no", orderNoList));
@ -245,10 +214,7 @@ public class WechatPayNotifyHandleService {
}); });
} catch (Exception e) { } catch (Exception e) {
log.error("nativePay 生成税点信息异常,异常信息{}", e.getMessage()); log.error("nativePay 生成税点信息异常,异常信息{}", e.getMessage());
}*/ }
// 发送公众号消息发给企业绑定的微信号 // 发送公众号消息发给企业绑定的微信号
// templateMessageService.orderMessageSend(one, 3); // templateMessageService.orderMessageSend(one, 3);
} }

View File

@ -6,7 +6,6 @@ import com.evotech.hd.common.core.Dto.request.template.AlarmTemplateDto;
import com.evotech.hd.common.core.Dto.request.template.StopServerTemplateDto; import com.evotech.hd.common.core.Dto.request.template.StopServerTemplateDto;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.TradeDetail; import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.entity.order.Order;
import org.springdoc.core.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
@ -91,11 +90,4 @@ public interface WechatService {
@Async("taskExecutor") @Async("taskExecutor")
public void sendGzhToBeSettledOrderMessage(@RequestBody Order order); public void sendGzhToBeSettledOrderMessage(@RequestBody Order order);
/***
* 发送报警到公众号
* @return
*/
@PostMapping(value = "/send/gzh/alarm/message", consumes = {MediaType.APPLICATION_JSON_VALUE})
public com.evotech.hd.common.core.Dto.Result<String> sendGzhToBeSettledAlarmMessage(@RequestBody AlarmTemplate alarmTemplate);
} }

View File

@ -1,321 +0,0 @@
package com.evotech.hd.cloud.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 时间工具类
*
* @author evo
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils
{
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
* 获取当前Date型日期
*
* @return Date() 当前日期
*/
public static Date getNowDate()
{
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
*
* @return String
*/
public static String getDate()
{
return dateTimeNow(YYYY_MM_DD);
}
public static final String getTime()
{
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
public static final String dateTimeNow()
{
return dateTimeNow(YYYYMMDDHHMMSS);
}
public static final String dateTimeNow(final String format)
{
return parseDateToStr(format, new Date());
}
public static final String dateTime(final Date date)
{
return parseDateToStr(YYYY_MM_DD, date);
}
public static final String parseDateToStr(final String format, final Date date)
{
return new SimpleDateFormat(format).format(date);
}
public static final Date dateTime(final String format, final String ts)
{
try
{
return new SimpleDateFormat(format).parse(ts);
}
catch (ParseException e)
{
throw new RuntimeException(e);
}
}
/**
* 日期路径 即年// 如2018/08/08
*/
public static final String datePath()
{
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
/**
* 日期路径 即年// 如20180808
*/
public static final String dateTime()
{
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMdd");
}
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str)
{
if (str == null)
{
return null;
}
try
{
return parseDate(str.toString(), parsePatterns);
}
catch (ParseException e)
{
return null;
}
}
/**
* 获取服务器启动时间
*/
public static Date getServerStartDate()
{
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
/**
* 计算相差天数
*/
public static int differentDaysByMillisecond(Date date1, Date date2)
{
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/**
* 计算时间差
*
* @param endDate 最后时间
* @param startTime 开始时间
* @return 时间差/小时/分钟
*/
public static String timeDistance(Date endDate, Date startTime)
{
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
// long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - startTime.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
// long sec = diff % nd % nh % nm / ns;
return day + "" + hour + "小时" + min + "分钟";
}
/**
* 增加 LocalDateTime ==> Date
*/
public static Date toDate(LocalDateTime temporalAccessor)
{
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* 增加 LocalDate ==> Date
*/
public static Date toDate(LocalDate temporalAccessor)
{
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
public static Integer getBetweenYear(Date start, Date end, Integer offsetDay){
Calendar cal1 = Calendar.getInstance();
cal1.setTime(start);
Long days = new BigDecimal(getBetweenDays(start, end)).add(new BigDecimal(offsetDay)).longValue();
int yearsDiff = 0;
long remainingDays = days;
while (remainingDays >= 365) {
int year = cal1.get(Calendar.YEAR) + yearsDiff;
//int daysInYear = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 366 : 365;
int daysInYear = 365;
if (remainingDays >= daysInYear) {
remainingDays -= daysInYear;
yearsDiff++;
} else {
break;
}
}
return yearsDiff;
}
public static Integer getBetweenYearByDays(Date start, Date end){
return getBetweenYear(start, end, 0);
}
public static Integer getBetweenMonth(Date start, Date end){
Calendar currentDate = Calendar.getInstance();
currentDate.setTime(start);
// 将输入的Date转换为Calendar以便获取年月信息
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(end);
// 计算年份差和月份差
int yearsDiff = endCalendar.get(Calendar.YEAR) - currentDate.get(Calendar.YEAR);
int monthsDiff = endCalendar.get(Calendar.MONTH) - currentDate.get(Calendar.MONTH);
// 调整月份差考虑到年份差可能影响实际的月份数差异
monthsDiff += yearsDiff * 12;
return monthsDiff;
}
public static Date getMonthFirst(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
public static Date getMonthEnd(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -1);
return calendar.getTime();
}
public static Integer getYear(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.YEAR);
}
public static Integer getMonth(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.MONTH)+1;
}
public static Integer getMonthDays(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH,1);
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
public static Long getBetweenDays(Date start, Date end){
Calendar currentDate = Calendar.getInstance();
currentDate.setTime(start);
// 将输入的Date转换为Calendar以便获取年月信息
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(end);
return calculateDifferenceInDays(endCalendar, currentDate);
}
public static Long getBetweenMinutes(Date start, Date end){
Calendar currentDate = Calendar.getInstance();
currentDate.setTime(start);
// 将输入的Date转换为Calendar以便获取年月信息
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(end);
long diffInMillis = endCalendar.getTimeInMillis() - currentDate.getTimeInMillis();
return diffInMillis / (60 * 1000);
}
public static long calculateDifferenceInDays(Calendar date1, Calendar date2) {
long diffInMillies = Math.abs(date1.getTimeInMillis() - date2.getTimeInMillis());
return diffInMillies / (24 * 60 * 60 * 1000); // 将毫秒转换为天
}
public static List<String> getCurrentMonthAndDays(){
return getMonthAndDays(DateUtils.getNowDate());
}
public static List<String> getMonthAndDays(Date date){
List<String> dayList = new ArrayList<String>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
SimpleDateFormat sdfm = new SimpleDateFormat("yyyy-MM");
for(int p=1;p<=days;p++){
try{
String rq = sdfm.format(date)+"-";
if(p < 10){
rq += "0" + p;
}else {
rq += p;
}
dayList.add(rq);
}catch (Exception e){
e.printStackTrace();
}
}
return dayList;
}
}

Some files were not shown because too many files have changed in this diff Show More