From 1b0cf0db5c82ea8308d2f338973a91555787c34d Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期二, 18 三月 2025 11:17:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java |  188 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 161 insertions(+), 27 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java
index 429e6eb..0ffaba6 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java
@@ -23,14 +23,17 @@
 import com.github.binarywang.wxpay.bean.result.WxPayBillInfo;
 import com.github.binarywang.wxpay.bean.result.WxPayBillResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
+import lombok.Synchronized;
 import org.apache.commons.lang3.StringUtils;
 import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 
 /**
@@ -93,7 +96,7 @@
     @Override
     public WxBill findOne(WxBill wxBill) {
         QueryWrapper<WxBill> wrapper = new QueryWrapper<>(wxBill);
-        return wxBillMapper.selectOne(wrapper);
+        return wxBillMapper.selectOne(wrapper.last(" limit 1"));
     }
 
     @Override
@@ -101,7 +104,71 @@
         QueryWrapper<WxBill> wrapper = new QueryWrapper<>(wxBill);
         return wxBillMapper.selectList(wrapper);
     }
-  
+    @Override
+    public  List<WxBill> getTotalBill(WxBill param) {
+        //鑾峰彇姹囨�荤粺璁�
+        WxBill bill = getTotalDataByDate(param);
+        WxBill bill1 = initBillData();//璁板綍浜ゆ槗瀹炴敹缁熻鏁版嵁
+        bill1.setSumBill(bill.getSumBill());//璁㈠崟鏁伴噺
+        bill1.setSumTotalFee(bill.getSumTotalFee());//浜ゆ槗閲戦
+        bill1.setSumCmmsAmt(bill.getSumCmmsAmt());//浜ゆ槗鎵嬬画璐�
+        bill1.setSumSuccessFee(bill.getSumSuccessFee());//鎴愬姛浜ゆ槗閲戦
+
+        WxBill bill2 = initBillData();//璁板綍閫�娆剧粺璁℃暟鎹�
+        bill2.setSumRefundBill(bill.getSumRefundBill());//閫�娆剧瑪鏁�
+        bill2.setSumRefundCmmsAmt(bill.getSumRefundCmmsAmt());//閫�娆炬墜缁垂
+        bill2.setSumRefundFee(bill.getSumRefundFee());//閫�娆鹃噾棰�
+
+        WxBill bill3 = initBillData();
+        bill3.setSumBill(bill.getSumBill());
+        bill3.setSumSuccessFee(bill.getSumSuccessFee());
+        bill3.setSumCmmsAmt(bill.getSumCmmsAmt());
+        bill3.setSumTotalFee(bill.getSumTotalFee());
+        bill3.setSumRefundBill(bill.getSumRefundBill());//閫�娆剧瑪鏁�
+        bill3.setSumRefundCmmsAmt(Constants.formatDecimalNum(bill.getSumRefundCmmsAmt()).add(Constants.formatDecimalNum(bill.getSumCmmsAmt())));//鎵嬬画璐�
+        bill3.setSumRefundFee(bill.getSumRefundFee());//閫�娆鹃噾棰�
+        bill3.setTotal(bill.getTotal());
+
+        QueryWrapper<WxBillDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().ge(param.getStartDate() !=null,WxBillDetail::getPid,DateUtil.getShortDateStr(param.getStartDate()));
+        queryWrapper.lambda().le(param.getEndDate() !=null,WxBillDetail::getPid,DateUtil.getShortDateStr(param.getEndDate()));
+        queryWrapper.lambda().ne(WxBillDetail::getAppid, WxMiniConfig.wxPayService.getConfig().getAppId());//闈炶嚜琛岃溅鏀跺叆缁熻
+        queryWrapper.lambda().groupBy(WxBillDetail::getBillStatus);
+        queryWrapper.select( "count(id) as sum_bill"
+                ,"sum(settlement_total_fee) as settlement_total_fee"
+                ,"sum(refund_fee) as refund_fee"
+                ,"sum(cmms_amt) as cmms_amt" ,"bill_status");
+        List<WxBillDetail> detailList = wxBillDetailMapper.selectList(queryWrapper);
+        WxBill bill4 = initBillData();//璁板綍浜ゆ槗瀹炴敹缁熻鏁版嵁
+        if(detailList!=null){
+            for(WxBillDetail detail : detailList){
+                if(StringUtils.equals(detail.getBillStatus(), "SUCCESS")){
+                    //瀹炴敹鏁版嵁
+                    bill4.setSumBill( detail.getSumBill());//浜ゆ槗绗旀暟
+                    bill4.setSumSuccessFee(Constants.formatDecimalNum(detail.getSettlementTotalFee()));//浜ゆ槗閲戦
+                    bill4.setSumCmmsAmt(Constants.formatDecimalNum(detail.getCmmsAmt()));//浜ゆ槗鎵嬬画璐�
+                } else if(StringUtils.equals(detail.getBillStatus(), "REFUND") || StringUtils.equals(detail.getBillStatus(), "REVOKED")){
+                    //閫�娆炬暟鎹�
+                    bill4.setSumRefundBill(Constants.formatIntegerNum(bill4.getSumRefundBill())+detail.getSumBill());//閫�娆剧瑪鏁�
+                    bill4.setSumRefundFee(Constants.formatDecimalNum(bill4.getSumRefundFee()).add(Constants.formatDecimalNum(detail.getRefundFee())));
+                    bill4.setSumRefundCmmsAmt(Constants.formatDecimalNum(bill4.getSumRefundCmmsAmt()).add(Constants.formatDecimalNum(Constants.formatDecimalNum(detail.getCmmsAmt()))));//閫�娆炬墜缁垂
+                }
+            }
+            //缁撶畻閲戦
+            bill4.setTotal(bill4.getSumSuccessFee()
+                    .subtract(bill4.getSumRefundFee())
+                    .subtract(bill4.getSumCmmsAmt())
+                    .subtract(bill4.getSumRefundCmmsAmt()));
+        }
+
+        List<WxBill> list = new ArrayList<>();
+        list.add(bill1);//瀹炴敹浜ゆ槗
+        list.add(bill2);//閫�娆炬眹鎬�
+        list.add(bill3);//瀹炴敹閫�娆炬�昏
+        list.add(bill4);//闈炶嚜琛岃溅鏀跺叆
+        return list;
+    }
+
     @Override
     public PageData<WxBill> findPage(PageWrap<WxBill> pageWrap) {
         IPage<WxBill> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
@@ -143,16 +210,59 @@
         if (pageWrap.getModel().getBikeFee() != null) {
             queryWrapper.lambda().eq(WxBill::getBikeFee, pageWrap.getModel().getBikeFee());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+        queryWrapper.lambda().ge(pageWrap.getModel().getStartDate() !=null,WxBill::getId,DateUtil.getShortDateStr(pageWrap.getModel().getStartDate()));
+        queryWrapper.lambda().le(pageWrap.getModel().getEndDate() !=null,WxBill::getId,DateUtil.getShortDateStr(pageWrap.getModel().getEndDate()));
+        //鎸夌収鏃堕棿鍗囧簭鏄剧ず
+        queryWrapper.lambda().orderByAsc(WxBill::getId);
+       /* for(PageWrap.SortData sortData: pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                 queryWrapper.orderByDesc(sortData.getProperty());
             } else {
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
-        }
-        return PageData.from(wxBillMapper.selectPage(page, queryWrapper));
+        }*/
+        return PageData.from(wxBillMapper.selectPage(page, queryWrapper),getTotalDataByDate(pageWrap.getModel()));
     }
 
