he2802 1 năm trước cách đây
mục cha
commit
b6fa38beb8

+ 20 - 24
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOrderStatisticsController.java

@@ -2,32 +2,19 @@ package com.zhongzheng.controller.order;
 
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.core.page.TableDataInfo;
-import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.framework.web.service.TopTokenService;
-import com.zhongzheng.modules.top.financial.bo.OrderRefundPayBo;
-import com.zhongzheng.modules.top.financial.bo.TopDivideLogQueryBo;
-import com.zhongzheng.modules.top.financial.bo.TopDivideOrderQueryBo;
-import com.zhongzheng.modules.top.financial.vo.OrderRefundPayDetailVo;
-import com.zhongzheng.modules.top.financial.vo.TopCostTpVo;
-import com.zhongzheng.modules.top.financial.vo.TopOrderLogVo;
-import com.zhongzheng.modules.top.goods.bo.*;
 import com.zhongzheng.modules.top.goods.service.ITopOldOrderService;
-import com.zhongzheng.modules.top.goods.vo.*;
 import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsBo;
-import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsDayBo;
+import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsViewBo;
 import com.zhongzheng.modules.top.order.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * 订单Controller
@@ -67,16 +54,25 @@ public class TopOrderStatisticsController extends BaseController {
         return getDataTable(list);
     }
 
-//    /**
-//     * 下单客户订单数量统计
-//     */
-//    @ApiOperation("下单客户订单数量统计")
-//    @GetMapping("/day")
-//    public TableDataInfo<TopOrderStatisticsNumVo> orderStatisticsDayList(TopOrderStatisticsDayBo bo) {
-//        startPage();
-//        List<TopOrderStatisticsNumVo> list = iTopOldOrderService.orderStatisticsDayList(bo);
-//        return getDataTable(list);
-//    }
+    /**
+     * 下单客户订单走势图
+     */
+    @ApiOperation("下单客户订单走势图")
+    @GetMapping("/view")
+    public AjaxResult<TopOrderStatisticsViewVo> orderStatisticsView(TopOrderStatisticsViewBo bo) {
+        return AjaxResult.success(iTopOldOrderService.orderStatisticsView(bo));
+    }
+
+    /**
+     * 下单客户订单详情
+     */
+    @ApiOperation("下单客户订单详情")
+    @GetMapping("/detail")
+    public TableDataInfo<TopOrderStatisticsDetailVo> orderStatisticsDetail(TopOrderStatisticsBo bo) {
+        startPage();
+        List<TopOrderStatisticsDetailVo> list = iTopOldOrderService.orderStatisticsDetail(bo);
+        return getDataTable(list);
+    }
 
     /**
      * 下单客户订单金额统计

+ 97 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -275,6 +275,29 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return cal.getTimeInMillis() / 1000;  //今天凌晨
     }
 
+    /**
+     * 获取指定时间的凌晨时间戳
+     */
+    public static Long getScheduleTimeStrZeroTime(String timeStr,String patternStr)
+    {
+        Long time = dateTimeSec(patternStr,timeStr);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(timeToDate(time));
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        return cal.getTimeInMillis() / 1000;  //今天凌晨
+    }
+
+    /**
+     * 获取指定时间的凌晨时间戳
+     */
+    public static Long getScheduleTimeZeroTime(Long scheduleTime)
+    {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(timeToDate(scheduleTime));
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        return cal.getTimeInMillis() / 1000;  //今天凌晨
+    }
+
     public static String formatDate(Date time,String str)
     {
        SimpleDateFormat sdf = new SimpleDateFormat(str);
@@ -610,4 +633,78 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return c.getTime().getTime()/1000;
     }
 
+
+    public static List<Long> getWeekData(Long dataTime){
+        List<Long> week = new ArrayList();
+        Calendar calendar = Calendar.getInstance();
+        Long zeroTime = DateUtils.getScheduleTimeZeroTime(dataTime);
+        calendar.setTime(timeToDate(zeroTime));
+        // 如果是周日
+        if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+            calendar.add(Calendar.DAY_OF_YEAR,-1);
+        }
+        // 获取当前日期是当周的第i天
+        int i = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+         // 获取当前日期所在周的第一天
+        calendar.add(Calendar.DATE , -i);
+
+        for (int j = 0; j < 7; j++) {
+            if(j >0){
+                calendar.add(Calendar.DATE , 1);
+            }
+            Long time = calendar.getTime().getTime()/1000;
+            if (j == 6){
+                time = time + 86400L;
+            }
+            week.add(time);
+        }
+        return week;
+    }
+
+
+    public static Map<Long,Long> getWeekTime(Long startTime,Long endTime){
+        Map<Long,Long> mapList = new HashMap<>();
+        Long zeroTime = DateUtils.getScheduleTimeZeroTime(startTime);
+        //一天的时间戳
+        Long time = 86400L;
+        for (Long i = zeroTime; i <= endTime; i = i+time) {
+            List<Long> weekData = DateUtils.getWeekData(i);
+            mapList.put(weekData.get(0),weekData.get(weekData.size()-1));
+        }
+        return mapList;
+    }
+
+    public static Map<Long,Long> getMonthTime(Long startTime,Long endTime){
+        //一天的时间戳
+        Long time = 86400L;
+        Map<Long,Long> map = new HashMap<>();
+        try{
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+            Date d1 = DateUtils.timeToDate(startTime);
+            Date d2 = DateUtils.timeToDate(endTime);
+            Calendar dd = Calendar.getInstance();//定义日期实例
+            dd.setTime(d1);//设置日期起始时间
+            while (dd.getTime().before(d2)) {//判断是否到结束日期
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+                String str = sdf.format(dd.getTime());
+                Calendar c = Calendar.getInstance();
+                c.setTime(format.parse(str));
+                c.add(Calendar.MONTH, 0);
+                c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
+                Long start = c.getTime().getTime()/1000;
+                dd.setTime(DateUtils.timeToDate(start));
+                //获取当前月最后一天
+                Calendar ca = Calendar.getInstance();
+                ca.setTime(format.parse(str));
+                ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
+                Long end = ca.getTime().getTime()/1000 + time;
+                map.put(start,end);
+                dd.add(Calendar.MONTH, 1);//进行当前日期月份加1
+            }
+        }catch (Exception e){
+            System.out.println("异常"+e.getMessage());
+        }
+        return map;
+    }
+
 }

