Compare commits
No commits in common. "master" and "order_reconstruction" have entirely different histories.
master
...
order_reco
@ -9,20 +9,15 @@
|
||||
<module name="common-mybatis" />
|
||||
<module name="authorization-server" />
|
||||
<module name="resource-server" />
|
||||
<module name="common-permission" />
|
||||
<module name="gateway-server" />
|
||||
<module name="admin-server" />
|
||||
<module name="common-web" />
|
||||
<module name="common-mongodb" />
|
||||
<module name="wechat-server" />
|
||||
<module name="cloud-manage-server" />
|
||||
<module name="common-redis" />
|
||||
<module name="common-core" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
<bytecodeTargetLevel>
|
||||
<module name="common-websocket" target="17" />
|
||||
</bytecodeTargetLevel>
|
||||
</component>
|
||||
<component name="JavacSettings">
|
||||
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
|
||||
@ -30,12 +25,9 @@
|
||||
<module name="authorization-server" options="-parameters" />
|
||||
<module name="cloud-manage-server" options="-parameters" />
|
||||
<module name="common-core" options="-parameters" />
|
||||
<module name="common-mongodb" options="-parameters" />
|
||||
<module name="common-mybatis" options="-parameters" />
|
||||
<module name="common-permission" options="-parameters" />
|
||||
<module name="common-redis" options="-parameters" />
|
||||
<module name="common-web" options="-parameters" />
|
||||
<module name="common-websocket" options="-parameters" />
|
||||
<module name="gateway-server" options="-parameters" />
|
||||
<module name="resource-server" options="-parameters" />
|
||||
<module name="wechat-server" options="-parameters" />
|
||||
|
||||
@ -4,12 +4,9 @@
|
||||
<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$/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-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-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/resources" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/cloud-manage-server/src/main/java" charset="UTF-8" />
|
||||
|
||||
@ -7,11 +7,6 @@
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="ignoredFiles">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$/base-commons/common-websocket/pom.xml" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_14" project-jdk-name="17 (2)" project-jdk-type="JavaSDK" />
|
||||
</project>
|
||||
@ -28,10 +28,7 @@
|
||||
<groupId>org.hibernate.validator</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
@ -74,12 +71,6 @@
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.58</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
@ -22,8 +22,4 @@ public class ResultUtil {
|
||||
log.error("当前请求出现异常{}", result.getMsg());
|
||||
return null;
|
||||
}
|
||||
|
||||
public static <T> Boolean verifyCode(Result<T> result){
|
||||
return CodeMsg.SUCCESS.getCode().equals(result.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();;
|
||||
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -6,14 +6,12 @@ public interface HDConstant {
|
||||
* 全局删除标识-已删除
|
||||
*/
|
||||
final static Integer DELETE_YES = 1;
|
||||
|
||||
/***
|
||||
* 全局删除标识-未删除
|
||||
*/
|
||||
final static Integer DELETE_NO = 0;
|
||||
|
||||
final static String PUBLIC_KEY="public_key";
|
||||
final static String PRIVATE_KEY="private_key";
|
||||
|
||||
/***
|
||||
* 大华设备相关CONSTANT
|
||||
*/
|
||||
@ -314,8 +312,4 @@ public interface HDConstant {
|
||||
* 预约单失效前缀
|
||||
*/
|
||||
String preOrder="pre_order:";
|
||||
/***
|
||||
* 站控推送策略
|
||||
*/
|
||||
String STRATEGY_NAME = "站控推送";
|
||||
}
|
||||
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -16,6 +16,4 @@ import java.util.List;
|
||||
public interface BatteryStationCdStrategyDao extends BaseMapper<BatteryStationCdStrategy> {
|
||||
|
||||
List<BatteryStationCdStrategy> listCdStrategy(@Param("stationCode") String stationCode, @Param("status") Integer status);
|
||||
|
||||
BatteryStationCdStrategy getBatteryStationCdStrategyByName(@Param("stationCode") String stationCode, @Param("name") String name);
|
||||
}
|
||||
|
||||
@ -43,6 +43,4 @@ public interface OrderDao extends BaseMapper<Order> {
|
||||
Double homeFindOrderAmountData(@Param("date") Date date);
|
||||
|
||||
List<HomeOrderInfo> findOrderListByStatus(@Param("status") Integer status);
|
||||
|
||||
List<Order> findBillList(@Param("companyCode") String companyCode, @Param("orderTimeEnd")String orderTimeEnd);
|
||||
}
|
||||
|
||||
@ -1,32 +1,38 @@
|
||||
package com.evotech.hd.common.core.dao.cloud;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.evotech.hd.common.core.constant.HDConstant;
|
||||
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
|
||||
import com.evotech.hd.common.core.permission.DataScope;
|
||||
import com.evotech.hd.common.core.permission.DataScopes;
|
||||
|
||||
/**
|
||||
* @author zrb
|
||||
* @since 2024-11-22
|
||||
*/
|
||||
@DataScopes({
|
||||
@DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE),
|
||||
@DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE),
|
||||
})
|
||||
//@DataScopeOpenMethod(openMethod = true, methodName = {"homeFindHalfYearAmountData"})
|
||||
public interface OrderSwapBatteryDao extends BaseMapper<OrderSwapBattery> {
|
||||
|
||||
//package com.evotech.hd.common.core.dao.cloud;
|
||||
//
|
||||
//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
//import com.evotech.hd.common.core.Dto.request.HomeRequestDto;
|
||||
//import com.evotech.hd.common.core.Dto.result.home.*;
|
||||
//import com.evotech.hd.common.core.constant.HDConstant;
|
||||
//import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
|
||||
//import com.evotech.hd.common.core.permission.DataScope;
|
||||
//import com.evotech.hd.common.core.permission.DataScopes;
|
||||
//import org.apache.ibatis.annotations.Param;
|
||||
//
|
||||
//import java.util.Date;
|
||||
//import java.util.List;
|
||||
//
|
||||
///**
|
||||
// * @author zrb
|
||||
// * @since 2024-11-22
|
||||
// */
|
||||
//@DataScopes({
|
||||
// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE),
|
||||
// @DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE),
|
||||
//})
|
||||
////@DataScopeOpenMethod(openMethod = true, methodName = {"homeFindHalfYearAmountData"})
|
||||
//public interface OrderSwapBatteryDao extends BaseMapper<OrderSwapBattery> {
|
||||
//
|
||||
//
|
||||
// List<HomeOrderSwapBatteryProportionDto> homeFindProportionData(@Param("params") HomeRequestDto params);
|
||||
//
|
||||
// List<HomeOrderSwapBatteryAmountDto> homeFindAmountData(@Param("params") HomeRequestDto params);
|
||||
//
|
||||
// List<HomeOrderSwapBatteryHalfYearDto> homeFindHalfYearOrderData(@Param("params") HomeRequestDto params);
|
||||
|
||||
// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, tableAlias = "osb", permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE)
|
||||
//
|
||||
//// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, tableAlias = "osb", permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE)
|
||||
// List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearAmountData(@Param("params") HomeRequestDto params);
|
||||
//因为站端不需要显示金额, 所有重新写一个
|
||||
// //因为站端不需要显示金额, 所有重新写一个
|
||||
// List<HomeOrderSwapBatteryHalfYearAmountDto> homeFindHalfYearStationAmountData(@Param("params") HomeRequestDto params);
|
||||
//
|
||||
// Long homeFindOrderCountData(@Param("date") Date date);
|
||||
@ -34,4 +40,4 @@ public interface OrderSwapBatteryDao extends BaseMapper<OrderSwapBattery> {
|
||||
// Double homeFindOrderAmountData(@Param("date") Date date);
|
||||
//
|
||||
// List<HomeOrderInfo> findOrderListByStatus(@Param("status") Integer status);
|
||||
}
|
||||
//}
|
||||
|
||||
@ -37,10 +37,4 @@ public class BaseEntity extends IdEntity {
|
||||
@TableField(fill = FieldFill.UPDATE)
|
||||
private Date uptime;
|
||||
|
||||
public BaseEntity() {
|
||||
}
|
||||
|
||||
public BaseEntity(Integer pkId) {
|
||||
super(pkId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -36,11 +36,4 @@ public class IdEntity implements Serializable {
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
@TableField(fill = FieldFill.INSERT)
|
||||
private Date ctime;
|
||||
|
||||
public IdEntity() {
|
||||
}
|
||||
|
||||
public IdEntity(Integer pkId) {
|
||||
this.pkId = pkId;
|
||||
}
|
||||
}
|
||||
|
||||
@ -57,10 +57,6 @@ public class BatteryStation extends BaseEntity implements Serializable {
|
||||
@Schema(description = "地址-区县")
|
||||
private String addressArea;
|
||||
|
||||
@Schema(description = "区划编码", requiredMode = RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "区划编码不能为空")
|
||||
private String divisionNo;
|
||||
|
||||
@Schema(description = "注册日期")
|
||||
private String registerDate;
|
||||
|
||||
|
||||
@ -1,16 +1,22 @@
|
||||
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.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.RequiredMode;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author zrb
|
||||
* @since 2025-02-10
|
||||
@ -44,18 +50,4 @@ public class BatteryStationCdStrategyDetail extends BaseEntity implements Serial
|
||||
|
||||
@Schema(description = "充电功率")
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -70,7 +70,7 @@ public class BatteryStationDc extends BaseEntity implements Serializable {
|
||||
private Integer soc;
|
||||
|
||||
@Schema(description = "电池仓位号")
|
||||
private String dccNo;
|
||||
private Integer dccNo;
|
||||
|
||||
@Schema(description = "删除标志:1-已删除,0-未删除", hidden = true)
|
||||
private Integer delFlag;
|
||||
|
||||
@ -1,162 +1,162 @@
|
||||
package com.evotech.hd.common.core.entity.cloud;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.evotech.hd.common.core.entity.BaseEntity;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author zrb
|
||||
* @since 2024-11-22
|
||||
*/
|
||||
@Data
|
||||
@TableName("hd_cloud_manage.yt_t_order_swap_battery")
|
||||
@Schema(name = "换电订单信息表")
|
||||
public class OrderSwapBattery extends BaseEntity implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "预约订单ID")
|
||||
private Integer orderPreId;
|
||||
|
||||
@Schema(description = "预约用户")
|
||||
private String orderPreUid;
|
||||
|
||||
@Schema(description = "预约用户名称")
|
||||
private String orderPreUname;
|
||||
|
||||
@Schema(description = "预约用户手机")
|
||||
private String orderPrePhone;
|
||||
|
||||
@Schema(description = "类型:1-换电,2-充电", requiredMode = RequiredMode.REQUIRED)
|
||||
@NotNull(message = "订单类型不能为空")
|
||||
private Integer orderType;
|
||||
|
||||
@Schema(description = "订单编码", hidden = true)
|
||||
private String orderNo;
|
||||
|
||||
@Schema(description = "车牌号", requiredMode = RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "车牌号不能为空")
|
||||
private String plateNum;
|
||||
|
||||
@Schema(description = "订单时间", example = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
private Date orderTime;
|
||||
|
||||
@Schema(description = "换电站编码", requiredMode = RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "换电站编码不能为空")
|
||||
private String stationCode;
|
||||
|
||||
@Schema(description = "换电站名称", requiredMode = RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "换电站名称不能为空")
|
||||
private String stationName;
|
||||
|
||||
@Schema(description = "金额账号")
|
||||
private String accountCode;
|
||||
|
||||
@Schema(description = "订单金额")
|
||||
private Integer amount;
|
||||
|
||||
@Schema(description = "订单状态:1-已创建,2-换电中,3-换电完成,4-充电中,5-充电完成,6-待结算,7-已完成,9-已取消, -1-退款")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "计算费用方式:1-ODO,2-SOC,3-按电量")
|
||||
private Integer feeType;
|
||||
|
||||
@Schema(description = "基础费用")
|
||||
private BigDecimal basicFee;
|
||||
|
||||
@Schema(description = "服务开始时间")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
private Date serviceTimeBegin;
|
||||
|
||||
@Schema(description = "服务结束时间")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
private Date serviceTimeEnd;
|
||||
|
||||
@Schema(description = "服务费")
|
||||
private BigDecimal serviceFee;
|
||||
|
||||
@Schema(description = "费用标准")
|
||||
private String feeStandardJson;
|
||||
@Schema(description = "费用标准详情")
|
||||
@TableField(exist = false)
|
||||
private BatteryStationHdFeeStandard feeStandardDetail;
|
||||
|
||||
@Schema(description = "上次租赁电池时车辆里程")
|
||||
private BigDecimal lastRentBatCarOdo;
|
||||
|
||||
@Schema(description = "归还电池时车辆里程")
|
||||
private BigDecimal nowReturnBatCarOdo;
|
||||
|
||||
@Schema(description = "按ODO换电费")
|
||||
private BigDecimal odoAmount;
|
||||
|
||||
@Schema(description = "充电开始时间")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
private Date chargeTimeBegin;
|
||||
|
||||
@Schema(description = "充电结束时间")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
private Date chargeTimeEnd;
|
||||
|
||||
@Schema(description = "总充电量")
|
||||
private BigDecimal electAmount;
|
||||
|
||||
@Schema(description = "租借电池包仓位")
|
||||
private Integer rentBatNo;
|
||||
|
||||
@Schema(description = "租用电池包编码")
|
||||
private String rentBatCode;
|
||||
|
||||
@Schema(description = "租用电池包SOC")
|
||||
private Integer rentBatSoc;
|
||||
|
||||
@Schema(description = "归还电池包编码")
|
||||
private String returnBatCode;
|
||||
|
||||
@Schema(description = "归还电池包仓位")
|
||||
private Integer returnBatNo;
|
||||
|
||||
@Schema(description = "归还电池包SOC")
|
||||
private Integer returnBatSoc;
|
||||
|
||||
@Schema(description = "归还电池租出时soc")
|
||||
private Integer returnBatRentSoc;
|
||||
|
||||
@Schema(description = "归还电池租出的换电站编码")
|
||||
private String returnBatRentStationCode;
|
||||
|
||||
@Schema(description = "归还电池租出的换电站")
|
||||
private String returnBatRentStationName;
|
||||
|
||||
@Schema(description = "换电模式:1-全自动,2-半自动,3-人工干预 ")
|
||||
private Integer changeMode;
|
||||
|
||||
@Schema(description = "换电车道 1-A 车道;2-B 车道")
|
||||
private Integer changeLane;
|
||||
|
||||
@Schema(description = "删除状态:1-已删除,0-未删除", hidden = true)
|
||||
private Integer delFlag;
|
||||
|
||||
@Schema(description = "交易编码", hidden = true)
|
||||
private String tradeNo;
|
||||
|
||||
@Schema(description = "备注信息")
|
||||
private String remark;
|
||||
}
|
||||
//package com.evotech.hd.common.core.entity.cloud;
|
||||
//
|
||||
//import com.baomidou.mybatisplus.annotation.TableField;
|
||||
//import com.baomidou.mybatisplus.annotation.TableName;
|
||||
//import com.evotech.hd.common.core.entity.BaseEntity;
|
||||
//import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
//import io.swagger.v3.oas.annotations.media.Schema;
|
||||
//import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
|
||||
//import jakarta.validation.constraints.NotBlank;
|
||||
//import jakarta.validation.constraints.NotNull;
|
||||
//import lombok.Data;
|
||||
//import org.springframework.format.annotation.DateTimeFormat;
|
||||
//
|
||||
//import java.io.Serializable;
|
||||
//import java.math.BigDecimal;
|
||||
//import java.util.Date;
|
||||
//
|
||||
///**
|
||||
// * @author zrb
|
||||
// * @since 2024-11-22
|
||||
// */
|
||||
//@Data
|
||||
//@TableName("hd_cloud_manage.yt_t_order_swap_battery")
|
||||
//@Schema(name = "换电订单信息表")
|
||||
//public class OrderSwapBattery extends BaseEntity implements Serializable {
|
||||
//
|
||||
// private static final long serialVersionUID = 1L;
|
||||
//
|
||||
// @Schema(description = "预约订单ID")
|
||||
// private Integer orderPreId;
|
||||
//
|
||||
// @Schema(description = "预约用户")
|
||||
// private String orderPreUid;
|
||||
//
|
||||
// @Schema(description = "预约用户名称")
|
||||
// private String orderPreUname;
|
||||
//
|
||||
// @Schema(description = "预约用户手机")
|
||||
// private String orderPrePhone;
|
||||
//
|
||||
// @Schema(description = "类型:1-换电,2-充电", requiredMode = RequiredMode.REQUIRED)
|
||||
// @NotNull(message = "订单类型不能为空")
|
||||
// private Integer orderType;
|
||||
//
|
||||
// @Schema(description = "订单编码", hidden = true)
|
||||
// private String orderNo;
|
||||
//
|
||||
// @Schema(description = "车牌号", requiredMode = RequiredMode.REQUIRED)
|
||||
// @NotBlank(message = "车牌号不能为空")
|
||||
// private String plateNum;
|
||||
//
|
||||
// @Schema(description = "订单时间", example = "yyyy-MM-dd HH:mm:ss")
|
||||
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
// private Date orderTime;
|
||||
//
|
||||
// @Schema(description = "换电站编码", requiredMode = RequiredMode.REQUIRED)
|
||||
// @NotBlank(message = "换电站编码不能为空")
|
||||
// private String stationCode;
|
||||
//
|
||||
// @Schema(description = "换电站名称", requiredMode = RequiredMode.REQUIRED)
|
||||
// @NotBlank(message = "换电站名称不能为空")
|
||||
// private String stationName;
|
||||
//
|
||||
// @Schema(description = "金额账号")
|
||||
// private String accountCode;
|
||||
//
|
||||
// @Schema(description = "订单金额")
|
||||
// private Integer amount;
|
||||
//
|
||||
// @Schema(description = "订单状态:1-已创建,2-换电中,3-换电完成,4-充电中,5-充电完成,6-待结算,7-已完成,9-已取消, -1-退款")
|
||||
// private Integer status;
|
||||
//
|
||||
// @Schema(description = "计算费用方式:1-ODO,2-SOC,3-按电量")
|
||||
// private Integer feeType;
|
||||
//
|
||||
// @Schema(description = "基础费用")
|
||||
// private BigDecimal basicFee;
|
||||
//
|
||||
// @Schema(description = "服务开始时间")
|
||||
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
// private Date serviceTimeBegin;
|
||||
//
|
||||
// @Schema(description = "服务结束时间")
|
||||
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
// private Date serviceTimeEnd;
|
||||
//
|
||||
// @Schema(description = "服务费")
|
||||
// private BigDecimal serviceFee;
|
||||
//
|
||||
// @Schema(description = "费用标准")
|
||||
// private String feeStandardJson;
|
||||
// @Schema(description = "费用标准详情")
|
||||
// @TableField(exist = false)
|
||||
// private BatteryStationHdFeeStandard feeStandardDetail;
|
||||
//
|
||||
// @Schema(description = "上次租赁电池时车辆里程")
|
||||
// private BigDecimal lastRentBatCarOdo;
|
||||
//
|
||||
// @Schema(description = "归还电池时车辆里程")
|
||||
// private BigDecimal nowReturnBatCarOdo;
|
||||
//
|
||||
// @Schema(description = "按ODO换电费")
|
||||
// private BigDecimal odoAmount;
|
||||
//
|
||||
// @Schema(description = "充电开始时间")
|
||||
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
// private Date chargeTimeBegin;
|
||||
//
|
||||
// @Schema(description = "充电结束时间")
|
||||
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
// private Date chargeTimeEnd;
|
||||
//
|
||||
// @Schema(description = "总充电量")
|
||||
// private BigDecimal electAmount;
|
||||
//
|
||||
// @Schema(description = "租借电池包仓位")
|
||||
// private Integer rentBatNo;
|
||||
//
|
||||
// @Schema(description = "租用电池包编码")
|
||||
// private String rentBatCode;
|
||||
//
|
||||
// @Schema(description = "租用电池包SOC")
|
||||
// private Integer rentBatSoc;
|
||||
//
|
||||
// @Schema(description = "归还电池包编码")
|
||||
// private String returnBatCode;
|
||||
//
|
||||
// @Schema(description = "归还电池包仓位")
|
||||
// private Integer returnBatNo;
|
||||
//
|
||||
// @Schema(description = "归还电池包SOC")
|
||||
// private Integer returnBatSoc;
|
||||
//
|
||||
// @Schema(description = "归还电池租出时soc")
|
||||
// private Integer returnBatRentSoc;
|
||||
//
|
||||
// @Schema(description = "归还电池租出的换电站编码")
|
||||
// private String returnBatRentStationCode;
|
||||
//
|
||||
// @Schema(description = "归还电池租出的换电站")
|
||||
// private String returnBatRentStationName;
|
||||
//
|
||||
// @Schema(description = "换电模式:1-全自动,2-半自动,3-人工干预 ")
|
||||
// private Integer changeMode;
|
||||
//
|
||||
// @Schema(description = "换电车道 1-A 车道;2-B 车道")
|
||||
// private Integer changeLane;
|
||||
//
|
||||
// @Schema(description = "删除状态:1-已删除,0-未删除", hidden = true)
|
||||
// private Integer delFlag;
|
||||
//
|
||||
// @Schema(description = "交易编码", hidden = true)
|
||||
// private String tradeNo;
|
||||
//
|
||||
// @Schema(description = "备注信息")
|
||||
// private String remark;
|
||||
//}
|
||||
|
||||
@ -1,15 +1,19 @@
|
||||
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.evotech.hd.common.core.entity.BaseEntity;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author zrb
|
||||
* @since 2024-12-11
|
||||
@ -31,7 +35,6 @@ public class OrderSwapBatteryStep extends BaseEntity implements Serializable {
|
||||
private String stepName;
|
||||
|
||||
@Schema(description = "步骤时间")
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||
private Date stepTime;
|
||||
}
|
||||
|
||||
@ -24,9 +24,6 @@ public class TradeDetail extends BaseEntity implements Serializable {
|
||||
@Schema(description = "换电站编码")
|
||||
private String stationCode;
|
||||
|
||||
@Schema(description = "交易人微信Id")
|
||||
private String plateCompanyCode;
|
||||
|
||||
@Schema(description = "交易人name")
|
||||
private String trader;
|
||||
|
||||
@ -39,7 +36,7 @@ public class TradeDetail extends BaseEntity implements Serializable {
|
||||
@Schema(description = "交易类型:1-充值,2-订单消费,3-退款, 9-提现")
|
||||
private Integer tradeType;
|
||||
|
||||
@Schema(description = "支付方式:1-账户余额,2-微信,3-支付宝,4-网银,5 -充电补偿, 6-公对公转账")
|
||||
@Schema(description = "支付方式:1-账户余额,2-微信,3-支付宝,4-网银,5 -充电补偿")
|
||||
private Integer payType;
|
||||
@Schema(description = "微信支付API类型")
|
||||
private String wechatPayApiType;
|
||||
@ -71,7 +68,7 @@ public class TradeDetail extends BaseEntity implements Serializable {
|
||||
@Schema(description = "微信支付订单号")
|
||||
private String transactionId;
|
||||
|
||||
@Schema(description = "支付结果,暂用微信结果的枚举类型, 新增 paymentInProgress 结算中类型")
|
||||
@Schema(description = "支付结果,暂用微信结果的枚举类型")
|
||||
private String payResult;
|
||||
|
||||
@Schema(description = "付款人编码,对于个人账户,交易发起人和付款人一般是同一人。公司账户交易发起人是公司,付款人可能是 微信账户")
|
||||
@ -97,8 +94,8 @@ public class TradeDetail extends BaseEntity implements Serializable {
|
||||
@Schema(description = "订单总描述")
|
||||
private String description;
|
||||
|
||||
@Schema(description = "状态: edit-编辑中, submit-提交. finish-完成, reject-打回")
|
||||
private String status;
|
||||
|
||||
|
||||
|
||||
|
||||
// @Schema(description = "在微信等支付网关创建支付订单时失败,返回的失败原因")
|
||||
|
||||
@ -28,7 +28,4 @@ public class PageListWalletRequest extends BasePageRequest {
|
||||
@Schema(description = "引入站点")
|
||||
private String stationCode;
|
||||
|
||||
@Schema(description = "客户电话")
|
||||
private String phone;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -56,8 +56,4 @@ public class BaseOrder extends IdEntity {
|
||||
* 支付的回调信息
|
||||
*/
|
||||
private String notifyInfo;
|
||||
/***
|
||||
* 交易编码
|
||||
*/
|
||||
private String tradeNo;
|
||||
}
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
package com.evotech.hd.common.core.entity.order;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
@ -75,6 +74,4 @@ public class Order extends BaseOrder{
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date updateTime;
|
||||
@TableField(exist = false)
|
||||
private OrderDetail orderDetail;
|
||||
}
|
||||
|
||||
@ -16,8 +16,6 @@ public enum OrderStatusEnums implements BaseEnum<Integer, String> {
|
||||
|
||||
FINISH(7, "已完成"),
|
||||
|
||||
SETTLEMENT_IN_PROGRESS(8, "结算中"),
|
||||
|
||||
CANCLE(9, "已取消"),
|
||||
|
||||
REFUND(-1, "订单退款"),
|
||||
@ -32,8 +30,6 @@ public enum OrderStatusEnums implements BaseEnum<Integer, String> {
|
||||
|
||||
String name;
|
||||
|
||||
|
||||
|
||||
public Integer getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
@ -9,9 +9,6 @@ public enum PayTypeEnums {
|
||||
ALIPAY(3, "支付宝"),
|
||||
|
||||
BANK(4, "网银"),
|
||||
CHARGING_COMPENSATION(5, "充电补偿"),
|
||||
|
||||
BUSINESS_TO_BUSINESS(6, "公对公"),
|
||||
|
||||
OTHER(9, "其他");
|
||||
|
||||
|
||||
@ -18,13 +18,13 @@ public enum SwapBatteryStepEnum implements BaseEnum<Integer, String>{
|
||||
|
||||
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, "完成"),
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -26,8 +26,12 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
|
||||
public void insertFill(MetaObject metaObject) {
|
||||
try {
|
||||
AuthUser user = RedisPermissionUtils.getUser();
|
||||
if(BeanUtil.isNotEmpty(metaObject) && BeanUtil.isNotEmpty(user)){
|
||||
mySetFieldValByName("creater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
|
||||
if(BeanUtil.isEmpty(user)){
|
||||
log.info("当前操作位登录, 无需执行");
|
||||
return;
|
||||
}
|
||||
if(BeanUtil.isNotEmpty(metaObject)){
|
||||
mySetFieldValByName("creater",user.getUid(),metaObject);
|
||||
mySetFieldValByName("ctime",new Date(),metaObject);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@ -47,9 +51,13 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
|
||||
@Override
|
||||
public void updateFill(MetaObject metaObject) {
|
||||
try {
|
||||
AuthUser user = RedisPermissionUtils.getUser();
|
||||
if(BeanUtil.isNotEmpty(metaObject) && BeanUtil.isNotEmpty(user)){
|
||||
mySetFieldValByName("updater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
|
||||
AuthUser user = RedisPermissionUtils.getUser();
|
||||
if(BeanUtil.isEmpty(user)){
|
||||
log.info("当前操作未登录, 无需执行");
|
||||
return;
|
||||
}
|
||||
if(BeanUtil.isNotEmpty(metaObject)){
|
||||
mySetFieldValByName("updater",user.getUid(),metaObject);
|
||||
mySetFieldValByName("uptime",new Date(),metaObject);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
||||
@ -3,15 +3,13 @@ package com.evotech.hd.cloud;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
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.mongo.MongoAutoConfiguration;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
|
||||
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
|
||||
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
|
||||
@EnableDiscoveryClient
|
||||
@ComponentScan("com.evotech.hd.**")
|
||||
@MapperScan({"com.evotech.hd.cloud.dao.**", "com.evotech.hd.common.core.dao.**"})
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -28,7 +28,7 @@ public class WechatUserController {
|
||||
@Operation(summary = "查询")
|
||||
@GetMapping("/list")
|
||||
public Result<Page<WechatUser>> list(@ParameterObject PageListWechatUserRequest plwur) {
|
||||
return wechatUserService.pageList(plwur);
|
||||
return wechatUserService.list(plwur);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -55,7 +55,7 @@ public class OrderPerController {
|
||||
@PostMapping("/cancel")
|
||||
@ApiOperationSupport(order = 2)
|
||||
public Result<Integer> cancelPre(@NotNull Integer id) {
|
||||
return orderSwapBatteryPreService.updateStatusById(id, 3);
|
||||
return orderSwapBatteryPreService.cancelPre(id, 3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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.service.OrderService;
|
||||
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.entity.cloud.OrderSwapBatteryStep;
|
||||
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
|
||||
@ -40,14 +38,6 @@ public class OrderSwapBatteryController {
|
||||
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 = "查询换电步骤")
|
||||
@GetMapping("/step/list")
|
||||
@ApiOperationSupport(order = 9)
|
||||
@ -55,7 +45,12 @@ public class OrderSwapBatteryController {
|
||||
return orderService.listStep(orderNo);
|
||||
}
|
||||
|
||||
|
||||
@Operation(summary = "个人账户余额支付")
|
||||
@PostMapping({"/one"})
|
||||
@ApiOperationSupport(order = 11)
|
||||
public Result<Order> one(@RequestParam String orderNo) {
|
||||
return orderService.one(orderNo);
|
||||
}
|
||||
|
||||
@Operation(summary = "个人账户余额支付")
|
||||
@PostMapping({"/wallet/pay"})
|
||||
@ -64,6 +59,10 @@ public class OrderSwapBatteryController {
|
||||
return orderService.walletPay(orderNo, wuid, uname);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Operation(summary = "查询公司订单")
|
||||
@GetMapping("/listcompanyorder")
|
||||
@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 = "扫码支付订单查询状态")
|
||||
@GetMapping("/paystatus/query")
|
||||
@ -125,35 +133,4 @@ public class OrderSwapBatteryController {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -51,20 +51,6 @@ public class TradeController {
|
||||
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 = "查询")
|
||||
@GetMapping("/list")
|
||||
@ApiOperationSupport(order = 4)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
||||
}
|
||||
@ -1,5 +1,8 @@
|
||||
package com.evotech.hd.cloud.entity.vo;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
|
||||
@ -9,9 +12,6 @@ import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Schema(name = "Native下单参数")
|
||||
public class NativePayVO {
|
||||
@ -21,7 +21,6 @@ public class NativePayVO {
|
||||
|
||||
@Schema(description = "公司编码")
|
||||
private String ccode;
|
||||
private String companyCode;
|
||||
|
||||
@Schema(description = "订单总描述", requiredMode = RequiredMode.REQUIRED)
|
||||
@NotBlank
|
||||
@ -60,7 +59,5 @@ public class NativePayVO {
|
||||
|
||||
@Schema(description = "用户设备型号")
|
||||
private String deviceId;
|
||||
@Schema(description = "订单结束时间")
|
||||
String orderTimeEnd;
|
||||
|
||||
}
|
||||
|
||||
@ -7,8 +7,7 @@ public enum EventFunctionTypesEnum {
|
||||
FUN_CHARGE_RECORD("chargeRecord", "chargeRecordConf", "充电事件记录"),
|
||||
FUN_SWAP_RECORD("swapRecord", "swapRecordConf", "换电事件记录"),
|
||||
FUN_WARN_RECORD("faultRecord", "faultRecordConf", "故障告警事件记录"),
|
||||
FUN_ORDEREVENT("swapComplete", "swapCompleteConfirm", " 站端换电完成事件"),
|
||||
FUN_PUSH_STATION_CONTRNL_DATA("", "pushReservation", " 推送站端事件");
|
||||
FUN_ORDEREVENT("swapComplete", "swapCompleteConfirm", " 站端换电完成事件");
|
||||
String function;
|
||||
String reFunction;
|
||||
|
||||
|
||||
@ -15,7 +15,6 @@ public enum StateFunctionTypesEnum {
|
||||
FUN_CHARGING_DATA("chargingData", "", "充电过程实时信息"),
|
||||
FUN_BAT_DATA("batData", "", "电池实时信息"),
|
||||
FUN_STATION_STATE("stationState", "", "站级状态信息"),
|
||||
FUN_CHARGING_STRATEGY("chargingStrategy", "", "充电策略信息"),
|
||||
;
|
||||
|
||||
|
||||
|
||||
@ -19,14 +19,6 @@ public class MessageTopic implements Serializable {
|
||||
|
||||
private String messageType;
|
||||
|
||||
public MessageTopic() {
|
||||
}
|
||||
|
||||
public MessageTopic( String stationCode, String messageType) {
|
||||
this.stationCode = stationCode;
|
||||
this.messageType = messageType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return businessType + "/" + stationCode + "/" + dataDirection + "/" + messageType;
|
||||
|
||||
@ -46,7 +46,7 @@ public class MqttResponse<T> implements Serializable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public MqttResponse<T> success(T dataBody){
|
||||
public MqttResponse<T> success(T data){
|
||||
this.code=SUCCESS;
|
||||
this.msg="成功";
|
||||
this.data=data;
|
||||
|
||||
@ -18,7 +18,7 @@ public class OrderStatusData {
|
||||
private Integer soc;
|
||||
|
||||
@Schema(description = "租借电池包仓位")
|
||||
private String rentBatNo;
|
||||
private Integer rentBatNo;
|
||||
|
||||
@Schema(description = "租用电池包编码")
|
||||
private String rentBatCode;
|
||||
@ -30,7 +30,7 @@ public class OrderStatusData {
|
||||
private String returnBatCode;
|
||||
|
||||
@Schema(description = "归还电池包仓位")
|
||||
private String returnBatNo;
|
||||
private Integer returnBatNo;
|
||||
|
||||
@Schema(description = "归还电池包SOC")
|
||||
private Integer returnBatSoc;
|
||||
|
||||
@ -4,7 +4,7 @@ import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm.MqttStrategyConfirmExchangeProcessor;
|
||||
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event.MqttStrategyEventExchangeProcessor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
@ -25,11 +25,11 @@ public class EventMessageService {
|
||||
* event消息 处理
|
||||
*/
|
||||
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)){
|
||||
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())){
|
||||
processor.exchange(topic, header, dataBody);
|
||||
}
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
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.RandomUtil;
|
||||
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.SymmetricAlgorithm;
|
||||
import cn.hutool.crypto.symmetric.SymmetricCrypto;
|
||||
import cn.hutool.json.JSONConfig;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
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.MessageMqtt;
|
||||
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.MqttMessageHeader;
|
||||
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.common.core.constant.HDConstant;
|
||||
import com.evotech.hd.common.redis.utils.RedisUtil;
|
||||
@ -52,21 +47,6 @@ public class MessageUtilService {
|
||||
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消息
|
||||
@ -100,19 +80,7 @@ public class MessageUtilService {
|
||||
public void publishRSAMessage(MessageTopic topic, String msg, String stationPublicKey) {
|
||||
RSA rsa = SecureUtil.rsa(null, stationPublicKey);
|
||||
String encrypt = rsa.encryptBase64(msg, KeyType.PublicKey);
|
||||
|
||||
// 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));
|
||||
}
|
||||
publishMessage.publish(encrypt, topic.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -135,8 +103,8 @@ public class MessageUtilService {
|
||||
try {
|
||||
MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString());
|
||||
try {
|
||||
//dataBody.set("header", JSONUtil.toJsonStr(header));
|
||||
addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), JSONUtil.parseObj(message));
|
||||
dataBody.set("header", JSONUtil.toJsonStr(header));
|
||||
addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), dataBody);
|
||||
} 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));
|
||||
throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage());
|
||||
|
||||
@ -52,9 +52,6 @@ public class MqttMessageHandleService {
|
||||
// 3.1.2 保存MQTT消息
|
||||
MqttMessageHeader header = messageUtilService.addMqttMessage(topic, message.getId()+"", message.getQos(), jo);
|
||||
JSONObject dataBody = jo.getJSONObject("dataBody");
|
||||
if(dataBody == null){
|
||||
dataBody = jo.getJSONObject("data");
|
||||
}
|
||||
// 3.2 分类处理
|
||||
// 3.2.1 state
|
||||
if (MqttMessageTypeEnum.STATE.getType().equals(topic.getMessageType())) {
|
||||
|
||||
@ -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);
|
||||
// }
|
||||
//
|
||||
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
* MqttStrategyEventExchangeProcessor
|
||||
* 接口
|
||||
*
|
||||
* @author andy.shi
|
||||
* @ClassName:MqttStrategyEventExchangeProcessor
|
||||
* @date: 2025年10月29日 10:41
|
||||
* @ClassName:MqttStrategyequestExchangeProcessor
|
||||
* @date: 2025年06月19日 16:29
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
|
||||
public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchangeProcessor {
|
||||
|
||||
|
||||
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());
|
||||
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题:{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
|
||||
sendAESMessage(topic, header, response);
|
||||
|
||||
@ -1,69 +1,69 @@
|
||||
//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
|
||||
//
|
||||
//import cn.hutool.json.JSONObject;
|
||||
//import cn.hutool.json.JSONUtil;
|
||||
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
//import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
|
||||
//import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||
//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
|
||||
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryData;
|
||||
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq;
|
||||
//import com.evotech.hd.cloud.service.BatteryStationDcService;
|
||||
//import com.evotech.hd.common.core.constant.HDConstant;
|
||||
//import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
|
||||
//import jakarta.annotation.Resource;
|
||||
//import lombok.extern.slf4j.Slf4j;
|
||||
//import org.springframework.stereotype.Service;
|
||||
//
|
||||
//import java.util.Collections;
|
||||
//import java.util.List;
|
||||
//import java.util.stream.Collectors;
|
||||
//
|
||||
///**
|
||||
// * 站端请求电池数据
|
||||
// *
|
||||
// * @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl
|
||||
// * @date: 2025年05月19日 17:41
|
||||
// * @author: andy.shi
|
||||
// * @contact: 17330188597
|
||||
// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
// */
|
||||
//@Service
|
||||
//@Slf4j
|
||||
//public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
|
||||
//
|
||||
// @Resource
|
||||
// BatteryStationDcService batteryStationDcService;
|
||||
//
|
||||
// @Override
|
||||
// public boolean accept(String functionName) {
|
||||
// return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
// BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class);
|
||||
// String batCode = batteryInfoReq.getBatCode();
|
||||
// //直接默认为错误
|
||||
// MqttResponse<List<BatteryData>> response = new MqttResponse<List<BatteryData>>().createError(batteryInfoReq.getBatteryInfoRequestId());
|
||||
//
|
||||
// List<BatteryStationDc> list = Collections.emptyList();
|
||||
// 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)));
|
||||
// }else{
|
||||
// //如果没有电池编号, 则以当前站的电池数据为准
|
||||
// list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode()));
|
||||
// }
|
||||
// if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
|
||||
// response.setCode(MqttResponse.PUBLIC_SUCCESS);
|
||||
// response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList()));
|
||||
// }else {
|
||||
// response.setMsg("未查询到电池信息");
|
||||
// }
|
||||
//
|
||||
// logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
|
||||
// sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response);
|
||||
// }
|
||||
//
|
||||
//}
|
||||
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
|
||||
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
|
||||
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryData;
|
||||
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq;
|
||||
import com.evotech.hd.cloud.service.BatteryStationDcService;
|
||||
import com.evotech.hd.common.core.constant.HDConstant;
|
||||
import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 站端请求电池数据
|
||||
*
|
||||
* @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl
|
||||
* @date: 2025年05月19日 17:41
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
|
||||
|
||||
@Resource
|
||||
BatteryStationDcService batteryStationDcService;
|
||||
|
||||
@Override
|
||||
public boolean accept(String functionName) {
|
||||
return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class);
|
||||
String batCode = batteryInfoReq.getBatCode();
|
||||
//直接默认为错误
|
||||
MqttResponse<List<BatteryData>> response = new MqttResponse<List<BatteryData>>().createError(batteryInfoReq.getBatteryInfoRequestId());
|
||||
|
||||
List<BatteryStationDc> list = Collections.emptyList();
|
||||
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)));
|
||||
}else{
|
||||
//如果没有电池编号, 则以当前站的电池数据为准
|
||||
list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode()));
|
||||
}
|
||||
if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
|
||||
response.setCode(MqttResponse.PUBLIC_SUCCESS);
|
||||
response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList()));
|
||||
}else {
|
||||
response.setMsg("未查询到电池信息");
|
||||
}
|
||||
|
||||
logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
|
||||
sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -13,14 +13,17 @@ import com.evotech.hd.cloud.service.OrderService;
|
||||
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.order.Order;
|
||||
import com.evotech.hd.common.core.entity.order.OrderDetail;
|
||||
import com.evotech.hd.common.core.utils.Collections;
|
||||
import com.evotech.hd.common.redis.utils.RedisServiceUtils;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 换电信息--站端回复开始换电通知信息类
|
||||
* 站端回复开始换电通知信息类
|
||||
*
|
||||
* @ClassName:MqttRequestBatterySwapExchangeProcessorImpl
|
||||
* @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));
|
||||
//如果是成功, 创建订单详情
|
||||
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{
|
||||
wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(Collections.asMap("code",0, "msg", battery.getMsg())));
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* 取消订单--取消订单请求类
|
||||
* 取消订单请求类
|
||||
* @ClassName:MqttRequestCancelOrderExchangeProcessorImpl
|
||||
* @date: 2025年05月19日 14:51
|
||||
* @author: andy.shi
|
||||
|
||||
@ -1,73 +1,73 @@
|
||||
//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
|
||||
//
|
||||
//import cn.hutool.json.JSONObject;
|
||||
//import cn.hutool.json.JSONUtil;
|
||||
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
//import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
|
||||
//import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
|
||||
//import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||
//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
|
||||
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.CarInfoReq;
|
||||
//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData;
|
||||
//import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
|
||||
//import jakarta.annotation.Resource;
|
||||
//import lombok.extern.slf4j.Slf4j;
|
||||
//import org.apache.commons.lang3.StringUtils;
|
||||
//import org.springframework.beans.BeanUtils;
|
||||
//import org.springframework.stereotype.Service;
|
||||
//
|
||||
//import java.util.List;
|
||||
//import java.util.stream.Collectors;
|
||||
//
|
||||
///**
|
||||
// * 站端请求车辆信息
|
||||
// * @ClassName:MqttRequestCarInfoExchangeProcessorImpl
|
||||
// * @date: 2025年06月19日 11:21
|
||||
// * @author: andy.shi
|
||||
// * @contact: 17330188597
|
||||
// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
// */
|
||||
//@Service
|
||||
//@Slf4j
|
||||
//public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
|
||||
//
|
||||
// @Resource
|
||||
// private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
|
||||
//
|
||||
// @Override
|
||||
// public boolean accept(String functionName) {
|
||||
// return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
// CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class);
|
||||
// //直接默认为错误
|
||||
// MqttResponse<List<VehicleData>> response = new MqttResponse<List<VehicleData>>().createError(carInfoReq.getCarInfoRequestId());
|
||||
// String plateNum = carInfoReq.getPlateNum();
|
||||
// if(StringUtils.isEmpty(plateNum)){
|
||||
// response.setMsg("没有车牌号参数");
|
||||
// }else{
|
||||
// List<VehicleWechatUserRelation> list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper<VehicleWechatUserRelation>().eq( VehicleWechatUserRelation::getPlateNum, plateNum));
|
||||
// if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
|
||||
// response.setCode(MqttResponse.PUBLIC_SUCCESS);
|
||||
// response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList()));
|
||||
// }else {
|
||||
// response.setMsg("未查询到车辆信息");
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
|
||||
// sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// public static VehicleData convertVehicleData(VehicleWechatUserRelation data){
|
||||
// VehicleData vd = new VehicleData();
|
||||
// BeanUtils.copyProperties(data, vd);
|
||||
// return vd;
|
||||
// }
|
||||
//
|
||||
//
|
||||
//}
|
||||
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
|
||||
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
|
||||
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
|
||||
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.CarInfoReq;
|
||||
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData;
|
||||
import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 站端请求车辆信息
|
||||
* @ClassName:MqttRequestCarInfoExchangeProcessorImpl
|
||||
* @date: 2025年06月19日 11:21
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
|
||||
|
||||
@Resource
|
||||
private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
|
||||
|
||||
@Override
|
||||
public boolean accept(String functionName) {
|
||||
return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class);
|
||||
//直接默认为错误
|
||||
MqttResponse<List<VehicleData>> response = new MqttResponse<List<VehicleData>>().createError(carInfoReq.getCarInfoRequestId());
|
||||
String plateNum = carInfoReq.getPlateNum();
|
||||
if(StringUtils.isEmpty(plateNum)){
|
||||
response.setMsg("没有车牌号参数");
|
||||
}else{
|
||||
List<VehicleWechatUserRelation> list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper<VehicleWechatUserRelation>().eq( VehicleWechatUserRelation::getPlateNum, plateNum));
|
||||
if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
|
||||
response.setCode(MqttResponse.PUBLIC_SUCCESS);
|
||||
response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList()));
|
||||
}else {
|
||||
response.setMsg("未查询到车辆信息");
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
|
||||
sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response);
|
||||
}
|
||||
|
||||
|
||||
public static VehicleData convertVehicleData(VehicleWechatUserRelation data){
|
||||
VehicleData vd = new VehicleData();
|
||||
BeanUtils.copyProperties(data, vd);
|
||||
return vd;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -19,7 +19,7 @@ import org.springframework.stereotype.Service;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* 预约订单--站端请求创建预约单类
|
||||
* 站端请求创建预约单类
|
||||
*
|
||||
* @ClassName:MqttRequestPreOrderExchangeProcessorImpl
|
||||
* @date: 2025年05月19日 17:41
|
||||
@ -42,7 +42,7 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
|
||||
@Override
|
||||
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
OrderSwapBatteryPre orderSwapBatteryPre = JSONUtil.toBean(dataBody, OrderSwapBatteryPre.class);
|
||||
MqttResponse response = new MqttResponse().error("");
|
||||
MqttResponse response = new MqttResponse().createError(orderSwapBatteryPre.getSourceId());
|
||||
// 1. 基础字段校验
|
||||
if (validateRequiredFields(orderSwapBatteryPre)) {
|
||||
response.setMsg("预约信息不完整");
|
||||
@ -55,7 +55,6 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
|
||||
// 创建预约单信息
|
||||
orderSwapBatteryPre.setUcode(wechatUser.getWuid());
|
||||
orderSwapBatteryPre.setSource(3);
|
||||
orderSwapBatteryPre.setStationCode(topic.getStationCode());
|
||||
Result<Boolean> integerResult = orderSwapBatteryPreService.addOrderSwapBatteryPre(orderSwapBatteryPre);
|
||||
//检查结果
|
||||
if (integerResult.getData()){
|
||||
@ -86,12 +85,12 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
|
||||
return Stream.of(
|
||||
order.getPlateNum(),
|
||||
order.getPhone(),
|
||||
// order.getStationCode(),
|
||||
// order.getStationName(),
|
||||
order.getUname()
|
||||
// order.getSwapDay(),
|
||||
// order.getSwapDuration(),
|
||||
// order.getReservationTime()
|
||||
order.getStationCode(),
|
||||
order.getStationName(),
|
||||
order.getUname(),
|
||||
order.getSwapDay(),
|
||||
order.getSwapDuration(),
|
||||
order.getReservationTime()
|
||||
).anyMatch(StrUtil::isBlankIfStr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* 初始化车辆和预约单--接收站端推送的车牌照, 创建车辆信息和预约单
|
||||
* 接收站端推送的车牌照, 创建车辆信息和预约单
|
||||
*
|
||||
* @ClassName:MqttRequestPushCarCreateMakeAppointmentExchangeProcessorImpl
|
||||
* @date: 2025年04月30日 15:34
|
||||
|
||||
@ -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.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 lombok.extern.slf4j.Slf4j;
|
||||
@ -31,7 +30,7 @@ import org.springframework.stereotype.Service;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 查询订单--站端根据车牌号查询订单
|
||||
* 站端根据车牌号查询订单
|
||||
*
|
||||
* @ClassName:MqttRequestQueryOrderExchangeProcessorImpl
|
||||
* @date: 2025年05月19日 17:41
|
||||
@ -73,7 +72,7 @@ public class MqttRequestQueryOrderExchangeProcessorImpl implements MqttStrategyR
|
||||
.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())));
|
||||
.eq(Order::getStatus, OrderStatusEnums.CREATE.getCode()));
|
||||
if (ObjectUtils.isNotEmpty(order)) {
|
||||
response.setCode(MqttResponse.PUBLIC_SUCCESS);
|
||||
}else{
|
||||
|
||||
@ -16,7 +16,7 @@ import org.springframework.util.StringUtils;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 查询充电策略--Mqtt查询充电策略
|
||||
* Mqtt查询充电策略
|
||||
* @ClassName:StrategyMqttMessageRequestExchangeProcessorImpl
|
||||
* @date: 2025年04月08日 11:36
|
||||
* @author: andy.shi
|
||||
|
||||
@ -1,42 +1,42 @@
|
||||
//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state;
|
||||
//
|
||||
//import cn.hutool.json.JSONObject;
|
||||
//import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao;
|
||||
//import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
|
||||
//import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||
//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||
//import com.evotech.hd.cloud.utils.components.HDStepDictComponent;
|
||||
//import jakarta.annotation.Resource;
|
||||
//import lombok.extern.slf4j.Slf4j;
|
||||
//import org.springframework.stereotype.Service;
|
||||
//
|
||||
///**
|
||||
// * 站端反馈订单状态
|
||||
// *
|
||||
// * @ClassName:MqttStateSwapStepDataExchangeProcessor
|
||||
// * @date: 2025年04月29日 13:26
|
||||
// * @author: andy.shi
|
||||
// * @contact: 17330188597
|
||||
// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
// */
|
||||
//@Slf4j
|
||||
//@Service
|
||||
//public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor {
|
||||
//
|
||||
// @Resource
|
||||
// private HDStepDictComponent hdStepDictComponent;
|
||||
// @Resource
|
||||
// private OrderSwapBatteryStepDao orderSwapBatteryStepDao;
|
||||
//
|
||||
// @Override
|
||||
// public boolean accept(String functionName) {
|
||||
// return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
//// OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class);
|
||||
//// OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class);
|
||||
// log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题:{},换电步骤名称:{}",topic, dataBody.toString());
|
||||
// }
|
||||
//}
|
||||
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao;
|
||||
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
|
||||
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||
import com.evotech.hd.cloud.utils.components.HDStepDictComponent;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 站端反馈订单状态
|
||||
*
|
||||
* @ClassName:MqttStateSwapStepDataExchangeProcessor
|
||||
* @date: 2025年04月29日 13:26
|
||||
* @author: andy.shi
|
||||
* @contact: 17330188597
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor {
|
||||
|
||||
@Resource
|
||||
private HDStepDictComponent hdStepDictComponent;
|
||||
@Resource
|
||||
private OrderSwapBatteryStepDao orderSwapBatteryStepDao;
|
||||
|
||||
@Override
|
||||
public boolean accept(String functionName) {
|
||||
return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
// OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class);
|
||||
// OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class);
|
||||
log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题:{},换电步骤名称:{}",topic, dataBody.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,11 +50,16 @@ public class MqttStateSwapStepDataExchangeProcessor implements MqttStrategyState
|
||||
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
||||
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()));
|
||||
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));
|
||||
//发送通知到指定客户端
|
||||
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))));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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()));
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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("查询云端预约单信息失败");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
|
||||
}
|
||||
@ -1,8 +0,0 @@
|
||||
package com.evotech.hd.cloud.service;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface BatteryStationSecretKeyService {
|
||||
|
||||
public Map<String, String> getStationSecretKeyByStationCode(String stationCode);
|
||||
}
|
||||
@ -13,9 +13,4 @@ import com.evotech.hd.common.core.entity.order.OrderDetail;
|
||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||
*/
|
||||
public interface OrderDetailService extends IService<OrderDetail> {
|
||||
|
||||
|
||||
public OrderDetail addOrderDetailByOrder(Integer orderId);
|
||||
|
||||
public OrderDetail getOrderDetailByOrder(Integer orderId);
|
||||
}
|
||||
|
||||
@ -2,18 +2,14 @@ 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.common.core.entity.order.Order;
|
||||
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.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.entity.cloud.OrderSwapBatteryPre;
|
||||
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep;
|
||||
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
|
||||
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
|
||||
import com.evotech.hd.common.core.entity.order.Order;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
@ -77,12 +73,4 @@ public interface OrderService extends IService<Order> {
|
||||
Result<BatterySwapResponse> getStartSwap(String wuid, String orderId);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ public interface OrderSwapBatteryPreService extends IService<OrderSwapBatteryPre
|
||||
|
||||
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);
|
||||
|
||||
|
||||
@ -16,10 +16,6 @@ public interface TradeService extends IService<TradeDetail> {
|
||||
|
||||
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 List<TradeDetail> tradeList(PageListTradeRequest pltr);
|
||||
|
||||
@ -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.entity.wechat.WechatUser;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface WechatUserService {
|
||||
|
||||
public Result<Page<WechatUser>> pageList(PageListWechatUserRequest plwur);
|
||||
|
||||
public Result<List<WechatUser>> list(List<String> wuIds);
|
||||
public Result<Page<WechatUser>> list(PageListWechatUserRequest plwur);
|
||||
|
||||
public Result<Integer> alterPhone(String wuid, String phone, String name);
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -1,11 +1,7 @@
|
||||
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.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.common.core.Dto.Result;
|
||||
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.BatteryStationCdStrategyDetail;
|
||||
import com.evotech.hd.common.core.enums.CodeMsg;
|
||||
import com.evotech.hd.common.core.utils.Collections;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStrategyService {
|
||||
|
||||
@Resource
|
||||
private BatteryStationCdStrategyDao strategyDao;
|
||||
@Resource
|
||||
private BatteryStationCdStrategyDetailDao strategyDetailDao;
|
||||
@Resource
|
||||
private MessageUtilService messageUtilService;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -53,17 +44,7 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
||||
public Result<Integer> delete(Integer id) {
|
||||
int n = strategyDao.deleteById(id);
|
||||
if (n == 1) {
|
||||
List<BatteryStationCdStrategyDetail> list = strategyDetailDao.selectList(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));
|
||||
strategyDetailDao.delete(new QueryWrapper<BatteryStationCdStrategyDetail>().eq("strategy_id", id));
|
||||
return new Result<Integer>().success(n);
|
||||
}
|
||||
return new Result<Integer>().error("删除充电策略出错!");
|
||||
@ -92,7 +73,6 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
||||
bscsd.setCtime(new Date());
|
||||
int n = strategyDetailDao.insert(bscsd);
|
||||
if (n == 1) {
|
||||
pushStation(bscsd);
|
||||
return new Result<Integer>().success(n);
|
||||
}
|
||||
return new Result<Integer>().error("添加充电策略详情出错!");
|
||||
@ -102,7 +82,6 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
||||
public Result<Integer> deleteDetail(Integer id) {
|
||||
int n = strategyDetailDao.deleteById(id);
|
||||
if (n == 1) {
|
||||
pushStation(new BatteryStationCdStrategyDetail(id, 3));
|
||||
return new Result<Integer>().success(n);
|
||||
}
|
||||
return new Result<Integer>().error("删除充电策略详情出错!");
|
||||
@ -112,8 +91,6 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
||||
public Result<Integer> updateDetail(BatteryStationCdStrategyDetail bscsd) {
|
||||
int n = strategyDetailDao.updateById(bscsd);
|
||||
if (n == 1) {
|
||||
bscsd.setDataType(2);
|
||||
pushStation(bscsd);
|
||||
return new Result<Integer>().success(n);
|
||||
}
|
||||
return new Result<Integer>().error("更新充电策略详情失败!");
|
||||
@ -142,17 +119,4 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
||||
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));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -3,7 +3,7 @@ package com.evotech.hd.cloud.service.impl;
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
import cn.hutool.crypto.KeyUtil;
|
||||
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
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);
|
||||
} else {
|
||||
// 如果不存在密钥对,则生成新的密钥对
|
||||
KeyPair keyPair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue());
|
||||
KeyPair keyPair = KeyUtil.generateKeyPair(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue());
|
||||
// 将私钥转换为Base64编码的字符串
|
||||
String privatekeyBase64String = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
|
||||
// 将公钥转换为Base64编码的字符串
|
||||
@ -373,7 +373,7 @@ public class BatteryStationServiceImpl implements BatteryStationService {
|
||||
//如果消防没有报警, 检查烟感
|
||||
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){
|
||||
alarmMsg.append("烟感报警");
|
||||
}
|
||||
|
||||
@ -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.wechat.WechatUser;
|
||||
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.redis.utils.RedisUtil;
|
||||
import com.evotech.hd.common.service.MongoDBService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@ -237,7 +235,7 @@ public class HomeServiceImpl implements HomeService {
|
||||
//待结算订单数量
|
||||
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);
|
||||
|
||||
@ -255,29 +253,16 @@ public class HomeServiceImpl implements HomeService {
|
||||
if(Collections.isNotEmpty(alarmList)){
|
||||
StationState stationState= alarmList.get(0);
|
||||
//报警信息
|
||||
JSONObject alarmJSONObject = JSONObject.parseObject(stationState.getValue());
|
||||
JSONObject alarmJSONObject = JSONObject.parseObject(alarmList.get(0).getValue());
|
||||
Integer fire = alarmJSONObject.getInteger("fire");
|
||||
List<String> alarmMessage = Collections.emptyList();
|
||||
if(ObjectUtils.isNotEmpty(fire) && MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(fire)){
|
||||
alarmMessage.add("消防告警");
|
||||
if(MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(fire)){
|
||||
alarm.setAlarmType("消防告警");
|
||||
}else{
|
||||
String smoke = alarmJSONObject.getString("smoke");
|
||||
if(Collections.asList(smoke.split(",")).contains(String.valueOf(MongoConstant.ErrorCode.STATION_ALARM_CODE))){
|
||||
alarm.setAlarmType("烟感告警");
|
||||
}
|
||||
}
|
||||
String smoke = alarmJSONObject.getString("smoke");
|
||||
if(StringUtils.isNotEmpty(smoke) && Collections.asList(smoke.split(",")).contains(String.valueOf(MongoConstant.ErrorCode.STATION_ALARM_CODE))){
|
||||
alarmMessage.add("烟感告警");
|
||||
}
|
||||
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"));
|
||||
}
|
||||
});
|
||||
|
||||
@ -1,15 +1,12 @@
|
||||
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.evotech.hd.cloud.service.OrderDetailService;
|
||||
import com.evotech.hd.common.core.dao.cloud.OrderDetailDao;
|
||||
import com.evotech.hd.common.core.entity.order.OrderDetail;
|
||||
import com.evotech.hd.cloud.service.OrderDetailService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 订单详情实现类
|
||||
*
|
||||
@ -24,23 +21,6 @@ import java.util.Date;
|
||||
@Slf4j
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -7,10 +7,8 @@ import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONConfig;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
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.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
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.message.MessageTopic;
|
||||
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.state.OrderStatusData;
|
||||
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.utils.CommonUtil;
|
||||
import com.evotech.hd.cloud.utils.ExcelUtil;
|
||||
import com.evotech.hd.cloud.utils.ParamServiceUtils;
|
||||
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
|
||||
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.constant.HDConstant;
|
||||
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.order.Order;
|
||||
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.*;
|
||||
import com.evotech.hd.common.core.utils.Collections;
|
||||
import com.evotech.hd.common.core.utils.DataUtils;
|
||||
import com.evotech.hd.common.permission.util.RedisPermissionUtils;
|
||||
import com.evotech.hd.common.permission.util.SpringUtil;
|
||||
import com.evotech.hd.common.core.enums.CodeMsg;
|
||||
import com.evotech.hd.common.core.enums.OrderStatusEnums;
|
||||
import com.evotech.hd.common.core.enums.PayTypeEnums;
|
||||
import com.evotech.hd.common.core.enums.TradeTypeEnums;
|
||||
import com.evotech.hd.common.redis.utils.RedisServiceUtils;
|
||||
import com.evotech.hd.common.web.util.EnumUtils;
|
||||
import jakarta.annotation.Resource;
|
||||
@ -57,7 +51,6 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@ -102,15 +95,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
private OrderSwapBatteryPreDao orderSwapBatteryPreDao;
|
||||
@Resource
|
||||
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){
|
||||
OrderListVo vo = new OrderListVo();
|
||||
BeanUtils.copyProperties(order, vo);
|
||||
vo.setAmount(order.getOrderAmount());
|
||||
@ -126,9 +114,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
.ge(ObjectUtils.isNotEmpty(plsor.getOrderTimeBegin()), Order::getOrderTime, plsor.getOrderTimeBegin())
|
||||
.le(ObjectUtils.isNotEmpty(plsor.getOrderTimeEnd()), Order::getOrderTime, plsor.getOrderTimeEnd())
|
||||
.eq(StringUtils.isNotEmpty(plsor.getStationCode()), Order::getStationCode, plsor.getStationCode())
|
||||
.eq(StringUtils.isNotEmpty(plsor.getTradeNo()), Order::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.getUserId()), Order::getPreWechatId, plsor.getUserId())
|
||||
.ne(Order::getDelFlag, 1)
|
||||
.orderByDesc(Order::getOrderTime));
|
||||
|
||||
@ -162,9 +149,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
}
|
||||
// 3. 选择费用计算方式 计算费用, 这里计算出来直接就是分
|
||||
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());
|
||||
// 4. 跟新订单
|
||||
@ -213,23 +197,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
order.setPlateNum(orderSwapBatteryPre.getPlateNum());
|
||||
order.setOrderTime(new Date());
|
||||
order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP);
|
||||
//站端不会推送换电中事件, 所以根据预约单创建订单, 即为换电中
|
||||
order.setStatus(OrderStatusEnums.SWAP.getCode());
|
||||
order.setStatus(OrderStatusEnums.CREATE.getCode());
|
||||
order.setStationCode(orderSwapBatteryPre.getStationCode());
|
||||
order.setStationName(orderSwapBatteryPre.getStationName());
|
||||
order.setDelFlag(HDConstant.DELETE_NO);
|
||||
// TODO 查询换电站信息,拿到计费方式,计费信息在充电结束时, 计算
|
||||
Boolean saveResult = save(order);
|
||||
if(saveResult){
|
||||
try {
|
||||
orderDetailService.addOrderDetailByOrder(order.getPkId());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.error("生成换电订单详情出错",e);
|
||||
}
|
||||
}
|
||||
// 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
|
||||
@ -246,13 +220,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
return new Result<Boolean>().error("未找到符合条件的订单");
|
||||
}
|
||||
|
||||
try {
|
||||
orderDetailService.addOrderDetailByOrder(order.getPkId());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.error("生成换电订单详情出错",e);
|
||||
}
|
||||
|
||||
try {
|
||||
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.setTradeNo(trade.getOutTradeNo());
|
||||
//order.setTradeNo(trade.getOutTradeNo());
|
||||
order.setUpdateTime(new Date());
|
||||
orderDao.updateById(order);
|
||||
log.info("订单支付成功, 订单编号: {}", order.getOrderNo());
|
||||
@ -421,20 +388,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<String> companyNativePay(NativePayVO 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("为找到订单信息");
|
||||
public Result<String> companyNativePay(NativePayVO prePay) {
|
||||
return wechatService.wechatNativePay(prePay);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -467,20 +422,21 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
@Override
|
||||
public Result<Integer> checkList(PageListSwapOrderRequest plsor) {
|
||||
Page<Order> page = new Page<Order>(plsor.getPageNo(), plsor.getPageSize());
|
||||
// String strs = "1,2,3,4,5,6";
|
||||
// if (StringUtils.isBlank(strs)) {//订单状态"已完成"之前的状态
|
||||
// statusList = Arrays.asList(strs.split(",")).stream().map(Integer::valueOf).toList();
|
||||
// }
|
||||
List<Integer> statusList = new ArrayList<>();
|
||||
String strs = "1,2,3,4,5,6";
|
||||
if (StringUtils.isBlank(strs)) {//订单状态"已完成"之前的状态
|
||||
statusList = Arrays.asList(strs.split(",")).stream().map(Integer::valueOf).toList();
|
||||
}
|
||||
page = orderDao.selectPage(page, new QueryWrapper<Order>()
|
||||
.eq(StringUtils.isNotBlank(plsor.getOrderNo()), "order_no", plsor.getOrderNo())
|
||||
.eq(StringUtils.isNotBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum())
|
||||
.in("status", Collections.asList(1,2,3,4,5,6))
|
||||
.eq(StringUtils.isBlank(plsor.getOrderNo()), "order_no", plsor.getOrderNo())
|
||||
.eq(StringUtils.isBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum())
|
||||
.in(!statusList.isEmpty(), "status", statusList)
|
||||
.ge(plsor.getOrderTimeBegin() != null, "order_time", plsor.getOrderTimeBegin())
|
||||
.le(plsor.getOrderTimeEnd() != null, "order_time", plsor.getOrderTimeEnd())
|
||||
.eq(StringUtils.isNotBlank(plsor.getStationCode()), "station_code", plsor.getStationCode())
|
||||
.like(StringUtils.isNotBlank(plsor.getStationName()), "station_name", plsor.getStationName())
|
||||
.eq(StringUtils.isNotBlank(plsor.getUserId()), "pre_wechat_id", plsor.getUserId())
|
||||
.eq(StringUtils.isNotBlank(plsor.getTradeNo()), "trade_no", plsor.getTradeNo())
|
||||
.eq(StringUtils.isBlank(plsor.getStationCode()), "station_code", plsor.getStationCode())
|
||||
.like(StringUtils.isBlank(plsor.getStationName()), "station_name", plsor.getStationName())
|
||||
.eq(StringUtils.isBlank(plsor.getUserId()), "order_pre_uid", plsor.getUserId())
|
||||
.eq(StringUtils.isBlank(plsor.getTradeNo()), "trade_no", plsor.getTradeNo())
|
||||
.ne("del_flag", 1)
|
||||
.orderByDesc("pk_id"));
|
||||
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());
|
||||
page1 = orderSwapBatteryPreDao.selectPage(page1, new QueryWrapper<OrderSwapBatteryPre>()
|
||||
.eq("status", "1")
|
||||
.eq(StringUtils.isNotBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum())
|
||||
.eq(StringUtils.isBlank("1"), "status", "1")
|
||||
.eq(StringUtils.isBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum())
|
||||
.orderByDesc("pk_id"));
|
||||
if (!page1.getRecords().isEmpty()) {
|
||||
return new Result<Integer>().error("该车辆有预约成功的订单,请处理后重试!");
|
||||
@ -542,240 +498,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
|
||||
public Result<Order> one(String 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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.OrderSwapBatteryPreDao;
|
||||
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.utils.CloudTemplateMessageUtils;
|
||||
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.OrderSwapBatteryPre;
|
||||
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.order.Order;
|
||||
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 jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@ -60,10 +51,7 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
|
||||
private WechatUserDao wechatUserDao;
|
||||
@Resource
|
||||
private OrderDao orderDao;
|
||||
@Resource
|
||||
private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
|
||||
@Resource
|
||||
MqttStrategyEventExchangeProcessor mqttStrategyEventExchangeProcessor;
|
||||
|
||||
|
||||
@Override
|
||||
public Boolean addPreByPlateNum(String plateNum, String stationCode) {
|
||||
@ -100,16 +88,11 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
|
||||
if (vehicleInfo == null) {
|
||||
return new Result<Boolean>().error("未找到车辆信息", false);
|
||||
}
|
||||
|
||||
// 2. 检查预约人
|
||||
if (!wechatUserDao.exists(new LambdaQueryWrapper<WechatUser>().ne(WechatUser::getPhoneNumber, " ").isNotNull(WechatUser::getPhoneNumber).eq(WechatUser::getWuid, orderSwapBatteryPre.getUcode()))) {
|
||||
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 则证明换电站未运营
|
||||
if (batteryStationDao.exists(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getCode, orderSwapBatteryPre.getStationCode()).ne(BatteryStation::getStatus, 1))) {
|
||||
return new Result<Boolean>().error("该换电站未运营!", false);
|
||||
@ -149,32 +132,11 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
|
||||
RedisServiceUtils.set(redisKey, expireTime);
|
||||
// 发送服务号消息,没有消息队列,先用接口吧
|
||||
CloudTemplateMessageUtils.sendPreOrderMessage(orderSwapBatteryPre);
|
||||
//数据来源不是站端的时候, 同步下发到站控
|
||||
if(!Integer.valueOf(3).equals(orderSwapBatteryPre.getSource())){
|
||||
pushStationControl(orderSwapBatteryPre);
|
||||
}
|
||||
return new Result<Boolean>().success(true);
|
||||
}
|
||||
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
|
||||
public Result<Page<OrderSwapBatteryPre>> list(PageListSwapOrderPreRequest plsopr) {
|
||||
Page<OrderSwapBatteryPre> page = new Page<OrderSwapBatteryPre>(plsopr.getPageNo(), plsopr.getPageSize());
|
||||
@ -195,7 +157,7 @@ public class OrderSwapBatteryPreServiceImpl extends ServiceImpl<OrderSwapBattery
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<Integer> updateStatusById(Integer id, Integer status) {
|
||||
public Result<Integer> cancelPre(Integer id, Integer status) {
|
||||
OrderSwapBatteryPre osbp = new OrderSwapBatteryPre();
|
||||
osbp.setPkId(id);
|
||||
osbp.setStatus(status != null? status : 3);
|
||||
|
||||
@ -1,30 +1,23 @@
|
||||
package com.evotech.hd.cloud.service.impl;
|
||||
|
||||
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.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.evotech.hd.cloud.dao.TradeDetailDao;
|
||||
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.newthread.GZHTemplateMessageService;
|
||||
import com.evotech.hd.cloud.service.newthread.WechatPayNotifyHandleService;
|
||||
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.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.OrderStatusEnums;
|
||||
import com.evotech.hd.common.core.utils.Collections;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.Date;
|
||||
@ -41,8 +34,6 @@ public class TradeServiceImpl extends ServiceImpl<TradeDetailDao, TradeDetail> i
|
||||
@Resource
|
||||
private GZHTemplateMessageService gzhTemplateMessageService;
|
||||
@Resource
|
||||
TaxPointService taxPointService;
|
||||
@Resource
|
||||
private OrderDao orderDao;
|
||||
@Override
|
||||
public Result<Integer> add(TradeDetail td) {
|
||||
@ -75,45 +66,6 @@ public class TradeServiceImpl extends ServiceImpl<TradeDetailDao, TradeDetail> i
|
||||
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
|
||||
public Result<Page<TradeDetail> > list(PageListTradeRequest pltr) {
|
||||
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);
|
||||
//只有当整体数据处理成功之后, 才保存交易记录, 防止出现异常,二次请求进来数据无法处理
|
||||
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);
|
||||
}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);
|
||||
}
|
||||
|
||||
add(tradeDetail);
|
||||
}
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
|
||||
@ -92,7 +92,7 @@ public class VehicleServiceImpl extends ServiceImpl<VehicleInfoDao, VehicleInfo>
|
||||
.eq(StringUtils.hasText(plvr.getPhone()), "phone", plvr.getPhone())
|
||||
.eq(StringUtils.hasText(plvr.getCcode()), "ccode", plvr.getCcode())
|
||||
.ne("del_flag", 1)
|
||||
.orderByDesc("ctime"));
|
||||
.orderByAsc("plate_num"));
|
||||
if (page.getRecords().isEmpty()) {
|
||||
return new Result<Page<VehicleInfo>>().error(CodeMsg.DATABASE_RESULT_NULL);
|
||||
}
|
||||
|
||||
@ -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.WechatUser;
|
||||
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 jakarta.annotation.Resource;
|
||||
import org.slf4j.Logger;
|
||||
@ -120,11 +119,8 @@ public class WalletAccountServiceImpl extends ServiceImpl<WalletAccountDao, Wall
|
||||
wa1.setGiftAmount(wa.getGiftAmount());
|
||||
// wa1.setTotalAmount(wa.getTotalAmount());
|
||||
wa1.setRechargeAmount(wa.getRechargeAmount());
|
||||
int n = walletAccountDao.update(wa1, new UpdateWrapper<WalletAccount>()
|
||||
.set(org.apache.commons.lang3.StringUtils.isNotEmpty(wa.getAccName()), "acc_name",wa.getAccName())
|
||||
.set("gift_amount",wa.getGiftAmount())
|
||||
.set("recharge_Amount",wa.getRechargeAmount())
|
||||
.eq(org.apache.commons.lang3.StringUtils.isNotEmpty(wa.getCode()), "code", wa.getCode())
|
||||
int n = walletAccountDao.update(wa1, new QueryWrapper<WalletAccount>()
|
||||
.eq("code", wa.getCode())
|
||||
.eq("pk_id", wa.getPkId()));
|
||||
if (n == 1) {
|
||||
return new Result<Integer>().success(n);
|
||||
@ -135,21 +131,10 @@ public class WalletAccountServiceImpl extends ServiceImpl<WalletAccountDao, Wall
|
||||
|
||||
@Override
|
||||
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());
|
||||
QueryWrapper<WalletAccount> queryWrapper = new QueryWrapper<WalletAccount>()
|
||||
.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(plwr.getOwnerType() != null, "owner_type", plwr.getOwnerType())
|
||||
.eq(StringUtils.hasText(plwr.getOwnerId()), "owner_id", plwr.getOwnerId())
|
||||
@ -165,7 +150,6 @@ public class WalletAccountServiceImpl extends ServiceImpl<WalletAccountDao, Wall
|
||||
WalletAccountVO vo = new WalletAccountVO();
|
||||
// 复制基本属性
|
||||
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())) {
|
||||
WechatUser wechatUser = wechatUserDao.selectOne(
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
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.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@ -28,7 +27,7 @@ public class WechatUserServiceImpl implements WechatUserService {
|
||||
private WechatUserDao wechatUserDao;
|
||||
|
||||
@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 = wechatUserDao.selectPage(page, new QueryWrapper<WechatUser>()
|
||||
@ -50,11 +49,6 @@ public class WechatUserServiceImpl implements WechatUserService {
|
||||
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
|
||||
public Result<Integer> alterPhone(String wuid, String phone, String name) {
|
||||
if (!(StringUtils.hasText(phone) || StringUtils.hasText(name))) {
|
||||
|
||||
@ -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.dao.cloud.OrderDao;
|
||||
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.WalletAccount;
|
||||
import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail;
|
||||
@ -86,7 +87,7 @@ public class WechatPayNotifyHandleService {
|
||||
}
|
||||
if (WechatPayApiTypeEnums.NATIVE.getCode().equals(tradeDetail.getWechatPayApiType())) {
|
||||
// native支付,企业
|
||||
return nativePayHandle(tradeDetail);
|
||||
nativePayHandle(tradeDetail);
|
||||
}
|
||||
return new Result<String>().error("未知的支付类型");
|
||||
} else if (tradeDetail.getTradeType() == 9) {
|
||||
@ -189,40 +190,8 @@ public class WechatPayNotifyHandleService {
|
||||
* 一般企业多条付款
|
||||
* @param tradeDetail
|
||||
*/
|
||||
private Result<String> nativePayHandle(TradeDetail tradeDetail) {
|
||||
try {
|
||||
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()));
|
||||
private void nativePayHandle(TradeDetail tradeDetail) {
|
||||
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<Order> orderList = orderDao.selectList(new QueryWrapper<Order>()
|
||||
.eq("status", 6).in("order_no", orderNoList));
|
||||
@ -245,10 +214,7 @@ public class WechatPayNotifyHandleService {
|
||||
});
|
||||
} catch (Exception e) {
|
||||
log.error("nativePay 生成税点信息异常,异常信息{}", e.getMessage());
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
}
|
||||
// 发送公众号消息,发给企业绑定的微信号
|
||||
// templateMessageService.orderMessageSend(one, 3);
|
||||
}
|
||||
|
||||
@ -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.entity.cloud.OrderSwapBatteryPre;
|
||||
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 org.springdoc.core.annotations.ParameterObject;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
@ -91,11 +90,4 @@ public interface WechatService {
|
||||
@Async("taskExecutor")
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user