From 3c5723e2b832823fc63e6d8cd1460b2e003583db Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 29 九月 2025 17:16:38 +0800
Subject: [PATCH] 抽奖活动添加次数规则

---
 framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java |  291 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 268 insertions(+), 23 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
index fc44324..c3003e8 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -10,6 +10,7 @@
 import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
+import cn.lili.base.Result;
 import cn.lili.common.enums.ClientTypeEnum;
 import cn.lili.common.enums.PromotionTypeEnum;
 import cn.lili.common.enums.ResultCode;
@@ -30,6 +31,7 @@
 import cn.lili.modules.goods.service.GoodsService;
 import cn.lili.modules.goods.service.GoodsSkuService;
 import cn.lili.modules.lmk.domain.entity.CouponVirtual;
+import cn.lili.modules.lmk.domain.vo.OrderCountByDayAndHourVO;
 import cn.lili.modules.lmk.domain.vo.OrderCountVO;
 import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
 import cn.lili.modules.lmk.enums.general.VirtualGoodsTypeEnum;
@@ -56,6 +58,7 @@
 import cn.lili.modules.promotion.entity.dos.Pintuan;
 import cn.lili.modules.promotion.service.CouponService;
 import cn.lili.modules.promotion.service.PintuanService;
+import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
 import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO;
 import cn.lili.modules.store.service.StoreDetailService;
 import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
@@ -86,7 +89,9 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.reactivex.rxjava3.core.Maybe;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
@@ -109,6 +114,10 @@
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -1286,6 +1295,231 @@
         return order;
     }
 
