Merge branch 'dev' into dev-g

This commit is contained in:
Guoqs
2025-06-26 15:50:09 +08:00
22 changed files with 794 additions and 53 deletions

View File

@@ -21,6 +21,9 @@ public class AdapayMemberInfoDTO {
private String adapayMemberId;
// 结算账户id
private String settleAccountId;
//////////下面是创建结算账户参数///////////
// 银行卡号
private String cardId;

View File

@@ -1517,4 +1517,53 @@ public class AdapayService {
return totalSplitAmount;
}
/**
* 创建结算账户
* @param dto
* @throws BaseAdaPayException
*/
public void createBankAccount(SettleAccountDTO dto) throws BaseAdaPayException {
// 根据运营商id 查出现有的adapayMemberId
String merchantId = dto.getMerchantId();
// 新写一个查询方法,查询最近一条的记录(因为之前已经删除过数据,使用原查询方法查不到数据)
AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectRecentInfoByMerchantId(merchantId);
if (adapayMemberAccount == null) {
return;
}
String adapayMemberId = adapayMemberAccount.getAdapayMemberId();
// 查询该商户的wxAppId
String wxAppId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId);
// 创建结算账户请求
Map<String, Object> settleAccount = this.createSettleAccountRequest(dto, adapayMemberId, wxAppId);
// 保存结果
if (settleAccount == null || StringUtils.equals((String) settleAccount.get("status"), "failed")) {
String errorMsg = settleAccount == null ? "创建汇付结算账户失败" : (String) settleAccount.get("error_msg");
throw new BusinessException("00500001", errorMsg);
}
String settleAccountId = (String) settleAccount.get("id");
// 保存到数据库
adapayMemberAccount = new AdapayMemberAccount();
adapayMemberAccount.setMerchantId(dto.getMerchantId());
adapayMemberAccount.setAdapayMemberId(adapayMemberId);
adapayMemberAccount.setSettleAccountId(settleAccountId);
adapayMemberAccount.setStatus(Constants.ONE);
adapayMemberAccountService.insertAdapayMemberAccount(adapayMemberAccount);
}
/**
* 删除结算账户(先删除汇付的结算账户,再逻辑删除数据库)
* @param dto
* @throws BaseAdaPayException
*/
public void deleteSettleAccount(AdapayMemberInfoDTO dto) throws BaseAdaPayException {
// 查询appId
String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(dto.getMerchantId());
// 1、新建删除请求 2、如果成功再将数据库中的记录删除
this.createDeleteSettleAccountRequest(dto.getAdapayMemberId(), dto.getSettleAccountId(), wechatAppId);
// 删除数据库中的记录
adapayMemberAccountService.deleteAccountByMerchantId(dto.getMerchantId());
}
}

View File

