fix:添加app-生产概况-任务统计

ck
HuangHuiKang 1 month ago
parent 7616b34052
commit c2bde1b2b9

@ -200,7 +200,12 @@ public class TaskController {
}
@GetMapping("/trend")
@Operation(summary = "任务单趋势统计")
@PreAuthorize("@ss.hasPermission('mes:task:query')")
public CommonResult<TaskTrendRespVO> getTaskTrend(@Valid TaskTrendReqVO reqVO) {
return success(taskService.getTaskTrend(reqVO));
}
// ==================== 子表(生产任务单明细) ====================

@ -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;
}

@ -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;
}

@ -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<TaskTrendItemRespVO> dayTrend;
}

@ -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<TaskDO> {
default List<TaskDO> selectList(List<Integer> status) {
return selectList(TaskDO::getStatus, status);
}
}
TaskTrendRespVO selectTrendSummary(@Param("reqVO") TaskTrendReqVO reqVO);
List<TaskTrendItemRespVO> selectTrendByDay(@Param("reqVO") TaskTrendReqVO reqVO);
List<TaskTrendItemRespVO> selectTrendByMonth(@Param("reqVO") TaskTrendReqVO reqVO);
List<TaskTrendItemRespVO> selectTrendByWeekday(@Param("reqVO") TaskTrendReqVO reqVO);
List<TaskTrendItemRespVO> selectTrendByHour(@Param("reqVO") TaskTrendReqVO reqVO);
}

@ -172,6 +172,8 @@ public interface TaskService {
List<TaskDetailDO> getTaskDetailListByTaskIds(Collection<Long> taskIds);
TaskTrendRespVO getTaskTrend(TaskTrendReqVO reqVO);
}
}

@ -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 {
);
}
}
@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<TaskTrendItemRespVO> 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));
}
}
}

@ -9,4 +9,98 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>
<select id="selectTrendSummary"
resultType="cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendRespVO">
SELECT
COUNT(1) AS totalNum,
SUM(CASE WHEN t.status = 2 THEN 1 ELSE 0 END) AS issuedNum,
SUM(CASE WHEN t.status = 7 THEN 1 ELSE 0 END) AS partialScheduledNum,
SUM(CASE WHEN t.status = 8 THEN 1 ELSE 0 END) AS waitingProductionNum,
SUM(CASE WHEN t.status = 9 THEN 1 ELSE 0 END) AS producingNum,
SUM(CASE WHEN t.status = 10 THEN 1 ELSE 0 END) AS completedNum
FROM mes_task t
WHERE t.deleted = b'0'
<if test="reqVO.beginTime != null">
AND t.create_time &gt;= #{reqVO.beginTime}
</if>
<if test="reqVO.endTime != null">
AND t.create_time &lt;= #{reqVO.endTime}
</if>
</select>
<select id="selectTrendByDay"
resultType="cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendItemRespVO">
SELECT
DATE_FORMAT(t.create_time, '%Y-%m-%d') AS day,
COUNT(1) AS count
FROM mes_task t
WHERE t.deleted = b'0'
<if test="reqVO.beginTime != null">
AND t.create_time &gt;= #{reqVO.beginTime}
</if>
<if test="reqVO.endTime != null">
AND t.create_time &lt;= #{reqVO.endTime}
</if>
GROUP BY DATE_FORMAT(t.create_time, '%Y-%m-%d')
ORDER BY day ASC
</select>
<select id="selectTrendByMonth"
resultType="cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendItemRespVO">
SELECT
DATE_FORMAT(t.create_time, '%Y-%m') AS day,
COUNT(1) AS count
FROM mes_task t
WHERE t.deleted = b'0'
<if test="reqVO.beginTime != null">
AND t.create_time &gt;= #{reqVO.beginTime}
</if>
<if test="reqVO.endTime != null">
AND t.create_time &lt;= #{reqVO.endTime}
</if>
GROUP BY DATE_FORMAT(t.create_time, '%Y-%m')
ORDER BY day ASC
</select>
<select id="selectTrendByWeekday"
resultType="cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendItemRespVO">
SELECT
CASE DAYOFWEEK(t.create_time)
WHEN 1 THEN '星期日'
WHEN 2 THEN '星期一'
WHEN 3 THEN '星期二'
WHEN 4 THEN '星期三'
WHEN 5 THEN '星期四'
WHEN 6 THEN '星期五'
WHEN 7 THEN '星期六'
END AS day,
COUNT(1) AS count
FROM mes_task t
WHERE t.deleted = b'0'
<if test="reqVO.beginTime != null">
AND t.create_time &gt;= #{reqVO.beginTime}
</if>
<if test="reqVO.endTime != null">
AND t.create_time &lt;= #{reqVO.endTime}
</if>
GROUP BY DAYOFWEEK(t.create_time)
ORDER BY DAYOFWEEK(t.create_time) ASC
</select>
<select id="selectTrendByHour"
resultType="cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskTrendItemRespVO">
SELECT
DATE_FORMAT(t.create_time, '%H:00') AS day,
COUNT(1) AS count
FROM mes_task t
WHERE t.deleted = b'0'
<if test="reqVO.beginTime != null">
AND t.create_time &gt;= #{reqVO.beginTime}
</if>
<if test="reqVO.endTime != null">
AND t.create_time &lt;= #{reqVO.endTime}
</if>
GROUP BY DATE_FORMAT(t.create_time, '%H')
ORDER BY DATE_FORMAT(t.create_time, '%H') ASC
</select>
</mapper>

Loading…
Cancel
Save