+    private WxBill getTotalDataByDate(WxBill model) {
+        QueryWrapper<WxBill> param = new QueryWrapper<>();
+        param.lambda().ge(model.getStartDate() !=null,WxBill::getId,DateUtil.getShortDateStr(model.getStartDate()));
+        param.lambda().le(model.getEndDate() !=null,WxBill::getId,DateUtil.getShortDateStr(model.getEndDate()));
+        param.select("sum(sum_bill) as sum_bill"
+                ,"sum(sum_refund_bill) as sum_refund_bill"
+                ,"sum(sum_success_fee) as sum_success_fee"
+                ,"sum(sum_refund_fee) as sum_refund_fee"
+                ,"sum(sum_cmms_amt) as sum_cmms_amt"
+                ,"sum(sum_total_fee) as sum_total_fee"
+                ,"sum(sum_apply_refund_fee) as sum_apply_refund_fee"
+                ,"sum(sum_total_fee) as sum_total_fee"
+                ,"sum(total) as total"
+                ,"sum(sum_refund_cmms_amt) as sum_refund_cmms_amt"
+                ,"sum(bike_fee) as bike_fee"
+                );
+        WxBill bill = wxBillMapper.selectOne(param.last("limit 1"));
+        if(bill == null){
+            bill = initBillData();
+
+        }
+        return bill;
+    }
+
+    public static WxBill initBillData(){
+        WxBill bill = new WxBill();
+        bill.setSumBill(0);
+        bill.setSumTotalFee(new BigDecimal(0.00));
+        bill.setSumSuccessFee(new BigDecimal(0.00));
+        bill.setSumRefundFee(new BigDecimal(0.00));
+        bill.setSumCouponRefundFee(new BigDecimal(0.00));
+        bill.setSumApplyRefundFee(new BigDecimal(0.00));
+        bill.setSumCmmsAmt(new BigDecimal(0.00));
+        bill.setSumRefundBill(0);
+        bill.setSumRefundCmmsAmt(new BigDecimal(0.00));
+        bill.setTotal(new BigDecimal(0.00));
+        bill.setBikeFee(new BigDecimal(0.00));
+        return bill;
+    }
     @Override
     public long count(WxBill wxBill) {
         QueryWrapper<WxBill> wrapper = new QueryWrapper<>(wxBill);
@@ -160,11 +270,13 @@
     }
     @Override
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
-    public void getWxBill(String billDate) {
+    @Synchronized//鍗曚緥鎵ц
+    public void getWxBill(Date ydate ) {
+        isValidDate(ydate);
         // 鑾峰彇浜ゆ槗璐﹀崟鏁版嵁
         WxPayDownloadBillRequest request = new WxPayDownloadBillRequest();
-//        String billDate =  DateUtil.beforeDateToStr(1);
-        Date ydate = DateUtil.addDaysToDate(new Date(), -1);
+        String billDate = DateUtil.getShortDateStr(ydate);
+//        Date ydate = DateUtil.addDaysToDate(new Date(), -1);
         request.setBillDate(billDate);
         request.setBillType("SUCCESS");
         WxPayBillResult response = null;
@@ -181,18 +293,9 @@
         }catch (WxPayException e){
 
         }
-        WxBill bill = new WxBill();
+        WxBill bill = initBillData();
         //鏃ユ湡浣滀负涓婚敭
         bill.setId(billDate);
-        bill.setSumBill(0);
-        bill.setSumTotalFee(new BigDecimal(0.00));
-        bill.setSumSuccessFee(new BigDecimal(0.00));
-        bill.setSumRefundFee(new BigDecimal(0.00));
-        bill.setSumCouponRefundFee(new BigDecimal(0.00));
-        bill.setSumApplyRefundFee(new BigDecimal(0.00));
-        bill.setSumCmmsAmt(new BigDecimal(0.00));
-        bill.setSumRefundBill(0);
-        bill.setSumRefundCmmsAmt(new BigDecimal(0.00));
         List<WxBillDetail> detailList = new ArrayList<>();
         if(response !=null){
 //                List<WxPayBillInfo> detailList = response.getBillInfoList();
@@ -203,10 +306,6 @@
             bill.setSumTotalFee(formatStringToDecimal(response.getTotalAmount()));
             //搴旂粨璁㈠崟鎬婚噾棰�
             bill.setSumSuccessFee(formatStringToDecimal(response.getTotalFee()));
-            //閫�娆炬�婚噾棰�
-            bill.setSumRefundFee(formatStringToDecimal(response.getTotalFee()));
-            //閫�娆炬�婚噾棰�
-            bill.setSumApplyRefundFee(formatStringToDecimal(response.getTotalAppliedRefundFee()));
             //浜ゆ槗鎬绘墜缁垂閲戦
             bill.setSumCmmsAmt(formatStringToDecimal(response.getTotalPoundageFee()));
             detailList.addAll(getDetialModelByInfo(bill,response.getBillInfoList()));
@@ -215,8 +314,12 @@
             //閫�娆惧崟鎬绘暟绱杩涘叆
 //                bill.setSumBill(bill.getSumBill()+(Integer.parseInt(response.getTotalRecord()));
             bill.setSumRefundBill(Integer.parseInt(responseRefund.getTotalRecord()));//閫�娆剧殑璁㈠崟鏁�
+            //閫�娆炬�婚噾棰�
+            bill.setSumRefundFee(formatStringToDecimal(responseRefund.getTotalRefundFee()));
+            //閫�娆炬�婚噾棰�
+            bill.setSumApplyRefundFee(formatStringToDecimal(responseRefund.getTotalAppliedRefundFee()));
             bill.setSumRefundCmmsAmt(formatStringToDecimal(responseRefund.getTotalPoundageFee()));//閫�娆炬�绘墜缁垂
-            bill.setSumCouponRefundFee(formatStringToDecimal(responseRefund.getTotalCouponFee()));//閫�娆炬�绘墜缁垂
+            bill.setSumCouponRefundFee(formatStringToDecimal(responseRefund.getTotalCouponFee()));//閫�娆炬�婚噾棰�
             detailList.addAll(getDetialModelByInfo(bill,responseRefund.getBillInfoList()));
         }
         wxBillMapper.delete(new UpdateWrapper<WxBill>().lambda().eq( WxBill::getId, bill.getId()));
@@ -232,6 +335,28 @@
             wxBillDetailMapper.insertBatch(detailList);
         }
     }
