diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderStatisticsController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderStatisticsController.java index 60209b131..c8c09f68a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderStatisticsController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderStatisticsController.java @@ -64,4 +64,16 @@ public class OrderStatisticsController { public CommonResult> getOrderStatusCount(@Valid OrderStatisticsReqVO reqVO) { return success(orderStatisticsService.getOrderStatusCount(reqVO)); } + + @GetMapping("/orderAndPlanCount/group") + @Operation(summary = "生产单、排单单量分组统计") + public CommonResult> getOrderAndPlanCountGroup(@Valid OrderStatisticsReqVO reqVO) { + return success(orderStatisticsService.getOrderAndPlanCountGroup(reqVO)); + } + + @GetMapping("/orderAndPlanArea/group") + @Operation(summary = "生产单、排单平方数分组统计") + public CommonResult> getOrderAndPlanAreaGroup(@Valid OrderStatisticsReqVO reqVO) { + return success(orderStatisticsService.getOrderAndPlanAreaSumGroup(reqVO)); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatisticsAreaRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatisticsAreaRespVO.java new file mode 100644 index 000000000..127e3b727 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatisticsAreaRespVO.java @@ -0,0 +1,57 @@ +package com.cf.imes.module.executor.controller.admin.order.vo.order; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 生产单平方数统计") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString(callSuper = true) +public class OrderStatisticsAreaRespVO implements Comparable { + @Schema(description = "订单平方数") + private BigDecimal areaSum; + + @Schema(description = "生产单时间") + private String date; + + @Override + public int compareTo(@NotNull OrderStatisticsAreaRespVO other) { + // 解析 orderDate 字符串为年、月、周 + String[] partsThis = date.split("-"); + String[] partsOther = other.date.split("-"); + + // 比较年份 + int yearComparison = Integer.compare(Integer.parseInt(partsThis[0]), Integer.parseInt(partsOther[0])); + if (yearComparison != 0) { + return yearComparison; + } + + // 比较月份 + if (partsThis.length > 1 && partsOther.length > 1) { + int monthComparison = Integer.compare(Integer.parseInt(partsThis[1]), Integer.parseInt(partsOther[1])); + if (monthComparison != 0) { + return monthComparison; + } + } + + // 比较周数 + if (partsThis.length > 2 && partsOther.length > 2) { + int weekComparison = Integer.compare(Integer.parseInt(partsThis[2]), Integer.parseInt(partsOther[2])); + if (weekComparison != 0) { + return weekComparison; + } + } + + // 如果所有部分都相同,则按状态排序 + return this.areaSum.compareTo(other.areaSum); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatusRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatisticsStatusRespVO.java similarity index 79% rename from cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatusRespVO.java rename to cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatisticsStatusRespVO.java index 7b7961b15..173951d3c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatusRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatisticsStatusRespVO.java @@ -10,21 +10,21 @@ import org.jetbrains.annotations.NotNull; @AllArgsConstructor @NoArgsConstructor @ToString(callSuper = true) -public class OrderStatusRespVO implements Comparable { +public class OrderStatisticsStatusRespVO implements Comparable { @Schema(description = "订单状态") - private Integer orderState; + private Integer orderStatus; @Schema(description = "订单数量") private Integer orderCount; @Schema(description = "生产单时间") - private String orderDate; + private String date; @Override - public int compareTo(@NotNull OrderStatusRespVO other) { + public int compareTo(@NotNull OrderStatisticsStatusRespVO other) { // 解析 orderDate 字符串为年、月、周 - String[] partsThis = orderDate.split("-"); - String[] partsOther = other.orderDate.split("-"); + String[] partsThis = date.split("-"); + String[] partsOther = other.date.split("-"); // 比较年份 int yearComparison = Integer.compare(Integer.parseInt(partsThis[0]), Integer.parseInt(partsOther[0])); @@ -49,6 +49,6 @@ public class OrderStatusRespVO implements Comparable { } // 如果所有部分都相同,则按状态排序 - return this.orderState.compareTo(other.orderState); + return this.orderStatus.compareTo(other.orderStatus); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanStatisticsAreaRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanStatisticsAreaRespVO.java new file mode 100644 index 000000000..b3fc1647c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanStatisticsAreaRespVO.java @@ -0,0 +1,62 @@ +package com.cf.imes.module.executor.controller.admin.plan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; + +/** + * @author Gqr + * @since 2024/8/7 15:12 + */ + +@Schema(description = "管理后台 - 排单统计RespVO") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString(callSuper = true) +public class OrderPlanStatisticsAreaRespVO implements Comparable { + @Schema(description = "统计时间") + private String date; + + @Schema(description = "面积总和") + private BigDecimal areaSum; + + @Override + public int compareTo(@NotNull OrderPlanStatisticsAreaRespVO other) { + // 解析 date 字符串为年、月、周 + String[] partsThis = date.split("-"); + String[] partsOther = other.date.split("-"); + + // 比较年份 + int yearComparison = Integer.compare(Integer.parseInt(partsThis[0]), Integer.parseInt(partsOther[0])); + if (yearComparison != 0) { + return yearComparison; + } + + // 比较月份 + if (partsThis.length > 1 && partsOther.length > 1) { + int monthComparison = Integer.compare(Integer.parseInt(partsThis[1]), Integer.parseInt(partsOther[1])); + if (monthComparison != 0) { + return monthComparison; + } + } + + // 比较周数 + if (partsThis.length > 2 && partsOther.length > 2) { + int weekComparison = Integer.compare(Integer.parseInt(partsThis[2]), Integer.parseInt(partsOther[2])); + if (weekComparison != 0) { + return weekComparison; + } + } + + // 如果所有部分都相同,则按面积排序 + return this.areaSum.compareTo(other.areaSum); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanStatisticsCountRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanStatisticsCountRespVO.java new file mode 100644 index 000000000..179a555b0 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPlanStatisticsCountRespVO.java @@ -0,0 +1,61 @@ +package com.cf.imes.module.executor.controller.admin.plan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.jetbrains.annotations.NotNull; + +/** + * @author Gqr + * @since 2024/8/7 15:12 + */ + +@Schema(description = "管理后台 - 排单统计RespVO") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString(callSuper = true) +public class OrderPlanStatisticsCountRespVO implements Comparable { + + @Schema(description = "数量") + private Integer count; + + @Schema(description = "统计时间") + private String date; + + @Override + public int compareTo(@NotNull OrderPlanStatisticsCountRespVO other) { + // 解析 date 字符串为年、月、周 + String[] partsThis = date.split("-"); + String[] partsOther = other.date.split("-"); + + // 比较年份 + int yearComparison = Integer.compare(Integer.parseInt(partsThis[0]), Integer.parseInt(partsOther[0])); + if (yearComparison != 0) { + return yearComparison; + } + + // 比较月份 + if (partsThis.length > 1 && partsOther.length > 1) { + int monthComparison = Integer.compare(Integer.parseInt(partsThis[1]), Integer.parseInt(partsOther[1])); + if (monthComparison != 0) { + return monthComparison; + } + } + + // 比较周数 + if (partsThis.length > 2 && partsOther.length > 2) { + int weekComparison = Integer.compare(Integer.parseInt(partsThis[2]), Integer.parseInt(partsOther[2])); + if (weekComparison != 0) { + return weekComparison; + } + } + + // 如果所有部分都相同,则按面积排序 + return this.count.compareTo(other.count); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderStatisticsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderStatisticsMapper.java index a3053400d..b17eb8a17 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderStatisticsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderStatisticsMapper.java @@ -2,8 +2,9 @@ package com.cf.imes.module.executor.dal.mysql.order; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsAreaRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO; -import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatusRespVO; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsStatusRespVO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.enums.OrderStatusEnum; import org.apache.ibatis.annotations.Mapper; @@ -70,10 +71,26 @@ public interface OrderStatisticsMapper extends BaseMapperX { Integer selectOrderSquareProduce(@Param("organId") Long organId); /** - * 生产单状态按时间分组统计 + * 生产单状态按时间分组统计数量 * * @param reqVO * @return */ - List selectOrderStatusCount(@Param("req") OrderStatisticsReqVO reqVO); + List selectOrderStatusCountGroupBy(@Param("req") OrderStatisticsReqVO reqVO); + + /** + * 生产单按时间分组统计数量 + * + * @param reqVO + * @return + */ + List selectOrderCountGroupByOrderDate(@Param("req") OrderStatisticsReqVO reqVO); + + /** + * 生产单按时间分组统计面积 + * + * @param reqVO + * @return + */ + List selectOrderAreaGroupByOrderDate(@Param("req") OrderStatisticsReqVO reqVO); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java index 4f1fa4c8e..33ef05b45 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java @@ -2,15 +2,16 @@ package com.cf.imes.module.executor.dal.mysql.plan; import java.util.*; -import cn.hutool.core.util.StrUtil; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO; +import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.annotations.Mapper; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import org.apache.ibatis.annotations.Param; @@ -26,7 +27,7 @@ import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.ge public interface PlanMapper extends BaseMapperX { default PageResult selectPage(PlanPageReqVO reqVO) { - if(StrUtil.isNotBlank(reqVO.getCustomer())) { + if(StringUtils.isNotBlank(reqVO.getCustomer())) { return selectJoinPage(reqVO, PlanDO.class, new MPJLambdaWrapperX() .eq(PlanDO::getDeleted,false) .eq(PlanDO::getOrganId,getUserOrganId()) @@ -85,10 +86,18 @@ public interface PlanMapper extends BaseMapperX { .eq(PlanDO::getMachineId,machineId)); } -// -// default PlanDO selectByOrderId(Long orderId) { -// return selectOne(new MPJLambdaWrapperX() -// .like(PlanDO::getOrderNos, orderId)); -// -// } + /** + * 排单按时间分组统计数量 + * + * @param reqVO + * @return + */ + List selectPlanCountGroupByCreateTime(@Param("req") OrderStatisticsReqVO reqVO); + + /** + * 排单按时间分组统计面积 + * @param reqVO + * @return + */ + List selectPlanAreaGroupByCreateTime(@Param("req") OrderStatisticsReqVO reqVO); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsService.java index bb88d0c7d..a125192da 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsService.java @@ -6,6 +6,7 @@ import java.util.Map; /** * 生产单统计 order_{N} Service 接口 + * * @author Gqr * @since 2024/8/5 16:57 */ @@ -36,7 +37,23 @@ public interface OrderStatisticsService { Integer orderSquareProduce(OrderStatisticsReqVO reqVO); /** - * 生产单状态统计 + * 生产单状态分组统计 */ Map getOrderStatusCount(OrderStatisticsReqVO reqVO); + + /** + * 生产单、排单单量分组统计 + * + * @param reqVO + * @return + */ + Map getOrderAndPlanCountGroup(OrderStatisticsReqVO reqVO); + + /** + * 生产单、排单平方数统计 + * + * @param reqVO + * @return + */ + Map getOrderAndPlanAreaSumGroup(OrderStatisticsReqVO reqVO); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java index 4cb7ecaf4..235c6c028 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java @@ -4,15 +4,23 @@ import cn.hutool.core.util.ObjectUtil; import com.cf.imes.framework.common.enums.OrderStatusEnum; import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsAreaRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO; -import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatusRespVO; +import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsStatusRespVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsAreaRespVO; +import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsCountRespVO; import com.cf.imes.module.executor.dal.mysql.order.OrderStatisticsMapper; +import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; import com.cf.imes.module.executor.enums.OrderStatisticsUnit; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.math.BigDecimal; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -21,7 +29,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.stream.Collectors; /** @@ -34,6 +41,9 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { @Resource private OrderStatisticsMapper orderStatisticsMapper; + @Resource + private PlanMapper planMapper; + @Override @OrganIgnore public Integer orderCount(OrderStatisticsReqVO reqVO) { @@ -69,37 +79,44 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { public Map getOrderStatusCount(OrderStatisticsReqVO reqVO) { Map resultMap = new HashMap<>(); + // 获取机构id + reqVO.setOrganId(getOrganIdParam(reqVO)); + // 计算时间跨度 getTimeSpan(reqVO); // 查询订单状态统计数据 - List orderStatusRespVOS = orderStatisticsMapper.selectOrderStatusCount(reqVO); + List orderStatusRespVOS = orderStatisticsMapper.selectOrderStatusCountGroupBy(reqVO); // 基于相同的orderDate分组 - Map> orderDateMap = orderStatusRespVOS.stream() + Map> orderDateMap = orderStatusRespVOS.stream() .sorted(Comparator.naturalOrder()) - .collect(Collectors.groupingBy(OrderStatusRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList())); + .collect(Collectors.groupingBy(OrderStatisticsStatusRespVO::getDate, LinkedHashMap::new, Collectors.toList())); // 所有的日期集合 - Set dateList = orderDateMap.keySet(); + List dateList = generateDateRange(reqVO); resultMap.put("dateList", dateList); // 遍历订单状态所有枚举值 List> series = new ArrayList<>(); for (OrderStatusEnum orderStatusEnum : OrderStatusEnum.values()) { Map seriesItem = new HashMap<>(); - int[] sumArr = new int[orderDateMap.size()]; + int[] sumArr = new int[dateList.size()]; - // 遍历日期map记录status下的orderCount到sumArr数组 + // 遍历完整的日期范围 int index = 0; - for (Map.Entry> entry : orderDateMap.entrySet()) { + for (String dateStr : dateList) { // 查找匹配的订单状态 - Optional matchingStatus = entry.getValue().stream() - .filter(respVO -> Objects.equals(orderStatusEnum.getStatus(), respVO.getOrderState())) - .findFirst(); + List listForDate = orderDateMap.get(dateStr); + int count = 0; + if (listForDate != null) { + count = listForDate.stream() + .filter(respVO -> Objects.equals(orderStatusEnum.getStatus(), respVO.getOrderStatus())) + .mapToInt(OrderStatisticsStatusRespVO::getOrderCount) + .sum(); + } - // 没有匹配的补齐0 - sumArr[index++] = matchingStatus.map(OrderStatusRespVO::getOrderCount).orElse(0); + sumArr[index++] = count; } seriesItem.put("data", sumArr); @@ -112,6 +129,90 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { return resultMap; } + @Override + @OrganIgnore + public Map getOrderAndPlanCountGroup(OrderStatisticsReqVO reqVO) { + Map resultMap = new LinkedHashMap<>(); + + // 获取机构id + reqVO.setOrganId(getOrganIdParam(reqVO)); + + // 计算时间跨度 + getTimeSpan(reqVO); + + // 所有的日期集合 + List dateList = generateDateRange(reqVO); + + Map> orderRespMap = orderStatisticsMapper.selectOrderCountGroupByOrderDate(reqVO).stream() + .sorted(Comparator.naturalOrder()) + .collect(Collectors.groupingBy(OrderStatisticsStatusRespVO::getDate, LinkedHashMap::new, Collectors.toList())); + Map> planRespMap = planMapper.selectPlanCountGroupByCreateTime(reqVO).stream() + .sorted(Comparator.naturalOrder()) + .collect(Collectors.groupingBy(OrderPlanStatisticsCountRespVO::getDate, LinkedHashMap::new, Collectors.toList())); + + // 遍历时间跨度列表,匹配数量存入数组,没有补0存入数组 + for (int i = 0; i < dateList.size(); i++) { + String dateStr = dateList.get(i); + int[] countArr = new int[2]; + // 存入生产单数量 + Integer orderCount = Optional.ofNullable(orderRespMap.get(dateStr)) + .map(list -> list.stream().findFirst().orElse(new OrderStatisticsStatusRespVO())) + .map(OrderStatisticsStatusRespVO::getOrderCount) + .orElse(0); + countArr[0] = orderCount; + + // 存入排单数量 + Integer planCount = Optional.ofNullable(planRespMap.get(dateStr)) + .map(list -> list.stream().findFirst().orElse(new OrderPlanStatisticsCountRespVO())) + .map(OrderPlanStatisticsCountRespVO::getCount) + .orElse(0); + countArr[1] = planCount; + + resultMap.put(dateStr, countArr); + } + + return resultMap; + } + + @Override + @OrganIgnore + public Map getOrderAndPlanAreaSumGroup(OrderStatisticsReqVO reqVO) { + Map resultMap = new LinkedHashMap<>(); + + // 获取机构id + reqVO.setOrganId(getOrganIdParam(reqVO)); + + // 计算时间跨度 + getTimeSpan(reqVO); + + // 所有的日期集合 + List dateList = generateDateRange(reqVO); + + Map> orderRespMap = orderStatisticsMapper.selectOrderAreaGroupByOrderDate(reqVO).stream() + .sorted(Comparator.naturalOrder()) + .collect(Collectors.groupingBy(OrderStatisticsAreaRespVO::getDate, LinkedHashMap::new, Collectors.toList())); + Map> planRespMap = planMapper.selectPlanAreaGroupByCreateTime(reqVO).stream() + .sorted(Comparator.naturalOrder()) + .collect(Collectors.groupingBy(OrderPlanStatisticsAreaRespVO::getDate, LinkedHashMap::new, Collectors.toList())); + + // 遍历时间跨度列表,匹配数量存入数组,没有补0存入数组 + for (String dateStr : dateList) { + BigDecimal[] areaArr = new BigDecimal[2]; + + // 存生产单面积 + List orderCountRespVOS = orderRespMap.get(dateStr); + areaArr[0] = orderCountRespVOS != null && !orderCountRespVOS.isEmpty() ? orderCountRespVOS.get(0).getAreaSum() : BigDecimal.ZERO; + + // 存排单面积 + List planCountRespVOS = planRespMap.get(dateStr); + areaArr[1] = planCountRespVOS != null && !planCountRespVOS.isEmpty() ? planCountRespVOS.get(0).getAreaSum() : BigDecimal.ZERO; + + resultMap.put(dateStr, areaArr); + } + + return resultMap; + } + /** * 获取统计的时间跨度 * 计算起止时间:前端不传入时间就根据维度单位从当前日期计算 @@ -150,6 +251,57 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { } } + /** + * 获取日期范围内的所有格式字符串 + * + * @param reqVO + * @return + */ + private List generateDateRange(OrderStatisticsReqVO reqVO) { + Integer unit = reqVO.getUnit(); + // 计算时间跨度 + getTimeSpan(reqVO); + // 计算后的开始和结束时间 + LocalDate startDate = ObjectUtil.clone(reqVO.getCreateTime()[0]); + LocalDate endDate = ObjectUtil.clone(reqVO.getCreateTime()[1]); + + List dates = new ArrayList<>(); + while (!startDate.isAfter(endDate)) { + String dateStr; + switch (OrderStatisticsUnit.fromValue(unit)) { + case QUARTER: + dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-Q")); + // 加一季度(3个月) + startDate = startDate.plusMonths(3); + break; + case MONTH: + dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-M")); + // 加一月 + startDate = startDate.plusMonths(1); + break; + case WEEK: + // 使用自定义格式表示月份 + dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-M")); + // 计算从月份第一天到当前日期经过了多少周 + LocalDate monthStart = startDate.with(TemporalAdjusters.firstDayOfMonth()); + long weeksInMonth = ChronoUnit.WEEKS.between(monthStart, startDate) + 1; + dateStr = dateStr + "-" + weeksInMonth; + // 加一周 + startDate = startDate.plusWeeks(1); + break; + case DAY: + dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-M-d")); + // 加一天 + startDate = startDate.plusDays(1); + break; + default: + throw new IllegalArgumentException("Unsupported unit: " + unit); + } + dates.add(dateStr); + } + return dates; + } + /** * 前端传组织否则查当前用户所在的组织 * diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderStatisticsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderStatisticsMapper.xml index 2f9cb3c0a..3a4df3814 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderStatisticsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderStatisticsMapper.xml @@ -10,27 +10,72 @@ - + select o.status as orderStatus, count(o.id) as orderCount - ,CONCAT(YEAR(o.order_date), '-', QUARTER(o.order_date)) as orderDate + ,CONCAT(YEAR(o.order_date), '-', QUARTER(o.order_date)) as date - ,CONCAT(YEAR(o.order_date), '-', MONTH(o.order_date)) as orderDate + ,CONCAT(YEAR(o.order_date), '-', MONTH(o.order_date)) as date ,CONCAT(YEAR(o.order_date), '-', MONTH(o.order_date), '-', FLOOR((DayOfMonth(o.order_date)-1)/7)+1) AS - orderDate + date - ,CONCAT(YEAR(o.order_date), '-', MONTH(o.order_date), '-', DAY(o.order_date)) as orderDate + ,CONCAT(YEAR(o.order_date), '-', MONTH(o.order_date), '-', DAY(o.order_date)) as date from orders o - where o.organ_id = #{organId} + where o.organ_id = #{req.organId} and o.order_date between #{req.createTime[0]} and #{req.createTime[1]} and o.deleted = 0 - group by o.status, orderDate; + group by orderStatus, date; + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml index a8131c5be..1b442cca4 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -123,4 +123,52 @@ + + + \ No newline at end of file