Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
YAS\29473
2025-09-26 14:56:16 +08:00
33 changed files with 1362 additions and 91 deletions

View File

@@ -29,6 +29,12 @@ public class ChargeAlgorithmRecord extends BaseEntity {
@Excel(name = "订单编号")
private String orderCode;
private String taskId;
private String webUrl;
private String pdfUrl;
/**
* 总体得分
*/

View File

@@ -120,6 +120,11 @@ public class OrderBasicInfo {
*/
private Date payTime;
/**
* 保险金额
*/
private BigDecimal insuranceAmount;
/**
* 车牌号码
*/

View File

@@ -0,0 +1,101 @@
package com.jsowell.pile.domain;
import java.math.BigDecimal;
import com.jsowell.common.annotation.Excel;
import com.jsowell.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 订单保险信息对象 order_insurance_info
*
* @author jsowell
* @date 2025-09-05
*/
public class OrderInsuranceInfo extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* $column.columnComment
*/
private Long id;
/**
* 保险交易流水号
*/
@Excel(name = "保险交易流水号")
private String insuranceTransactionCode;
/**
* 关联订单号
*/
@Excel(name = "关联订单号")
private String orderCode;
/**
* 保险支付金额
*/
@Excel(name = "保险支付金额")
private BigDecimal tradeAmount;
/**
* 删除标识0-否1-是)
*/
private String delFlag;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setInsuranceTransactionCode(String insuranceTransactionCode) {
this.insuranceTransactionCode = insuranceTransactionCode;
}
public String getInsuranceTransactionCode() {
return insuranceTransactionCode;
}
public void setOrderCode(String orderCode) {
this.orderCode = orderCode;
}
public String getOrderCode() {
return orderCode;
}
public void setTradeAmount(BigDecimal tradeAmount) {
this.tradeAmount = tradeAmount;
}
public BigDecimal getTradeAmount() {
return tradeAmount;
}
public void setDelFlag(String delFlag) {
this.delFlag = delFlag;
}
public String getDelFlag() {
return delFlag;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
.append("id", getId())
.append("insuranceTransactionCode", getInsuranceTransactionCode())
.append("orderCode", getOrderCode())
.append("tradeAmount", getTradeAmount())
.append("createTime", getCreateTime())
.append("createBy", getCreateBy())
.append("updateTime", getUpdateTime())
.append("updateBy", getUpdateBy())
.append("delFlag", getDelFlag())
.toString();
}
}

View File

@@ -55,6 +55,11 @@ public class GenerateOrderDTO extends BasicPileDTO{
*/
private BigDecimal chargeAmount;
/**
* 保险金额
*/
private BigDecimal insuranceAmount;
/**
* 充电桩枪口信息
*/

View File

@@ -37,6 +37,11 @@ public class PayOrderDTO extends BaseDTO{
*/
private BigDecimal payAmount;
/**
* 保险金额
*/
private BigDecimal insuranceAmount;
/**
* @see ScenarioEnum
* 支付场景

View File

@@ -23,6 +23,11 @@ public class PayOrderSuccessCallbackDTO {
*/
private BigDecimal payAmount;
/**
* 保险金额
*/
private BigDecimal insuranceAmount;
/**
* 支付方式
* 1-余额支付2-微信支付3-支付宝支付

View File

@@ -0,0 +1,71 @@
package com.jsowell.pile.mapper;
import java.util.List;
import com.jsowell.pile.domain.OrderInsuranceInfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* 订单保险信息Mapper接口
*
* @author jsowell
* @date 2025-09-05
*/
@Repository
public interface OrderInsuranceInfoMapper {
/**
* 查询订单保险信息
*
* @param id 订单保险信息主键
* @return 订单保险信息
*/
public OrderInsuranceInfo selectOrderInsuranceInfoById(Long id);
/**
* 查询订单保险信息列表
*
* @param orderInsuranceInfo 订单保险信息
* @return 订单保险信息集合
*/
public List<OrderInsuranceInfo> selectOrderInsuranceInfoList(OrderInsuranceInfo orderInsuranceInfo);
/**
* 新增订单保险信息
*
* @param orderInsuranceInfo 订单保险信息
* @return 结果
*/
public int insertOrderInsuranceInfo(OrderInsuranceInfo orderInsuranceInfo);
/**
* 修改订单保险信息
*
* @param orderInsuranceInfo 订单保险信息
* @return 结果
*/
public int updateOrderInsuranceInfo(OrderInsuranceInfo orderInsuranceInfo);
/**
* 删除订单保险信息
*
* @param id 订单保险信息主键
* @return 结果
*/
public int deleteOrderInsuranceInfoById(Long id);
/**
* 批量删除订单保险信息
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteOrderInsuranceInfoByIds(Long[] ids);
/**
* 通过订单号查询订单保险信息
* @param orderCode
* @return
*/
OrderInsuranceInfo getInfoByOrderCode(@Param("orderCode") String orderCode);
}

View File

@@ -0,0 +1,68 @@
package com.jsowell.pile.service;
import java.util.List;
import com.jsowell.pile.domain.OrderInsuranceInfo;
/**
* 订单保险信息Service接口
*
* @author jsowell
* @date 2025-09-05
*/
public interface IOrderInsuranceInfoService {
/**
* 查询订单保险信息
*
* @param id 订单保险信息主键
* @return 订单保险信息
*/
public OrderInsuranceInfo selectOrderInsuranceInfoById(Long id);
/**
* 查询订单保险信息列表
*
* @param orderInsuranceInfo 订单保险信息
* @return 订单保险信息集合
*/
public List<OrderInsuranceInfo> selectOrderInsuranceInfoList(OrderInsuranceInfo orderInsuranceInfo);
/**
* 新增订单保险信息
*
* @param orderInsuranceInfo 订单保险信息
* @return 结果
*/
public int insertOrderInsuranceInfo(OrderInsuranceInfo orderInsuranceInfo);
/**
* 修改订单保险信息
*
* @param orderInsuranceInfo 订单保险信息
* @return 结果
*/
public int updateOrderInsuranceInfo(OrderInsuranceInfo orderInsuranceInfo);
/**
* 批量删除订单保险信息
*
* @param ids 需要删除的订单保险信息主键集合
* @return 结果
*/
public int deleteOrderInsuranceInfoByIds(Long[] ids);
/**
* 删除订单保险信息信息
*
* @param id 订单保险信息主键
* @return 结果
*/
public int deleteOrderInsuranceInfoById(Long id);
/**
* 通过订单号查询订单保险信息
* @param orderCode
* @return
*/
OrderInsuranceInfo getInsuranceInfoByOrderCode(String orderCode);
}

View File

@@ -598,4 +598,10 @@ public interface OrderBasicInfoService{
* @param connectorMark 主辅枪标记
*/
void chargingPileStartedSuccessfully(String transactionCode, String pileConnectorCode, String connectorMark);
/**
* 关闭某笔待支付订单
* @param orderCode
*/
void closeOrderByOrderCode(String orderCode);
}

View File

@@ -3,6 +3,8 @@ package com.jsowell.pile.service.impl;
import com.alibaba.fastjson2.JSON;
import com.google.common.collect.Lists;
import com.jsowell.common.constant.UserConstants;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.domain.MemberPlateNumberRelation;
import com.jsowell.pile.mapper.MemberPlateNumberRelationMapper;
@@ -86,13 +88,13 @@ public class MemberPlateNumberRelationServiceImpl implements MemberPlateNumberRe
}
// 校验vin
// String vinCode = memberPlateNumberRelation.getVinCode();
// if (StringUtils.isNotBlank(vinCode)) {
// // 判断当前vin是否被绑定
// if (UserConstants.NOT_UNIQUE.equals(checkVinCodeUnique(vinCode))) {
// throw new BusinessException(ReturnCodeEnum.CODE_THIS_VIN_HAS_BEEN_BINDING);
// }
// }
String vinCode = memberPlateNumberRelation.getVinCode();
if (StringUtils.isNotBlank(vinCode)) {
// 判断当前vin是否被绑定
if (UserConstants.NOT_UNIQUE.equals(checkVinCodeUnique(vinCode))) {
throw new BusinessException(ReturnCodeEnum.CODE_THIS_VIN_HAS_BEEN_BINDING);
}
}
return memberPlateNumberRelationMapper.updateMemberPlateNumberRelation(memberPlateNumberRelation);
}

View File

@@ -1947,8 +1947,13 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
OrderBasicInfo orderBasicInfo = this.getOrderInfoByOrderCode(afterSettleOrderDTO.getOrderCode());
String payMode = orderBasicInfo.getPayMode();
// 校验订单支付金额,消费金额,退款金额
BigDecimal orderPayAmount = afterSettleOrderDTO.getOrderPayAmount(); // 支付金额
// if (orderBasicInfo.getInsuranceAmount().compareTo(BigDecimal.ZERO) > 0) {
// // 如果该笔订单保险金额大于0则将支付金额 - 保险金额作为新的支付金额
// orderPayAmount = orderPayAmount.subtract(orderBasicInfo.getInsuranceAmount());
// }
BigDecimal orderConsumeAmount = afterSettleOrderDTO.getOrderConsumeAmount(); // 消费金额
BigDecimal orderSettleAmount = afterSettleOrderDTO.getOrderSettleAmount();
BigDecimal orderRefundAmount = afterSettleOrderDTO.getOrderRefundAmount(); // 退款金额
@@ -1979,6 +1984,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
}
}
// 校验通过将退款金额重新set为了避免数据库的退款金额没有及时更新
orderBasicInfo.setRefundAmount(orderRefundAmount);
afterSettleOrderDTO.setOrderBasicInfo(orderBasicInfo);
@@ -2008,6 +2014,8 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
*/
private List<PaymentInfo> getOrderPaymentInfoList(AfterSettleOrderDTO afterSettleOrderDTO) {
String orderCode = afterSettleOrderDTO.getOrderCode();
OrderBasicInfo orderBasicInfo = afterSettleOrderDTO.getOrderBasicInfo();
// 查询订单支付记录
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
// 选出需要分账的支付id
@@ -2038,11 +2046,11 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
logger.info("执行订单分账/新分账方法, orderCode:{}, 分账金额:{}",
afterSettleOrderDTO.getOrderCode(), afterSettleOrderDTO.getOrderSettleAmount());
// 如果是PRE环境, 直接返回
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
logger.debug("PRE环境不执行");
// return null;
}
// String env = SpringUtils.getActiveProfile();
// if (StringUtils.equalsIgnoreCase(env, "pre")) {
// logger.debug("PRE环境不执行");
// // return null;
// }
// 结算金额
BigDecimal orderSettleAmount = afterSettleOrderDTO.getOrderSettleAmount();
@@ -2052,6 +2060,12 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
// 订单编号
String orderCode = afterSettleOrderDTO.getOrderCode();
// 订单信息
OrderBasicInfo orderBasicInfo = afterSettleOrderDTO.getOrderBasicInfo();
// 保险金额(有默认值 0.00
BigDecimal insuranceAmount = orderBasicInfo.getInsuranceAmount();
// 订单是否需要分账, 结算金额必须大于0
if (orderSettleAmount == null || orderSettleAmount.compareTo(BigDecimal.ZERO) <= 0) {
logger.info("realTimeOrderSplit-订单[{}]结算金额[{}]必须大于0", afterSettleOrderDTO.getOrderCode(), orderSettleAmount);
@@ -2093,7 +2107,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
PaymentConfirmParam param = PaymentConfirmParam.builder()
.paymentId(paymentId)
.divMemberList(divMemberList)
.confirmAmt(orderSettleAmount)
.confirmAmt(orderSettleAmount.add(insuranceAmount)) // 订单结算金额 + 保险金额
.orderCode(orderCode)
.wechatAppId(appId)
.build();
@@ -2175,6 +2189,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
@Override
public List<SplitData> calculationSplitDataList(List<StationSplitConfig> stationSplitConfigList, AfterSettleOrderDTO afterSettleOrderDTO) {
List<SplitData> resultList = Lists.newArrayList();
OrderBasicInfo orderBasicInfo = afterSettleOrderDTO.getOrderBasicInfo();
// totalElecSplitRatio和totalServiceSplitRatio 都等于100%, 才进行后续操作
boolean verifySplitConfig = stationSplitConfigService.verifySplitConfig(stationSplitConfigList);
@@ -2237,6 +2252,17 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
return resultList;
}
// 如果保险金额大于0新增一条分账信息
if (orderBasicInfo.getInsuranceAmount().compareTo(BigDecimal.ZERO) > 0) {
SplitData insuranceSplit = new SplitData();
insuranceSplit.setMemberId(Constants.ZERO);
insuranceSplit.setAmount(String.valueOf(orderBasicInfo.getInsuranceAmount()));
insuranceSplit.setFeeFlag(Constants.N);
resultList.add(insuranceSplit);
}
// TODO 是否可以分多笔给同一个账户如果不行下面进行根据adapayMemberId进行金额累加
return resultList;
}
@@ -2387,11 +2413,11 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
logger.info("执行订单退款/新退款方法, orderCode:{}, 退款金额:{}, dto:{}",
afterSettleOrderDTO.getOrderCode(), afterSettleOrderDTO.getOrderRefundAmount(), JSON.toJSONString(afterSettleOrderDTO));
// 如果是PRE环境, 直接返回
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
logger.debug("PRE环境不执行");
// return;
}
// String env = SpringUtils.getActiveProfile();
// if (StringUtils.equalsIgnoreCase(env, "pre")) {
// logger.debug("PRE环境不执行");
// // return;
// }
// 退款
String mode = pileMerchantInfoService.getDelayModeByMerchantId(afterSettleOrderDTO.getMerchantId());
AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode);
@@ -4242,7 +4268,6 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
orderInfo.setPayAmount(orderPayAmount.add(payAmount));
}
orderInfo.setPayTime(new Date());
String pileSn = orderInfo.getPileSn();
// 发送启动充电指令前,再次下发计费模板
@@ -4261,7 +4286,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
}
// 获取启动金额
BigDecimal chargeAmount = computeChargeAmount(orderInfo.getMerchantId(), orderInfo.getStationId(), orderInfo.getMemberId(), orderInfo.getPayAmount());
BigDecimal chargeAmount = computeChargeAmount(orderInfo.getMerchantId(), orderInfo.getStationId(), orderInfo.getMemberId(), dto.getPayAmount());
// 发送启动指令
if (StringUtils.equals(pileConnectorDetailVO.getChargePortType(), Constants.THREE)) {
@@ -4781,6 +4806,11 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
.settleAmount(BigDecimal.ZERO)
.startType(dto.getStartType())
.build();
if (dto.getInsuranceAmount() != null) {
if (dto.getInsuranceAmount().compareTo(BigDecimal.ZERO) > 0) {
orderBasicInfo.setInsuranceAmount(dto.getInsuranceAmount());
}
}
if (StringUtils.equals(OrderTypeEnum.MERGE_CHARGE_ORDER.getValue(), dto.getOrderType())) {
// 并充订单
orderBasicInfo.setOrderType(dto.getOrderType());
@@ -5513,5 +5543,23 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
public List<SupStationStatsVO> queryOrderListByStationIdAndTime(String stationId , String startTime , String endTime) {
return orderBasicInfoMapper.queryOrderListByStationIdAndTime(stationId, startTime, endTime);
}
/**
* 关闭某笔待支付订单
* @param orderCode
*/
@Override
public void closeOrderByOrderCode(String orderCode) {
// 查询订单信息
OrderBasicInfo orderBasicInfo = getOrderInfoByOrderCode(orderCode);
String payStatus = orderBasicInfo.getPayStatus();
if (!StringUtils.equals(OrderPayStatusEnum.unpaid.getValue(), payStatus)) {
// 不是待支付状态
throw new BusinessException(ReturnCodeEnum.CODE_ORDER_INFO_ERROR);
}
// 订单状态改为 7-订单关闭
orderBasicInfo.setOrderStatus(OrderStatusEnum.ORDER_CLOSE_TIMEOUT.getValue());
updateOrderBasicInfo(orderBasicInfo);
}
}

View File

@@ -0,0 +1,100 @@
package com.jsowell.pile.service.impl;
import java.util.List;
import com.jsowell.common.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jsowell.pile.mapper.OrderInsuranceInfoMapper;
import com.jsowell.pile.domain.OrderInsuranceInfo;
import com.jsowell.pile.service.IOrderInsuranceInfoService;
/**
* 订单保险信息Service业务层处理
*
* @author jsowell
* @date 2025-09-05
*/
@Service
public class OrderInsuranceInfoServiceImpl implements IOrderInsuranceInfoService {
@Autowired
private OrderInsuranceInfoMapper orderInsuranceInfoMapper;
/**
* 查询订单保险信息
*
* @param id 订单保险信息主键
* @return 订单保险信息
*/
@Override
public OrderInsuranceInfo selectOrderInsuranceInfoById(Long id) {
return orderInsuranceInfoMapper.selectOrderInsuranceInfoById(id);
}
/**
* 查询订单保险信息列表
*
* @param orderInsuranceInfo 订单保险信息
* @return 订单保险信息
*/
@Override
public List<OrderInsuranceInfo> selectOrderInsuranceInfoList(OrderInsuranceInfo orderInsuranceInfo) {
return orderInsuranceInfoMapper.selectOrderInsuranceInfoList(orderInsuranceInfo);
}
/**
* 新增订单保险信息
*
* @param orderInsuranceInfo 订单保险信息
* @return 结果
*/
@Override
public int insertOrderInsuranceInfo(OrderInsuranceInfo orderInsuranceInfo) {
orderInsuranceInfo.setCreateTime(DateUtils.getNowDate());
return orderInsuranceInfoMapper.insertOrderInsuranceInfo(orderInsuranceInfo);
}
/**
* 修改订单保险信息
*
* @param orderInsuranceInfo 订单保险信息
* @return 结果
*/
@Override
public int updateOrderInsuranceInfo(OrderInsuranceInfo orderInsuranceInfo) {
orderInsuranceInfo.setUpdateTime(DateUtils.getNowDate());
return orderInsuranceInfoMapper.updateOrderInsuranceInfo(orderInsuranceInfo);
}
/**
* 批量删除订单保险信息
*
* @param ids 需要删除的订单保险信息主键
* @return 结果
*/
@Override
public int deleteOrderInsuranceInfoByIds(Long[] ids) {
return orderInsuranceInfoMapper.deleteOrderInsuranceInfoByIds(ids);
}
/**
* 删除订单保险信息信息
*
* @param id 订单保险信息主键
* @return 结果
*/
@Override
public int deleteOrderInsuranceInfoById(Long id) {
return orderInsuranceInfoMapper.deleteOrderInsuranceInfoById(id);
}
/**
* 通过订单号查询订单保险信息
* @param orderCode
* @return
*/
@Override
public OrderInsuranceInfo getInsuranceInfoByOrderCode(String orderCode) {
return orderInsuranceInfoMapper.getInfoByOrderCode(orderCode);
}
}

View File

@@ -160,6 +160,14 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
// 订单已支付
throw new BusinessException(ReturnCodeEnum.CODE_ORDER_IS_NOT_TO_BE_PAID_ERROR);
}
// 判断所支付的保险金额是否有变动
// if (!(dto.getInsuranceAmount().compareTo(orderInfo.getInsuranceAmount()) == 0)) {
// orderInfo.setInsuranceAmount(dto.getInsuranceAmount());
// orderInfo.setPayAmount(dto.getPayAmount());
//
// // 修改订单
// orderBasicInfoService.updateOrderBasicInfo(orderInfo);
// }
Map<String, Object> resultMap = Maps.newHashMap();
if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue())) {
// 余额支付