|
|
@@ -3,6 +3,7 @@ package com.fs.hisStore.service.impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
import java.time.ZonedDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
@@ -14,6 +15,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
|
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
|
|
import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.alibaba.fastjson.TypeReference;
|
|
|
@@ -30,7 +32,9 @@ import com.fs.common.utils.StringUtils;
|
|
|
import com.fs.common.utils.ip.IpUtils;
|
|
|
import com.fs.company.domain.Company;
|
|
|
import com.fs.company.domain.CompanyUser;
|
|
|
+import com.fs.company.domain.RechargeRecord;
|
|
|
import com.fs.company.mapper.CompanyConfigMapper;
|
|
|
+import com.fs.company.mapper.RechargeRecordMapper;
|
|
|
import com.fs.company.service.ICompanyService;
|
|
|
import com.fs.company.service.ICompanyUserService;
|
|
|
import com.fs.core.config.WxMaConfiguration;
|
|
|
@@ -53,14 +57,19 @@ import com.fs.his.service.IFsUserService;
|
|
|
import com.fs.his.service.IFsUserWxService;
|
|
|
import com.fs.his.utils.ConfigUtil;
|
|
|
import com.fs.hisStore.config.StoreConfig;
|
|
|
+import com.fs.hisStore.domain.FsStoreOrderScrm;
|
|
|
+import com.fs.hisStore.enums.OrderInfoEnum;
|
|
|
import com.fs.hisStore.enums.SysConfigEnum;
|
|
|
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
|
|
|
import com.fs.hisStore.param.*;
|
|
|
import com.fs.hisStore.vo.FsStorePaymentUsetVo;
|
|
|
import com.fs.huifuPay.domain.HuiFuCreateOrder;
|
|
|
import com.fs.huifuPay.domain.HuifuCreateOrderResult;
|
|
|
import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
|
|
|
import com.fs.huifuPay.service.HuiFuService;
|
|
|
+import com.fs.live.domain.LiveOrder;
|
|
|
import com.fs.live.domain.LiveOrderPayment;
|
|
|
+import com.fs.live.mapper.LiveOrderMapper;
|
|
|
import com.fs.live.mapper.LiveOrderPaymentMapper;
|
|
|
import com.fs.pay.pay.dto.WxJspayDTO;
|
|
|
import com.fs.hisStore.vo.FsStorePaymentStatisticsVO;
|
|
|
@@ -126,7 +135,14 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
private LiveOrderPaymentMapper liveOrderPaymentMapper;
|
|
|
@Autowired
|
|
|
private IFsUserScrmService userService;
|
|
|
+ @Autowired
|
|
|
+ private RechargeRecordMapper rechargeRecordMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsStoreOrderScrmMapper storeOrderScrmMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private LiveOrderMapper liveOrderMapper;
|
|
|
@Autowired
|
|
|
private ICompanyUserService companyUserService;
|
|
|
@Autowired
|
|
|
@@ -1134,6 +1150,11 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
if (Objects.isNull(user)) {
|
|
|
throw new CustomException("用户不存在");
|
|
|
}
|
|
|
+ if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()) {
|
|
|
+ if (user.getRechargeBalance().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ throw new CustomException("余额不足!请先充值。");
|
|
|
+ }
|
|
|
+ }
|
|
|
String type = null;
|
|
|
FsPayConfig payConfig = new FsPayConfig();
|
|
|
if (PaymentMethodEnum.WX_APP == payOrderParam.getPaymentMethod()) {
|
|
|
@@ -1148,7 +1169,7 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
String json = configService.selectConfigByKey("his.pay");
|
|
|
PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
|
|
|
payConfig.setType(payConfigDTO.getType());
|
|
|
- } else {
|
|
|
+ }else if(!(PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod())){
|
|
|
if (StringUtils.isBlank(payOrderParam.getAppId())) {
|
|
|
throw new IllegalArgumentException("appId不能为空");
|
|
|
}
|
|
|
@@ -1183,20 +1204,170 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 创建记录 TODO 根据type创建支付
|
|
|
FsStorePaymentScrm storePayment = new FsStorePaymentScrm();
|
|
|
+
|
|
|
+ // 1. 根据业务类型创建对应的支付对象
|
|
|
if (payOrderParam.getBusinessType().getPrefix().equals("live")) {
|
|
|
+ // 处理直播业务支付
|
|
|
LiveOrderPayment liveOrderPayment = createLiveStorePayment(payConfig, user, payOrderParam);
|
|
|
BeanUtils.copyProperties(liveOrderPayment, storePayment);
|
|
|
+
|
|
|
+ // 处理储值支付
|
|
|
+ if (isRechargePayment(payOrderParam)) {
|
|
|
+ return processLiveRechargePayment(liveOrderPayment, user);
|
|
|
+ }
|
|
|
} else {
|
|
|
+ // 处理商城业务支付
|
|
|
storePayment = createStorePaymentScrm(payConfig, user, payOrderParam);
|
|
|
- }
|
|
|
|
|
|
+ // 处理储值支付
|
|
|
+ if (isRechargePayment(payOrderParam)) {
|
|
|
+ return processStoreRechargePayment(storePayment, user);
|
|
|
+ }
|
|
|
+ }
|
|
|
// 根据配置类型创建第三方支付订单
|
|
|
return createThirdPartyPaymentScrm(payConfig, storePayment, user, payOrderParam);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 判断是否为储值支付
|
|
|
+ * @param payOrderParam 支付订单参数
|
|
|
+ * @return true:储值支付 false:其他支付方式
|
|
|
+ */
|
|
|
+ private boolean isRechargePayment(PayOrderParam payOrderParam) {
|
|
|
+ return PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理直播储值支付
|
|
|
+ * @param liveOrderPayment 直播订单支付信息
|
|
|
+ * @param user 用户信息
|
|
|
+ * @return 支付处理结果
|
|
|
+ */
|
|
|
+ private R processLiveRechargePayment(LiveOrderPayment liveOrderPayment, FsUserScrm user) {
|
|
|
+ // 查询直播订单信息
|
|
|
+ LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderId(liveOrderPayment.getBusinessId());
|
|
|
+ Company company = companyService.selectCompanyById(liveOrder.getCompanyId());
|
|
|
+
|
|
|
+ // 扣减用户储值余额
|
|
|
+ deductUserRechargeBalance(user, liveOrder.getPayMoney());
|
|
|
+
|
|
|
+ // 更新直播订单状态
|
|
|
+ updateLiveOrderStatus(liveOrder);
|
|
|
+
|
|
|
+ // 创建消费记录
|
|
|
+ return R.ok().put("data", createConsumptionRecord(
|
|
|
+ liveOrder.getOrderId(),
|
|
|
+ liveOrder.getOrderCode(),
|
|
|
+ user.getUserId(),
|
|
|
+ user.getNickName(),
|
|
|
+ liveOrderPayment.getPayMoney(),
|
|
|
+ company
|
|
|
+ ));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理商城储值支付
|
|
|
+ * @param storePayment 商城订单支付信息
|
|
|
+ * @param user 用户信息
|
|
|
+ * @return 支付处理结果
|
|
|
+ */
|
|
|
+ private R processStoreRechargePayment(FsStorePaymentScrm storePayment, FsUserScrm user) {
|
|
|
+ // 查询商城订单信息
|
|
|
+ FsStoreOrderScrm fsStoreOrderScrm = storeOrderScrmMapper.selectFsStoreOrderById(storePayment.getOrderId());
|
|
|
+ Company company = companyService.selectCompanyById(fsStoreOrderScrm.getCompanyId());
|
|
|
+
|
|
|
+ // 扣减用户储值余额
|
|
|
+ deductUserRechargeBalance(user, storePayment.getPayMoney());
|
|
|
+
|
|
|
+ // 更新商城订单状态
|
|
|
+ updateStoreOrderStatus(fsStoreOrderScrm);
|
|
|
+
|
|
|
+ // 创建消费记录
|
|
|
+ return R.ok().put("data", createConsumptionRecord(
|
|
|
+ fsStoreOrderScrm.getId(),
|
|
|
+ fsStoreOrderScrm.getOrderCode(),
|
|
|
+ user.getUserId(),
|
|
|
+ user.getNickName(),
|
|
|
+ storePayment.getPayMoney(),
|
|
|
+ company
|
|
|
+ ));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 扣减用户储值余额
|
|
|
+ * @param user 用户信息
|
|
|
+ * @param amount 扣减金额
|
|
|
+ */
|
|
|
+ private void deductUserRechargeBalance(FsUserScrm user, BigDecimal amount) {
|
|
|
+ user.setRechargeBalance(user.getRechargeBalance().subtract(amount));
|
|
|
+ userService.updateFsUser(user);
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 更新直播订单状态
|
|
|
+ * @param liveOrder 直播订单
|
|
|
+ */
|
|
|
+ private void updateLiveOrderStatus(LiveOrder liveOrder) {
|
|
|
+ liveOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
|
|
|
+ liveOrder.setPayTime(LocalDateTime.now());
|
|
|
+ liveOrder.setIsPay("1");
|
|
|
+ liveOrderMapper.updateLiveOrder(liveOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新商城订单状态
|
|
|
+ * @param storeOrder 商城订单
|
|
|
+ */
|
|
|
+ private void updateStoreOrderStatus(FsStoreOrderScrm storeOrder) {
|
|
|
+ storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue());
|
|
|
+ storeOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
|
|
|
+ storeOrder.setPayTime(new Date());
|
|
|
+ storeOrderScrmMapper.updateFsStoreOrder(storeOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 订单支付成功后,增加消费记录
|
|
|
+ * @param orderId 订单ID
|
|
|
+ * @param orderNo 订单编号
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @param userName 用户姓名
|
|
|
+ * @param amount 消费金额
|
|
|
+ * @return 影响行数
|
|
|
+ */
|
|
|
+ public int createConsumptionRecord(Long orderId, String orderNo, Long userId,
|
|
|
+ String userName, BigDecimal amount,Company company
|
|
|
+ ) {
|
|
|
+ RechargeRecord record = new RechargeRecord();
|
|
|
+ record.setUserId(userId);
|
|
|
+ record.setUserName(userName);
|
|
|
+ record.setTotalAmount(amount);
|
|
|
+ record.setTransactionId(generateTransactionId());
|
|
|
+ record.setOrderId(orderId);
|
|
|
+ record.setOrderNo(orderNo);
|
|
|
+ record.setBusinessType(1); // 1-消费
|
|
|
+ if (ObjectUtil.isEmpty(company)){
|
|
|
+ record.setRemark("订单消费,自主下单没有归属公司");
|
|
|
+ }else {
|
|
|
+ record.setCompanyId(company.getCompanyId());
|
|
|
+ record.setCompanyName(company.getCompanyName());
|
|
|
+ record.setRemark("订单消费");
|
|
|
+ }
|
|
|
+ record.setCreateTime(new Date());
|
|
|
+ record.setDelFlag("0");
|
|
|
+
|
|
|
+ return rechargeRecordMapper.insertRechargeRecord(record);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成交易流水号
|
|
|
+ * @return 交易流水号
|
|
|
+ */
|
|
|
+ private String generateTransactionId() {
|
|
|
+ return "TXF" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
|
|
|
+ }
|
|
|
/**
|
|
|
* 直播订单支付信息
|
|
|
*
|
|
|
@@ -1212,9 +1383,15 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
}
|
|
|
|
|
|
LiveOrderPayment storePayment = new LiveOrderPayment();
|
|
|
- storePayment.setStatus(0);
|
|
|
+
|
|
|
+ if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()){
|
|
|
+ storePayment.setStatus(1);
|
|
|
+ storePayment.setPayMode("cz");
|
|
|
+ }else {
|
|
|
+ storePayment.setStatus(0);
|
|
|
+ storePayment.setPayMode(payConfig.getType());
|
|
|
+ }
|
|
|
storePayment.setAppId(payConfig.getAppId());
|
|
|
- storePayment.setPayMode(payConfig.getType());
|
|
|
storePayment.setBusinessCode(payOrderParam.getOrderCode());
|
|
|
storePayment.setPayCode(payCode);
|
|
|
storePayment.setPayMoney(payOrderParam.getAmount());
|
|
|
@@ -1436,10 +1613,15 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
}
|
|
|
|
|
|
FsStorePaymentScrm storePayment = new FsStorePaymentScrm();
|
|
|
- storePayment.setStatus(0);
|
|
|
+ if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()){
|
|
|
+ storePayment.setStatus(1);
|
|
|
+ storePayment.setPayMode("cz");
|
|
|
+ }else {
|
|
|
+ storePayment.setStatus(0);
|
|
|
+ storePayment.setPayMode(payConfig.getType());
|
|
|
+ }
|
|
|
storePayment.setAppId(payConfig.getAppId());
|
|
|
storePayment.setOrderId(payOrderParam.getOrderId());
|
|
|
- storePayment.setPayMode(payConfig.getType());
|
|
|
storePayment.setBusinessCode(payOrderParam.getOrderCode());
|
|
|
storePayment.setPayCode(payCode);
|
|
|
storePayment.setPayMoney(payOrderParam.getAmount());
|