+    @Override
+    public Result getOrderCount(StatisticsQueryParam queryParam) {
+        Date startTime = null;
+        Date endTime = new Date(); // 缁撴潫鏃堕棿榛樿鏄綋鍓嶆椂闂�
+        List<String> dateList = new ArrayList<>();
+
+        Calendar calendar = Calendar.getInstance(); // 鐢ㄤ簬鏃ユ湡璁$畻鐨勬棩鍘嗗疄渚�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        int days = 0;
+        //鍒ゆ柇鏄惁鏄寜骞存湀鏌ヨ
+        if (queryParam.getYear() != null && queryParam.getMonth() != null) {
+            Date[] dates =CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth());
+            startTime = dates[0];
+            endTime = dates[1];
+            System.out.println("寮�濮嬫墦鍗�");
+            System.out.println(startTime);
+            System.out.println(endTime);
+            Calendar tempCalendar = Calendar.getInstance();
+            tempCalendar.setTime(startTime);
+            days = tempCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+            for (int i = 0; i < days; i++) {
+                dateList.add(sdf.format(tempCalendar.getTime()));
+                tempCalendar.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+            }
+        }else{
+            switch (queryParam.getSearchType()) {
+                case "TODAY":
+                    // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
+                    calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
+                    calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
+                    calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
+                    calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
+                    startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
+                    dateList.add(sdf.format(startTime));
+                    break;
+                case "YESTERDAY":
+                    // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
+
+                    // 璁剧疆鏄ㄥぉ0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
+
+                    // 璁剧疆鏄ㄥぉ23:59:59.999
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 59);
+                    calendar.set(Calendar.SECOND, 59);
+                    calendar.set(Calendar.MILLISECOND, 999);
+                    endTime = calendar.getTime();
+
+                    dateList.add(sdf.format(startTime));
+                    break;
+                case "LAST_SEVEN":
+                    // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
+
+                    // 璁剧疆7澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
+
+                    days = 7;
+                    // 寰幆鐢熸垚7澶╃殑鏃ユ湡瀛楃涓�
+                    Calendar tempCalendar = Calendar.getInstance();
+                    tempCalendar.setTime(startTime);
+                    for (int i = 0; i < days; i++) {
+                        dateList.add(sdf.format(tempCalendar.getTime()));
+                        tempCalendar.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+                    }
+                    break;
+                case "LAST_THIRTY":
+                    // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
+
+                    // 璁剧疆30澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
+
+                    days = 30;
+                    // 寰幆鐢熸垚30澶╃殑鏃ユ湡瀛楃涓�
+                    Calendar tempCalendar30 = Calendar.getInstance();
+                    tempCalendar30.setTime(startTime);
+                    for (int i = 0; i < days; i++) {
+                        dateList.add(sdf.format(tempCalendar30.getTime()));
+                        tempCalendar30.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+                    }
+                    break;
+                default:
+                    return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+            }
+        }
+
+        List<Map<String, Object>> maps = baseMapper.selectOrderCountByDay(startTime,endTime);
+
+        Map<String, Long> dayCountMap = maps.stream()
+                .collect(Collectors.toMap(
+                        map -> map.get("day").toString(),  // 鏃ユ湡瀛楃涓诧紙濡�2023-09-19锛�
+                        map -> Long.valueOf(map.get("count").toString())  // 璁㈠崟鏁伴噺
+                ));
+
+        List<Long> orderCounts = new ArrayList<>();
+        for (String date : dateList) {
+            // 鏍稿績锛氬瓨鍦ㄥ垯鍙栨煡璇㈢粨鏋滐紝涓嶅瓨鍦ㄥ垯琛�0
+            orderCounts.add(dayCountMap.getOrDefault(date, 0L));
+        }
+
+
+        return Result.ok().data(orderCounts);
+    }
+
+    @Override
+    public Result getOrderTimePeriod(StatisticsQueryParam queryParam) {
+        Date startTime = null;
+        Date endTime = new Date(); // 缁撴潫鏃堕棿榛樿鏄綋鍓嶆椂闂�
+        List<String> dateList = new ArrayList<>();
+
+        Calendar calendar = Calendar.getInstance(); // 鐢ㄤ簬鏃ユ湡璁$畻鐨勬棩鍘嗗疄渚�
+        for (int i =0;i<24;i++){
+            dateList.add(i + "鐐�");
+        }
+        if (queryParam.getYear() != null && queryParam.getMonth() != null) {
+            Date[] dates =CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth());
+            startTime = dates[0];
+            endTime = dates[1];
+        }else{
+            switch (queryParam.getSearchType()) {
+                case "TODAY":
+                    // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
+                    calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
+                    calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
+                    calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
+                    calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
+                    startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
+                    break;
+                case "YESTERDAY":
+                    // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
+
+                    // 璁剧疆鏄ㄥぉ0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
+
+                    // 璁剧疆鏄ㄥぉ23:59:59.999
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 59);
+                    calendar.set(Calendar.SECOND, 59);
+                    calendar.set(Calendar.MILLISECOND, 999);
+                    endTime = calendar.getTime();
+                    break;
+                case "LAST_SEVEN":
+                    // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
+
+                    // 璁剧疆7澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
+
+                    break;
+                case "LAST_THIRTY":
+                    // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
+
+                    // 璁剧疆30澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
+
+                    break;
+                default:
+                    return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+            }
+        }
+
+
+
+        List<Map<String, Object>> maps = baseMapper.selectOrderTimePeriod(startTime,endTime);
+
+        Map<String, Long> countByDayHour = maps.stream()
+                .collect(Collectors.toMap(
+                        map -> map.get("hour").toString(),
+                        map -> Long.valueOf(map.get("count").toString()),
+                        Long::sum  // 濡傛灉鏈夐噸澶嶏紝绱姞count
+                ));
+
+        // 閬嶅巻鏌ョ湅缁撴灉
+        List<Long> countList = new ArrayList<>();
+        for (int i = 0; i < 24; i++) {
+            String hourKey = String.valueOf(i);
+            Long count = countByDayHour.getOrDefault(hourKey, 0L);
+            countList.add(count);
+        }
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("dateData",dateList);
+        map.put("countData",countList);
+        //TODO 娴忚鏁版嵁鏈姞鍏�
+//        map.put();
+
+        return Result.ok().data(map);
+    }
+
     /**
      * 铏氭嫙鎴愬洟
      *
@@ -1620,8 +1854,19 @@
             orderExportDetailDTO.setPaymentMethod(CharSequenceUtil.isNotBlank(orderExportDTO.getPaymentMethod()) ? PaymentMethodEnum.valueOf(orderExportDTO.getPaymentMethod()).paymentName() : "");
             orderExportDetailDTO.setClientType(ClientTypeEnum.valueOf(orderExportDTO.getClientType()).value());
             orderExportDetailDTO.setOrderType(orderExportDTO.getOrderType().equals(OrderTypeEnum.NORMAL.name()) ? "鏅�氳鍗�" : "铏氭嫙璁㈠崟");
-            orderExportDetailDTO.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.valueOf(orderExportDTO.getAfterSaleStatus()).description());
 
+            String afterSaleStatus = orderExportDTO.getAfterSaleStatus();
+            if (StringUtils.isNotBlank(afterSaleStatus)) {
+                try {
+                    orderExportDetailDTO.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.valueOf(afterSaleStatus).description());
+                } catch (IllegalArgumentException e) {
+                    // 澶勭悊鏋氫妇鍊间笉瀛樺湪鐨勬儏鍐�
+                    orderExportDetailDTO.setAfterSaleStatus("鏈煡鐘舵��");
+                }
+            } else {
+                // 璁剧疆榛樿鍊兼垨绌哄瓧绗︿覆
+                orderExportDetailDTO.setAfterSaleStatus("鏃犲敭鍚庣姸鎬�");
+            }
             //鏃堕棿
             orderExportDetailDTO.setCreateTime(DateUtil.formatDateTime(orderExportDTO.getCreateTime()));
             orderExportDetailDTO.setPaymentTime(DateUtil.formatDateTime(orderExportDTO.getPaymentTime()));
@@ -1636,7 +1881,7 @@
         // 鍒涘缓琛ㄥご
         Row header = sheet.createRow(0);
         String[] headers = {"涓昏鍗曠紪鍙�", "瀛愯鍗曠紪鍙�", "閫夎喘鍟嗗搧", "鍟嗗搧鏁伴噺", "鍟嗗搧ID", "鍟嗗搧鍗曚环", "璁㈠崟搴斾粯閲戦",
-                "杩愯垂", "浼樻儬鎬婚噾棰�", "骞冲彴浼樻儬", "鍟嗗浼樻儬", "鍟嗗鏀逛环", "鏀粯鏂瑰紡","涔板鍚嶇О", "鏀朵欢浜�", "鏀朵欢浜烘墜鏈哄彿",
+                "杩愯垂", "浼樻儬鎬婚噾棰�", "骞冲彴浼樻儬", "鍟嗗浼樻儬", "鍟嗗鏀逛环", "鏀粯鏂瑰紡","浼氬憳ID","涔板鍚嶇О", "鏀朵欢浜�", "鏀朵欢浜烘墜鏈哄彿",
                 "鐪�", "甯�", "鍖�", "琛楅亾", "璇︾粏鍦板潃", "涔板鐣欒█", "璁㈠崟鎻愪氦鏃堕棿", "鏀粯瀹屾垚鏃堕棿", "鏉ユ簮",
                 "璁㈠崟鐘舵��", "璁㈠崟绫诲瀷", "鍞悗鐘舵��", "鍙栨秷鍘熷洜", "鍙戣揣鏃堕棿", "瀹屾垚鏃堕棿", "搴楅摵"};
 
@@ -1651,7 +1896,7 @@
             row.createCell(0).setCellValue(dto.getOrderSn());
             row.createCell(1).setCellValue(dto.getOrderItemSn());
             row.createCell(2).setCellValue(dto.getGoodsName());
-            row.createCell(3).setCellValue(dto.getNum());
+            row.createCell(3).setCellValue(dto.getNum()!=null?dto.getNum():0);
             row.createCell(4).setCellValue(dto.getGoodsId());
             row.createCell(5).setCellValue(dto.getUnitPrice()!=null?dto.getUnitPrice():0);
             row.createCell(6).setCellValue(dto.getFlowPrice()!=null?dto.getFlowPrice():0);
@@ -1661,27 +1906,27 @@
             row.createCell(10).setCellValue(dto.getStoreMarketingCost()!=null?dto.getStoreMarketingCost():0);
             row.createCell(11).setCellValue(dto.getUpdatePrice()!=null?dto.getUpdatePrice():0);
             row.createCell(12).setCellValue(dto.getPaymentMethod());
+            row.createCell(13).setCellValue(dto.getMemberId());
+            row.createCell(14).setCellValue(dto.getNickName());
 
-            row.createCell(13).setCellValue(dto.getNickName());
-
-            row.createCell(14).setCellValue(dto.getConsigneeName());
-            row.createCell(15).setCellValue(dto.getConsigneeMobile());
-            row.createCell(16).setCellValue(dto.getProvince());
-            row.createCell(17).setCellValue(dto.getCity());
-            row.createCell(18).setCellValue(dto.getDistrict());
-            row.createCell(19).setCellValue(dto.getStreet());
-            row.createCell(20).setCellValue(dto.getConsigneeDetail());
-            row.createCell(21).setCellValue(dto.getRemark());
-            row.createCell(22).setCellValue(dto.getCreateTime());
-            row.createCell(23).setCellValue(dto.getPaymentTime());
-            row.createCell(24).setCellValue(dto.getClientType());
-            row.createCell(25).setCellValue(dto.getOrderStatus());
-            row.createCell(26).setCellValue(dto.getOrderType());
-            row.createCell(27).setCellValue(dto.getAfterSaleStatus());
-            row.createCell(28).setCellValue(dto.getCancelReason());
-            row.createCell(29).setCellValue(dto.getLogisticsTime());
-            row.createCell(30).setCellValue(dto.getCompleteTime());
-            row.createCell(31).setCellValue(dto.getStoreName());
+            row.createCell(15).setCellValue(dto.getConsigneeName());
+            row.createCell(16).setCellValue(dto.getConsigneeMobile());
+            row.createCell(17).setCellValue(dto.getProvince());
+            row.createCell(18).setCellValue(dto.getCity());
+            row.createCell(19).setCellValue(dto.getDistrict());
+            row.createCell(20).setCellValue(dto.getStreet());
+            row.createCell(21).setCellValue(dto.getConsigneeDetail());
+            row.createCell(22).setCellValue(dto.getRemark());
+            row.createCell(23).setCellValue(dto.getCreateTime());
+            row.createCell(24).setCellValue(dto.getPaymentTime());
+            row.createCell(25).setCellValue(dto.getClientType());
+            row.createCell(26).setCellValue(dto.getOrderStatus());
+            row.createCell(27).setCellValue(dto.getOrderType());
+            row.createCell(28).setCellValue(dto.getAfterSaleStatus());
+            row.createCell(29).setCellValue(dto.getCancelReason());
+            row.createCell(30).setCellValue(dto.getLogisticsTime());
+            row.createCell(31).setCellValue(dto.getCompleteTime());
+            row.createCell(32).setCellValue(dto.getStoreName());
         }
 
         //淇敼鍒楀

--
Gitblit v1.8.0