+ 11 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/mapper/TopOldOrderMapper.java

@@ -10,8 +10,8 @@ import com.zhongzheng.modules.top.goods.vo.TopOldOrderInvoiceVo;
 import com.zhongzheng.modules.top.goods.vo.TopOldOrderRefundVo;
 import com.zhongzheng.modules.top.goods.vo.TopOldOrderVo;
 import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsBo;
-import com.zhongzheng.modules.top.order.vo.TopOrderStatisticsMoneyVo;
-import com.zhongzheng.modules.top.order.vo.TopOrderStatisticsNumVo;
+import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsViewBo;
+import com.zhongzheng.modules.top.order.vo.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
@@ -88,4 +88,13 @@ public interface TopOldOrderMapper extends BaseMapper<TopOldOrder> {
     Long getOrderGoodsNumStatisticsTotalWithBo(TopOrderStatisticsBo bo);
 
     List<String> getBusinessList(TopOrderStatisticsBo bo);
+
+    List<TopOrderStatisticsTwoVo> getStatisticsView(TopOrderStatisticsViewBo bo);
+
+    List<TopOrderStatisticsDetailVo> getDetailStatistics(TopOrderStatisticsBo bo);
+
+    TopOrderStatisticsDetailTotalVo getDetailStatisticsTotal(@Param("startTime")Long startTime,@Param("endTime")Long endTime);
+
+    Long getOrderTenant(Long customerId);
+
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/ITopOldOrderService.java

@@ -9,6 +9,7 @@ import com.zhongzheng.modules.top.goods.domain.TopOldOrder;
 import com.zhongzheng.modules.top.goods.vo.*;
 import com.zhongzheng.modules.top.order.bo.PayOrderCallBackBo;
 import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsBo;
+import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsViewBo;
 import com.zhongzheng.modules.top.order.vo.*;
 
 import java.util.Collection;
@@ -148,9 +149,15 @@ public interface ITopOldOrderService extends IService<TopOldOrder> {
 
 	List<TopOrderStatisticsNumVo> orderNumTenantStatistics(TopOrderStatisticsBo bo);
 
+
 	List<TopOrderStatisticsMoneyVo> getBusinessOrderMoney(TopOrderStatisticsBo bo);
 
 	List<TopOrderStatisticsNumVo> getBusinessOrderNum(TopOrderStatisticsBo bo);
 
 	List<String> getBusinessList(TopOrderStatisticsBo bo);
+
+	TopOrderStatisticsViewVo orderStatisticsView(TopOrderStatisticsViewBo bo);
+
+	List<TopOrderStatisticsDetailVo> orderStatisticsDetail(TopOrderStatisticsBo bo);
+
 }

+ 319 - 10
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java

@@ -59,9 +59,11 @@ import com.zhongzheng.modules.top.goods.service.*;
 import com.zhongzheng.modules.top.goods.vo.*;
 import com.zhongzheng.modules.top.order.bo.PayOrderCallBackBo;
 import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsBo;
+import com.zhongzheng.modules.top.order.bo.TopOrderStatisticsViewBo;
 import com.zhongzheng.modules.top.order.domain.TopOrderBankPay;
 import com.zhongzheng.modules.top.order.service.ITopOrderBankPayService;
 import com.zhongzheng.modules.top.order.vo.*;
+import com.zhongzheng.modules.top.order.vo.TopOrderStatisticsTwoVo;
 import com.zhongzheng.modules.top.settle.domian.TopInstSettle;
 import com.zhongzheng.modules.top.settle.domian.TopInstSettleRelaiton;
 import com.zhongzheng.modules.top.settle.service.ITopInstSettleRelationService;
@@ -73,15 +75,6 @@ import com.zhongzheng.modules.top.user.service.ITopSysUserRoleService;
 import com.zhongzheng.modules.top.user.service.ITopSysUserService;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.service.IUserService;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.mime.MultipartEntityBuilder;
-import org.apache.http.entity.mime.content.StringBody;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -90,6 +83,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -2285,7 +2279,7 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
                     Long subtract = item.getOrderNum() - num;
                     BigDecimal divide = new BigDecimal(subtract).divide(new BigDecimal(num),2, RoundingMode.HALF_UP);
                     String s = divide.multiply(new BigDecimal("100")).toString();
-                    item.setWeekRate(s+"%");
+                    item.setYearRate(s+"%");
                 }
             }
 
