From 9088209cdd7e3158d2a04caae05e6726ba3b3ad6 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期二, 12 十二月 2023 18:26:17 +0800
Subject: [PATCH] Merge branch 'devPartner' of http://139.186.142.91:10010/r/productDev/parkBike into devPartner

---
 server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java |  201 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 156 insertions(+), 45 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index f31398b..f02ddd4 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -1,5 +1,7 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -17,6 +19,7 @@
 import com.doumee.core.utils.Utils;
 import com.doumee.core.wx.WxMiniConfig;
 import com.doumee.core.wx.WxMiniUtilService;
+import com.doumee.core.wx.WxPayProperties;
 import com.doumee.dao.business.*;
 import com.doumee.dao.business.MemberRidesMapper;
 import com.doumee.dao.business.join.GoodsorderJoinMapper;
@@ -38,11 +41,11 @@
 import com.doumee.service.business.MemberRidesService;
 import com.doumee.service.business.PricingRuleService;
 import com.doumee.service.business.RefundService;
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
-import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
-import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension;
+import com.wechat.pay.java.service.partnerpayments.jsapi.model.*;
+import com.wechat.pay.java.service.refund.model.RefundNotification;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.checkerframework.checker.units.qual.A;
@@ -64,8 +67,10 @@
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
+@Slf4j
 public class GoodsorderServiceImpl implements GoodsorderService {
 
 
@@ -475,10 +480,22 @@
         closeGoodsorder(  goodsorder,Constants.REFUND_TYPE.PLAT_FORCE.getKey());
     }
 
+    /**
+     * 鍙戣捣閫�娆剧敵璇�
+     * @param goodsorder
+     * @param type
+     */
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     @Override
     public void closeGoodsorder( Goodsorder goodsorder ,int type ) {
-
+        Refund r = refundMapper.selectOne(new QueryWrapper<Refund>().lambda()
+                .eq(Refund::getObjId,goodsorder.getId())
+                .eq(Refund::getIsdeleted,Constants.ZERO)
+                .eq(Refund::getStatus,Constants.ZERO)
+                .last("limit 1" ));
+        if(r != null){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞瓨鍦ㄩ��娆剧敵璇锋鍦ㄥ鐞嗕腑锛岃绋嶅悗鏌ョ湅璁㈠崟淇℃伅鍝");
+        }
         List<MemberRides> memberRides = getMemberRidesForClose(goodsorder.getId());
         //榛樿缁撶畻涓烘娂閲戦噾棰�
         BigDecimal closeMoney = new BigDecimal(0.00);
@@ -487,6 +504,55 @@
             closeMoney = getCloseMoneyByRides(memberRides,true,goodsorder.getMoney()).getAmount();
             //瀹為檯缁撶畻浠锋牸锛岃褰曞湪鏈�楂樿溅鍨嬭褰曚笂
             memberRides.get(0).setActualPrice(closeMoney);
+        }
+        int refundMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(closeMoney)).intValue();//璁$畻浠锋牸
+        RefundDTO refundDTO = new RefundDTO();
+        refundDTO.setOrderId(goodsorder.getId());
+        refundDTO.setCanBalance(goodsorder.getMoney());
+        refundDTO.setRefundAmount(new BigDecimal(refundMoney));
+        refundDTO.setTotalAmount(goodsorder.getMoney());
+        refundDTO.setMemberId(goodsorder.getMemberId());
+        refundDTO.setReason(Constants.REFUND_TYPE.get(type).getName());
+        refundDTO.setCreator(goodsorder.getEditor());
+        refundDTO.setType(type);
+        wxMiniUtilService.wxRefund(refundDTO);
+    }
+
+    /**
+     * 閫�娆炬垚鍔熷洖璋�
+     */
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    @Override
+    public void closeGoodsorderDone(RefundNotification param) {
+        //鏌ヨ閫�娆剧敵璇疯鍗�
+        Refund refund = refundMapper.selectById(param.getOutRefundNo());
+        if(refund == null
+                || Constants.formatIntegerNum(refund.getIsdeleted()) == Constants.ONE
+                || Constants.formatIntegerNum(refund.getStatus()) == Constants.TWO){
+            return;
+        }
+        if (!"SUCCESS".equals(param.getRefundStatus().name())) {
+            // 濡傛灉閫�娆剧姸鎬佷笉姝g‘锛屼慨鏀归��娆惧崟鐘舵��
+            refund.setStatus(Constants.ONE);
+            refund.setEditDate(new Date());
+            refund.setOnlineOrderid(param.getTransactionId());
+            refund.setDoneDate(refund.getEditDate());
+            //鏇存柊閫�娆惧崟鐘舵��
+            refundMapper.updateById(refund);
+            return;
+        }
+        refund.setOnlineOrderid(param.getTransactionId());
+        doRefundTransactions(refund);
+
+        Goodsorder goodsorder = goodsorderMapper.selectById(refund.getObjId());
+        if(goodsorder ==null || Constants.formatIntegerNum(goodsorder.getCloseStatus()) != Constants.ZERO){
+            return;
+        }
+        //杩涜璁㈠崟缁撶畻涓氬姟澶勭悊
+        List<MemberRides> memberRides = getMemberRidesForClose(refund.getObjId());
+        //榛樿缁撶畻涓烘娂閲戦噾棰�
+        if (!CollectionUtils.isEmpty(memberRides)){
+            //楠戣鎬绘椂闀�
             for(MemberRides model :memberRides){
                 MemberRides up = new MemberRides();
                 up.setId(model.getId());
@@ -499,12 +565,15 @@
                 memberRidesJoinMapper.updateById(up);
             }
         }
+        BigDecimal closeMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(refund.getMoney()));
+        //閫�娆句箰琛�
+        int type =Constants.formatIntegerNum(refund.getType());
         Goodsorder update = new Goodsorder();
         update.setId(goodsorder.getId());
         update.setStatus(Constants.GOODSORDER_STATUS.CLOSE.getKey());
         update.setCloseMoney(closeMoney);
         update.setCloseDate(new Date());
