From 55ba702c1df240929e68df3b42fa9cb0607378b8 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期一, 08 九月 2025 10:58:48 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/2.0.1' into 2.0.1

---
 server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java |  192 ++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 169 insertions(+), 23 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 0b3c4a2..74ead5c 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
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.constants.Constants;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.Constants;
@@ -28,6 +29,8 @@
 import com.doumee.dao.business.model.Goodsorder;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.MemberRides;
+import com.doumee.dao.business.vo.BikeIncomeDetailReportVO;
+import com.doumee.dao.business.vo.BikeIncomeReportVO;
 import com.doumee.dao.business.vo.GoodsorderExportVO;
 import com.doumee.dao.business.vo.GoodsorderTotalDataVO;
 import com.doumee.dao.business.web.request.*;
@@ -58,10 +61,14 @@
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.InetAddress;
+import java.net.URLEncoder;
 import java.net.UnknownHostException;
 
+import java.nio.charset.Charset;
 import java.sql.Ref;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
@@ -199,7 +206,9 @@
             MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
             queryWrapper.selectAll(Goodsorder.class);
             queryWrapper.selectAs(Member::getOpenid, Goodsorder::getOpenid);
+            queryWrapper.selectAs(BaseParam::getType, Goodsorder::getBikeType);
             queryWrapper.leftJoin(Member.class, Member::getId  ,Goodsorder::getMemberId);
+            queryWrapper.leftJoin(BaseParam.class, BaseParam::getId  ,Goodsorder::getParamId);
             queryWrapper.select("(select max(r.done_date) from refund r where r.obj_id=t.id  and r.status=2 ) as refund_date");
             queryWrapper.select("(select sum(r.money) from refund r where r.obj_id=t.id and r.status=2) as refund_money");
             //鏃堕棿娈电瓫閫�
@@ -213,6 +222,9 @@
             queryWrapper.eq(Goodsorder::getPayStatus,Constants.ONE);
             queryWrapper.orderByAsc(Goodsorder::getPayDate);
             goodsorderExportVOIPage = goodsorderJoinMapper.selectJoinPage(page, GoodsorderExportVO.class, queryWrapper);
