diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java index ed6a97df5..3a305589a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java @@ -200,7 +200,12 @@ public class TaskController { } - + @GetMapping("/trend") + @Operation(summary = "任务单趋势统计") + @PreAuthorize("@ss.hasPermission('mes:task:query')") + public CommonResult getTaskTrend(@Valid TaskTrendReqVO reqVO) { + return success(taskService.getTaskTrend(reqVO)); + } // ==================== 子表(生产任务单明细) ==================== diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendItemRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendItemRespVO.java new file mode 100644 index 000000000..cd7b31314 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendItemRespVO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 任务单趋势明细 Response VO") +@Data +public class TaskTrendItemRespVO { + + @Schema(description = "横轴标签") + private String day; + + @Schema(description = "数量") + private Long count; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendReqVO.java new file mode 100644 index 000000000..57dbcc909 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.mes.enums.BaogongTrendTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 任务单趋势 Request VO") +@Data +public class TaskTrendReqVO { + + @Schema(description = "趋势类型:1-近一年,2-本月,3-本周,4-今日,5-自定义", example = "4") + @InEnum(BaogongTrendTypeEnum.class) + private Integer trendType; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime beginTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime endTime; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendRespVO.java new file mode 100644 index 000000000..5dea942a9 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskTrendRespVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 任务单趋势汇总 Response VO") +@Data +public class TaskTrendRespVO { + + @Schema(description = "任务单总数") + private Long totalNum; + + @Schema(description = "下达数") + private Long issuedNum; + + @Schema(description = "部分排产数") + private Long partialScheduledNum; + + @Schema(description = "待生产数") + private Long waitingProductionNum; + + @Schema(description = "生产中数") + private Long producingNum; + + @Schema(description = "已完成数") + private Long completedNum; + + @Schema(description = "趋势集合") + private List dayTrend; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java index 5a89b4fdb..a392d6c6e 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java @@ -5,8 +5,12 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskStatusEnum; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendItemRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendRespVO; import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -55,4 +59,14 @@ public interface TaskMapper extends BaseMapperX { default List selectList(List status) { return selectList(TaskDO::getStatus, status); } -} \ No newline at end of file + + TaskTrendRespVO selectTrendSummary(@Param("reqVO") TaskTrendReqVO reqVO); + + List selectTrendByDay(@Param("reqVO") TaskTrendReqVO reqVO); + + List selectTrendByMonth(@Param("reqVO") TaskTrendReqVO reqVO); + + List selectTrendByWeekday(@Param("reqVO") TaskTrendReqVO reqVO); + + List selectTrendByHour(@Param("reqVO") TaskTrendReqVO reqVO); +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java index a701a3a50..a13f4e298 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java @@ -172,6 +172,8 @@ public interface TaskService { List getTaskDetailListByTaskIds(Collection taskIds); + TaskTrendRespVO getTaskTrend(TaskTrendReqVO reqVO); -} \ No newline at end of file + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java index 7a92b939a..62d0705b3 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -32,6 +32,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskMapper; import cn.iocoder.yudao.module.mes.dal.mysql.task.ViewTaskProductSummaryMapper; import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; +import cn.iocoder.yudao.module.mes.enums.BaogongTrendTypeEnum; import cn.iocoder.yudao.module.mes.service.deviceledger.DeviceLedgerService; import cn.iocoder.yudao.module.mes.strategy.task.ScheduleSortStrategyFactory; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -46,6 +47,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -914,4 +916,82 @@ public class TaskServiceImpl implements TaskService { ); } -} \ No newline at end of file + @Override + public TaskTrendRespVO getTaskTrend(TaskTrendReqVO reqVO) { + fillTrendTimeRange(reqVO); + TaskTrendRespVO respVO = taskMapper.selectTrendSummary(reqVO); + if (respVO == null) { + respVO = new TaskTrendRespVO(); + } + if (respVO.getTotalNum() == null) { + respVO.setTotalNum(0L); + } + if (respVO.getIssuedNum() == null) { + respVO.setIssuedNum(0L); + } + if (respVO.getPartialScheduledNum() == null) { + respVO.setPartialScheduledNum(0L); + } + if (respVO.getWaitingProductionNum() == null) { + respVO.setWaitingProductionNum(0L); + } + if (respVO.getProducingNum() == null) { + respVO.setProducingNum(0L); + } + if (respVO.getCompletedNum() == null) { + respVO.setCompletedNum(0L); + } + respVO.setDayTrend(buildTrend(reqVO)); + return respVO; + } + + private List buildTrend(TaskTrendReqVO reqVO) { + BaogongTrendTypeEnum trendType = BaogongTrendTypeEnum.valueOf(reqVO.getTrendType()); + if (trendType == BaogongTrendTypeEnum.CUSTOM) { + return Collections.emptyList(); + } + if (trendType == BaogongTrendTypeEnum.YEAR) { + return taskMapper.selectTrendByMonth(reqVO); + } + if (trendType == BaogongTrendTypeEnum.WEEK) { + return taskMapper.selectTrendByWeekday(reqVO); + } + if (trendType == BaogongTrendTypeEnum.TODAY) { + return taskMapper.selectTrendByHour(reqVO); + } + return taskMapper.selectTrendByDay(reqVO); + } + + private void fillTrendTimeRange(TaskTrendReqVO reqVO) { + BaogongTrendTypeEnum trendType = BaogongTrendTypeEnum.valueOf(reqVO.getTrendType()); + if (trendType == null) { + return; + } + LocalDateTime now = LocalDateTime.now(); + if (trendType == BaogongTrendTypeEnum.YEAR) { + reqVO.setBeginTime(now.minusMonths(11).withDayOfMonth(1).toLocalDate().atStartOfDay()); + reqVO.setEndTime(now.withDayOfMonth(now.toLocalDate().lengthOfMonth()).toLocalDate().atTime(LocalTime.MAX)); + return; + } + if (trendType == BaogongTrendTypeEnum.MONTH) { + LocalDate currentDate = now.toLocalDate(); + reqVO.setBeginTime(currentDate.withDayOfMonth(1).atStartOfDay()); + reqVO.setEndTime(currentDate.withDayOfMonth(currentDate.lengthOfMonth()).atTime(LocalTime.MAX)); + return; + } + if (trendType == BaogongTrendTypeEnum.WEEK) { + LocalDate currentDate = now.toLocalDate(); + LocalDate weekStart = currentDate.with(DayOfWeek.MONDAY); + LocalDate weekEnd = currentDate.with(DayOfWeek.SUNDAY); + reqVO.setBeginTime(weekStart.atStartOfDay()); + reqVO.setEndTime(weekEnd.atTime(LocalTime.MAX)); + return; + } + if (trendType == BaogongTrendTypeEnum.TODAY) { + LocalDate currentDate = now.toLocalDate(); + reqVO.setBeginTime(currentDate.atStartOfDay()); + reqVO.setEndTime(now.minusHours(1).withMinute(59).withSecond(59).withNano(999999999)); + } + } + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml index f2e7369b8..749fb18b3 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml @@ -9,4 +9,98 @@ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ --> - \ No newline at end of file + + + + + + + + + +