diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/OrderController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/OrderController.java index f992eb751..fff175623 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/OrderController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/OrderController.java @@ -114,7 +114,7 @@ public class OrderController extends BaseController { */ @PostMapping("/settleOrderForWeb") public RestApiResponse settleOrder(HttpServletRequest request, @RequestBody SettleOrderDTO dto) { - logger.info("结算订单 param:{}", JSONObject.toJSONString(dto)); + logger.info("结算订单param:{}", JSONObject.toJSONString(dto)); RestApiResponse response; try { orderService.settleOrderForWeb(dto); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java index b0df58cec..8899866fb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java @@ -1,5 +1,6 @@ package com.jsowell.pile.service.programlogic; +import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -23,6 +24,7 @@ import com.jsowell.pile.transaction.service.TransactionService; import com.jsowell.pile.vo.uniapp.MemberVO; import com.jsowell.pile.vo.uniapp.PileConnectorDetailVO; import com.jsowell.pile.vo.web.*; +import com.jsowell.wxpay.dto.WechatSendMsgDTO; import com.jsowell.wxpay.service.WxAppletRemoteService; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; @@ -105,6 +107,9 @@ public abstract class AbstractProgramLogic implements InitializingBean { @Autowired protected MemberGroupService memberGroupService; + @Autowired + private PileStationWhitelistService pileStationWhitelistService; + @Autowired protected RedisCache redisCache; @@ -162,6 +167,116 @@ public abstract class AbstractProgramLogic implements InitializingBean { */ public abstract List getOrderRefundInfoList(OrderBasicInfo orderBasicInfo); + /** + * 生成订单 返回交易流水号 + * + * @param dto + * @return + */ + protected Map generateOrderByCard(GenerateOrderDTO dto) throws Exception { + logger.info("充电桩主动申请启动充电生成订单 param:{}", JSON.toJSONString(dto)); + BigDecimal accountBalance; + String payMode; + // 判断当前用户是否为平台测试员 + PlatformTesterVO platformTesterVO = memberBasicInfoService.selectPlatformTesterStatus(dto.getMemberId()); + PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(dto.getPileSn()); + PileStationWhitelist pileStationWhitelist = pileStationWhitelistService.queryWhitelistByMemberId(String.valueOf(pileBasicInfo.getStationId()), dto.getMemberId()); + + // 运营商id + String merchantId = pileBasicInfo.getMerchantId() + ""; + + if (platformTesterVO != null && StringUtils.equals(Constants.ONE, platformTesterVO.getStatus())) { + // 是平台测试员 + accountBalance = Constants.whitelistDefaultAmount; + payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue(); + } else if (pileStationWhitelist != null) { + // 站点白名单 + accountBalance = Constants.whitelistDefaultAmount; + payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue(); + } else { + // 通过memberId获取账户余额 + MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId(), merchantId); + if (memberVO == null) { + throw new BusinessException(ReturnCodeEnum.CODE_GET_MEMBER_ACCOUNT_AMOUNT_ERROR); + } + accountBalance = memberVO.getTotalAccountAmount(); + if (accountBalance.compareTo(BigDecimal.ZERO) <= 0) { + logger.info("充电桩主动申请启动充电生成订单 余额不足, memberId:{}, MemberVO:{}", dto.getMemberId(), JSON.toJSONString(memberVO)); + throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); + } + BigDecimal defaultAmount = Constants.balancePayMaxAmount; + if (accountBalance.compareTo(defaultAmount) > 0) { + accountBalance = defaultAmount; + } + payMode = OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue(); + // accountBalance = memberVO.getTotalAccountAmount(); + // dto.setChargeAmount(totalAccountAmount); // 充电金额 + // dto.setPayMode(OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue()); // 1-余额支付 + } + dto.setChargeAmount(accountBalance); + dto.setPayMode(payMode); + /* + 生成订单 + */ + OrderBasicInfo basicInfo = generateOrder(dto); + if (basicInfo == null) { + return null; + } + if (StringUtils.equals(StartModeEnum.AUTH_CARD.getValue(), dto.getStartMode())) { + // 将卡状态改为启动锁定 + PileAuthCard pileAuthCard = PileAuthCard.builder() + .id(dto.getPileAuthCardInfo().getId()) + .logicCard(dto.getPileAuthCardInfo().getLogicCard()) + .status("2") + .build(); + pileAuthCardService.updatePileAuthCard(pileAuthCard); + } else if (StringUtils.equals(StartModeEnum.VIN_CODE.getValue(), dto.getStartMode())) { + // 将vin码改成启动锁定 2023.11.4 站点白名单和测试员不需要锁定 + if (!StringUtils.equals(OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue(), dto.getPayMode())) { + dto.getMemberPlateNumberRelation().setVinStatus("2"); + } + // 2024.02.06 不再判断锁定状态 + // memberPlateNumberRelationService.updateMemberPlateNumberRelation(dto.getMemberPlateNumberRelation()); + } + + // 组装结果集 + Map map = Maps.newHashMap(); + map.put("orderCode", basicInfo.getOrderCode()); + map.put("transactionCode", basicInfo.getTransactionCode()); + map.put("accountBalance", accountBalance); + + logger.info("生成订单 result:{}", JSON.toJSONString(map)); + + // 支付订单 + PayOrderDTO payOrderDTO = new PayOrderDTO(); + payOrderDTO.setOrderCode(basicInfo.getOrderCode()); + payOrderDTO.setPayAmount(accountBalance); + payOrderDTO.setPayMode(dto.getPayMode()); + payOrderDTO.setMemberId(dto.getMemberId()); + payOrderDTO.setStartMode(dto.getStartMode()); + // payOrderDTO.setCode(); + // payOrderDTO.setLockValue(); + // payOrderDTO.setOrderBasicInfo(basicInfo); + + // payOrder(payOrderDTO); + + String mode = pileMerchantInfoService.getDelayModeByMerchantId(merchantId); + // 获取处理逻辑 + AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode); + orderLogic.payOrder(payOrderDTO); + + // 推送小程序启动充电消息 + // 通过memberId查询openId + MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMemberId(dto.getMemberId()); + WechatSendMsgDTO sendMsgDTO = new WechatSendMsgDTO(); + sendMsgDTO.setOpenId(memberBasicInfo.getOpenId()); + sendMsgDTO.setOrderCode(basicInfo.getOrderCode()); + + wxAppletRemoteService.startChargingSendMsg(sendMsgDTO); + + return map; + } + /** * 订单支付成功 支付回调 * 支付成功后掉用这个方法 @@ -525,7 +640,7 @@ public abstract class AbstractProgramLogic implements InitializingBean { } /** - * 从redis中取出实时记录保存到表中j + * 从redis中取出实时记录保存到表中 * 当订单完成的时候调用 * 【公共方法】 */