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