+
+
+
         }else{
             MPJLambdaWrapper<Refund> queryWrapper = new MPJLambdaWrapper<>();
             queryWrapper.selectAs(Refund::getMoney,GoodsorderExportVO::getRefundMoney);
@@ -240,6 +252,7 @@
 
         if (!CollectionUtils.isEmpty(goodsorderExportVOIPage.getRecords())){
             goodsorderExportVOIPage.getRecords().forEach(s->{
+                s.setBikeType(s.getType()==Constants.ZERO?s.getBikeType():Constants.ONE);
                 s.setMoney(Constants.translateMoney(s.getMoney()));
                 s.setRefundMoney(Constants.translateMoney(s.getRefundMoney()));
                 s.setCloseMoney(Constants.translateMoney(s.getCloseMoney()).compareTo(s.getMoney()) > 0 ? s.getMoney() : Constants.translateMoney(s.getCloseMoney()));
@@ -283,6 +296,7 @@
         }
         if (!CollectionUtils.isEmpty(goodsorderList)){
             goodsorderList.forEach(s->{
+                s.setBikeType(s.getType()==Constants.ZERO?s.getBikeType():Constants.ONE);
                 s.setMoney(Constants.translateMoney(s.getMoney()));
                 s.setCloseMoney(Constants.translateMoney(s.getCloseMoney()).compareTo(s.getMoney()) > 0 ? s.getMoney() : Constants.translateMoney(s.getCloseMoney()));
                 s.setRefundMoney(Constants.translateMoney(s.getRefundMoney()));
@@ -296,11 +310,13 @@
         queryWrapper.selectAll(Goodsorder.class);
         queryWrapper.selectAs(Member::getOpenid, Goodsorder::getOpenid);
         queryWrapper.selectAs(DiscountMember::getName, Goodsorder::getDiscountName);
+        queryWrapper.selectAs(BaseParam::getType, Goodsorder::getBikeType);
         queryWrapper.leftJoin(Member.class, Member::getId  ,Goodsorder::getMemberId);
         queryWrapper.leftJoin(DiscountMember.class, DiscountMember::getGoodsorderId  ,Goodsorder::getId);
-//        queryWrapper.select("(select r.name from discount_member r where r.isdeleted=0  and r.goodsorder_id=t.id limit 1) as discountName");
+        queryWrapper.leftJoin(BaseParam.class, BaseParam::getId  ,Goodsorder::getParamId);
         queryWrapper.select("(select max(r.done_date) from refund r where r.obj_id=t.id  and  r.status in(0,2)) as refund_date");
         queryWrapper.select("(select sum(r.money) from refund r where r.obj_id=t.id and r.status in(0,2)) as refund_money");
+        queryWrapper.select("(select  sum(d.ride_price)  from discount_log d where d.goodsorder_id=t.id and d.type = 0) as discountMoney");
         //鏃堕棿娈电瓫閫�
         if (Objects.nonNull(model.getStartDate())){
             queryWrapper.ge(Goodsorder::getPayDate, Utils.Date.getStart(model.getStartDate()));
@@ -308,6 +324,7 @@
         if (Objects.nonNull(model.getEndDate())){
             queryWrapper.le( Goodsorder::getPayDate, Utils.Date.getEnd(model.getEndDate()));
         }
+        queryWrapper.eq(Objects.nonNull(model.getBikeType()),BaseParam::getType,model.getBikeType());
         queryWrapper.eq(Constants.equalsInteger(model.getType(),Constants.ONE)&&model.getPayStatus() !=null,Goodsorder::getPayStatus,model.getPayStatus());
         queryWrapper.like(model.getCode() !=null,Goodsorder::getCode,model.getCode());
         queryWrapper.like(model.getId() !=null,Goodsorder::getId,model.getId());
@@ -333,6 +350,8 @@
 
         queryWrapper.select("(select  sum(er.discount_price) from member_rides  er  where er.ordre_id=t.id and er.isdeleted=0) as discountMoney," +
                 "(select  er.status from member_rides  er  where er.ordre_id=t.id order by er.create_date desc limit 1) as memberRidesStatus");
+
+
         queryWrapper.select("( select s.realname from refund r left join system_user s on r.creator = s.id where r.obj_id = t.id order by r.id desc  limit 1  ) ",Goodsorder::getRefundUserName);
         if(Objects.nonNull(pageWrap.getModel().getCloseStatus()) && pageWrap.getModel().getCloseStatus().equals(Constants.ZERO)){
             queryWrapper.ne(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.CLOSE.getKey());
@@ -627,6 +646,7 @@
                 freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
             }catch (Exception e){
             }
+
             closeMoney = getCloseMoneyByRides(memberRides,freeTime,true,goodsorder.getMoney(),goodsorder.getMemberId(),true).getAmount();
             //瀹為檯缁撶畻浠锋牸锛岃褰曞湪鏈�楂樿溅鍨嬭褰曚笂
 //            memberRides.get(0).setActualPrice(closeMoney);
@@ -674,6 +694,31 @@
                 memberRidesJoinMapper.updateById(up);
             }
         }
+        int durationSum = 0;
+        int freeTime = 0;
+        try {
+            freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
+        }catch (Exception e){
+        }
+        //鏈�楂樹环鏍艰溅鍨嬬殑楠戣璁板綍
+        //MemberRides topRides = this.getMaxRides(memberRides,durationSum,freeTime,true);
+        MemberRides topRides =null;
+        for(MemberRides rides : memberRides){
+            if ( true && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠璁㈠崟鏈夋湭瀹屾垚鐨勯獞琛岋紝鏃犳硶寮哄埗缁撶畻");
+            }
+            durationSum += Constants.formatIntegerNum(rides.getDuration());//绱楠戣锛堣璐癸級鏃堕暱
+            if(durationSum-freeTime > 0 ){//鍙畻瓒呭嚭鍏嶈垂鏃堕暱鐨勬暟鎹�
+                if(topRides == null ||( Constants.formatIntegerNum(topRides.getSortnum())<Constants.formatIntegerNum(rides.getSortnum())
+                        && Constants.formatIntegerNum(rides.getDuration())>0)){
+                    topRides = rides;
+                }
+            }
+        }
+        //鏃犺秴杩囧厤璐规椂闀跨殑楠戣璁板綍 鏌ヨ鏈�鍚庝竴鏉¤褰�
+        if(Objects.isNull(topRides)){
+             topRides = memberRidesJoinMapper.selectOne(new QueryWrapper<MemberRides>().lambda().eq(MemberRides::getOrdreId,goodsorder.getId()).orderByDesc(MemberRides::getCreateDate).last("limit 1"));
+        }
 //        BigDecimal closeMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(refund.getMoney()));
         //閫�娆句箰琛�
 //       int type =Constants.formatIntegerNum(refund.getType());
@@ -681,6 +726,7 @@
         update.setId(goodsorder.getId());
         update.setStatus(Constants.GOODSORDER_STATUS.CLOSE.getKey());
         update.setCloseMoney(closeMoney);
+        update.setParamId(Objects.nonNull(topRides)?topRides.getParamId():null);
         update.setCloseStatus(Constants.ONE);
         update.setCloseDate(new Date());
         update.setCloseInfo(Constants.REFUND_TYPE.get(type).getInfo());
@@ -717,6 +763,23 @@
         transactionsMapper.insert(transactions);
         //淇敼璁㈠崟淇℃伅
         goodsorderMapper.updateById(update);
+    }
+
+    public MemberRides getMaxRides(List<MemberRides> memberRides,Integer durationSum,Integer freeTime,boolean isClose){
+        MemberRides topRides =null;
+        for(MemberRides rides : memberRides){
+            if ( isClose && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠璁㈠崟鏈夋湭瀹屾垚鐨勯獞琛岋紝鏃犳硶寮哄埗缁撶畻");
+            }
+            durationSum += Constants.formatIntegerNum(rides.getDuration());//绱楠戣锛堣璐癸級鏃堕暱
+            if(durationSum-freeTime > 0 ){//鍙畻瓒呭嚭鍏嶈垂鏃堕暱鐨勬暟鎹�
+                if(topRides == null ||( Constants.formatIntegerNum(topRides.getSortnum())<Constants.formatIntegerNum(rides.getSortnum())
+                        && Constants.formatIntegerNum(rides.getDuration())>0)){
+                    topRides = rides;
+                }
+            }
+        }
+        return topRides;
     }
     /**
      * 閫�娆炬垚鍔熷洖璋�
@@ -792,14 +855,30 @@
         transactionsMapper.insert(transactions);
     }
 
+    @Override
+    public List<MemberRides> getMemberRidesForClose(String id) {
+        MPJLambdaWrapper<MemberRides> wrapper = new MPJLambdaWrapper<>();
+        wrapper.eq(MemberRides::getOrdreId,id);
+        wrapper.ne(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.LOCKING_DEFEAT.getKey());
+        wrapper.selectAll(MemberRides.class)
+                .selectAs(BaseParam::getSortnum, MemberRides::getSortnum)
+                .selectAs(BaseParam::getName, MemberRides::getParamName);
+        wrapper.leftJoin(BaseParam.class, BaseParam::getId, MemberRides::getParamId);
+        wrapper.orderByDesc(BaseParam::getSortnum);
+        //鍙栨渶楂樿溅鍨嬩綔涓鸿浠锋柟妗�
+        //鏌ヨ鎵�鏈夐獞琛岃褰�
+        List<MemberRides> memberRides = memberRidesJoinMapper.selectJoinList(MemberRides.class,wrapper);
+        return memberRides;
+    }
+
     private RidesDetailResponse  getCloseMoneyByRides(List<MemberRides> memberRides,int freeTime,boolean isClose,BigDecimal yjMoney,String memberId,Boolean unOver) {
         RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
         ridesDetailResponse.setHaveDisCount(Constants.ZERO);
         BigDecimal closeMoney = new BigDecimal(0.00);
         int durationSum = 0;
+        //鏈�楂樹环鏍艰溅鍨嬬殑楠戣璁板綍
+        //MemberRides topRides = this.getMaxRides(memberRides,durationSum,freeTime,isClose);
         MemberRides topRides =null;
-
-        //鍙栨渶楂樿溅鍨嬭绠楁柟妗堢粨绠楄鍗�
         for(MemberRides rides : memberRides){
             if ( isClose && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠璁㈠崟鏈夋湭瀹屾垚鐨勯獞琛岋紝鏃犳硶寮哄埗缁撶畻");
@@ -812,7 +891,6 @@
                 }
             }
         }
-
         //璁$畻搴斾粯閲戦
         if( topRides != null){
             int baseTime =Constants.formatIntegerNum(topRides.getBaseTime());
@@ -827,7 +905,9 @@
                 }
             }
             topRides.setActualPrice(closeMoney);
-        } 
+            //2025骞�3鏈�18鏃�11:28:38 杩斿洖楠戣浠锋牸鏈�楂樼殑杞﹀瀷
+            ridesDetailResponse.setParamId(topRides.getParamId());
+        }
         //鏌ヨ鏄惁瀛樺湪濂楅淇℃伅
         DiscountMember discountMember = this.getUseDiscount(memberId,durationSum,Objects.nonNull(topRides)?topRides.getType():null);
         //璁$畻鎶垫墸閲戦
@@ -891,22 +971,6 @@
         ridesDetailResponse.setAmount(closeMoney);
         ridesDetailResponse.setBikeType(topRides!=null?topRides.getParamName():"-");
         return ridesDetailResponse;
-    }
-
-    @Override
-    public List<MemberRides> getMemberRidesForClose(String id) {
-        MPJLambdaWrapper<MemberRides> wrapper = new MPJLambdaWrapper<>();
-        wrapper.eq(MemberRides::getOrdreId,id);
-        wrapper.ne(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.LOCKING_DEFEAT.getKey());
-        wrapper.selectAll(MemberRides.class)
-                .selectAs(BaseParam::getSortnum, MemberRides::getSortnum)
-                .selectAs(BaseParam::getName, MemberRides::getParamName);
-        wrapper.leftJoin(BaseParam.class, BaseParam::getId, MemberRides::getParamId);
-        wrapper.orderByDesc(BaseParam::getSortnum);
-        //鍙栨渶楂樿溅鍨嬩綔涓鸿浠锋柟妗�
-        //鏌ヨ鎵�鏈夐獞琛岃褰�
-        List<MemberRides> memberRides = memberRidesJoinMapper.selectJoinList(MemberRides.class,wrapper);
-        return memberRides;
     }
 
     @Override
@@ -1078,7 +1142,7 @@
             model.setRefundNum(Constants.formatIntegerNum(refund.getCountNum()));
             model.setRefundMoney(Constants.translateMoney(Constants.formatDecimalNum(refund.getMoney())));
         }
-        model.setClosedMoney(model.getPayMoney().subtract(model.getRefundMoney()).subtract(model.getUnClosedMoney()));
+        model.setClosedMoney(model.getPayMoney().add(model.getDiscountMoney()).subtract(model.getRefundMoney()).subtract(model.getUnClosedMoney()));
         return  model;
     }
     @Override
@@ -1385,6 +1449,7 @@
     public void autoCloseOrder( ) {
         Goodsorder goodsorder = new Goodsorder();
         goodsorder.setIsdeleted(Constants.ZERO);
+        goodsorder.setType(Constants.ZERO);
         goodsorder.setStatus(Constants.goodsorderStatus.pay);
         List<Goodsorder> list = findList(goodsorder);
         if (!CollectionUtils.isEmpty(list)){
@@ -1401,8 +1466,8 @@
                 }
             });
         }
-
     }
+
     @Override
     public void goodsOrderSettlement(String memberId) {
         Goodsorder goodsorder = this.goodsorderMapper.selectOne(new QueryWrapper<Goodsorder>()
@@ -1641,4 +1706,85 @@
         );
     }
 
+
+
+    @Override
+    public List<List<String>> getBikeIncomeReportVOList(Date startDate ,Date endDate){
+        if( (Objects.isNull(startDate)||Objects.isNull(endDate))
+        || startDate.getTime()>endDate.getTime()
+        || DateUtil.daysBetweenDates(endDate,startDate) > 30
+        )
+        {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        System.out.println( DateUtil.daysBetweenDates(endDate,startDate));
+        //鑾峰彇鎵�鏈夎溅鍨嬩俊鎭�
+        List<BaseParam> baseParamList = baseParamMapper.selectList(new QueryWrapper<BaseParam>().lambda().eq(BaseParam::getIsdeleted,Constants.ZERO)
+                .in(BaseParam::getType,Constants.THREE,Constants.FOUR)
+                .orderByAsc(BaseParam::getType,BaseParam::getSortnum)
+        );
+        //鑾峰彇2涓棩鏈熶笅鎵�鏈夊ぉ鏁�
+        List<Date> dateList = DateUtil.getDateList(startDate,endDate);
+        //鏌ヨ鏃ユ湡鍐呯殑鎵�鏈夋暟鎹�
+        List<Goodsorder> goodsorderList = goodsorderMapper.selectList(new QueryWrapper<Goodsorder>().lambda().eq(Goodsorder::getType,Constants.ZERO)
+                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
+                .eq(Goodsorder::getStatus,Constants.FOUR)
+                .isNotNull(Goodsorder::getParamId)
+                .ge(Goodsorder::getPayDate, Utils.Date.getStart(startDate))
+                .le( Goodsorder::getPayDate, Utils.Date.getEnd(endDate))
+        );
+
+        List<List<String>> parentList = new ArrayList<>();
+
+        for (BaseParam baseParam:baseParamList) {
+            List<String> dataChildList = new ArrayList<>();
+            dataChildList.add(baseParam.getName()+"(鍏�)");
+            BigDecimal totalAmount = BigDecimal.ZERO;
+            for (Date date:dateList) {
+                BigDecimal amount = goodsorderList.stream()
+                        .filter(i->StringUtils.isNotBlank(i.getParamId())&&DateUtil.getShortDateStr(date).equals(DateUtil.getShortDateStr(i.getCreateDate()))&&baseParam.getId().equals(i.getParamId()))
+                        .map(i->i.getCloseMoney()).reduce(BigDecimal.ZERO,BigDecimal::add);
+                amount = amount.divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP);
+                dataChildList.add(amount.toString());
+                totalAmount  = amount.add(totalAmount);
+            }
+            dataChildList.add("锟�"+totalAmount);
+            parentList.add(dataChildList);
+        }
+
+        List<String> dataStrList = new ArrayList<>();
+        dataStrList.add("鏃ユ湡");
+        for (Date date:dateList) {
+            dataStrList.add(DateUtil.getShortDateStr(date));
+        }
+        dataStrList.add("鎬昏");
+        parentList.add(0,dataStrList);
+
+        return parentList;
+
+    }
+
+    @Override
+    public void excel(Date startDate , Date endDate, HttpServletResponse response){
+        List<List<String>> data = this.getBikeIncomeReportVOList(startDate,endDate);
+        try {
+            String fileName = "杞﹀瀷鏀跺叆鍒嗘瀽_"+System.currentTimeMillis();
+            String encodeFileName = URLEncoder.encode(fileName, Charset.forName("UTF-8").toString()) + ".xlsx";
+            response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
+            response.setContentType("application/octet-stream");
+            response.setHeader("eva-opera-type", "download");
+            response.setHeader("eva-download-filename", encodeFileName);
+            ExcelExporter.exportList(data, fileName, response.getOutputStream());
+        } catch (IOException e) {
+            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
+        }
+    }
+
+
+
+
+
+
+
+
 }

--
Gitblit v1.9.3