-        update.setCloseInfo(Constants.REFUND_TYPE.get(type).getInfo());
+        update.setCloseInfo(Constants.REFUND_TYPE.get(refund.getType()).getInfo());
         update.setCloseUserId(goodsorder.getEditor());
         if(Constants.REFUND_TYPE.PLAT_FORCE.getKey() == type){
             //濡傛灉鏄己鍒剁粨绠�
@@ -518,21 +587,7 @@
             //濡傛灉鏄钩鍙拌嚜鍔ㄧ粨绠�
             update.setCloseType(Constants.TWO);
         }
-        int refundMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(closeMoney)).intValue();//璁$畻浠锋牸
-        if(refundMoney > 0){
-            //濡傛灉鏈夐��娆撅紝鐢宠寰俊閫�娆撅紝璁板綍閫�娆句氦鏄撴祦姘�
-            RefundDTO refundDTO = new RefundDTO();
-            refundDTO.setOrderId(goodsorder.getId());
-            refundDTO.setCanBalance(goodsorder.getMoney());
-            refundDTO.setRefundAmount(new BigDecimal(refundMoney));
-            refundDTO.setTotalAmount(goodsorder.getMoney());
-            refundDTO.setMemberId(goodsorder.getMemberId());
-            refundDTO.setReason(Constants.REFUND_TYPE.get(type).getName());
-            refundDTO.setCreator(update.getEditor());
-            refundDTO.setType(type);
-            Refund refund = wxMiniUtilService.wxRefund(refundDTO);
-            update.setCloseId(refund.getId());
-        }
+        update.setCloseId(refund.getId());
         //瀛樺偍 娑堣垂浜ゆ槗娴佹按
         Transactions transactions = new Transactions();
         transactions.setId(Constants.getUUID());
@@ -540,7 +595,7 @@
         transactions.setCreateDate(new Date());
         transactions.setIsdeleted(Constants.ZERO);
         transactions.setOrderId(goodsorder.getId());