@@ -2642,6 +2636,321 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         return baseMapper.getBusinessList(bo);
     }
 
+    @Override
+    public TopOrderStatisticsViewVo orderStatisticsView(TopOrderStatisticsViewBo bo) {
+        //筛选时间处理
+        if (ObjectUtils.isNull(bo.getTimeSign()) && ObjectUtils.isNull(bo.getStartTime()) && ObjectUtils.isNull(bo.getEndTime())){
+            //没有选择时间范围,默认为当前时间向前推30天
+            Long nowTime = DateUtils.getNowTime();
+            Long dayBefore = DateUtils.getDayBefore(nowTime, 30);
+            bo.setStartTime(dayBefore);
+            bo.setEndTime(nowTime);
+        }else if (ObjectUtils.isNotNull(bo.getTimeSign())){
+            switch (bo.getTimeSign()){
+                case 1://本周
+                    Map<String, Long> timeInterval = DateUtils.getTimeInterval(new Date());
+                    bo.setStartTime(timeInterval.get("start"));
+                    bo.setEndTime(timeInterval.get("end"));
+                    break;
+                case 2://本月
+                    Long toMonthZeroTime = DateUtils.getToMonthZeroTime();
+                    bo.setStartTime(toMonthZeroTime);
+                    bo.setEndTime(DateUtils.getNowTime());
+                    break;
+                case 3://本年
+                    Long toYearZeroTime = DateUtils.getToYearZeroTime();
+                    bo.setStartTime(toYearZeroTime);
+                    bo.setEndTime(DateUtils.getNowTime());
+                    break;
+                default :
+                    break;
+            }
+        }
+        TopOrderStatisticsViewVo viewVo = new TopOrderStatisticsViewVo();
+        //天
+        bo.setViewSign(1);
+        List<TopOrderStatisticsTwoVo> voList = baseMapper.getStatisticsView(bo);
+        if (CollectionUtils.isNotEmpty(voList)){
+            String customerName = "";
+            Long customerId = 0L;
+            if (ObjectUtils.isNotNull(bo.getCustomerId())){
+                TopOldOrder oldOrder = topOldOrderService.getOne(new LambdaQueryWrapper<TopOldOrder>()
+                        .eq(TopOldOrder::getOldCustomerId, bo.getCustomerId())
+                        .eq(TopOldOrder::getCheckStatus,1)
+                        .eq(TopOldOrder::getStatus,1)
+                        .last("limit 1"));
+                if (ObjectUtils.isNull(oldOrder)){
+                    Order one = orderService.getOne(new LambdaQueryWrapper<Order>()
+                            .eq(Order::getTenantId, bo.getCustomerId())
+                            .eq(Order::getOrderStatus, 1)
+                            .last("limit 1"));
+                    if (ObjectUtils.isNotNull(one)){
+                        SysTenant tenant = sysTenantService.getById(bo.getCustomerId());
+                        customerName = tenant.getTenantName();
+                    }
+                }else{
+                    customerName = oldOrder.getPurchaseOrg();
+                }
+                customerId = bo.getCustomerId();
+            }
+            List<Long> dayTime = getDayTime(bo.getStartTime(), bo.getEndTime());
+            List<TopOrderStatisticsTwoVo> vos = new ArrayList<>();
+            for (Long day : dayTime) {
+                TopOrderStatisticsTwoVo twoVo = new TopOrderStatisticsTwoVo();
+                twoVo.setCustomerId(customerId);
+                twoVo.setCustomerName(customerName);
+                twoVo.setTime(day);
+                if (voList.stream().anyMatch(x -> DateUtils.getScheduleTimeStrZeroTime(x.getTimeStr(), "yyyy-MM-dd").equals(day))){
+                    TopOrderStatisticsTwoVo statisticsTwoVo = voList.stream()
+                            .filter(x -> DateUtils.getScheduleTimeStrZeroTime(x.getTimeStr(), "yyyy-MM-dd").equals(day)).findFirst().get();
+                    twoVo.setMoney(statisticsTwoVo.getMoney());
+                    twoVo.setOrderNum(statisticsTwoVo.getOrderNum());
+                }
+                vos.add(twoVo);
+            }
+            viewVo.setDayView(vos);
+        }
+
+        //周
+        bo.setViewSign(2);
+        List<TopOrderStatisticsTwoVo> voList2 = baseMapper.getStatisticsView(bo);
+        if (CollectionUtils.isNotEmpty(voList2)){
+            String customerName = "";
+            Long customerId = 0L;
+            if (ObjectUtils.isNotNull(bo.getCustomerId())){
+                TopOldOrder oldOrder = topOldOrderService.getOne(new LambdaQueryWrapper<TopOldOrder>()
+                        .eq(TopOldOrder::getOldCustomerId, bo.getCustomerId())
+                        .eq(TopOldOrder::getCheckStatus,1)
+                        .eq(TopOldOrder::getStatus,1)
+                        .last("limit 1"));
+                if (ObjectUtils.isNull(oldOrder)){
+                    Order one = orderService.getOne(new LambdaQueryWrapper<Order>()
+                            .eq(Order::getTenantId, bo.getCustomerId())
+                            .eq(Order::getOrderStatus, 1)
+                            .last("limit 1"));
+                    if (ObjectUtils.isNotNull(one)){
+                        SysTenant tenant = sysTenantService.getById(bo.getCustomerId());
+                        customerName = tenant.getTenantName();
+                    }
+                }else{
+                    customerName = oldOrder.getPurchaseOrg();
+                }
+                customerId = bo.getCustomerId();
+            }
+            Map<Long, Long> weekTime = getWeekTime(bo.getStartTime(), bo.getEndTime());
+            List<TopOrderStatisticsTwoVo> vos = new ArrayList<>();
+            for (Long time : weekTime.keySet()) {
+                TopOrderStatisticsTwoVo twoVo = new TopOrderStatisticsTwoVo();
+                twoVo.setCustomerId(customerId);
+                twoVo.setCustomerName(customerName);
+                twoVo.setTime(time);
+                if (voList2.stream().anyMatch(x ->
+                        DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) >= time
+                                && DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) <= weekTime.get(time))){
+                    TopOrderStatisticsTwoVo statisticsTwoVo = voList2.stream()
+                            .filter(x ->
+                                    DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) >= time
+                                            && DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) <= weekTime.get(time)).findFirst().get();
+                    twoVo.setMoney(statisticsTwoVo.getMoney());
+                    twoVo.setOrderNum(statisticsTwoVo.getOrderNum());
+                }
+                vos.add(twoVo);
+            }
+            viewVo.setWeekView(vos);
+        }
+
+        //月
+        bo.setViewSign(3);
+        List<TopOrderStatisticsTwoVo> voList3 = baseMapper.getStatisticsView(bo);
+        if (CollectionUtils.isNotEmpty(voList3)){
+            String customerName = "";
+            Long customerId = 0L;
+            if (ObjectUtils.isNotNull(bo.getCustomerId())){
+                TopOldOrder oldOrder = topOldOrderService.getOne(new LambdaQueryWrapper<TopOldOrder>()
+                        .eq(TopOldOrder::getOldCustomerId, bo.getCustomerId())
+                        .eq(TopOldOrder::getCheckStatus,1)
+                        .eq(TopOldOrder::getStatus,1)
+                        .last("limit 1"));
+                if (ObjectUtils.isNull(oldOrder)){
+                    Order one = orderService.getOne(new LambdaQueryWrapper<Order>()
+                            .eq(Order::getTenantId, bo.getCustomerId())
+                            .eq(Order::getOrderStatus, 1)
+                            .last("limit 1"));
+                    if (ObjectUtils.isNotNull(one)){
+                        SysTenant tenant = sysTenantService.getById(bo.getCustomerId());
+                        customerName = tenant.getTenantName();
+                    }
+                }else{
+                    customerName = oldOrder.getPurchaseOrg();
+                }
+                customerId = bo.getCustomerId();
+            }
+            Map<Long, Long> monthTime = DateUtils.getMonthTime(bo.getStartTime(), bo.getEndTime());
+            List<TopOrderStatisticsTwoVo> vos = new ArrayList<>();
+            for (Long time : monthTime.keySet()) {
+                TopOrderStatisticsTwoVo twoVo = new TopOrderStatisticsTwoVo();
+                twoVo.setCustomerId(customerId);
+                twoVo.setCustomerName(customerName);
+                twoVo.setTime(time);
+                if (voList2.stream().anyMatch(x ->
+                        DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) >= time
+                                && DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) <= monthTime.get(time))){
+                    TopOrderStatisticsTwoVo statisticsTwoVo = voList2.stream()
+                            .filter(x ->
+                                    DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) >= time
+                                            && DateUtils.getScheduleTimeZeroTime(x.getOrderTime()) <= monthTime.get(time)).findFirst().get();
+                    twoVo.setMoney(statisticsTwoVo.getMoney());
+                    twoVo.setOrderNum(statisticsTwoVo.getOrderNum());
+                }
+                vos.add(twoVo);
+            }
+            viewVo.setMonthView(vos);
+        }
+
+        return viewVo;
+    }
+
+    @Override
+    public List<TopOrderStatisticsDetailVo> orderStatisticsDetail(TopOrderStatisticsBo bo) {
+        //筛选时间处理
+        if (ObjectUtils.isNull(bo.getTimeSign()) && ObjectUtils.isNull(bo.getStartTime()) && ObjectUtils.isNull(bo.getEndTime())){
+            //没有选择时间范围,默认为当前时间向前推30天
+            Long nowTime = DateUtils.getNowTime();
+            Long dayBefore = DateUtils.getDayBefore(nowTime, 30);
+            bo.setStartTime(dayBefore);
+            bo.setEndTime(nowTime);
+        }else if (ObjectUtils.isNotNull(bo.getTimeSign())){
+            switch (bo.getTimeSign()){
+                case 1://本周
+                    Map<String, Long> timeInterval = DateUtils.getTimeInterval(new Date());
+                    bo.setStartTime(timeInterval.get("start"));
+                    bo.setEndTime(timeInterval.get("end"));
+                    break;
+                case 2://本月
+                    Long toMonthZeroTime = DateUtils.getToMonthZeroTime();
+                    bo.setStartTime(toMonthZeroTime);
+                    bo.setEndTime(DateUtils.getNowTime());
+                    break;
+                case 3://本年
+                    Long toYearZeroTime = DateUtils.getToYearZeroTime();
+                    bo.setStartTime(toYearZeroTime);
+                    bo.setEndTime(DateUtils.getNowTime());
+                    break;
+                default :
+                    break;
+            }
+        }
+
+        List<TopOrderStatisticsDetailVo> detailVos = baseMapper.getDetailStatistics(bo);
+        if (CollectionUtils.isEmpty(detailVos)){
+            return new ArrayList<>();
+        }
+
+        TopOrderStatisticsDetailTotalVo totalVo = baseMapper.getDetailStatisticsTotal(bo.getStartTime(),bo.getEndTime());
+        detailVos.forEach(item -> {
+            //订单客户机构ID
+            if (item.getOrderType() == 1){
+                Long tenantId = baseMapper.getOrderTenant(item.getCustomerId());
+                item.setTenantId(tenantId);
+            }else {
+                item.setTenantId(item.getCustomerId());
+            }
+            if (item.getMoney().compareTo(BigDecimal.ZERO) == 0){
+                return;
+            }
+            //订单金额
+            //环比
+            item.setWeekRate("100%");
+            Long startTime = bo.getStartTime();
+            Long endTime = bo.getEndTime();
+            Long time = endTime - startTime;
+            TopOrderStatisticsBo topOrderStatisticsBo = new TopOrderStatisticsBo();
+            topOrderStatisticsBo.setStartTime(startTime - time);
+            topOrderStatisticsBo.setEndTime(startTime);
+            topOrderStatisticsBo.setCustomerId(item.getCustomerId());
+            List<TopOrderStatisticsMoneyVo> moneyStatistics = baseMapper.getMoneyStatistics(topOrderStatisticsBo);
+            if (CollectionUtils.isNotEmpty(moneyStatistics)){
+                BigDecimal money = moneyStatistics.stream().findFirst().get().getMoney();
+                if (money.compareTo(BigDecimal.ZERO) > 0){
+                    BigDecimal subtract = item.getMoney().subtract(money);
+                    BigDecimal divide = subtract.divide(money,2, RoundingMode.HALF_UP);
+                    String s = divide.multiply(new BigDecimal("100")).toString();
+                    item.setMoneyWeekRate(s+"%");
+                }
+            }
+            List<TopOrderStatisticsNumVo> numStatistics = baseMapper.getNumStatistics(topOrderStatisticsBo);
+            if (CollectionUtils.isNotEmpty(numStatistics)){
+                Long num = numStatistics.stream().findFirst().get().getOrderNum();
+                if (num > 0){
+                    Long subtract = item.getOrderNum() - num;
+                    BigDecimal divide = new BigDecimal(subtract).divide(new BigDecimal(num),2, RoundingMode.HALF_UP);
+                    String s = divide.multiply(new BigDecimal("100")).toString();
+                    item.setWeekRate(s+"%");
+                }
+            }
+
+            //同比
+            item.setYearRate("100%");
+            Long startBefore = DateUtils.getDayBefore(bo.getStartTime(), 365);
+            Long endBefore = DateUtils.getDayBefore(bo.getEndTime(), 365);
+            topOrderStatisticsBo.setStartTime(startBefore);
+            topOrderStatisticsBo.setEndTime(endBefore);
+            List<TopOrderStatisticsMoneyVo> moneyStatistics2 = baseMapper.getMoneyStatistics(topOrderStatisticsBo);
+            if (CollectionUtils.isNotEmpty(moneyStatistics2)){
+                BigDecimal money = moneyStatistics2.stream().findFirst().get().getMoney();
+                if (money.compareTo(BigDecimal.ZERO) > 0){
+                    BigDecimal subtract = item.getMoney().subtract(money);
+                    BigDecimal divide = subtract.divide(money,2, RoundingMode.HALF_UP);
+                    String s = divide.multiply(new BigDecimal("100")).toString();
+                    item.setMoneyYearRate(s+"%");
+                }
+            }
+            List<TopOrderStatisticsNumVo> numStatistics2 = baseMapper.getNumStatistics(topOrderStatisticsBo);
+            if (CollectionUtils.isNotEmpty(numStatistics2)){
+                Long num = numStatistics2.stream().findFirst().get().getOrderNum();
+                if (num > 0){
+                    Long subtract = item.getOrderNum() - num;
+                    BigDecimal divide = new BigDecimal(subtract).divide(new BigDecimal(num),2, RoundingMode.HALF_UP);
+                    String s = divide.multiply(new BigDecimal("100")).toString();
+                    item.setYearRate(s+"%");
+                }
+            }
+
+            //金额占比
+            BigDecimal divide = item.getMoney().divide(totalVo.getMoneyTotal(), 2, RoundingMode.HALF_UP);
+            String s = divide.multiply(new BigDecimal("100")).toString();
+            item.setMoneyOccupationRate(s+"%");
+            //数量占比
+            BigDecimal divide2 = new BigDecimal(item.getOrderNum()).divide(new BigDecimal(totalVo.getOrderNumTotal()), 2, RoundingMode.HALF_UP);
+            String s2 = divide2.multiply(new BigDecimal("100")).toString();
+            item.setOccupationRate(s2+"%");
+        });
+        return detailVos;
+    }
+
+
+    private List<Long> getDayTime(Long startTime,Long endTime){
+        List<Long> tiemList = new ArrayList<>();
+        Long zeroTime = DateUtils.getScheduleTimeZeroTime(startTime);
+        //一天的时间戳
+        Long time = 86400L;
+        for (Long i = zeroTime; i <= endTime; i = i+time) {
+            tiemList.add(i);
+        }
+        return tiemList;
+    }
+
+    private Map<Long,Long> getWeekTime(Long startTime,Long endTime){
+        Map<Long,Long> mapList = new HashMap<>();
+        Map<Long, Long> weekTime = DateUtils.getWeekTime(startTime,endTime);
+        List<Long> aa = new ArrayList<>();
+        aa.addAll(weekTime.keySet());
+        List<Long> collect = aa.stream().sorted().collect(Collectors.toList());
+        for (Long aLong : collect) {
+            mapList.put(aLong,weekTime.get(aLong));
+        }
+        return mapList;
+    }
 
     private TopOrderGoodsUpVo getGoodsUp(TopOldOrderGoods orderGoods,List<TopOldOrderStudyVo> studyVos){
         TopOrderGoodsUpVo vo = BeanUtil.toBean(orderGoods, TopOrderGoodsUpVo.class);

+ 10 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/bo/TopOrderStatisticsDayBo.java → zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/bo/TopOrderStatisticsViewBo.java

@@ -10,11 +10,14 @@ import java.io.Serializable;
  * @date 2023年10月24日 16:03
  */
 @Data
-public class TopOrderStatisticsDayBo implements Serializable {
+public class TopOrderStatisticsViewBo implements Serializable {
 
     @ApiModelProperty("时间标识:1本周 2本月 3本年")
     private Integer timeSign;
 
+    @ApiModelProperty("时间标识:1天 2周 3月")
+    private Integer viewSign;
+
     @ApiModelProperty("开始时间")
     private Long startTime;
 
@@ -22,4 +25,10 @@ public class TopOrderStatisticsDayBo implements Serializable {
     private Long endTime;
 
     private Long customerId;
+
+    @ApiModelProperty("客户名称")
+    private String customerName;
+
+    @ApiModelProperty("业务层次")
+    private String businessName;
 }

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/vo/TopOrderStatisticsDetailTotalVo.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.top.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月24日 16:12
+ */
+@Data
+public class TopOrderStatisticsDetailTotalVo implements Serializable {
+
+    @ApiModelProperty("金额总数")
+    private BigDecimal moneyTotal;
+
+    @ApiModelProperty("订单总数")
+    private Long orderNumTotal;
+
+}

+ 61 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/vo/TopOrderStatisticsDetailVo.java

@@ -0,0 +1,61 @@
+package com.zhongzheng.modules.top.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月24日 16:12
+ */
+@Data
+public class TopOrderStatisticsDetailVo implements Serializable {
+
+    @ApiModelProperty("客户ID")
+    private Long customerId;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("客户名称")
+    private String customerName;
+
+    @ApiModelProperty("订单数量")
+    private Long orderNum;
+
+    @ApiModelProperty("订单类型:1旧系统 2新系统")
+    private Integer orderType;
+
+    @ApiModelProperty("环比")
+    private String weekRate;
+
+    @ApiModelProperty("同比")
+    private String yearRate;
+
+    @ApiModelProperty("占比")
+    private String occupationRate;
+
+    @ApiModelProperty("金额")
+    private BigDecimal money;
+
+    @ApiModelProperty("环比")
+    private String moneyWeekRate;
+
+    @ApiModelProperty("同比")
+    private String moneyYearRate;
+
+    @ApiModelProperty("占比")
+    private String moneyOccupationRate;
+
+    @ApiModelProperty("机构名称")
+    private String tenantName;
+
+    @ApiModelProperty("业务号")
+    private String createNo;
+
+    @ApiModelProperty("业务员名称")
+    private String createUsername;
+
+}

+ 36 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/vo/TopOrderStatisticsTwoVo.java

@@ -0,0 +1,36 @@
+package com.zhongzheng.modules.top.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月24日 16:12
+ */
+@Data
+public class TopOrderStatisticsTwoVo implements Serializable {
+
+    @ApiModelProperty("时间")
+    private Long time;
+
+    private String timeStr;
+
+    private Long orderTime;
+
+    @ApiModelProperty("客户ID")
+    private Long customerId;
+
+    @ApiModelProperty("客户名称")
+    private String customerName;
+
+    @ApiModelProperty("订单数量")
+    private Long orderNum;
+
+    @ApiModelProperty("订单金额")
+    private BigDecimal money;
+
+
+}

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/order/vo/TopOrderStatisticsViewVo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.top.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月26日 14:06
+ */
+@Data
+public class TopOrderStatisticsViewVo implements Serializable {
+
+    @ApiModelProperty("统计天")
+    private List<TopOrderStatisticsTwoVo> dayView;
+
+    @ApiModelProperty("统计周")
+    private List<TopOrderStatisticsTwoVo> weekView;
+
+    @ApiModelProperty("统计月")
+    private List<TopOrderStatisticsTwoVo> monthView;
+}

+ 232 - 4
zhongzheng-system/src/main/resources/mapper/modules/top/TopOldOrderMapper.xml

@@ -662,7 +662,7 @@
                 AND o.order_status = 1
                 AND (
                 o.input_order_sn IS NULL
-                OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) &lt; 0 ) AND o.tenant_id IS NOT NULL
+                OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0 ) AND o.tenant_id IS NOT NULL
                 <if test="startTime != null and startTime != ''">
                     AND o.create_time &gt;= #{startTime}
                 </if>
@@ -709,7 +709,7 @@
             AND o.order_status = 1
             AND (
             o.input_order_sn IS NULL
-            OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) &lt; 0 ) AND o.tenant_id IS NOT NULL
+            OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0 ) AND o.tenant_id IS NOT NULL
             <if test="startTime != null and startTime != ''">
                 AND o.create_time &gt;= #{startTime}
             </if>
