| | |
| | | package com.ruoyi.order.service.impl.order; |
| | | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | |
| | | import com.ruoyi.order.service.account.PaymentMessageService; |
| | | import com.ruoyi.order.service.account.ProfitSharingService; |
| | | import com.ruoyi.order.service.order.*; |
| | | import com.ruoyi.order.util.HuiFuTianXiaUtil; |
| | | import com.ruoyi.system.api.constant.AppErrorConstant; |
| | | import com.ruoyi.system.api.constant.DelayTaskEnum; |
| | | import com.ruoyi.system.api.constant.SecurityConstant; |
| | |
| | | import lombok.extern.log4j.Log4j2; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.text.NumberFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | |
| | | |
| | | @Resource |
| | | private OrderRefundService orderRefundService; |
| | | |
| | | @Value("${wx.pay.callbackPath}") |
| | | private String callbackPath; |
| | | |
| | | |
| | | /** |
| | |
| | | if (null != goodsNameList) { |
| | | goodsName = String.join(",", goodsNameList); |
| | | } |
| | | // 小程序微信下单支付 |
| | | createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo, |
| | | // // 小程序微信下单支付 |
| | | // createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo, |
| | | // orderId, order.getPayMoney(), appPlaceOrderDto.getOpenid(), |
| | | // appPlaceOrderDto.getSpbillCreateIp()); |
| | | |
| | | // 小程序微信下单支付 TODO 更换支付渠道(汇付天下) |
| | | createWxPayInfo1(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo, |
| | | orderId, order.getPayMoney(), appPlaceOrderDto.getOpenid(), |
| | | appPlaceOrderDto.getSpbillCreateIp()); |
| | | //生成自动取消订单延时任务 |
| | |
| | | throw new ServiceException(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 小程序支付下单API |
| | | * @param appPlaceOrderVo |
| | | * @param userId |
| | | * @param shopId |
| | | * @param goodsName |
| | | * @param outTradeNo |
| | | * @param orderId |
| | | * @param payMoney |
| | | * @param openid |
| | | * @param payerClientIp |
| | | */ |
| | | |
| | | private void createWxPayInfo1(AppPlaceOrderVo appPlaceOrderVo, Long userId, Long shopId, |
| | | String goodsName, String outTradeNo, |
| | | String orderId, BigDecimal payMoney, |
| | | String openid, String payerClientIp){ |
| | | try { |
| | | WxPayConfig config = wxService.getConfig(); |
| | | PartnerTransactionsRequest request = new PartnerTransactionsRequest(); |
| | | request.setSpAppid(config.getAppId()); |
| | | request.setSpMchid(config.getMchId()); |
| | | request.setSubMchid(config.getSubMchId()); |
| | | // 商品描述 body |
| | | String description = goodsName + "-商品购买"; |
| | | |
| | | request.setDescription(description); |
| | | request.setOutTradeNo(outTradeNo); |
| | | request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentCallback"); |
| | | |
| | | R<com.alibaba.fastjson.JSONObject> r = HuiFuTianXiaUtil.weixinPayment(outTradeNo, description, payMoney.doubleValue(), openid, request.getNotifyUrl()); |
| | | if(r.getCode() != 200){ |
| | | throw new ServiceException(r.getMsg()); |
| | | } |
| | | com.alibaba.fastjson.JSONObject data = r.getData(); |
| | | String mainMchId = WxPayConfiguration.getPlatformTyMacId(); |
| | | // 支付相关信息返回 |
| | | appPlaceOrderVo.setAppId(data.getString("appId")); |
| | | appPlaceOrderVo.setMchId(config.getMchId()); |
| | | appPlaceOrderVo.setTimeStamp(data.getString("timeStamp")); |
| | | appPlaceOrderVo.setNonceStr(data.getString("nonceStr")); |
| | | appPlaceOrderVo.setPackageStr(data.getString("package")); |
| | | appPlaceOrderVo.setSignType(data.getString("signType")); |
| | | appPlaceOrderVo.setPaySign(data.getString("paySign")); |
| | | |
| | | // 保存支付订单统一下单日志 |
| | | paymentMessageService.savePaymentMessage("1", orderId, JSON.toJSONString(request), data.toJSONString()); |
| | | |
| | | // 保存支付订单统一下单支付记录 |
| | | orderPaymentService.saveOrderPayment(userId, shopId, mainMchId, orderId, outTradeNo, payMoney, |
| | | appPlaceOrderVo.getEndTime(), "Y", openid, |
| | | goodsName, appPlaceOrderVo.getPackageStr()); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | if (appUserOrderPageVoList != null && !appUserOrderPageVoList.isEmpty()) { |
| | | Long shopId; |
| | | String activityId; |
| | | Shop shop; |
| | | HashSet<Long> shopSet = new HashSet<Long>(); |
| | | HashSet<String> activitySet = new HashSet<String>(); |
| | | // 遍历订单列表,获取店铺ID和活动ID |
| | | for (AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList) { |
| | | shopId = appUserOrderPageVo.getShopId(); |
| | | shopSet.add(shopId); |
| | |
| | | activitySet.add(activityId); |
| | | } |
| | | } |
| | | Map<Long, Shop> shopMap = new HashMap<>(); |
| | | shopSet.forEach(shopIdLong -> { |
| | | Shop shopTemp = remoteShopService.getShop(shopIdLong).getData(); |
| | | shopMap.put(shopIdLong, shopTemp); |
| | | }); |
| | | String shopJoinedString = String.join(",", shopSet.stream().map(Object::toString).collect(Collectors.toList())); |
| | | MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); |
| | | mgtBaseBathDto.setIds(shopJoinedString); |
| | | List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); |
| | | Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream() |
| | | .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); |
| | | MgtSimpleShopVo simpleShopVo; |
| | | Integer delayTime = 30; |
| | | if (redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)) { |
| | | delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); |
| | | } |
| | | //处理订单回显 |
| | | for (AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList) { |
| | | if(member.getBindingFlag()==0&&appUserOrderPageVo.getOrderFrom()==2){ |
| | | appUserOrderPageVo.setShopName("全部店铺"); |
| | | }else{ |
| | | shop = shopMap.get(appUserOrderPageVo.getShopId()); |
| | | appUserOrderPageVo.setShopName(shop.getShopName()); |
| | | appUserOrderPageVo.setShopServicePhone(shop.getShopServicePhone()); |
| | | simpleShopVo = shopMap.get(appUserOrderPageVo.getShopId()); |
| | | appUserOrderPageVo.setShopName(simpleShopVo.getShopName()); |
| | | appUserOrderPageVo.setShopServicePhone(simpleShopVo.getShopServicePhone()); |
| | | if (appUserOrderPageVo.getShopId().equals(appUserOrderPageDto.getShopId())) { |
| | | appUserOrderPageVo.setSameShop(1); |
| | | } else { |
| | |
| | | this.saveOrUpdate(order); |
| | | // 订单金额大于0时进行分账 |
| | | if (order.getOnlinePayMoney().compareTo(BigDecimal.ZERO)>0) { |
| | | submitProfitSharing(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom()); |
| | | // TODO: 2023/10/17 更换分账渠道(汇付天下) |
| | | // submitProfitSharing(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom()); |
| | | submitProfitSharing1(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom()); |
| | | } |
| | | //创建支付记录 |
| | | if(merVerifyOrderDto.getRelPayMoney().compareTo(BigDecimal.ZERO)>0){ |
| | |
| | | payRecord.setPayType(merVerifyOrderDto.getPayType()); |
| | | payRecordService.save(payRecord); |
| | | } |
| | | //更新用户消费统计 |
| | | //更新用户积分和消费统计 |
| | | MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); |
| | | memberTotalChangeDto.setUserId(order.getUserId()); |
| | | // 如果存在积分兑换比例,则计算积分 |
| | | if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) { |
| | | Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL); |
| | | BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue); |
| | | BigDecimal integralBig = moneyValueBig.multiply(order.getOnlinePayMoney()).setScale(0,BigDecimal.ROUND_HALF_UP); |
| | | Integer integral = Integer.valueOf(integralBig.toString()); |
| | | if(integral>0){ |
| | | memberTotalChangeDto.setChangeIntegral(integral); |
| | | memberTotalChangeDto.setTypeIntegral(1); |
| | | memberTotalChangeDto.setOrderId(orderId); |
| | | memberTotalChangeDto.setOrderNo(order.getOrderNo()); |
| | | } |
| | | } |
| | | //更新消费时间 |
| | | memberTotalChangeDto.setConsumeTime(nowTime); |
| | | remoteMemberService.changeMemberTotal(memberTotalChangeDto); |
| | | return merVerifyOrderVo; |
| | |
| | | paymentMessageService.savePaymentMessage("4", orderId, sendMessage, resultMessage); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * @description 分账实现 |
| | | * @author jqs |
| | | * @date 2023/9/8 11:56 |
| | | * @param orderId |
| | | * @param orderNo |
| | | * @param shopId |
| | | * @param orderMoney |
| | | * @param orderFrom |
| | | * @return void |
| | | */ |
| | | private void submitProfitSharing1(String orderId, String orderNo, Long shopId, BigDecimal orderMoney, Integer orderFrom) { |
| | | String sendMessage = ""; |
| | | String resultMessage = ""; |
| | | try { |
| | | // 核销完成 开始分账(平台收取服务费) |
| | | OrderPayment payment = orderPaymentService.getByOrderId(orderId); |
| | | String transactionId = payment.getTransactionId(); |
| | | String outTradeNo = payment.getOutTradeNo(); |
| | | R<ShopAuthenticationHftxVo> resultMch = remoteShopService.getShopHFTXSubMchId(shopId); |
| | | ShopAuthenticationHftxVo vo = resultMch.getData(); |
| | | if (StringUtils.isEmpty(vo.getHuifuId())) { |
| | | throw new ServiceException("获取商户号失败"); |
| | | } |
| | | // 平台特约商户号,用户平台收取服务费 2023-09-05改变分账方式 |
| | | String platformTyMacId = WxPayConfiguration.getPlatformTyMacId(); |
| | | if (!StringUtils.isEmpty(platformTyMacId)) { |
| | | WxPayConfig config = wxService.getConfig(); |
| | | ShopProportionVo shopProportion = null; |
| | | BigDecimal proportionPercent = null; |
| | | //商户订单获取统一分成 活动订单获取活动分成 |
| | | if(orderFrom==1){ |
| | | proportionPercent = new BigDecimal(vo.getShareRatio()); |
| | | }else{ |
| | | R<ShopProportionVo> resultShopProportion = remoteShopService.getShopProportion(shopId); |
| | | shopProportion = resultShopProportion.getData(); |
| | | proportionPercent = shopProportion.getProportionPercent(); |
| | | } |
| | | if (null != proportionPercent) { |
| | | ProfitSharingRequest request = new ProfitSharingRequest(); |
| | | request.setAppid(config.getAppId()); |
| | | request.setSubMchid(platformTyMacId); |
| | | request.setTransactionId(transactionId); |
| | | request.setOutOrderNo(IdUtils.simpleUUID()); |
| | | List<ProfitSharingRequest.Receiver> receiverList = new ArrayList<>(); |
| | | String description = "订单:" + orderNo + " 平台分账"; |
| | | //商户分成 |
| | | if(proportionPercent.compareTo(BigDecimal.ZERO)>0){ |
| | | PaymentDelaytransHFTXVo result = new PaymentDelaytransHFTXVo(); |
| | | // 计算分成金额 |
| | | int amount = orderMoney.multiply(proportionPercent).setScale(0, RoundingMode.UP).intValue(); |
| | | BigDecimal multiply = orderMoney.multiply(proportionPercent.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_EVEN); |
| | | log.info("订单分账:{} 分账金额: {}", orderNo, amount); |
| | | if (amount > 0) { |
| | | // 分账创建 |
| | | ProfitSharingRequest.Receiver receiver = new ProfitSharingRequest.Receiver(); |
| | | receiver.setType("MERCHANT_ID"); |
| | | receiver.setReceiverAccount(vo.getHuifuId()); |
| | | receiver.setAmount(amount); |
| | | receiver.setDescription(description); |
| | | receiverList.add(receiver); |
| | | request.setReceivers(receiverList); |
| | | // 分账完成 |
| | | request.setFinish(true); |
| | | |
| | | //分账对象 |
| | | JSONArray acctInfos = new JSONArray(); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("div_amt", String.format("%.2f", multiply.doubleValue())); |
| | | jsonObject.put("huifu_id", vo.getHuifuId()); |
| | | //平台商户 |
| | | double pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); |
| | | JSONObject jsonObject1 = new JSONObject(); |
| | | jsonObject1.put("div_amt", String.format("%.2f", pt_amount)); |
| | | jsonObject1.put("huifu_id", "6666000141216769"); |
| | | acctInfos.add(jsonObject1); |
| | | R<PaymentDelaytransHFTXVo> hftxVoR = HuiFuTianXiaUtil.paymentDelaytrans(request.getOutOrderNo(), outTradeNo, acctInfos); |
| | | if(hftxVoR.getCode() != 200){ |
| | | throw new ServiceException(hftxVoR.getMsg()); |
| | | } |
| | | result = hftxVoR.getData(); |
| | | // 创建分账记录 |
| | | profitSharingService.saveProfitSharing1(shopId, orderId, orderMoney, vo.getHuifuId(), multiply.doubleValue(), result); |
| | | } |
| | | // 保存请求信息 |
| | | sendMessage = JSONObject.toJSONString(request); |
| | | resultMessage = JSONObject.toJSONString(result); |
| | | } |
| | | } else { |
| | | resultMessage = String.format("订单分账:%s 获取商户分成失败", orderNo); |
| | | log.info(resultMessage); |
| | | } |
| | | } else { |
| | | resultMessage = String.format("订单分账:%s 获取微信商户号失败", orderNo); |
| | | log.info(resultMessage); |
| | | } |
| | | } catch (Exception e) { |
| | | resultMessage = String.format("订单分账:%s 分账失败:%s", orderNo, e.getMessage()); |
| | | log.info(resultMessage); |
| | | throw new ServiceException(resultMessage); |
| | | } |
| | | |
| | | // 保存分账信息 |
| | | paymentMessageService.savePaymentMessage("4", orderId, sendMessage, resultMessage); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * @param merVerifyCouponDto |
| | | * @return MerVerifyCouponVo |
| | |
| | | MerVerifyCouponVo merVerifyCouponVo = new MerVerifyCouponVo(); |
| | | // 调用remoteCouponService的getVerifyCoupon方法获取MerVerifyCouponGetVo对象 |
| | | List<Goods> goodsList = verifyCouponGetVo.getGoodsList(); |
| | | String relGoodsIds = memberCoupon.getRelGoodsIds(); |
| | | String[] relGoodsIdArr = relGoodsIds.split(","); |
| | | if(relGoodsIdArr.length!=goodsList.size()){ |
| | | throw new ServiceException(AppErrorConstant.GOODS_DOWN); |
| | | } |
| | | merVerifyCouponVo.setUserName(member.getRealName()); |
| | | merVerifyCouponVo.setUserMobile(member.getMobile()); |
| | | merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom()); |
| | | merVerifyCouponVo.setCouponName(memberCoupon.getCouponName()); |
| | | merVerifyCouponVo.setCreateTime(memberCoupon.getReceiveTime()); |
| | | // 将goodsList转换为MerCouponGoodsListVo列表,并设置相应属性 |
| | | List<MerCouponGoodsListVo> merCouponGoodsList = goodsList.stream() |
| | | .map(goods -> { |
| | | MerCouponGoodsListVo merCouponGoods = new MerCouponGoodsListVo(); |
| | | merCouponGoods.setGoodsId(goods.getGoodsId()); |
| | | merCouponGoods.setGoodsName(goods.getGoodsName()); |
| | | if (goods.getGoodsType() == 1) { |
| | | merCouponGoods.setGoodsType("周期"); |
| | | } else if (goods.getGoodsType() == 2) { |
| | | merCouponGoods.setGoodsType("服务"); |
| | | } else if (goods.getGoodsType() == 3) { |
| | | merCouponGoods.setGoodsType("体验"); |
| | | } else if (goods.getGoodsType() == 4) { |
| | | merCouponGoods.setGoodsType("单品"); |
| | | } |
| | | // 设置其他属性 |
| | | return merCouponGoods; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | List<MerCouponGoodsListVo> merCouponGoodsList = new ArrayList<>(); |
| | | MerCouponGoodsListVo merCouponGoods; |
| | | for(Goods goods : goodsList){ |
| | | if(goods.getGoodsStatus()!=1){ |
| | | throw new ServiceException(AppErrorConstant.GOODS_DOWN); |
| | | } |
| | | merCouponGoods = new MerCouponGoodsListVo(); |
| | | merCouponGoods.setGoodsId(goods.getGoodsId()); |
| | | merCouponGoods.setGoodsName(goods.getGoodsName()); |
| | | if (goods.getGoodsType() == 1) { |
| | | merCouponGoods.setGoodsType("周期"); |
| | | } else if (goods.getGoodsType() == 2) { |
| | | merCouponGoods.setGoodsType("服务"); |
| | | } else if (goods.getGoodsType() == 3) { |
| | | merCouponGoods.setGoodsType("体验"); |
| | | } else if (goods.getGoodsType() == 4) { |
| | | merCouponGoods.setGoodsType("单品"); |
| | | } |
| | | merCouponGoodsList.add(merCouponGoods); |
| | | } |
| | | // 设置merVerifyCouponVo的goodsList属性为merCouponGoodsList |
| | | merVerifyCouponVo.setGoodsList(merCouponGoodsList); |
| | | //生成服务 |
| | |
| | | SysUser sysUser; |
| | | if (member != null) { |
| | | sysUser = remoteUserService.getSysUser(member.getUserId()).getData(); |
| | | if(member.getBindingFlag()==1&&!member.getRelationShopId().equals(merNewOrderDto.getShopId())){ |
| | | throw new ServiceException(AppErrorConstant.USER_BINDING_ERROR); |
| | | } |
| | | } else { |
| | | //创建新用户 |
| | | String memberId = IdUtils.simpleUUID(); |
| | |
| | | // 更新订单状态 outTradeNo |
| | | String outTradeNo = transaction.getOutTradeNo(); |
| | | Order order = this.getByOutTradeNo(outTradeNo); |
| | | if(order.getOrderStatus() != 1){ |
| | | return; |
| | | } |
| | | String orderId = order.getOrderId(); |
| | | order.setOrderStatus(2); |
| | | order.setPayTime(new Date()); |
| | |
| | | // 初始化会员统计信息 |
| | | MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); |
| | | memberTotalChangeDto.setUserId(order.getUserId()); |
| | | // 如果存在积分兑换比例,则计算积分 |
| | | if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) { |
| | | // 如果存在积分兑换比例,则计算积分 2023-09-14改为核销后获取积分 |
| | | /*if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) { |
| | | Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL); |
| | | BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue); |
| | | BigDecimal integralBig = moneyValueBig.multiply(order.getPayMoney()).setScale(0,BigDecimal.ROUND_HALF_UP); |
| | | Integer integral = Integer.valueOf(integralBig.toString()); |
| | | memberTotalChangeDto.setChangeIntegral(integral); |
| | | memberTotalChangeDto.setTypeIntegral(1); |
| | | memberTotalChangeDto.setOrderId(orderId); |
| | | memberTotalChangeDto.setOrderNo(order.getOrderNo()); |
| | | } |
| | | if(integral>0){ |
| | | memberTotalChangeDto.setChangeIntegral(integral); |
| | | memberTotalChangeDto.setTypeIntegral(1); |
| | | memberTotalChangeDto.setOrderId(orderId); |
| | | memberTotalChangeDto.setOrderNo(order.getOrderNo()); |
| | | } |
| | | }*/ |
| | | // 设置会员支付金额和支付时间 |
| | | memberTotalChangeDto.setPayMoney(order.getPayMoney()); |
| | | memberTotalChangeDto.setPayTime(new Date()); |
| | |
| | | activityTotalChangeDto.setChangeNum(1); |
| | | activityTotalChangeDto.setMoney(order.getPayMoney()); |
| | | Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId()); |
| | | //判断用户是否下过单 如果只有当前订单则为1 |
| | | if (userActivityNum == 1) { |
| | | activityTotalChangeDto.setPersonNum(1); |
| | | } else { |
| | |
| | | // 初始化会员统计信息 |
| | | MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); |
| | | memberTotalChangeDto.setUserId(order.getUserId()); |
| | | // 如果存在积分兑换比例,则计算积分 |
| | | // 如果存在积分兑换比例,则计算积分 2023-09-14改为核销后获取积分 |
| | | /*if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) { |
| | | Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL); |
| | | BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue); |
| | |
| | | // 更新会员统计信息 |
| | | remoteMemberService.changeMemberTotal(memberTotalChangeDto); |
| | | // 如果订单来源于活动,则更新活动统计信息 |
| | | //TODO 可考虑改成定时任务统一查询后增加 减少服务器压力但会增加延后性 |
| | | if (order.getOrderFrom() == 2) { |
| | | ActivityTotalChangeDto activityTotalChangeDto = new ActivityTotalChangeDto(); |
| | | activityTotalChangeDto.setActivityId(order.getActivityId()); |
| | |
| | | activityTotalChangeDto.setRefundNum(1); |
| | | activityTotalChangeDto.setMoney(order.getPayMoney()); |
| | | Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId()); |
| | | //判断用户是否还有活动订单 无则减少人数 |
| | | if (userActivityNum > 0) { |
| | | activityTotalChangeDto.setPersonNum(1); |
| | | } else { |
| | | activityTotalChangeDto.setPersonNum(0); |
| | | } else { |
| | | activityTotalChangeDto.setPersonNum(1); |
| | | } |
| | | activityTotalChangeDto.setUserId(order.getUserId()); |
| | | remoteActivityService.changeActivityTotal(activityTotalChangeDto); |
| | |
| | | if(BigDecimal.ZERO.compareTo(onlinePayMoney) < 0){ |
| | | log.info("订单支付金额大于0,可发起退款"); |
| | | // 订单支付金额大于0,可发起退款 |
| | | orderWxApplyRefund(orderId, refundId, onlinePayMoney, orderRefund); |
| | | // orderWxApplyRefund(orderId, refundId, onlinePayMoney, orderRefund); |
| | | // 订单支付金额大于0,可发起退款 todo 修改渠道(汇付天下) |
| | | orderWxApplyRefund1(orderId, refundId, onlinePayMoney, orderRefund); |
| | | } |
| | | |
| | | orderRefund.setRefundStatus(1); |
| | |
| | | paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson); |
| | | |
| | | } catch (WxPayException e) { |
| | | throw new ServiceException(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 申请退款API |
| | | */ |
| | | private void orderWxApplyRefund1(String orderId, String outRefundNo, BigDecimal payMoney, OrderRefund orderRefund){ |
| | | try { |
| | | // 创建支付订单 |
| | | OrderPayment orderPayment = orderPaymentService.getByOrderId(orderId); |
| | | if (null == orderPayment) { |
| | | return; |
| | | } |
| | | |
| | | log.info("调用微信退款---发起退款"); |
| | | |
| | | String subMchId = orderPayment.getSubMchId(); |
| | | // WxPayConfig config = wxService.getConfig(); |
| | | |
| | | RefundsRequest request = new RefundsRequest(); |
| | | // request.setSpAppid(config.getAppId()); |
| | | request.setSubMchid(subMchId); |
| | | request.setTransactionId(orderPayment.getTransactionId()); |
| | | request.setOutRefundNo(outRefundNo); |
| | | request.setReason("用户取消订单"); |
| | | // 订单金额 |
| | | int total = orderPayment.getPayMoney().multiply(new BigDecimal(100)).intValue(); |
| | | |
| | | RefundsRequest.Amount amount = RefundsRequest.Amount.builder().refund(total).total(total).currency("CNY").build(); |
| | | request.setAmount(amount); |
| | | request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentRefundCallback"); |
| | | |
| | | // RefundsResult result = wxService.getEcommerceService().refunds(request); |
| | | |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
| | | String org_req_date = sdf.format(orderPayment.getCreateTime()); |
| | | String outTradeNo = orderPayment.getOutTradeNo(); |
| | | R<String> r = HuiFuTianXiaUtil.weixinPaymentRefund(outRefundNo, orderPayment.getPayMoney().doubleValue(), org_req_date, outTradeNo, request.getNotifyUrl()); |
| | | if(r.getCode() != 200){ |
| | | throw new ServiceException(r.getMsg()); |
| | | } |
| | | |
| | | // 微信退款id |
| | | orderRefund.setWxRefundId(r.getData()); |
| | | |
| | | // 请求参数 |
| | | Gson gson = new Gson(); |
| | | String refundRequestJson = gson.toJson(request); |
| | | // 返回参数 |
| | | // String refundResponseJson = gson.toJson(result); |
| | | |
| | | // log.info("调用微信退款返回参数---{}", refundResponseJson); |
| | | |
| | | // 保存支付订单统一下单日志 |
| | | // paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson); |
| | | |
| | | } catch (Exception e) { |
| | | throw new ServiceException(e.getMessage()); |
| | | } |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public List<MerOrderPageVo> pageMerMemberPayOrder(Page page,MerMemberNoClearOrderDto merOrderPageDto){ |
| | | // 获取订单列表 |
| | | List<MerOrderPageVo> merOrderPageVoList = orderMapper.pageMerMemberPayOrder(page, merOrderPageDto); |
| | | // 如果订单列表不为空 |
| | | if (merOrderPageVoList != null && !merOrderPageVoList.isEmpty()) { |
| | | Long userId; |
| | | BigDecimal zeroBig = new BigDecimal("0.00"); |
| | | StringJoiner userIdSj = new StringJoiner(","); |
| | | // 遍历订单列表 |
| | | for (MerOrderPageVo merOrderPageVo : merOrderPageVoList) { |
| | | userId = merOrderPageVo.getUserId(); |
| | | userIdSj.add(userId.toString()); |
| | | if(merOrderPageVo.getUnPaidMoney().compareTo(zeroBig)<0){ |
| | | // 如果未支付金额小于零,则设置为零 |
| | | if (merOrderPageVo.getUnPaidMoney().compareTo(zeroBig) < 0) { |
| | | merOrderPageVo.setUnPaidMoney(zeroBig); |
| | | } |
| | | } |
| | | // 获取用户列表 |
| | | MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto(); |
| | | mgtBaseBathDto.setIds(userIdSj.toString()); |
| | | List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(mgtBaseBathDto).getData(); |
| | | // 将用户列表转换为Map,以便根据用户ID快速查找用户信息 |
| | | Map<Long, MgtSimpleMemberVo> userMap = simpleMemberVoList.stream() |
| | | .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity())); |
| | | // 遍历订单列表 |
| | | for (MerOrderPageVo merOrderPageVo : merOrderPageVoList) { |
| | | if(merOrderPageVo.getUserId()!=null&&userMap.get(merOrderPageVo.getUserId())!=null){ |
| | | // 如果订单的用户ID不为空,并且用户Map中存在对应的用户信息 |
| | | if (merOrderPageVo.getUserId() != null && userMap.get(merOrderPageVo.getUserId()) != null) { |
| | | // 设置订单的用户名、昵称和手机号 |
| | | merOrderPageVo.setUserName(userMap.get(merOrderPageVo.getUserId()).getRealName()); |
| | | merOrderPageVo.setNickName(userMap.get(merOrderPageVo.getUserId()).getNickName()); |
| | | merOrderPageVo.setUserMobile(userMap.get(merOrderPageVo.getUserId()).getUserMobile()); |
| | | }else{ |
| | | log.debug("订单merOrderPageVo"+merOrderPageVo.getOrderId()+"缺少用户"); |
| | | } else { |
| | | log.debug("订单merOrderPageVo" + merOrderPageVo.getOrderId() + "缺少用户"); |
| | | } |
| | | } |
| | | } |
| | |
| | | public ProfitSharingResult queryBill(String orderId) throws WxPayException { |
| | | OrderPayment orderPayment = orderPaymentService.getByOrderId(orderId); |
| | | ProfitSharing profitSharing = profitSharingService.getByOrderId(orderId); |
| | | |
| | | ProfitSharingQueryRequest request = new ProfitSharingQueryRequest(); |
| | | request.setSubMchid("1650744551"); |
| | | request.setTransactionId(orderPayment.getTransactionId()); |