+
+    private boolean isValidDate(Date ydate) {
+        if(ydate == null  ){
+            //鏃堕棿涓嶈兘涓虹┖
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        int days =  DateUtil.daysBetweenDates(new Date(),ydate);
+        if(days< 1){
+            //鍙兘鍚屾鏄ㄥぉ涔嬪墠鐨勬暟鎹�
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if( days == 1){
+            //鍙兘鍚屾鏄ㄥぉ10涔嬪墠鐨勬暟鎹�
+            Calendar caln = Calendar.getInstance();
+            caln.setTime(ydate);
+            if(caln.get(Calendar.HOUR_OF_DAY)  > 10){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈�杩戝悓姝ユ椂闂村彧鑳芥埅姝㈠埌鏄ㄥぉ10鐐瑰墠锛�");
+            }
+        }
+        return true;
+    }
+
     private void getTotalAndIncome(WxBill bill,Date date) {
         QueryWrapper<Goodsorder> queryWrapper = new QueryWrapper<>();
         queryWrapper.apply("to_char(create_date, 'yyyy-MM-dd') = {0}", date);
@@ -245,6 +370,10 @@
         if(billInfoList!=null){
             for (int i = 0; i <billInfoList.size(); i++) {
                 WxPayBillInfo info =billInfoList.get(i);
+                if((StringUtils.equals(info.getTradeType(),"REFUND" )||StringUtils.equals(info.getTradeType(),"REVOKED" )) && !StringUtils.equals(info.getRefundState(),"SUCCESS" )){
+                    //濡傛灉鏄潪鎴愬姛鐨勯��娆炬暟鎹紝涓嶈繘琛屽悓姝�
+                    continue;
+                }
                 WxBillDetail detail = new WxBillDetail();
                 detail.setId(UUID.randomUUID().toString());
                 detail.setPid(bill.getId());
@@ -280,13 +409,18 @@
                 detail.setRefundApplyDate(DateUtil.getDateFromString2(info.getRefundTime())); //鐢宠閫�娆炬椂闂�
                 //璁$畻鑷杞︽敹鍏ワ紝鍖归厤鏉ヨ嚜鑷杞﹀皬绋嬪簭鐨勬墍鏈夋敮浠樻垚鍔熷拰閫�娆炬垚鍔熺殑閲戦锛屼綔涓鸿嚜琛岃溅鏀跺叆锛堢疮璁℃敹娆鹃噾棰�-绱閫�娆炬垚鍔熼噾棰濓級
                 if(StringUtils.equals(detail.getAppid(), WxMiniConfig.wxPayService.getConfig().getAppId())){
-                    //鑷杞︽敹鍏ョ疮璁℃敹娆鹃噾棰�
-                    bill.setBikeFee(bill.getBikeFee().add(detail.getSettlementTotalFee()));
-                    if(StringUtils.equals(detail.getRefundSuccessStatus(),"SUCCESS")){
+                    //鑷杞︽敹鍏ョ疮璁℃敹娆鹃噾棰�(鏀粯鎴愬姛鎬婚噾棰�-閫�娆炬�婚噾棰濓級
+                    if(StringUtils.equals(info.getTradeState(),"SUCCESS")){
+                        //濡傛灉鏄氦鏄�
+                        bill.setBikeFee(bill.getBikeFee().add(detail.getSettlementTotalFee()));
+                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getCmmsAmt()) );
+                    }else  if(StringUtils.equals(info.getTradeState(),"REFUND" ) || StringUtils.equals(info.getTradeState(),"REVOKED" )){
                         //濡傛灉閫�娆炬垚鍔燂紝鎵i櫎閫�娆鹃噾棰�
-                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getApplyRefundFee()));
+                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getRefundFee()) );
+                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getCmmsAmt()) );
                     }
                 }
+
                 detailList.add(detail);
             }
         }

--
Gitblit v1.9.3