@@ -767,7 +767,7 @@
         AND o.order_status = 1
         AND (
         o.input_order_sn IS NULL
-        OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) &lt; 0 ) AND o.tenant_id IS NOT NULL
+        OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0 ) AND o.tenant_id IS NOT NULL
         <if test="startTime != null and startTime != ''">
             AND o.create_time &gt;= #{startTime}
         </if>
@@ -814,7 +814,7 @@
         AND o.order_status = 1
         AND (
         o.input_order_sn IS NULL
-        OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) &lt; 0 ) AND o.tenant_id IS NOT NULL
+        OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0 ) AND o.tenant_id IS NOT NULL
         <if test="startTime != null and startTime != ''">
             AND o.create_time &gt;= #{startTime}
         </if>
@@ -824,6 +824,230 @@
         ) num_total
     </select>
 
+    <select id="getDetailStatisticsTotal" parameterType="java.lang.Long"
+            resultType="com.zhongzheng.modules.top.order.vo.TopOrderStatisticsDetailTotalVo">
+        SELECT
+        ((
+        SELECT
+        SUM( too.order_received - too.order_refunded ) AS money
+        FROM
+        top_old_order too
+        WHERE
+        too.`status` = 1
+        AND too.check_status = 1
+        AND too.old_customer_id IS NOT NULL
+        <if test="startTime != null and startTime != ''">
+            AND too.check_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND too.check_time &lt;= #{endTime}
+        </if>
+        ) + (
+        SELECT
+        SUM( o.order_price ) AS money
+        FROM
+        `order` o
+        WHERE
+        o.`status` = 1
+        AND o.order_status = 1
+        AND (
+        o.input_order_sn IS NULL
+        OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0 ) AND o.tenant_id IS NOT NULL
+        <if test="startTime != null and startTime != ''">
+            AND o.create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND o.create_time &lt;= #{endTime}
+        </if>
+        )) moneyTotal,
+        ((
+        SELECT
+        COUNT(too.order_id) AS orderNum
+        FROM
+        top_old_order too
+        WHERE
+        too.`status` = 1
+        AND too.check_status = 1
+        AND too.old_customer_id IS NOT NULL
+        <if test="startTime != null and startTime != ''">
+            AND too.check_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND too.check_time &lt;= #{endTime}
+        </if>
+        ) + (
+        SELECT
+        COUNT(o.order_id) AS orderNum
+        FROM
+        `order` o
+        WHERE
+        o.`status` = 1
+        AND o.order_status = 1
+        AND (
+        o.input_order_sn IS NULL
+        OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0 ) AND o.tenant_id IS NOT NULL
+        <if test="startTime != null and startTime != ''">
+            AND o.create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND o.create_time &lt;= #{endTime}
+        </if>
+        )) orderNumTotal
+    </select>
+
+    <select id="getStatisticsView" parameterType="com.zhongzheng.modules.top.order.bo.TopOrderStatisticsViewBo"
+            resultType="com.zhongzheng.modules.top.order.vo.TopOrderStatisticsTwoVo">
+        SELECT
+        COUNT(a.order_id) AS orderNum,
+        SUM(a.money) AS money,
+        any_value(a.timeStr) AS orderTime,
+        <if test="viewSign != null and viewSign == 1">
+            DATE_FORMAT(FROM_UNIXTIME(a.timeStr), '%Y-%m-%d') AS timeStr
+        </if>
+        <if test="viewSign != null and viewSign == 2">
+            DATE_FORMAT(FROM_UNIXTIME(a.timeStr), '%Y-%U') AS timeStr
+        </if>
+        <if test="viewSign != null and viewSign == 3">
+            DATE_FORMAT(FROM_UNIXTIME(a.timeStr), '%Y-%m') AS timeStr
+        </if>
+        FROM (
+        SELECT
+        too.order_id as order_id,
+        too.check_time as timeStr,
+        too.order_received - too.order_refunded as money
+        FROM
+        top_old_order too
+        WHERE
+        too.`status` = 1
+        AND too.check_status = 1
+        <if test="startTime != null and startTime != ''">
+            AND too.check_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND too.check_time &lt;= #{endTime}
+        </if>
+        <if test="customerId != null and customerId != ''">
+            AND too.old_customer_id IS NOT NULL
+            AND too.old_customer_id = #{customerId}
+        </if>
+        UNION ALL
+        SELECT
+        o.order_id as order_id,
+        o.create_time as timeStr,
+        o.order_price as money
+        FROM
+        `order` o
+        WHERE
+        o.`status` = 1
+        AND o.order_status = 1
+        AND (
+        o.input_order_sn IS NULL
+        OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0
+        )
+        <if test="startTime != null and startTime != ''">
+            AND o.create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND o.create_time &lt;= #{endTime}
+        </if>
+        <if test="customerId != null and customerId != ''">
+            AND o.tenant_id = #{customerId}
+            AND o.tenant_id IS NOT NULL
+        </if>
+        ) a WHERE 1=1
+        <if test="viewSign != null and viewSign == 1">
+            GROUP BY DATE_FORMAT(FROM_UNIXTIME(a.timeStr), '%Y-%m-%d')
+        </if>
+        <if test="viewSign != null and viewSign == 2">
+            GROUP BY DATE_FORMAT(FROM_UNIXTIME(a.timeStr), '%Y-%U')
+        </if>
+        <if test="viewSign != null and viewSign == 3">
+            GROUP BY DATE_FORMAT(FROM_UNIXTIME(a.timeStr), '%Y-%m')
+        </if>
+    </select>
+
+    <select  id="getDetailStatistics" parameterType="com.zhongzheng.modules.top.order.bo.TopOrderStatisticsViewBo"
+             resultType="com.zhongzheng.modules.top.order.vo.TopOrderStatisticsDetailVo">
+        SELECT
+            1 AS orderType,
+            COUNT(too.order_id) AS orderNum,
+            SUM( too.order_received - too.order_refunded ) AS money,
+            too.old_customer_id AS customer_id,
+            (
+            SELECT
+            tod.purchase_org
+            FROM
+            top_old_order tod
+            WHERE
+            tod.old_customer_id = too.old_customer_id
+            AND tod.`status` = 1
+            AND tod.check_status = 1
+            LIMIT 1
+            ) AS customer_name
+        FROM
+        top_old_order too
+        WHERE
+            too.`status` = 1
+            AND too.check_status = 1
+            AND too.old_customer_id IS NOT NULL
+            <if test="startTime != null and startTime != ''">
+                AND too.check_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                AND too.check_time &lt;= #{endTime}
+            </if>
+            <if test="customerId != null and customerId != ''">
+                AND too.old_customer_id = #{customerId}
+            </if>
+            <if test="businessName != null and businessName != ''">
+                AND (SELECT COUNT(DISTINCT oog.order_sn) FROM top_old_order_goods oog WHERE too.order_sn = oog.order_sn AND INSTR(oog.business_full_name,#{businessName}) ) > 0
+            </if>
+            <if test="customerName != null and customerName != ''">
+                AND too.purchase_org LIKE CONCAT('%',#{customerName},'%')
+            </if>
+            GROUP BY
+            too.old_customer_id UNION ALL
+        SELECT
+            2 AS orderType,
+            COUNT(o.order_id) AS orderNum,
+            SUM( o.order_price ) AS money,
+            o.tenant_id AS customer_id,
+            ( SELECT tenant_name FROM sys_tenant st WHERE st.tenant_id = o.tenant_id LIMIT 1 ) AS customer_name
+        FROM
+            `order` o
+        WHERE
+            o.`status` = 1
+            AND o.order_status = 1
+            AND (
+            o.input_order_sn IS NULL
+            OR ( SELECT COUNT( too.order_id ) FROM top_old_order too WHERE too.input_order_sn = o.input_order_sn ) = 0 ) AND o.tenant_id IS NOT NULL
+            <if test="startTime != null and startTime != ''">
+                AND o.create_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                AND o.create_time &lt;= #{endTime}
+            </if>
+            <if test="customerId != null and customerId != ''">
+                AND o.tenant_id  = #{customerId}
+            </if>
+            <if test="businessName != null and businessName != ''">
+                AND (
+                SELECT
+                COUNT(DISTINCT og.order_sn)
+                FROM order_goods og
+                LEFT JOIN goods g ON og.goods_id = g.goods_id
+                LEFT JOIN course_education_type cet ON g.education_type_id = cet.id
+                LEFT JOIN course_project_type cpt ON g.project_id = cpt.id
+                LEFT JOIN course_business cb ON g.business_id = cb.id
+                WHERE o.order_sn = og.order_sn
+                AND INSTR(CONCAT(cet.education_name,cpt.project_name,cb.business_name),#{businessName}) ) > 0
+            </if>
+            <if test="customerName != null and customerName != ''">
+                AND (SELECT COUNT(s.tenant_id) FROM sys_tenant s WHERE o.tenant_id = s.tenant_id AND s.tenant_name LIKE CONCAT('%',#{customerName},'%')) > 0
+            </if>
+            GROUP BY
+            o.tenant_id
+    </select>
 
     <select id="getTenantStatistics" parameterType="com.zhongzheng.modules.top.order.bo.TopOrderStatisticsBo"
             resultType="com.zhongzheng.modules.top.order.vo.TopOrderStatisticsMoneyVo">
@@ -1508,4 +1732,8 @@
         ORDER BY
         SUM( allu.money ) DESC
     </select>
+
+    <select id="getOrderTenant" parameterType="java.lang.Long" resultType="java.lang.Long">
+        SELECT tenant_id FROM top_old_order WHERE old_customer_id = #{customerId} LIMIT 1
+    </select>
 </mapper>