@@ -35,6 +35,21 @@ public class OrderBasicInfo {
*/
private String orderStatus;
/**
* 订单类型1-普通订单2-并充订单)
*/
private String orderType;
/**
* 并充订单序号
*/
private String mergeChargeNumber;
/**
* 主枪枪编号
*/
private String mainConnectorCode;
/**
* 会员id
*/

View File

@@ -88,6 +88,26 @@ public class GenerateOrderDTO extends BasicPileDTO{
*/
private MemberPlateNumberRelation MemberPlateNumberRelation;
/**
* 鉴权成功标识
*/
private boolean verifyFlag;
/**
* 订单类型1-普通订单2-并充订单)
*/
private String orderType;
/**
* 并充序号(并充启动时有值)
*/
private String mergeChargeNumber;
/**
* 主枪枪编码(并充启动时有值)
*/
private String mainConnectorCode;
/**
* 车牌号码
*/

View File

@@ -0,0 +1,47 @@
package com.jsowell.pile.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 鉴权并充订单DTO
*
* @author Lemon
* @Date 2025/6/12 14:32:38
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class VerifyMergeChargeOrderDTO {
// 桩编号
private String pileSn;
// 枪号
private String connectorCode;
// 枪口编号
private String pileConnectorCode;
// 启动方式
// 0x01 表示通过刷卡启动充电
// 0x03 表示vin码启动充电
private String startMode;
// 物理卡号
private String physicsCard;
// vin
private String vinCode;
// 主辅枪标记
// 0x00 主枪
// 0x01 辅枪
private String connectorMark;
// 并充序号
// 由桩生成:年月日时分秒,多个枪并充时上送并充序号一致,表示为同一次并充操作
private String mergeChargeNumber;
}

View File

@@ -119,4 +119,17 @@ public interface AdapayMemberAccountMapper {
void updateAdapayMemberAccountByMemberId(AdapayMemberAccount adapayMemberAccount);
AdapayMemberAccount selectByMemberId(String memberId);
/**
* 通过运营商id删除账户信息
* @param merchantId
*/
void deleteAccountByMerchantId(String merchantId);
/**
* 根据运营商id查询最近一条的信息
* @param merchantId
* @return
*/
AdapayMemberAccount selectRecentInfoByMerchantId(String merchantId);
}

View File

@@ -109,4 +109,17 @@ public interface AdapayMemberAccountService {
* @return
*/
String selectMerchantNameByAdapayMemberId(String adapayMemberId);
/**
* 根据运营商id删除记录
* @param merchantId
*/
void deleteAccountByMerchantId(String merchantId);
/**
* 根据运营商Id查询最近一条的信息
* @param merchantId
* @return
*/
AdapayMemberAccount selectRecentInfoByMerchantId(String merchantId);
}

View File

@@ -566,4 +566,11 @@ public interface OrderBasicInfoService{
* @param dto
*/
void setOrderSupplementAmount(OrderSupplementAmountDTO dto);
/**
* 鉴权并充订单
* @param dto
* @return
*/
Map<String, Object> verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception;
}

View File

@@ -278,44 +278,44 @@ public class PileRemoteService {
* @param dto
* @return
*/
public boolean publishBillingTemplateOld(PublishBillingTemplateDTO dto) {
// 获取计费模板信息
BillingTemplateVO billingTemplateVO = pileBillingTemplateService.selectBillingTemplateByTemplateId(dto.getTemplateId());
if (billingTemplateVO == null) {
log.warn("获取计费模板信息, 通过模板id:{}查询计费模板为null", dto.getTemplateId());
return false;
}
// 会员优惠计费模板不发布
if (Constants.ONE.equals(billingTemplateVO.getMemberFlag())) {
return false;
}
// 电单车计费模板不发布
if (Constants.TWO.equals(billingTemplateVO.getDeviceType())) {
return false;
}
// 更新计费模板的发布时间
PileBillingTemplate pileBillingTemplate = new PileBillingTemplate();
pileBillingTemplate.setId(Long.valueOf(billingTemplateVO.getTemplateId()));
pileBillingTemplate.setPublishTime(new Date());
pileBillingTemplateService.updatePileBillingTemplate(pileBillingTemplate);
// 获取到站点下所有的桩
List<PileDetailVO> pileList = pileBasicInfoService.selectPileListByStationIds(Lists.newArrayList(Long.valueOf(dto.getStationId())));
if (CollectionUtils.isNotEmpty(pileList)) {
// 删除缓存
List<String> collect = pileList.parallelStream()
.map(vo -> CacheConstants.BILLING_TEMPLATE_BY_PILE_SN + vo.getPileSn())
.collect(Collectors.toList());
redisCache.deleteObject(collect);
// 下发计费模板, 电单车不支持
if (StringUtils.equals(billingTemplateVO.getDeviceType(), Constants.ONE)) {
// 下发指令
pileList.parallelStream().forEach(pileInfoVO -> publishPileBillingTemplate(pileInfoVO.getPileSn(), billingTemplateVO));
}
}
// 修改计费模板状态
pileBillingTemplateService.changeStationTemplate(dto.getStationId(), dto.getTemplateId(), billingTemplateVO.getDeviceType(), billingTemplateVO.getMemberFlag());
return true;
}
// public boolean publishBillingTemplateOld(PublishBillingTemplateDTO dto) {
// // 获取计费模板信息
// BillingTemplateVO billingTemplateVO = pileBillingTemplateService.selectBillingTemplateByTemplateId(dto.getTemplateId());
// if (billingTemplateVO == null) {
// log.warn("获取计费模板信息, 通过模板id:{}查询计费模板为null", dto.getTemplateId());
// return false;
// }
// // 会员优惠计费模板不发布
// if (Constants.ONE.equals(billingTemplateVO.getMemberFlag())) {
// return false;
// }
// // 电单车计费模板不发布
// if (Constants.TWO.equals(billingTemplateVO.getDeviceType())) {
// return false;
// }
// // 更新计费模板的发布时间
// PileBillingTemplate pileBillingTemplate = new PileBillingTemplate();
// pileBillingTemplate.setId(Long.valueOf(billingTemplateVO.getTemplateId()));
// pileBillingTemplate.setPublishTime(new Date());
// pileBillingTemplateService.updatePileBillingTemplate(pileBillingTemplate);
// // 获取到站点下所有的桩
// List<PileDetailVO> pileList = pileBasicInfoService.selectPileListByStationIds(Lists.newArrayList(Long.valueOf(dto.getStationId())));
// if (CollectionUtils.isNotEmpty(pileList)) {
// // 删除缓存
// List<String> collect = pileList.parallelStream()
// .map(vo -> CacheConstants.BILLING_TEMPLATE_BY_PILE_SN + vo.getPileSn())
// .collect(Collectors.toList());
// redisCache.deleteObject(collect);
// // 下发计费模板, 电单车不支持
// if (StringUtils.equals(billingTemplateVO.getDeviceType(), Constants.ONE)) {
// // 下发指令
// pileList.parallelStream().forEach(pileInfoVO -> publishPileBillingTemplate(pileInfoVO.getPileSn(), billingTemplateVO));
// }
// }
// // 修改计费模板状态
// pileBillingTemplateService.changeStationTemplate(dto.getStationId(), dto.getTemplateId(), billingTemplateVO.getDeviceType(), billingTemplateVO.getMemberFlag());
// return true;
// }
/**
* 下发计费模板

View File

@@ -259,5 +259,19 @@ public class AdapayMemberAccountServiceImpl implements AdapayMemberAccountServic
return pileMerchantInfo.getMerchantName();
}
@Override
public void deleteAccountByMerchantId(String merchantId) {
adapayMemberAccountMapper.deleteAccountByMerchantId(merchantId);
}
/**
* 根据运营商id查询最近一条的信息
* @param merchantId
* @return
*/
@Override
public AdapayMemberAccount selectRecentInfoByMerchantId(String merchantId) {
return adapayMemberAccountMapper.selectRecentInfoByMerchantId(merchantId);
}
}

View File

@@ -4558,6 +4558,12 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
*/
@Override
public OrderBasicInfo saveOrderForEV(GenerateOrderDTO dto) throws ParseException {
String pileConnectorCode = dto.getPileSn() + dto.getConnectorCode();
// 先根据枪口号查询是否有未启动的并充订单
OrderBasicInfo orderBasicInfo = selectNotStartMergeOrder(pileConnectorCode);
if (orderBasicInfo != null) {
return orderBasicInfo;
}
String orderCode = generateNewOrderCode();
String transactionCode = dto.getTransactionCode();
if (StringUtils.isBlank(transactionCode)) {
@@ -4574,16 +4580,17 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
String merchantId = pileStationInfo != null ? String.valueOf(pileStationInfo.getMerchantId()) : "";
String plateNumber = dto.getPlateNumber() != null ? dto.getPlateNumber() : "";
// 订单基本信息
OrderBasicInfo orderBasicInfo = OrderBasicInfo.builder()
orderBasicInfo = OrderBasicInfo.builder()
.orderCode(orderCode)
.transactionCode(transactionCode)
.orderStatus(OrderStatusEnum.NOT_START.getValue())
.orderType(OrderTypeEnum.NORMAL_ORDER.getValue()) // 订单类型1-普通订单2-并充订单)
.memberId(dto.getMemberId())
.stationId(stationId)
.merchantId(merchantId)
.pileSn(dto.getPileSn())
.connectorCode(dto.getConnectorCode())
.pileConnectorCode(dto.getPileSn() + dto.getConnectorCode())
.pileConnectorCode(pileConnectorCode)
.startMode(dto.getStartMode())
.payStatus(Constants.ZERO)
// .payAmount(dto.getChargeAmount()) // 支付完成后填入支付金额
@@ -4594,6 +4601,18 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
.settleAmount(BigDecimal.ZERO)
.startType(dto.getStartType())
.build();
if (StringUtils.equals(OrderTypeEnum.MERGE_CHARGE_ORDER.getValue(), dto.getOrderType())) {
// 并充订单
orderBasicInfo.setOrderType(dto.getOrderType());
if (StringUtils.isNotBlank(dto.getMergeChargeNumber())) {
// 并充订单序号
orderBasicInfo.setMergeChargeNumber(dto.getMergeChargeNumber());
}
if (StringUtils.isNotBlank(dto.getMainConnectorCode())) {
// 主枪枪编号
orderBasicInfo.setMainConnectorCode(dto.getMainConnectorCode());
}
}
if (StringUtils.equals(dto.getStartMode(), StartModeEnum.AUTH_CARD.getValue())) {
// 鉴权卡启动
orderBasicInfo.setLogicCard(dto.getPileAuthCardInfo().getLogicCard());
@@ -4668,6 +4687,19 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
return orderBasicInfo;
}
/**
* 查询未启动的并充订单
* @param pileConnectorCode
* @return
*/
private OrderBasicInfo selectNotStartMergeOrder(String pileConnectorCode) {
OrderBasicInfo orderBasicInfo = new OrderBasicInfo();
orderBasicInfo.setOrderType(OrderTypeEnum.MERGE_CHARGE_ORDER.getValue());
orderBasicInfo.setOrderStatus(OrderStatusEnum.NOT_START.getValue());
orderBasicInfo.setPileConnectorCode(pileConnectorCode);
return getOrderBasicInfo(orderBasicInfo);
}
/**
* 保存电单车订单信息
* @param dto
@@ -5158,5 +5190,55 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
logger.info("设置订单待补缴金额, orderCode:{}, supplementAmount:{}, 备注:{}", dto.getOrderCode(), dto.getSupplementAmount(), dto.getRemark());
}
/**
* 鉴权并充订单
* @param dto
* @return
*/
@Override
public Map<String, Object> verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception {
Map<String, Object> map = new LinkedHashMap<>();
GenerateOrderDTO generateOrderDTO = new GenerateOrderDTO();
generateOrderDTO.setPileSn(dto.getPileSn());
generateOrderDTO.setConnectorCode(dto.getConnectorCode());
generateOrderDTO.setMergeChargeNumber(dto.getMergeChargeNumber());
// 判断是否为主枪
if (StringUtils.equals(Constants.DOUBLE_ZERO, dto.getConnectorMark())) {
// 主枪
generateOrderDTO.setMainConnectorCode(dto.getPileConnectorCode());
}
// 区分是卡还是vin充电
String startMode = dto.getStartMode();
if (StringUtils.equals(Constants.ZERO_ONE, startMode)) {
// 刷卡鉴权
// 根据卡号查询用户信息
String physicsCard = dto.getPhysicsCard();
PileAuthCard pileAuthCardInfo = pileAuthCardService.selectCardInfoByLogicCard(physicsCard);
if (pileAuthCardInfo == null) {
// 未查到此卡信息
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO);
}
generateOrderDTO.setPileAuthCardInfo(pileAuthCardInfo);
generateOrderDTO.setStartMode(StartModeEnum.AUTH_CARD.getValue());
generateOrderDTO.setMemberId(pileAuthCardInfo.getMemberId());
}else if (StringUtils.equals(Constants.ZERO_THREE, startMode)) {
// vin鉴权
// 根据vin查询绑定用户信息
String vinCode = dto.getVinCode();
MemberPlateNumberRelation memberInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode);
if (memberInfo == null) {
throw new BusinessException(ReturnCodeEnum.CODE_THIS_VIN_INFO_IS_NULL);
}
generateOrderDTO.setMemberPlateNumberRelation(memberInfo);
generateOrderDTO.setStartMode(StartModeEnum.VIN_CODE.getValue());
generateOrderDTO.setMemberId(memberInfo.getMemberId());
}
// 鉴权通过,生成订单启动充电
map = generateOrderByCard(generateOrderDTO);
return map;
}
}