-        transactions.setMoney(goodsorder.getMoney().subtract(new BigDecimal(refundMoney)));
+        transactions.setMoney(goodsorder.getMoney().subtract(Constants.formatDecimalNum(refund.getMoney())));
         transactions.setType(Constants.TRANSACTIONS_TYPE.CONSUMPTION.getKey());
         transactions.setDoneDate(new Date());
         transactions.setTitle(Constants.TRANSACTIONS_TYPE.CONSUMPTION.getName());
@@ -551,6 +606,46 @@
         transactionsMapper.insert(transactions);
         //淇敼璁㈠崟淇℃伅
         goodsorderMapper.updateById(update);
+    }
+
+    private void doRefundTransactions(Refund refund ) {
+        //瀛樺偍浜ゆ槗娴佹按琛�
+        refund.setStatus(Constants.TWO);
+        refund.setEditDate(new Date());
+        refund.setDoneDate(refund.getEditDate());
+        //鏇存柊閫�娆惧崟鐘舵��
+        refundMapper.updateById(refund);
+
+        Transactions transactions = new Transactions();
+        transactions.setId(Constants.getUUID());
+        transactions.setMemberId(refund.getMemberId());
+        transactions.setCreateDate(new Date());
+        transactions.setIsdeleted(Constants.ZERO);
+        transactions.setOrderId(refund.getObjId());
+        transactions.setMoney(refund.getMoney());
+        transactions.setPreOrderid(refund.getObjId());
+        transactions.setOnlineOrderid(refund.getId());
+        transactions.setDoneDate(new Date());
+        if(refund.getType().equals(Constants.REFUND_TYPE.PLAT_AUTO.getKey())||refund.getType().equals(Constants.REFUND_TYPE.PLAT_FORCE.getKey())){
+            //骞冲彴鑷姩閫�娆� 鎴� 寮哄埗閫�娆�
+            transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey());
+            transactions.setTitle(Constants.REFUND_TYPE.PLAT_AUTO.getInfo());
+            transactions.setContent(Constants.REFUND_TYPE.PLAT_AUTO.getInfo());
+        }else if(refund.getType().equals(Constants.REFUND_TYPE.NORMAL.getKey())){
+            //鐢ㄦ埛涓诲姩閫�娆�
+            transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey());
+            transactions.setTitle(Constants.REFUND_TYPE.NORMAL.getInfo());
+            transactions.setContent(Constants.REFUND_TYPE.NORMAL.getInfo());
+        }else if(refund.getType().equals(Constants.REFUND_TYPE.BACK.getKey())){
+            //缁撶畻鍚庨��娆�
+            transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey());
+            transactions.setTitle(Constants.REFUND_TYPE.BACK.getInfo());
+            transactions.setContent(Constants.REFUND_TYPE.BACK.getInfo());
+        }
+        transactions.setBalance(BigDecimal.ZERO);
+        transactions.setObjId(refund.getId());
+        transactions.setObjType(Constants.ONE);
+        transactionsMapper.insert(transactions);
     }
 
     private RidesDetailResponse    getCloseMoneyByRides(List<MemberRides> memberRides,boolean isClose,BigDecimal yjMoney) {
@@ -638,7 +733,8 @@
             refundDTO.setCreator(principal.getId());
             refundDTO.setReason(reason);
             refundDTO.setType(Constants.REFUND_TYPE.BACK.getKey());
-            Refund refund = wxMiniUtilService.wxRefund(refundDTO);
+            //鍙戣捣閫�娆剧敵璇�
+            wxMiniUtilService.wxRefund(refundDTO);
         }else {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝閫�娆鹃噾棰濅笉鍏佽瓒呰繃"+canBalance+"鍏�");
         }
@@ -827,23 +923,43 @@
         goodsorder.setPayWay(Constants.ZERO);
         this.goodsorderMapper.insert(goodsorder);
         //璋冭捣鏀粯
+        Object response = null;
         try {
-            Object response = null;
-            WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
-            request.setBody("楠戣鎶奸噾");
-            request.setAttach("createGoodsOrder");
-            request.setOutTradeNo(goodsorder.getId());
-            request.setTotalFee(goodsorder.getMoney().intValue());
-            request.setSpbillCreateIp(this.getIpAddr());
-            request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss"));
-            request.setOpenid(member.getOpenid());
-            response = WxMiniConfig.wxPayService.createOrder(request);
-            return response;
-        } catch (WxPayException e) {
-            e.printStackTrace();
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),e.getMessage());
+            response = getWxPayResponse(goodsorder,member.getOpenid());
+        }  catch (Exception e) {
+            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍙戣捣鏀粯澶辫触~");
         }
