|
|
@@ -0,0 +1,1234 @@
|
|
|
+package com.fs.reward.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.fs.common.core.domain.R;
|
|
|
+import com.fs.common.core.redis.RedisCache;
|
|
|
+import com.fs.common.exception.CustomException;
|
|
|
+import com.fs.common.utils.DateUtils;
|
|
|
+import com.fs.common.utils.ServletUtils;
|
|
|
+import com.fs.common.utils.ip.IpUtils;
|
|
|
+import com.fs.core.utils.OrderCodeUtils;
|
|
|
+import com.fs.course.domain.FsCourseRewardRound;
|
|
|
+import com.fs.course.mapper.FsCourseRewardRoundMapper;
|
|
|
+import com.fs.erp.domain.*;
|
|
|
+import com.fs.erp.dto.BaseResponse;
|
|
|
+import com.fs.erp.dto.ErpOrderQueryRequert;
|
|
|
+import com.fs.erp.dto.ErpOrderQueryResponse;
|
|
|
+import com.fs.erp.dto.ErpRefundUpdateRequest;
|
|
|
+import com.fs.his.domain.*;
|
|
|
+import com.fs.his.dto.ErpRemarkDTO;
|
|
|
+import com.fs.his.dto.PayConfigDTO;
|
|
|
+import com.fs.his.enums.ShipperCodeEnum;
|
|
|
+import com.fs.his.mapper.FsStoreMapper;
|
|
|
+import com.fs.his.mapper.FsUserAddressMapper;
|
|
|
+import com.fs.his.mapper.FsUserMapper;
|
|
|
+import com.fs.his.mapper.FsUserWxMapper;
|
|
|
+import com.fs.his.service.IFsExpressService;
|
|
|
+import com.fs.his.service.IFsStorePaymentService;
|
|
|
+import com.fs.his.service.IFsUserAddressService;
|
|
|
+import com.fs.his.utils.PhoneUtil;
|
|
|
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
|
|
|
+import com.fs.huifuPay.domain.HuiFuRefundResult;
|
|
|
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
|
|
|
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
|
|
|
+import com.fs.huifuPay.service.HuiFuService;
|
|
|
+import com.fs.pay.constant.PaymentTypeConstant;
|
|
|
+import com.fs.pay.domain.PaymentMiniProgramConfig;
|
|
|
+import com.fs.reward.domain.FsRewardGoods;
|
|
|
+import com.fs.reward.domain.FsRewardGoodsOrder;
|
|
|
+import com.fs.reward.mapper.FsRewardGoodsMapper;
|
|
|
+import com.fs.reward.mapper.FsRewardGoodsOrderMapper;
|
|
|
+import com.fs.reward.param.FsRewardGoodsOrderAddParam;
|
|
|
+import com.fs.reward.param.FsRewardGoodsOrderListParam;
|
|
|
+import com.fs.reward.param.FsRewardGoodsOrderPayParam;
|
|
|
+import com.fs.reward.service.IFsRewardGoodsOrderService;
|
|
|
+import com.fs.reward.vo.FsRewardGoodsOrderVO;
|
|
|
+import com.fs.system.service.ISysConfigService;
|
|
|
+import com.fs.tzBankPay.TzBankService.TzBankService;
|
|
|
+import com.fs.tzBankPay.doman.*;
|
|
|
+import com.fs.wx.order.domain.FsWxExpressTask;
|
|
|
+import com.fs.wx.order.mapper.FsWxExpressTaskMapper;
|
|
|
+import com.fs.ybPay.domain.CreateWxOrderResult;
|
|
|
+import com.fs.ybPay.domain.OrderResult;
|
|
|
+import com.fs.ybPay.domain.RefundResult;
|
|
|
+import com.fs.ybPay.dto.OrderQueryDTO;
|
|
|
+import com.fs.ybPay.dto.RefundDTO;
|
|
|
+import com.fs.ybPay.dto.WxJspayDTO;
|
|
|
+import com.fs.ybPay.service.IPayService;
|
|
|
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
|
|
|
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
|
|
|
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
|
|
|
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
|
|
|
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
|
|
|
+import com.github.binarywang.wxpay.config.WxPayConfig;
|
|
|
+import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
+import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.sql.Timestamp;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import static com.fs.his.utils.PhoneUtil.decryptPhone;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class FsRewardGoodsOrderServiceImpl extends ServiceImpl<FsRewardGoodsOrderMapper, FsRewardGoodsOrder> implements IFsRewardGoodsOrderService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FsRewardGoodsMapper fsRewardGoodsMapper;
|
|
|
+ @Autowired
|
|
|
+ private FsUserAddressMapper fsUserAddressMapper;
|
|
|
+ @Autowired
|
|
|
+ private FsCourseRewardRoundMapper fsCourseRewardRoundMapper;
|
|
|
+ @Autowired
|
|
|
+ private FsUserMapper fsUserMapper;
|
|
|
+ @Autowired
|
|
|
+ private FsStoreMapper fsStoreMapper;
|
|
|
+ @Autowired
|
|
|
+ private IFsStorePaymentService storePaymentService;
|
|
|
+ @Autowired
|
|
|
+ private WxPayService wxPayService;
|
|
|
+ @Autowired
|
|
|
+ private IPayService payService;
|
|
|
+ @Autowired
|
|
|
+ private TzBankService tzBankService;
|
|
|
+ @Autowired
|
|
|
+ private HuiFuService huiFuService;
|
|
|
+ @Autowired
|
|
|
+ private ISysConfigService configService;
|
|
|
+ @Autowired
|
|
|
+ private FsUserWxMapper fsUserWxMapper;
|
|
|
+ @Autowired
|
|
|
+ private IFsExpressService expressService;
|
|
|
+ @Autowired
|
|
|
+ private IFsUserAddressService fsUserAddressService;
|
|
|
+ @Autowired
|
|
|
+ private RedisCache redisCache;
|
|
|
+ @Autowired
|
|
|
+ private FsWxExpressTaskMapper fsWxExpressTaskMapper;
|
|
|
+
|
|
|
+ @Value("${jst.selfShopCode:''}")
|
|
|
+ private String selfShopCode;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询奖励商品订单列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<FsRewardGoodsOrderVO> selectFsRewardGoodsOrderVOList(FsRewardGoodsOrderListParam param) {
|
|
|
+ return baseMapper.selectFsRewardGoodsOrderVOList(param);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据id查询奖励商品订单详情
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public FsRewardGoodsOrderVO selectFsRewardGoodsOrderVOById(Long orderId) {
|
|
|
+ return baseMapper.selectFsRewardGoodsOrderVOById(orderId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建奖励商品订单
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public FsRewardGoodsOrder createOrder(Long userId, FsRewardGoodsOrderAddParam param) {
|
|
|
+ FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
|
|
|
+ if (Objects.isNull(fsUser)) {
|
|
|
+ throw new CustomException("用户不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsCourseRewardRound rewardRound = fsCourseRewardRoundMapper.selectFsCourseRewardRoundById(param.getRoundId());
|
|
|
+ if (Objects.isNull(rewardRound)
|
|
|
+ || !Objects.equals(rewardRound.getGoodsId(), param.getGoodsId())
|
|
|
+ || !Objects.equals(rewardRound.getUserId(), userId)) {
|
|
|
+ throw new CustomException("中奖记录不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ LocalDateTime lastTime = rewardRound.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusDays(30);
|
|
|
+ if (LocalDateTime.now().isAfter(lastTime)) {
|
|
|
+ throw new CustomException("中奖记录已过期!");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsRewardGoodsOrder fsRewardGoodsOrder = baseMapper.selectByUserIdAndGoodsIdAndRoundId(userId, param.getGoodsId(), param.getRoundId());
|
|
|
+ if (Objects.nonNull(fsRewardGoodsOrder)) {
|
|
|
+ throw new CustomException("请勿重复下单!");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsRewardGoods fsRewardGoods = fsRewardGoodsMapper.selectById(param.getGoodsId());
|
|
|
+ if (Objects.isNull(fsRewardGoods) || fsRewardGoods.getIsDel() == 1) {
|
|
|
+ throw new CustomException("商品不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fsRewardGoods.getStatus() == 0) {
|
|
|
+ throw new CustomException("商品已下架!");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fsRewardGoods.getStock() <= 0) {
|
|
|
+ throw new CustomException("商品库存不足!");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsUserAddress fsUserAddress = fsUserAddressMapper.selectFsUserAddressByAddressId(param.getAddressId());
|
|
|
+ if (Objects.isNull(fsUserAddress)) {
|
|
|
+ throw new CustomException("收货地址不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ String orderSn = "reward"+OrderCodeUtils.getOrderSn();
|
|
|
+ if (StringUtils.isEmpty(orderSn)) {
|
|
|
+ throw new CustomException("订单号生成失败,请重试");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 减库存
|
|
|
+ int cnt = fsRewardGoodsMapper.reduceStock(fsRewardGoods.getGoodsId());
|
|
|
+ if (cnt <= 0) {
|
|
|
+ throw new CustomException("商品库存不足!");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 抽中时的价格
|
|
|
+ if (Objects.nonNull(rewardRound.getGoodsPrice())) {
|
|
|
+ fsRewardGoods.setPrice(rewardRound.getGoodsPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ fsRewardGoodsOrder = new FsRewardGoodsOrder();
|
|
|
+ fsRewardGoodsOrder.setOrderSn(orderSn);
|
|
|
+ fsRewardGoodsOrder.setStoreId(fsRewardGoods.getStoreId());
|
|
|
+ fsRewardGoodsOrder.setUserId(userId);
|
|
|
+ fsRewardGoodsOrder.setUserName(fsUserAddress.getRealName().trim());
|
|
|
+ fsRewardGoodsOrder.setMobile(fsUserAddress.getPhone().trim());
|
|
|
+ fsRewardGoodsOrder.setAddress(fsUserAddress.getProvince() + " " + fsUserAddress.getCity() + " " + fsUserAddress.getDistrict() + " " + fsUserAddress.getDetail());
|
|
|
+ fsRewardGoodsOrder.setOrderMoney(fsRewardGoods.getPrice());
|
|
|
+ fsRewardGoodsOrder.setPayMoney(fsRewardGoods.getPrice());
|
|
|
+ fsRewardGoodsOrder.setRoundId(param.getRoundId());
|
|
|
+ fsRewardGoodsOrder.setGoodsId(param.getGoodsId());
|
|
|
+ fsRewardGoodsOrder.setGoodsJson(JSON.toJSONString(fsRewardGoods));
|
|
|
+ fsRewardGoodsOrder.setStatus(1);
|
|
|
+ fsRewardGoodsOrder.setExpiredTime(lastTime);
|
|
|
+ fsRewardGoodsOrder.setCreateTime(LocalDateTime.now());
|
|
|
+ fsRewardGoodsOrder.setCreateBy(fsUser.getNickName());
|
|
|
+ fsRewardGoodsOrder.setRemark("实物抽奖");
|
|
|
+ baseMapper.insert(fsRewardGoodsOrder);
|
|
|
+
|
|
|
+ return fsRewardGoodsOrder;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 支付订单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> payment(Long userId, FsRewardGoodsOrderPayParam param) {
|
|
|
+ // 查询订单
|
|
|
+ FsRewardGoodsOrder order = baseMapper.selectById(param.getOrderId());
|
|
|
+ if (Objects.isNull(order)) {
|
|
|
+ throw new CustomException("订单不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!order.getUserId().equals(userId)) {
|
|
|
+ throw new CustomException("非法操作!");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!order.getStatus().equals(1)) {
|
|
|
+ throw new CustomException("订单状态不正确!");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.getExpiredTime().isBefore(LocalDateTime.now())) {
|
|
|
+ throw new CustomException("订单已过期!");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询用户
|
|
|
+ FsUser user = fsUserMapper.selectFsUserByUserId(userId);
|
|
|
+ if (Objects.isNull(user)) {
|
|
|
+ throw new CustomException("用户不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ order.setPayType(param.getPayType());
|
|
|
+ baseMapper.updateById(order);
|
|
|
+
|
|
|
+ // 如果金额为0,直接完成支付
|
|
|
+ if (order.getPayMoney().compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ this.payConfirm(order.getOrderSn(), "", "", "", 2);
|
|
|
+
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("isPay", 1);
|
|
|
+ result.put("message", "支付成功");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据支付类型进行支付
|
|
|
+ switch (param.getPayType()) {
|
|
|
+ case 1:
|
|
|
+ return handleWxPayment(order, user, param);
|
|
|
+ case 2:
|
|
|
+ return handleWxH5Payment(order, user, param);
|
|
|
+ case 3:
|
|
|
+ return handleWxAppPayment(order, user, param);
|
|
|
+ case 4:
|
|
|
+ return handleAlipayPayment(order, user, param);
|
|
|
+ case 5:
|
|
|
+ return handleAlipayH5Payment(order, user, param);
|
|
|
+ default:
|
|
|
+ throw new CustomException("不支持的支付类型!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理微信App支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> handleWxAppPayment(FsRewardGoodsOrder order, FsUser user, FsRewardGoodsOrderPayParam param) {
|
|
|
+ if (StringUtils.isEmpty(user.getMpOpenId())) {
|
|
|
+ throw new CustomException("用户OpenID不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取配置
|
|
|
+ String json = configService.selectConfigByKey("his.pay");
|
|
|
+ PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
|
|
|
+
|
|
|
+ // 创建支付记录
|
|
|
+ FsStorePayment storePayment = createPaymentRecord(order, user.getUserId(), payConfigDTO.getType(), "微信", null, user.getMpOpenId());
|
|
|
+
|
|
|
+// switch (payConfigDTO.getType()) {
|
|
|
+// case PaymentTypeConstant.YB:
|
|
|
+// throw new CustomException("支付暂不可用!");
|
|
|
+// case PaymentTypeConstant.TZ_BANK:
|
|
|
+// return tzPay(order, user, param, storePayment);
|
|
|
+// case PaymentTypeConstant.HF:
|
|
|
+// return hfPay(user, param, storePayment);
|
|
|
+// }
|
|
|
+
|
|
|
+ throw new CustomException("支付配置错误!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理微信h5支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> handleWxH5Payment(FsRewardGoodsOrder order, FsUser user, FsRewardGoodsOrderPayParam param) {
|
|
|
+ if (StringUtils.isEmpty(user.getMpOpenId())) {
|
|
|
+ throw new CustomException("用户OpenID不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取配置
|
|
|
+ String json = configService.selectConfigByKey("his.pay");
|
|
|
+ PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
|
|
|
+
|
|
|
+ // 创建支付记录
|
|
|
+ FsStorePayment storePayment = createPaymentRecord(order, user.getUserId(), payConfigDTO.getType(), "微信", null, user.getMpOpenId());
|
|
|
+
|
|
|
+ switch (payConfigDTO.getType()) {
|
|
|
+// case PaymentTypeConstant.YB:
|
|
|
+// throw new CustomException("支付暂不可用!");
|
|
|
+// case PaymentTypeConstant.TZ_BANK:
|
|
|
+// return tzPay(order, user, param, storePayment);
|
|
|
+// case PaymentTypeConstant.HF:
|
|
|
+// return hfPay(user, param, storePayment);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new CustomException("支付配置错误!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理微信支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> handleWxPayment(FsRewardGoodsOrder order, FsUser user, FsRewardGoodsOrderPayParam param) {
|
|
|
+ if (StringUtils.isEmpty(user.getMaOpenId())) {
|
|
|
+ throw new CustomException("用户OpenID不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+// // 获取支付配置
|
|
|
+// PaymentMiniProgramConfig paymentConfig = paymentConfigService.selectPaymentConfigByAppId(param.getAppId());
|
|
|
+// if (Objects.isNull(paymentConfig)) {
|
|
|
+// throw new CustomException("当前小程序没有配置可用的支付方式!");
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 创建支付记录
|
|
|
+// FsStorePayment storePayment = createPaymentRecord(order, user.getUserId(), paymentConfig.getPayType(), "weixin", param.getAppId(), user.getMaOpenId());
|
|
|
+//
|
|
|
+// switch (paymentConfig.getPayType()) {
|
|
|
+// case PaymentTypeConstant.WX:
|
|
|
+// return wxPay(user, paymentConfig, storePayment);
|
|
|
+// case PaymentTypeConstant.YB:
|
|
|
+// return ybPay(user, param, storePayment);
|
|
|
+// case PaymentTypeConstant.TZ_BANK:
|
|
|
+// return tzPay(order, user, param, storePayment);
|
|
|
+// case PaymentTypeConstant.HF:
|
|
|
+// return hfPay(user, param, storePayment);
|
|
|
+// }
|
|
|
+
|
|
|
+ throw new CustomException("支付配置错误!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 汇付支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> hfPay(FsUser user, FsRewardGoodsOrderPayParam param, FsStorePayment storePayment) {
|
|
|
+ log.info("创建汇付订单");
|
|
|
+ HuiFuCreateOrder o = new HuiFuCreateOrder();
|
|
|
+
|
|
|
+ if (param.getPayType() == 1) {
|
|
|
+ o.setTradeType("T_MINIAPP");
|
|
|
+ o.setAppId(param.getAppId());
|
|
|
+ o.setOpenid(user.getMaOpenId());
|
|
|
+ } else if (param.getPayType() == 2) {
|
|
|
+ o.setTradeType("T_JSAPI");
|
|
|
+ o.setOpenid(user.getMpOpenId());
|
|
|
+ } else if (param.getPayType() == 3) {
|
|
|
+ o.setTradeType("T_JSAPI");
|
|
|
+ o.setOpenid(user.getMpOpenId());
|
|
|
+ } else if (param.getPayType() == 4){
|
|
|
+ o.setTradeType("A_NATIVE");
|
|
|
+ } else if (param.getPayType() == 5) {
|
|
|
+ o.setTradeType("A_NATIVE");
|
|
|
+ }
|
|
|
+
|
|
|
+ o.setReqSeqId("reward-" + storePayment.getPayCode());
|
|
|
+ o.setTransAmt(storePayment.getPayMoney().toString());
|
|
|
+ o.setGoodsDesc("奖励商品订单支付");
|
|
|
+ HuifuCreateOrderResult huiResult = huiFuService.createOrder(o);
|
|
|
+
|
|
|
+ log.info("创建汇付支付:{}", huiResult);
|
|
|
+ FsStorePayment mt = new FsStorePayment();
|
|
|
+ mt.setPaymentId(storePayment.getPaymentId());
|
|
|
+ mt.setTradeNo(huiResult.getHf_seq_id());
|
|
|
+ storePaymentService.updateFsStorePayment(mt);
|
|
|
+
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("data", huiResult);
|
|
|
+// result.put("type", PaymentTypeConstant.HF);
|
|
|
+ result.put("isPay", 0);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 台州银行支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> tzPay(FsRewardGoodsOrder order, FsUser user, FsRewardGoodsOrderPayParam param, FsStorePayment storePayment) {
|
|
|
+ PayCreateOrder o = new PayCreateOrder();
|
|
|
+ o.setOrderNo("reward" + storePayment.getPayCode()); // 业务系统订单号
|
|
|
+ o.setTrxAmt(storePayment.getPayMoney().doubleValue()); // 交易金额
|
|
|
+ o.setBusinessCstNo(order.getUserId().toString()); // 业务平台客户号
|
|
|
+
|
|
|
+ String phone = "";
|
|
|
+ if (user.getPhone() != null && user.getPhone().length() > 4) {
|
|
|
+ phone = user.getPhone().substring(user.getPhone().length() - 4);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (param.getPayType() == 1) {
|
|
|
+ if (user.getPhone().length() > 11) {
|
|
|
+ o.setPayerMobileNo(PhoneUtil.decryptPhone(user.getPhone()));
|
|
|
+ } else {
|
|
|
+ o.setPayerMobileNo(user.getPhone());
|
|
|
+ }
|
|
|
+ String openId = user.getMaOpenId();
|
|
|
+ if (param.getAppId() != null){
|
|
|
+ Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
|
|
|
+ .eq(FsUserWx::getFsUserId, user.getUserId())
|
|
|
+ .eq(FsUserWx::getAppId, param.getAppId());
|
|
|
+ FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
|
|
|
+ if (Objects.nonNull(fsUserWx)){
|
|
|
+ openId = fsUserWx.getOpenId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ o.setOpenId(openId);
|
|
|
+ o.setAppid(param.getAppId());
|
|
|
+// } else if (param.getPayType() == 2) {
|
|
|
+// o.setOpenId(user.getMpOpenId());
|
|
|
+// o.setPayType(Collections.singletonList(PayType.微信公众号.getCode()));
|
|
|
+// } else if (param.getPayType() == 3) {
|
|
|
+// o.setPayType(Collections.singletonList("11"));
|
|
|
+// } else if (param.getPayType() == 4){
|
|
|
+// o.setPayType(Collections.singletonList(PayType.支付宝条码支付.getCode()));
|
|
|
+// } else if (param.getPayType() == 5) {
|
|
|
+// o.setOpenId(user.getMpOpenId());
|
|
|
+// o.setPayType(Collections.singletonList(PayType.支付宝条码支付.getCode()));
|
|
|
+ }
|
|
|
+
|
|
|
+ o.setPayerName("微信用户" + phone);
|
|
|
+ o.setGoodsInfo("奖励商品订单支付"); // 订单信息
|
|
|
+ o.setOrderType(10);
|
|
|
+ o.setOrderId(order.getOrderId().toString());
|
|
|
+
|
|
|
+ TzBankResult<PayCreateOrderResult> tzBankResult;
|
|
|
+ if (param.getPayType() == 3) {
|
|
|
+ tzBankResult = tzBankService.createAppOrder(o);
|
|
|
+ } else {
|
|
|
+ tzBankResult = tzBankService.createOrder(o);
|
|
|
+ }
|
|
|
+
|
|
|
+ FsStorePayment mt = new FsStorePayment();
|
|
|
+ mt.setPaymentId(storePayment.getPaymentId());
|
|
|
+ mt.setTradeNo(tzBankResult.getBody().getOrderFlowNo());
|
|
|
+ storePaymentService.updateFsStorePayment(mt);
|
|
|
+
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("data", tzBankResult);
|
|
|
+ result.put("type", PaymentTypeConstant.TZ_BANK);
|
|
|
+ result.put("isPay", 0);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 易宝支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> ybPay(FsUser user, FsRewardGoodsOrderPayParam param, FsStorePayment storePayment) {
|
|
|
+ WxJspayDTO p = new WxJspayDTO();
|
|
|
+ p.setPayMoney(storePayment.getPayMoney().toString());
|
|
|
+ p.setLowOrderId("reward-" + storePayment.getPayCode());
|
|
|
+ p.setBody("奖励商品订单支付");
|
|
|
+ p.setIsMinipg("1");
|
|
|
+ p.setOpenId(user.getMaOpenId());
|
|
|
+ p.setAttach("");
|
|
|
+ p.setStoreid("0");
|
|
|
+ p.setAppId(param.getAppId());
|
|
|
+
|
|
|
+ CreateWxOrderResult wxOrder = payService.createWxOrder(p);
|
|
|
+ log.info("易宝返回: {}", wxOrder);
|
|
|
+ if (wxOrder.getStatus().equals("100")) {
|
|
|
+ FsStorePayment mt = new FsStorePayment();
|
|
|
+ mt.setPaymentId(storePayment.getPaymentId());
|
|
|
+ mt.setTradeNo(wxOrder.getUpOrderId());
|
|
|
+ storePaymentService.updateFsStorePayment(mt);
|
|
|
+
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("data", wxOrder);
|
|
|
+ result.put("type", PaymentTypeConstant.YB);
|
|
|
+ result.put("isPay", 0);
|
|
|
+ return result;
|
|
|
+ } else {
|
|
|
+ throw new CustomException("支付失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> wxPay(FsUser user, PaymentMiniProgramConfig paymentConfig, FsStorePayment storePayment) {
|
|
|
+ WxPayConfig payConfig = new WxPayConfig();
|
|
|
+ payConfig.setAppId(paymentConfig.getAppid());
|
|
|
+ payConfig.setMchId(paymentConfig.getWxMerchantNo());
|
|
|
+ payConfig.setMchKey(paymentConfig.getWxKey());
|
|
|
+ payConfig.setSubAppId(StringUtils.trimToNull(null));
|
|
|
+ payConfig.setSubMchId(StringUtils.trimToNull(null));
|
|
|
+ payConfig.setKeyPath(null);
|
|
|
+ payConfig.setNotifyUrl(paymentConfig.getWxNotifyUrl());
|
|
|
+ wxPayService.setConfig(payConfig);
|
|
|
+
|
|
|
+ WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
|
|
|
+ orderRequest.setOpenid(user.getMaOpenId());
|
|
|
+ orderRequest.setBody("奖励商品订单支付");
|
|
|
+ orderRequest.setOutTradeNo("reward-" + storePayment.getPayCode());
|
|
|
+ orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));
|
|
|
+ orderRequest.setTradeType("JSAPI");
|
|
|
+ orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
|
|
+
|
|
|
+ try {
|
|
|
+ WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
|
|
|
+
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("data", orderResult);
|
|
|
+ result.put("type", PaymentTypeConstant.WX);
|
|
|
+ result.put("isPay", 0);
|
|
|
+ return result;
|
|
|
+ } catch (WxPayException e) {
|
|
|
+ log.error("微信支付失败", e);
|
|
|
+ throw new CustomException("支付失败: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理支付宝支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> handleAlipayPayment(FsRewardGoodsOrder order, FsUser user, FsRewardGoodsOrderPayParam param) {
|
|
|
+ // 获取配置
|
|
|
+ String json = configService.selectConfigByKey("his.pay");
|
|
|
+ PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
|
|
|
+
|
|
|
+ // 创建支付记录
|
|
|
+ FsStorePayment storePayment = createPaymentRecord(order, user.getUserId(), payConfigDTO.getType(), "alipay", null, null);
|
|
|
+
|
|
|
+ switch (payConfigDTO.getType()) {
|
|
|
+ case PaymentTypeConstant.YB:
|
|
|
+ throw new CustomException("支付暂不可用!");
|
|
|
+ case PaymentTypeConstant.TZ_BANK:
|
|
|
+ return tzPay(order, user, param, storePayment);
|
|
|
+ case PaymentTypeConstant.HF:
|
|
|
+ return hfPay(user, param, storePayment);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new CustomException("支付配置错误!");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 支付宝H5支付
|
|
|
+ */
|
|
|
+ private Map<String, Object> handleAlipayH5Payment(FsRewardGoodsOrder order, FsUser user, FsRewardGoodsOrderPayParam param) {
|
|
|
+ // 获取配置
|
|
|
+ String json = configService.selectConfigByKey("his.pay");
|
|
|
+ PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
|
|
|
+
|
|
|
+ // 创建支付记录
|
|
|
+ FsStorePayment storePayment = createPaymentRecord(order, user.getUserId(), payConfigDTO.getType(), "alipay", null, user.getMpOpenId());
|
|
|
+
|
|
|
+ switch (payConfigDTO.getType()) {
|
|
|
+ case PaymentTypeConstant.YB:
|
|
|
+ throw new CustomException("支付暂不可用!");
|
|
|
+ case PaymentTypeConstant.TZ_BANK:
|
|
|
+ return tzPay(order, user, param, storePayment);
|
|
|
+ case PaymentTypeConstant.HF:
|
|
|
+ return hfPay(user, param, storePayment);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new CustomException("支付配置错误!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建支付记录
|
|
|
+ */
|
|
|
+ private FsStorePayment createPaymentRecord(FsRewardGoodsOrder order, Long userId, String payType, String payTypeCode, String appId, String openId) {
|
|
|
+ String payCode = OrderCodeUtils.getOrderSn();
|
|
|
+ if (StringUtils.isEmpty(payCode)) {
|
|
|
+ throw new CustomException("支付码生成失败,请重试");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsStorePayment storePayment = new FsStorePayment();
|
|
|
+ storePayment.setStatus(0);
|
|
|
+ storePayment.setPayMode(payType);
|
|
|
+ storePayment.setBusinessCode(order.getOrderSn());
|
|
|
+ storePayment.setPayCode(payCode);
|
|
|
+ storePayment.setPayMoney(order.getPayMoney());
|
|
|
+ storePayment.setCreateTime(new Date());
|
|
|
+ storePayment.setPayTypeCode(payTypeCode);
|
|
|
+ storePayment.setBusinessType(10); // 奖励商品订单
|
|
|
+ storePayment.setRemark("奖励商品订单支付");
|
|
|
+ storePayment.setOpenId(openId);
|
|
|
+ storePayment.setUserId(userId);
|
|
|
+ storePayment.setStoreId(order.getStoreId());
|
|
|
+ storePayment.setBusinessId(order.getOrderId().toString());
|
|
|
+ storePayment.setAppId(appId);
|
|
|
+
|
|
|
+ if (storePaymentService.insertFsStorePayment(storePayment) > 0) {
|
|
|
+ return storePayment;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new CustomException("创建支付记录失败!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 支付回调
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R payConfirm(String orderSn, String payCode, String tradeNo, String payType, Integer type) {
|
|
|
+ FsRewardGoodsOrder order;
|
|
|
+ if (type == 1) {
|
|
|
+ FsStorePayment storePayment = storePaymentService.selectFsStorePaymentByPaymentCode(payCode);
|
|
|
+ if (storePayment != null) {
|
|
|
+ if (storePayment.getStatus().equals(0)) {
|
|
|
+ FsStorePayment paymentMap = new FsStorePayment();
|
|
|
+ paymentMap.setPaymentId(storePayment.getPaymentId());
|
|
|
+ paymentMap.setStatus(1);
|
|
|
+ paymentMap.setPayTime(new Date());
|
|
|
+ paymentMap.setTradeNo(tradeNo);
|
|
|
+ if (payType.equals(PayType.WECHAT_MINI_PROGRAM_PAYMENT.getCode())) {
|
|
|
+ paymentMap.setPayTypeCode(PayType.WECHAT_MINI_PROGRAM_PAYMENT.name());
|
|
|
+ } else if (payType.equals(PayType.ALIPAY_BARCODE_PAYMENT.getCode())) {
|
|
|
+ paymentMap.setPayTypeCode(PayType.ALIPAY_BARCODE_PAYMENT.name());
|
|
|
+ }
|
|
|
+ if (storePayment.getPayMode().equals("yb")) {
|
|
|
+ OrderQueryDTO orderQueryDTO = new OrderQueryDTO();
|
|
|
+ orderQueryDTO.setUpOrderId(tradeNo);
|
|
|
+ OrderResult orderResult = payService.getOrder(orderQueryDTO);
|
|
|
+ paymentMap.setBankSerialNo(orderResult.getBankOrderId());
|
|
|
+ paymentMap.setBankTransactionId(orderResult.getBankTrxId());
|
|
|
+ }
|
|
|
+ log.info("更新支付记录");
|
|
|
+ storePaymentService.updateFsStorePayment(paymentMap);
|
|
|
+ }
|
|
|
+ order = getById(Long.parseLong(storePayment.getBusinessId()));
|
|
|
+ } else {
|
|
|
+ log.info("支付单号不存在: {}", payCode);
|
|
|
+ return R.error("支付单号不存在");
|
|
|
+ }
|
|
|
+ } else if (type == 2) {
|
|
|
+ order = lambdaQuery().eq(FsRewardGoodsOrder::getOrderSn, orderSn).one();
|
|
|
+ } else {
|
|
|
+ return R.error("type类型错误");
|
|
|
+ }
|
|
|
+
|
|
|
+ order.setStatus(2); // 已支付
|
|
|
+ order.setPayTime(LocalDateTime.now());
|
|
|
+ order.setUpdateTime(LocalDateTime.now());
|
|
|
+ order.setUpdateBy("回调");
|
|
|
+ baseMapper.updateById(order);
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推送erp
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void pushErp() throws InterruptedException {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ List<FsRewardGoodsOrder> noPushOrder = baseMapper.selectNoPushOrders();
|
|
|
+ List<ErpOrder> erpOrders = noPushOrder.stream().map(order -> {
|
|
|
+ ErpOrder erpOrder = new ErpOrder();
|
|
|
+ erpOrder.setVip_code(order.getUserId().toString());
|
|
|
+ erpOrder.setPlatform_code(order.getOrderSn());
|
|
|
+ erpOrder.setShop_code(selfShopCode);
|
|
|
+ erpOrder.setSeller_memo(order.getRemark());
|
|
|
+ erpOrder.setBuyer_account(order.getUserName());
|
|
|
+ erpOrder.setRemark(order.getRemark());
|
|
|
+
|
|
|
+ List<ErpOrderPayment> payments = new ArrayList<>();
|
|
|
+ ErpOrderPayment payment = new ErpOrderPayment();
|
|
|
+ payment.setPay_type_code("weixin");
|
|
|
+ payment.setPayment(order.getPayMoney().doubleValue());
|
|
|
+ payment.setPaytime(Timestamp.valueOf(order.getPayTime()));
|
|
|
+ payments.add(payment);
|
|
|
+ erpOrder.setPayments(payments);
|
|
|
+
|
|
|
+ //大于100发发顺丰云配
|
|
|
+ if (order.getPayMoney().compareTo(new BigDecimal(100)) > 0) {
|
|
|
+ //发互联网医院SF.0235488558_241101
|
|
|
+ FsExpress express = expressService.selectFsExpressByOmsCode("SF.0235488558_241101");
|
|
|
+ erpOrder.setExpress_code(express.getOmsCode());
|
|
|
+ order.setDeliveryName(express.getName());
|
|
|
+ order.setDeliveryCode(express.getCode());
|
|
|
+ } else {
|
|
|
+ //发ztpdd
|
|
|
+ FsExpress express = expressService.selectFsExpressByOmsCode("CDYJFYD.400011111705_241230");
|
|
|
+ erpOrder.setExpress_code(express.getOmsCode());
|
|
|
+ order.setDeliveryName(express.getName());
|
|
|
+ order.setDeliveryCode(express.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ ErpRemarkDTO remarkDTO = new ErpRemarkDTO();
|
|
|
+ remarkDTO.setTotalPrice(order.getOrderMoney());
|
|
|
+ remarkDTO.setPayPrice(order.getPayMoney());
|
|
|
+ remarkDTO.setDeliveryMoney(BigDecimal.ZERO);
|
|
|
+ remarkDTO.setPayMoney(order.getPayMoney());
|
|
|
+ remarkDTO.setCouponMoney(BigDecimal.ZERO);
|
|
|
+ remarkDTO.setOrderId(order.getOrderSn());
|
|
|
+ remarkDTO.setYdMoney(BigDecimal.ZERO);
|
|
|
+ remarkDTO.setPayTime(order.getPayTime().format(formatter));
|
|
|
+
|
|
|
+ erpOrder.setSeller_memo(erpOrder.getSeller_memo() + JSONUtil.toJsonStr(remarkDTO));
|
|
|
+ erpOrder.setRemark(erpOrder.getRemark() + JSONUtil.toJsonStr(remarkDTO));
|
|
|
+ erpOrder.setOrder_type_code("order");
|
|
|
+ erpOrder.setDeal_datetime(LocalDateTime.now().format(formatter));
|
|
|
+
|
|
|
+ List<ErpOrderItem> details = new ArrayList<>();
|
|
|
+ FsRewardGoods fsRewardGoods = JSON.parseObject(order.getGoodsJson(), FsRewardGoods.class);
|
|
|
+ ErpOrderItem item = new ErpOrderItem();
|
|
|
+ item.setItem_code(fsRewardGoods.getStoreGoodsSn().trim());
|
|
|
+ item.setPrice(fsRewardGoods.getPrice().toString());
|
|
|
+ item.setQty(1);
|
|
|
+ item.setRefund(0);
|
|
|
+ details.add(item);
|
|
|
+
|
|
|
+ erpOrder.setDetails(details);
|
|
|
+ erpOrder.setReceiver_name(order.getUserName().replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9]", ""));
|
|
|
+
|
|
|
+ String userPhone = order.getMobile().length() > 11 ? decryptPhone(order.getMobile()) : order.getMobile();
|
|
|
+ erpOrder.setReceiver_mobile(userPhone);
|
|
|
+
|
|
|
+ String[] address = order.getAddress().split(" ");
|
|
|
+ if (address.length < 3) {
|
|
|
+ String kdnAddress = fsUserAddressService.getKdnAddress(order.getAddress());
|
|
|
+ Map<String, Object> addDAta = (Map<String, Object>) JSON.parse(kdnAddress);
|
|
|
+ Map<String, String> add = (Map<String, String>) addDAta.get("Data");
|
|
|
+ erpOrder.setReceiver_province(add.get("ProvinceName"));
|
|
|
+ erpOrder.setReceiver_city(add.get("CityName"));
|
|
|
+ erpOrder.setReceiver_district(add.get("ExpAreaName"));
|
|
|
+ erpOrder.setReceiver_address(add.get("StreetName") + add.get("Address"));
|
|
|
+ } else {
|
|
|
+ erpOrder.setReceiver_province(address[0]);
|
|
|
+ erpOrder.setReceiver_city(address[1]);
|
|
|
+ erpOrder.setReceiver_district(address[2]);
|
|
|
+ //处理地址多空隔问题
|
|
|
+ if (address.length > 3) {
|
|
|
+ StringBuilder addrs = new StringBuilder();
|
|
|
+ for (int i = 3; i < address.length; i++) {
|
|
|
+ addrs.append(address[i]);
|
|
|
+ }
|
|
|
+ erpOrder.setReceiver_address(addrs.toString());
|
|
|
+ } else {
|
|
|
+ erpOrder.setReceiver_address(address[2]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ erpOrder.setReceiver_address(erpOrder.getReceiver_address().replace("+", "加"));
|
|
|
+ erpOrder.setReceiver_address(erpOrder.getReceiver_address().replace("\n", ""));
|
|
|
+
|
|
|
+ baseMapper.updateById(order);
|
|
|
+
|
|
|
+ return erpOrder;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (!erpOrders.isEmpty()) {
|
|
|
+// jstErpOrderService.batchAddRewardOrder(erpOrders);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步erp信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void syncErpData() throws InterruptedException {
|
|
|
+ List<Long> extendOrderSnList = baseMapper.selectPushOrders();
|
|
|
+
|
|
|
+ if (!extendOrderSnList.isEmpty()) {
|
|
|
+ List<List<Long>> batches = Lists.partition(extendOrderSnList, 100);
|
|
|
+ for (List<Long> batch : batches) {
|
|
|
+ int pageIndex = 1;
|
|
|
+ boolean has_next = false;
|
|
|
+ do {
|
|
|
+ Thread.sleep(300);
|
|
|
+ ErpOrderQueryRequert request = new ErpOrderQueryRequert();
|
|
|
+ request.setPage_size(100);
|
|
|
+// request.setPage_index(pageIndex);
|
|
|
+// request.setShop_id(selfShopCode);
|
|
|
+// request.setO_ids(batch); // 设置当前批次
|
|
|
+
|
|
|
+// ErpOrderQueryResponse response = jstErpOrderService.getOrder(request, "reward");
|
|
|
+// has_next = response.hasNextSafe();
|
|
|
+
|
|
|
+// if (response.getOrders() != null) {
|
|
|
+// for(ErpOrderQuery orderQuery : response.getOrders()){
|
|
|
+// if(orderQuery.getDeliverys()!=null&& !orderQuery.getDeliverys().isEmpty()){
|
|
|
+// for(ErpDeliverys delivery:orderQuery.getDeliverys()){
|
|
|
+// if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
|
|
|
+// deliveryOrder(orderQuery.getCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
|
|
|
+// redisCache.deleteObject("delivery"+":"+orderQuery.getO_id());
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+ pageIndex++;
|
|
|
+ } while (has_next);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发货
|
|
|
+ */
|
|
|
+ private void deliveryOrder(String orderCode, String deliveryId, String deliverCode, String deliverName) {
|
|
|
+ FsRewardGoodsOrder order = lambdaQuery().eq(FsRewardGoodsOrder::getOrderSn, orderCode).one();
|
|
|
+ if (order == null || order.getStatus() != 2) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ FsExpress express = expressService.selectFsExpressByOmsCode(deliverCode);
|
|
|
+ if (express != null) {
|
|
|
+ order.setDeliveryName(deliverName);
|
|
|
+ order.setDeliveryCode(express.getCode());
|
|
|
+ }
|
|
|
+ order.setStatus(3);
|
|
|
+ order.setDeliverySn(deliveryId);
|
|
|
+ order.setDeliveryTime(LocalDateTime.now());
|
|
|
+ baseMapper.updateById(order);
|
|
|
+
|
|
|
+ FsStore store = fsStoreMapper.selectFsStoreByStoreId(order.getStoreId());
|
|
|
+ //订阅物流回调
|
|
|
+ String lastFourNumber = "";
|
|
|
+ if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
|
|
|
+ if (store != null && store.getSendPhone() != null) {
|
|
|
+ lastFourNumber = store.getSendPhone();
|
|
|
+ } else {
|
|
|
+ lastFourNumber = order.getMobile().length() > 11 ?
|
|
|
+ decryptPhone(order.getMobile()) :
|
|
|
+ order.getMobile();
|
|
|
+ }
|
|
|
+ if (lastFourNumber.length() == 11) {
|
|
|
+ lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ expressService.subscribeEspress(order.getOrderSn(), order.getDeliveryCode(), order.getDeliverySn(), lastFourNumber);
|
|
|
+
|
|
|
+ FsStorePayment params = new FsStorePayment();
|
|
|
+ params.setBusinessCode(order.getOrderSn());
|
|
|
+ params.setBusinessType(10);
|
|
|
+ List<FsStorePayment> fsStorePayments = storePaymentService.selectFsStorePaymentList(params);
|
|
|
+ if(CollectionUtils.isNotEmpty(fsStorePayments)){
|
|
|
+ FsStorePayment fsStorePayment = fsStorePayments.get(0);
|
|
|
+ FsWxExpressTask fsWxExpressTask = new FsWxExpressTask();
|
|
|
+ fsWxExpressTask.setUserId(order.getUserId());
|
|
|
+ fsWxExpressTask.setStatus(0);
|
|
|
+ fsWxExpressTask.setRetryCount(0);
|
|
|
+ fsWxExpressTask.setCreateTime(LocalDateTime.now());
|
|
|
+ fsWxExpressTask.setUpdateTime(LocalDateTime.now());
|
|
|
+ fsWxExpressTask.setOrderCode(order.getOrderSn());
|
|
|
+ fsWxExpressTask.setExpressCompany(Objects.nonNull(express) ? express.getCode() : "");
|
|
|
+ fsWxExpressTask.setExpressNo(deliveryId);
|
|
|
+ fsWxExpressTask.setAppid(fsStorePayment.getAppId());
|
|
|
+ fsWxExpressTaskMapper.insert(fsWxExpressTask);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取订单支付信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<FsStorePayment> getPayInfo(String orderSn) {
|
|
|
+// return storePaymentService.selectByBusinessTypeAndBusinessCode(10, orderSn);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取消过期未支付订单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void cancelExpireRewardOrder() {
|
|
|
+ // 查询需要取消的订单
|
|
|
+ List<FsRewardGoodsOrder> expiredOrders = lambdaQuery()
|
|
|
+ .eq(FsRewardGoodsOrder::getStatus, 1)
|
|
|
+ .le(FsRewardGoodsOrder::getExpiredTime, LocalDateTime.now())
|
|
|
+ .list();
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(expiredOrders)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量更新订单状态
|
|
|
+ List<Long> orderIds = expiredOrders.stream()
|
|
|
+ .map(FsRewardGoodsOrder::getOrderId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ lambdaUpdate()
|
|
|
+ .set(FsRewardGoodsOrder::getStatus, -1)
|
|
|
+ .in(FsRewardGoodsOrder::getOrderId, orderIds)
|
|
|
+ .update();
|
|
|
+
|
|
|
+ // 回滚库存
|
|
|
+ for (FsRewardGoodsOrder order : expiredOrders) {
|
|
|
+ fsRewardGoodsMapper.addStock(order.getGoodsId());
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("取消过期奖励商品订单数量: {}, 回滚库存完成", orderIds.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 完成订单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void completeOrder() {
|
|
|
+ // 自动完成发货时间超过7天且处于已发货状态的订单
|
|
|
+ LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7);
|
|
|
+
|
|
|
+ // 查询需要完成的订单:状态为3(已发货)且发货时间超过7天
|
|
|
+ List<FsRewardGoodsOrder> ordersToComplete = lambdaQuery()
|
|
|
+ .eq(FsRewardGoodsOrder::getStatus, 3)
|
|
|
+ .le(FsRewardGoodsOrder::getDeliveryTime, sevenDaysAgo)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(ordersToComplete)) {
|
|
|
+ log.info("没有需要自动完成的订单");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量更新订单状态为已完成
|
|
|
+ List<Long> orderIds = ordersToComplete.stream()
|
|
|
+ .map(FsRewardGoodsOrder::getOrderId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ lambdaUpdate()
|
|
|
+ .set(FsRewardGoodsOrder::getStatus, 4)
|
|
|
+ .set(FsRewardGoodsOrder::getFinishTime, LocalDateTime.now())
|
|
|
+ .set(FsRewardGoodsOrder::getUpdateTime, LocalDateTime.now())
|
|
|
+ .set(FsRewardGoodsOrder::getUpdateBy, "系统自动完成")
|
|
|
+ .in(FsRewardGoodsOrder::getOrderId, orderIds)
|
|
|
+ .update();
|
|
|
+
|
|
|
+ log.info("自动完成奖励商品订单数量: {}", orderIds.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取消订单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int cancelOrder(Long orderId) {
|
|
|
+ // 查询订单信息
|
|
|
+ FsRewardGoodsOrder order = baseMapper.selectById(orderId);
|
|
|
+ if (order == null) {
|
|
|
+ throw new CustomException("订单不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 订单状态:1待支付 2已支付 3已发货 4已完成 -1已取消
|
|
|
+ Integer status = order.getStatus();
|
|
|
+
|
|
|
+ // 已取消状态,直接返回成功
|
|
|
+ if (status == -1) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 已完成状态,提示不可取消
|
|
|
+ if (status == 4) {
|
|
|
+ throw new CustomException("订单已完成,不可取消");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 待支付状态,直接修改订单状态
|
|
|
+ if (status == 1) {
|
|
|
+ return lambdaUpdate()
|
|
|
+ .set(FsRewardGoodsOrder::getStatus, -1)
|
|
|
+ .set(FsRewardGoodsOrder::getCancelTime, LocalDateTime.now())
|
|
|
+ .set(FsRewardGoodsOrder::getUpdateTime, LocalDateTime.now())
|
|
|
+ .set(FsRewardGoodsOrder::getUpdateBy, "系统取消")
|
|
|
+ .eq(FsRewardGoodsOrder::getOrderId, orderId)
|
|
|
+ .update() ? 1 : 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 已支付、已发货状态,先进行聚水潭订单取消,取消成功后再修改订单状态并退款
|
|
|
+ if (status == 2 || status == 3) {
|
|
|
+ return processShippedOrderCancellation(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new CustomException("订单状态异常,无法取消");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理已发货订单的取消
|
|
|
+ */
|
|
|
+ private int processShippedOrderCancellation(FsRewardGoodsOrder order) {
|
|
|
+ try {
|
|
|
+ // 先取消聚水潭订单
|
|
|
+ if (StringUtils.isNotEmpty(order.getExtendOrderSn())) {
|
|
|
+ cancelJstOrder(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 执行退款
|
|
|
+ processRefund(order);
|
|
|
+
|
|
|
+ // 修改订单状态
|
|
|
+ return lambdaUpdate()
|
|
|
+ .set(FsRewardGoodsOrder::getStatus, -1)
|
|
|
+ .set(FsRewardGoodsOrder::getCancelTime, LocalDateTime.now())
|
|
|
+ .set(FsRewardGoodsOrder::getUpdateTime, LocalDateTime.now())
|
|
|
+ .set(FsRewardGoodsOrder::getUpdateBy, "系统取消")
|
|
|
+ .eq(FsRewardGoodsOrder::getOrderId, order.getOrderId())
|
|
|
+ .update() ? 1 : 0;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("已发货订单取消失败,订单号:{}", order.getOrderSn(), e);
|
|
|
+ throw new CustomException("订单取消失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取消聚水潭订单
|
|
|
+ */
|
|
|
+ private void cancelJstOrder(FsRewardGoodsOrder order) {
|
|
|
+ try {
|
|
|
+// ErpRefundUpdateRequest requestDTO = new ErpRefundUpdateRequest();
|
|
|
+// requestDTO.setTid(order.getOrderSn());
|
|
|
+// requestDTO.setOid(order.getExtendOrderSn());
|
|
|
+// BaseResponse response = jstErpOrderService.cancelRewardOrder(requestDTO);
|
|
|
+//
|
|
|
+// if (response == null || !response.getSuccess()) {
|
|
|
+// throw new CustomException("聚水潭订单取消失败");
|
|
|
+// }
|
|
|
+
|
|
|
+ log.info("聚水潭订单取消成功,订单号:{},外部订单号:{}", order.getOrderSn(), order.getExtendOrderSn());
|
|
|
+
|
|
|
+ } catch (CustomException e) {
|
|
|
+ throw e;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("聚水潭订单取消失败,订单号:{}", order.getOrderSn(), e);
|
|
|
+ throw new CustomException("聚水潭订单取消失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理退款
|
|
|
+ */
|
|
|
+ private void processRefund(FsRewardGoodsOrder order) {
|
|
|
+ if (order.getPayMoney() == null || order.getPayMoney().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ return; // 无需退款
|
|
|
+ }
|
|
|
+
|
|
|
+ String orderType = "reward";
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 查询支付记录
|
|
|
+ FsStorePayment params = new FsStorePayment();
|
|
|
+ params.setBusinessType(10);
|
|
|
+ params.setBusinessCode(order.getOrderSn());
|
|
|
+ params.setStatus(1);
|
|
|
+ List<FsStorePayment> payments = storePaymentService.selectFsStorePaymentList(params);
|
|
|
+
|
|
|
+ if (payments != null && !payments.isEmpty()) {
|
|
|
+ FsStorePayment payment = payments.get(0);
|
|
|
+
|
|
|
+ // 根据支付方式处理退款
|
|
|
+ switch (payment.getPayMode()) {
|
|
|
+ case PaymentTypeConstant.WX:
|
|
|
+ processWxRefund(payment, orderType);
|
|
|
+ break;
|
|
|
+ case PaymentTypeConstant.YB:
|
|
|
+ processYbRefund(payment, orderType);
|
|
|
+ break;
|
|
|
+ case PaymentTypeConstant.TZ_BANK:
|
|
|
+ processTzBankRefund(payment, orderType);
|
|
|
+ break;
|
|
|
+ case PaymentTypeConstant.HF:
|
|
|
+ processHfRefund(payment, orderType);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new CustomException("不支持的支付方式:" + payment.getPayMode());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new CustomException("未找到支付明细");
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("退款处理成功,订单号:{},退款金额:{}", order.getOrderSn(), order.getPayMoney());
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("退款处理失败,订单号:{}", order.getOrderSn(), e);
|
|
|
+ throw new CustomException("退款处理失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信支付退款
|
|
|
+ */
|
|
|
+ private void processWxRefund(FsStorePayment payment, String orderType) {
|
|
|
+// PaymentMiniProgramConfig paymentConfig = paymentConfigService.selectPaymentConfigByAppId(payment.getAppid());
|
|
|
+// if (Objects.isNull(paymentConfig)) {
|
|
|
+// log.error("当前小程序 {} 没有配置可用的支付方式!", payment.getAppid());
|
|
|
+// throw new CustomException("当前小程序没有配置可用的支付方式!");
|
|
|
+// }
|
|
|
+
|
|
|
+ WxPayConfig payConfig = new WxPayConfig();
|
|
|
+// payConfig.setAppId(paymentConfig.getAppid());
|
|
|
+// payConfig.setMchId(paymentConfig.getWxMerchantNo());
|
|
|
+// payConfig.setMchKey(paymentConfig.getWxKey());
|
|
|
+// payConfig.setKeyPath(paymentConfig.getWxKeyPath());
|
|
|
+ payConfig.setSubAppId(StringUtils.trimToNull(null));
|
|
|
+ payConfig.setSubMchId(StringUtils.trimToNull(null));
|
|
|
+ wxPayService.setConfig(payConfig);
|
|
|
+
|
|
|
+ WxPayRefundRequest refundRequest = new WxPayRefundRequest();
|
|
|
+ refundRequest.setOutTradeNo(orderType + "-" + payment.getPayCode());
|
|
|
+ refundRequest.setOutRefundNo(orderType + "-" + payment.getPayCode());
|
|
|
+ refundRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
|
|
|
+ refundRequest.setRefundFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
|
|
|
+
|
|
|
+ try {
|
|
|
+ WxPayRefundResult refundResult = wxPayService.refund(refundRequest);
|
|
|
+ WxPayRefundQueryResult refundQueryResult = wxPayService.refundQuery("", refundResult.getOutTradeNo(), refundResult.getOutRefundNo(), refundResult.getRefundId());
|
|
|
+ if (refundQueryResult != null && refundQueryResult.getResultCode().equals("SUCCESS")) {
|
|
|
+ // 更新支付记录状态
|
|
|
+ updatePaymentRefundStatus(payment);
|
|
|
+ } else {
|
|
|
+ String msg = Objects.nonNull(refundQueryResult) ? refundQueryResult.getReturnMsg() : "";
|
|
|
+ throw new CustomException("退款请求失败" + msg);
|
|
|
+ }
|
|
|
+ } catch (WxPayException e) {
|
|
|
+ throw new CustomException("退款请求失败" + e.getReturnMsg());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 易宝支付退款
|
|
|
+ */
|
|
|
+ private void processYbRefund(FsStorePayment payment, String orderType) {
|
|
|
+ RefundDTO refundDTO = new RefundDTO();
|
|
|
+ refundDTO.setRefundMoney(payment.getPayMoney().toString());
|
|
|
+ refundDTO.setLowRefundNo(orderType + "-" + payment.getPayCode());
|
|
|
+ refundDTO.setUpOrderId(payment.getTradeNo());
|
|
|
+// refundDTO.setAppid(payment.getAppid());
|
|
|
+
|
|
|
+ RefundResult result = payService.refund(refundDTO);
|
|
|
+ log.info("订单退款返回结果: {}", result);
|
|
|
+ if (result.getState().equals("5")) {
|
|
|
+ // 更新支付记录状态
|
|
|
+ updatePaymentRefundStatus(payment);
|
|
|
+ } else {
|
|
|
+ throw new CustomException("退款请求失败" + result.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 台州银行退款
|
|
|
+ */
|
|
|
+ private void processTzBankRefund(FsStorePayment payment, String orderType) {
|
|
|
+ RefundParam tzBankResult = new RefundParam();
|
|
|
+ // 商户原支付订单号
|
|
|
+ tzBankResult.setOldPayOutOrderNo(orderType + payment.getPayCode());
|
|
|
+ // 商户退款订单号 对接平台系统里自己生成的退款订单号
|
|
|
+ tzBankResult.setRefundOrderNo(orderType + payment.getPayCode());
|
|
|
+ // 交易发送时间 yyyyMMddHHmmss
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
+ tzBankResult.setTrxSendTime(sdf.format(new Date()));
|
|
|
+ // 退款金额
|
|
|
+ tzBankResult.setRefundOrdTransAmt(payment.getPayMoney().doubleValue());
|
|
|
+// tzBankResult.setAppid(payment.getAppid());
|
|
|
+
|
|
|
+ TzBankResult<com.fs.tzBankPay.doman.RefundResult> result = tzBankService.refund(tzBankResult);
|
|
|
+ log.info("订单退款返回结果: {}", result);
|
|
|
+ if (result.getBody().getRefundOrdStatus().equals("90") || result.getBody().getRefundOrdStatus().equals("60")) {
|
|
|
+ // 更新支付记录状态
|
|
|
+ updatePaymentRefundStatus(payment);
|
|
|
+ } else {
|
|
|
+ log.error("退款请求失败: {}", result.getRetMsg());
|
|
|
+ throw new CustomException("退款请求失败" + result.getRetMsg());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 汇付支付退款
|
|
|
+ */
|
|
|
+ private void processHfRefund(FsStorePayment payment, String orderType) {
|
|
|
+ V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
|
|
|
+ request.setOrdAmt(payment.getPayMoney().toString());
|
|
|
+ request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
|
|
|
+ request.setReqSeqId("refund-" + payment.getPayCode());
|
|
|
+ Map<String, Object> extendInfoMap = new HashMap<>();
|
|
|
+ extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
|
|
|
+ request.setExtendInfo(extendInfoMap);
|
|
|
+ request.setAppId(payment.getAppId());
|
|
|
+
|
|
|
+ HuiFuRefundResult refund = huiFuService.refund(request);
|
|
|
+ log.info("订单退款返回结果: {}" + refund);
|
|
|
+ if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) &&
|
|
|
+ (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {
|
|
|
+ // 更新支付记录状态
|
|
|
+ updatePaymentRefundStatus(payment);
|
|
|
+ } else {
|
|
|
+ throw new CustomException("退款请求失败" + refund.getResp_desc());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新支付记录退款状态
|
|
|
+ */
|
|
|
+ private void updatePaymentRefundStatus(FsStorePayment payment) {
|
|
|
+ FsStorePayment paymentMap = new FsStorePayment();
|
|
|
+ paymentMap.setPaymentId(payment.getPaymentId());
|
|
|
+ paymentMap.setStatus(-1);
|
|
|
+ paymentMap.setRefundTime(DateUtils.getNowDate());
|
|
|
+ paymentMap.setRefundMoney(payment.getPayMoney());
|
|
|
+ storePaymentService.updateFsStorePayment(paymentMap);
|
|
|
+ }
|
|
|
+}
|