Merge branch 'HuiFu' into dev

# Conflicts:
#	jsowell-admin/src/main/java/com/jsowell/service/OrderService.java
This commit is contained in:
2023-05-20 10:16:32 +08:00
22 changed files with 3731 additions and 32 deletions

View File

@@ -90,6 +90,37 @@ public class PayController extends BaseController {
/**
* 会员充值余额
*/
@PostMapping("/rechargeBalance")
public RestApiResponse<?> rechargeBalance(HttpServletRequest request, @RequestBody WeixinPayDTO dto) {
logger.info("微信支付 param:{}", dto.toString());
RestApiResponse<?> response;
try {
if (StringUtils.isBlank(dto.getCode()) || StringUtils.isBlank(dto.getAmount())) {
return new RestApiResponse<>(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR);
}
// 鉴权
String memberId = getMemberIdByAuthorization(request);
if (StringUtils.isBlank(memberId)) {
throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR);
}
dto.setMemberId(memberId);
String openId = memberService.getOpenIdByCode(dto.getCode());
if (StringUtils.isBlank(openId)) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR);
}
dto.setOpenId(openId);
// 充值余额 附加参数
Map<String, Object> weixinMap = memberService.rechargeBalanceWithAdapay(dto);
response = new RestApiResponse<>(ImmutableMap.of("weixinMap", weixinMap));
} catch (Exception e) {
response = new RestApiResponse<>();
}
return response;
}
/**
* 7002 支付订单
* http://localhost:8080/uniapp/pay/payOrder

View File

@@ -1,7 +1,13 @@
package com.jsowell.service;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.ImmutableMap;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.huifu.adapay.model.Payment;
import com.jsowell.adapay.common.CreateAdaPaymentParam;
import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.page.PageResponse;
@@ -9,7 +15,9 @@ import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.TitleTypeEnum;
import com.jsowell.common.enums.uniapp.BalanceChangesEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.enums.ykc.ScenarioEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.AdapayUtil;
import com.jsowell.common.util.JWTUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.id.IdUtils;
@@ -23,8 +31,10 @@ import com.jsowell.pile.dto.BindingCardDTO;
import com.jsowell.pile.dto.CreateInvoiceTitleDTO;
import com.jsowell.pile.dto.MemberRegisterAndLoginDTO;
import com.jsowell.pile.dto.MemberRegisterDTO;
import com.jsowell.pile.dto.PaymentScenarioDTO;
import com.jsowell.pile.dto.UniAppQueryMemberBalanceDTO;
import com.jsowell.pile.dto.WechatLoginDTO;
import com.jsowell.pile.dto.WeixinPayDTO;
import com.jsowell.pile.service.IMemberBasicInfoService;
import com.jsowell.pile.service.IMemberInvoiceTitleService;
import com.jsowell.pile.service.IMemberPlateNumberRelationService;
@@ -42,10 +52,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
@Service
@@ -76,6 +88,9 @@ public class MemberService {
@Autowired
private IMemberInvoiceTitleService memberInvoiceTitleService;
@Autowired
private OrderService orderService;
/**
* 校验短信验证码
* @param dto
@@ -381,4 +396,42 @@ public class MemberService {
int i = memberInvoiceTitleService.insertMemberInvoiceTitle(title);
log.info("新增{}条发票抬头", i);
}
public Map<String, Object> rechargeBalance(WeixinPayDTO dto) throws Exception {
PaymentScenarioDTO paymentScenarioDTO = new PaymentScenarioDTO();
paymentScenarioDTO.setType(ScenarioEnum.BALANCE.getValue());
paymentScenarioDTO.setMemberId(dto.getMemberId());
dto.setAttach(JSONObject.toJSONString(paymentScenarioDTO));
dto.setDescription("会员充值余额");
return orderService.weixinPayV3(dto);
}
public Map<String, Object> rechargeBalanceWithAdapay(WeixinPayDTO dto) throws Exception {
// 封装对象
CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam();
createAdaPaymentParam.setOrder_no(IdUtils.fastSimpleUUID());
createAdaPaymentParam.setPay_amt(AdapayUtil.formatAmount(dto.getAmount()));
createAdaPaymentParam.setApp_id("app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa"); // todo 后面移动到配置文件中
createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道,这里需要做修改,判断是什么渠道的请求
createAdaPaymentParam.setGoods_title("充电费用1");
createAdaPaymentParam.setGoods_desc("充电费用2");
createAdaPaymentParam.setDescription("充电费用3");
createAdaPaymentParam.setExpend(JSONObject.toJSONString( ImmutableMap.of("open_id", dto.getOpenId())));
//异步通知地址url为http/https路径服务器POST回调URL 上请勿附带参数
createAdaPaymentParam.setNotify_url("https://api.jsowellcloud.com/uniapp/pay/adapayCallback");
try {
log.info("创建汇付支付参数:{}", JSONObject.toJSONString(createAdaPaymentParam));
Map<String, Object> response = Payment.create(BeanMap.create(createAdaPaymentParam));
log.info("创建汇付支付参数反参:{}", JSONObject.toJSONString(response));
if (response != null && !response.isEmpty()) {
JSONObject jsonObject = JSONObject.parseObject(response.get("expend").toString());
JSONObject pay_info = jsonObject.getJSONObject("pay_info");
Map<String, Object> resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {});
return resultMap;
}
} catch (BaseAdaPayException e) {
log.error("汇付-获取支付对象发生异常", e);
}
return null;
}
}

View File

@@ -1,11 +1,16 @@
package com.jsowell.service;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.huifu.adapay.model.Payment;
import com.jsowell.adapay.common.CreateAdaPaymentParam;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.vo.AuthorizedDeptVO;
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
@@ -24,6 +29,7 @@ import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.enums.ykc.ScenarioEnum;
import com.jsowell.common.enums.ykc.StartTypeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.AdapayUtil;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.SecurityUtils;
import com.jsowell.common.util.StringUtils;
@@ -66,7 +72,6 @@ import com.jsowell.pile.transaction.service.TransactionService;
import com.jsowell.pile.vo.base.OrderAmountDetailVO;
import com.jsowell.pile.vo.base.OrderPeriodAmountVO;
import com.jsowell.pile.vo.base.PileInfoVO;
import com.jsowell.pile.vo.base.StationInfoVO;
import com.jsowell.pile.vo.uniapp.InvoiceRecordVO;
import com.jsowell.pile.vo.uniapp.MemberVO;
import com.jsowell.pile.vo.uniapp.OrderVO;
@@ -83,6 +88,7 @@ import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
@@ -151,6 +157,8 @@ public class OrderService {
@Autowired
private RedisCache redisCache;
private List<String> stationIdList = Lists.newArrayList("1", "2");
/**
* 生成订单
*
@@ -191,7 +199,42 @@ public class OrderService {
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
// 微信支付
dto.setOrderBasicInfo(orderInfo);
Map<String, Object> weixinMap = wechatPayOrder(dto);
Map<String, Object> weixinMap = null;
if (stationIdList.contains("all") || stationIdList.contains(orderInfo.getStationId())) {
weixinMap = adapayPayOrder(dto);
} else {
weixinMap = wechatPayOrder(dto);
}
// 返回微信支付参数
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) { // 支付宝支付
// TODO 返回支付宝支付参数
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付
// 白名单支付可以直接调支付回调方法
dto.setPayAmount(new BigDecimal("500"));
whiteListPayOrder(dto);
}
return resultMap;
}
public Map<String, Object> payOrderWithAdapay(PayOrderDTO dto) {
OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode());
if (orderInfo == null) {
throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_NULL_ERROR);
}
if (!StringUtils.equals(orderInfo.getPayStatus(), "0")) {
// 订单已支付
throw new BusinessException(ReturnCodeEnum.CODE_ORDER_IS_NOT_TO_BE_PAID_ERROR);
}
Map<String, Object> resultMap = Maps.newHashMap();
if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) {
// 余额支付
balancePayOrder(dto);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
// 微信支付 使用adapay
dto.setOrderBasicInfo(orderInfo);
Map<String, Object> weixinMap = adapayPayOrder(dto);
// 返回微信支付参数
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) { // 支付宝支付
@@ -206,7 +249,6 @@ public class OrderService {
/**
* 白名单支付订单逻辑
*
* @param dto
*/
private void whiteListPayOrder(PayOrderDTO dto) {
@@ -221,14 +263,70 @@ public class OrderService {
payOrderSuccessCallback(callbackDTO);
}
/**
* 使用汇付支付
* @param dto
* @return
*/
private Map<String, Object> adapayPayOrder(PayOrderDTO dto) {
log.info("===============使用汇付支付");
// 相同参数重复请求,返回同一个支付对象
String redisKey = "ADAPAY_ORDER_PARAM:" + dto.getOrderCode();
Map<String, Object> cacheObject = redisCache.getCacheObject(redisKey);
if (cacheObject != null) {
return cacheObject;
}
OrderBasicInfo orderInfo = dto.getOrderBasicInfo();
if (orderInfo == null) {
// 订单为空重新查询
orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode());
}
// 获取openId
String openId = memberService.getOpenIdByCode(dto.getCode());
if (StringUtils.isBlank(openId)) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR);
}
// 封装对象
CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam();
createAdaPaymentParam.setOrder_no(orderInfo.getOrderCode());
// createAdaPaymentParam.setPay_amt(new DecimalFormat("#.00").format(dto.getPayAmount()));
createAdaPaymentParam.setPay_amt(AdapayUtil.formatAmount(dto.getPayAmount()));
createAdaPaymentParam.setApp_id("app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa"); // todo 后面移动到配置文件中
createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道,这里需要做修改,判断是什么渠道的请求
createAdaPaymentParam.setGoods_title("充电费用1");
createAdaPaymentParam.setGoods_desc("充电费用2"); // 这个字段是微信支付凭证的商品名
createAdaPaymentParam.setDescription("充电费用3");
createAdaPaymentParam.setExpend(JSONObject.toJSONString( ImmutableMap.of("open_id", openId)));
try {
log.info("创建汇付支付参数:{}", JSONObject.toJSONString(createAdaPaymentParam));
Map<String, Object> response = Payment.create(BeanMap.create(createAdaPaymentParam));
if (response != null && !response.isEmpty()) {
JSONObject jsonObject = JSONObject.parseObject(response.get("expend").toString());
JSONObject pay_info = jsonObject.getJSONObject("pay_info");
Map<String, Object> resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {
});
if (resultMap != null) {
// 表示已经获取到支付参数了,后续再有支付请求就拒绝
redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES);
}
return resultMap;
}
} catch (BaseAdaPayException e) {
log.error("汇付-获取支付对象发生异常", e);
}
return null;
}
/**
* 微信支付订单逻辑 获取支付参数
*
* @param dto
* @return
* @throws Exception
*/
private Map<String, Object> wechatPayOrder(PayOrderDTO dto) throws Exception {
// 相同参数重复请求,返回同一个支付对象
String redisKey = "WECHAT_PAY_ORDER_PARAM:" + dto.getOrderCode();
Map<String, Object> cacheObject = redisCache.getCacheObject(redisKey);
if (cacheObject != null) {
@@ -264,7 +362,6 @@ public class OrderService {
/**
* 余额支付订单逻辑
*
* @param dto
*/
private void balancePayOrder(PayOrderDTO dto) {
@@ -689,7 +786,6 @@ public class OrderService {
/**
* 查询订单详情信息
*
* @param orderCode 订单编号
* @return
*/
@@ -778,7 +874,7 @@ public class OrderService {
// 使用余额支付
payInfo.setPayMode(OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue());
payInfo.setPayModeDesc(OrderPayModeEnum.PAYMENT_OF_BALANCE.getLabel());
} else if (StringUtils.equals(payMode, OrderPayRecordEnum.WECHATPAY_PAYMENT.getValue())) {
} else if (StringUtils.equals(payMode, OrderPayRecordEnum.WECHATPAY_PAYMENT.getValue())){
// 使用微信支付
payInfo.setPayMode(OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue());
payInfo.setPayModeDesc(OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getLabel());
@@ -788,7 +884,7 @@ public class OrderService {
payInfo.setOutTradeNo(wxpayCallbackRecord.getOutTradeNo());
payInfo.setTransactionId(wxpayCallbackRecord.getTransactionId());
}
} else if (StringUtils.equals(payMode, OrderPayRecordEnum.WHITELIST_PAYMENT.getValue())) {
} else if (StringUtils.equals(payMode, OrderPayRecordEnum.WHITELIST_PAYMENT.getValue())){
// 使用白名单支付
payInfo.setPayMode(OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue());
payInfo.setPayModeDesc(OrderPayModeEnum.PAYMENT_OF_WHITELIST.getLabel());
@@ -831,7 +927,6 @@ public class OrderService {
/**
* 获取小程序订单详情
*
* @param orderCode
* @return
*/
@@ -907,7 +1002,7 @@ public class OrderService {
// monitorDataList是按照时间倒序的chargingDataList需要按照时间正序
Collections.reverse(chargingDataList);
vo.setChargingDataList(chargingDataList);
}
}
OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderCode);
if (orderDetail != null) {
@@ -930,7 +1025,6 @@ public class OrderService {
/**
* 根据订单号查询充电桩启动状态
*
* @param orderCode
* @return
*/
@@ -950,7 +1044,6 @@ public class OrderService {
/**
* 人工结算订单
*
* @param dto
*/
public boolean manualSettlementOrder(ManualSettlementDTO dto) {
@@ -1004,7 +1097,6 @@ public class OrderService {
/**
* 当前登录会员 获取支付方式
*
* @param dto
*/
public List<PayModeVO> getPayMode(GetPayModeDTO dto) {
@@ -1040,9 +1132,11 @@ public class OrderService {
public List<OrderVO> queryUninvoicedOrderList(QueryOrderDTO dto) {
int i = 15;
// 查询最近15天完成的订单
LocalDateTime dateTime = LocalDateTime.now().plusDays(-i);
List<OrderVO> orderList = orderBasicInfoService.getListByMemberIdAndOrderStatus(dto.getMemberId(), Lists.newArrayList("6"), dateTime, dto.getStationId());
List<OrderVO> orderList = orderBasicInfoService.getListByMemberIdAndOrderStatus(dto.getMemberId(), Lists.newArrayList("6"), dateTime);
// 过滤掉订单金额为0的
orderList = orderList.stream()
.filter(x -> x.getOrderAmount().compareTo(BigDecimal.ZERO) > 0)
@@ -1050,6 +1144,7 @@ public class OrderService {
if (CollectionUtils.isEmpty(orderList)) {
return orderList;
}
// 查询最近60天申请开票记录
QueryInvoiceRecordDTO build = QueryInvoiceRecordDTO.builder()
.memberId(dto.getMemberId())
@@ -1059,37 +1154,22 @@ public class OrderService {
if (CollectionUtils.isEmpty(orderInvoiceRecords)) {
return orderList;
}
// 排除掉已经申请过的订单
List<String> orderCodeList = orderInvoiceRecords.stream() // 转化为 Stream
.map(OrderInvoiceRecord::getOrderCodes) // 获取 OrderInvoiceRecord 中的 orderCodes 字符串
.flatMap(str -> Arrays.stream(str.split(","))) // 分隔逗号并转化为 Stream
.collect(Collectors.toList()); // 收集为 List<String>
orderList = orderList.stream()
.filter(x -> !orderCodeList.contains(x.getOrderCode()))
.collect(Collectors.toList());
return orderList;
}
public List<StationInfoVO> queryUninvoicedStationList(QueryOrderDTO dto) {
dto.setStationId(null);
List<OrderVO> orderVOS = queryUninvoicedOrderList(dto);
if (CollectionUtils.isEmpty(orderVOS)) {
return Lists.newArrayList();
}
// 根据站点分组
List<StationInfoVO> stationInfoVOS = orderVOS.stream()
.map(
x -> StationInfoVO.builder()
.stationId(x.getStationId())
.stationName(x.getStationName())
.build()
).distinct().collect(Collectors.toList());
return stationInfoVOS;
return orderList;
}
/**
* 申请开票
*
* @param dto
*/
public void applyOrderInvoice(ApplyOrderInvoiceDTO dto) {
@@ -1168,4 +1248,7 @@ public class OrderService {
.build();
}
public void adapayCallback(HttpServletRequest request, WechatPayNotifyParameter body) {
log.info("");
}
}