+
+        return response;
     }
+
+    private Object getWxPayResponse(Goodsorder goodsorder,String openid) throws Exception {
+        //璋冭捣鏀粯
+            Object response = null;
+        PrepayRequest request = new PrepayRequest();
+        request.setAttach("createGoodsOrder");
+        request.setDescription("妫灄鍏洯鑷杞﹂獞琛屾娂閲戞敮浠�");
+        request.setSpMchid(WxMiniConfig.wxProperties.getMchId());
+        request.setSpAppid(WxMiniConfig.wxProperties.getAppId());
+        request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId());
+        request.setSubAppid(WxMiniConfig.wxProperties.getSubAppId());
+        Payer payer = new Payer();
+        payer.setSubOpenid(openid);
+        request.setPayer(payer);
+        request.setOutTradeNo(goodsorder.getId());
+        request.setNotifyUrl(WxMiniConfig.wxProperties.getNotifyUrl());//杩欎釜鍥炶皟url蹇呴』鏄痟ttps寮�澶寸殑
+        Amount amount = new Amount();
+        amount.setTotal(goodsorder.getMoney().intValue());
+        request.setAmount(amount);
+//        PrepayResponse res = WxMiniConfig.wxPayService.prepay(request);
+            // 璺熶箣鍓嶄笅鍗曠ず渚嬩竴鏍凤紝濉厖棰勪笅鍗曞弬鏁�
+        PrepayWithRequestPaymentResponse resParam =  WxMiniConfig.jsapiExtService.prepayWithRequestPayment(request,WxMiniConfig.wxProperties.getSubAppId());
+        response =resParam;
+
+        return response;
+
+    }
+
 
     /**
      * 楠岃瘉钀ヤ笟鏃堕棿
@@ -899,10 +1015,8 @@
                     s.setEditDate(date);
                     s.setEditor(null);
                     s.setCloseDate(date);
-
                     closeGoodsorder(s,Constants.REFUND_TYPE.PLAT_AUTO.getKey());
                 }catch (BusinessException e){
-
                 }catch (Exception e){
 
                 }
@@ -917,10 +1031,7 @@
                 .eq("status",Constants.goodsorderStatus.pay)
                 .last(" limit 1 "));
         if(Objects.isNull(goodsorder)){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏃犻獞琛岃鍗曡褰�");
-        }
-        if(goodsorder == null  ){
-            throw new BusinessException(ResponseStatus.DATA_EMPTY );
+            throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"鏃犻獞琛岃鍗曡褰�");
         }
         if(Constants.formatIntegerNum(goodsorder.getStatus()) != Constants.GOODSORDER_STATUS.HAVING_PAY.getKey() ){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ヨ鍗曞綋鍓嶇姸鎬佷笉鏀寔缁撶畻鎿嶄綔锛岃灏濊瘯鍒锋柊鍒楄〃閲嶈瘯锛�" );
@@ -937,7 +1048,7 @@
     public String payNotify(String preOrderId,String paymentNo){
         Goodsorder goodsorder = this.goodsorderMapper.selectById(preOrderId);
         if(goodsorder.getStatus()==Constants.goodsorderStatus.pay){
-            return WxPayNotifyResponse.success("澶勭悊鎴愬姛!");
+            return  ("澶勭悊鎴愬姛!");
         }
         goodsorder.setOnlineOrderid(paymentNo);
         goodsorder.setPayStatus(Constants.goodsorderPayStatus.pay);
@@ -962,7 +1073,7 @@
         transactions.setObjId(goodsorder.getId());
         transactions.setObjType(Constants.ZERO);
         transactionsMapper.insert(transactions);
-        return WxPayNotifyResponse.success("澶勭悊鎴愬姛!");
+        return  ("澶勭悊鎴愬姛!");
     }
 
 

--
Gitblit v1.9.3