aps-modules/aps-core/src/main/java/com/aps/core/controller/ApsPartRouteStatController.java
@@ -100,10 +100,25 @@ { return toAjax(apsPartRouteStatService.deleteApsPartRouteStatByIds(ids)); } /** * 1.根据现有零件计划 和工艺路线、资源池信息 更新统计表 * */ @PostMapping("/updateStat") public AjaxResult updateStat() { apsPartRouteStatService.updatePartRoutPlanDate(); return success(); } /*** * 2. 根据日期、工艺路线、资源池信息 查询统计表 * */ @GetMapping("/query") public AjaxResult queryStat() public AjaxResult query() { return apsPartRouteStatService.selectResourceDateStat(); } } aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsResourceGroupTempController.java
@@ -34,7 +34,7 @@ @GetMapping("/list") public TableDataInfo list(ApsResourceGroupTemp apsResourceGroupTemp) { startPage(); //startPage(); List<ApsResourceGroupTemp> list = apsResourceGroupTempService.selectApsResourceGroupTempList(apsResourceGroupTemp); return getDataTable(list); } aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsResourceDateStat.java
@@ -1,6 +1,5 @@ package com.aps.core.domain; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; @@ -8,11 +7,60 @@ /* * 用于统计资源组日计划数据 * */ @Data public class ApsResourceDateStat { public LocalDate getPlanDay() { return planDay; } public void setPlanDay(LocalDate planDay) { this.planDay = planDay; } public Integer getDesignTimes() { return designTimes; } public void setDesignTimes(Integer designTimes) { this.designTimes = designTimes; } public String getResourceName() { return resourceName; } public void setResourceName(String resourceName) { this.resourceName = resourceName; } public Integer getRequireTimes() { return requireTimes; } public void setRequireTimes(Integer requireTimes) { this.requireTimes = requireTimes; } public BigDecimal getCapacityLoad() { return capacityLoad; } public void setCapacityLoad(BigDecimal capacityLoad) { this.capacityLoad = capacityLoad; } public String getResourceGroupName() { return resourceGroupName; } public void setResourceGroupName(String resourceGroupName) { this.resourceGroupName = resourceGroupName; } private LocalDate planDay; private String resourceName; private Integer requireTimes; private Integer designTimes; private BigDecimal capacityLoad; private String resourceGroupName; } aps-modules/aps-core/src/main/java/com/aps/core/service/IApsPartRouteStatService.java
@@ -61,5 +61,7 @@ */ public int deleteApsPartRouteStatById(String id); void updatePartRoutPlanDate(); AjaxResult selectResourceDateStat(); } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java
@@ -1,10 +1,12 @@ package com.aps.core.service.impl; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; import com.aps.common.core.utils.uuid.IdUtils; import com.aps.common.core.web.domain.AjaxResult; @@ -29,6 +31,7 @@ { @Autowired private ApsPartRouteStatMapper apsPartRouteStatMapper; @Autowired private ApsResourceGroupMapper resourceGroupMapper; /** @@ -109,13 +112,13 @@ /** * 查询零件工序并更新计划开工日期 * */ @Override public void updatePartRoutPlanDate() { List<ApsPartRouteStat> tempList = apsPartRouteStatMapper.selectPartRoutStat(); /*对tempList 按照 workOrderNo 进行分组*/ Map<String, List<ApsPartRouteStat>> groupByWorkOrderNo = tempList.stream().collect(groupingBy(ApsPartRouteStat::getWorkOrderNo)); /*本次计算批次号*/ String batchNum = IdUtils.fastSimpleUUID(); apsPartRouteStatMapper.deleteLastBatch(batchNum); for (Map.Entry<String, List<ApsPartRouteStat>> entry : groupByWorkOrderNo.entrySet()) { /*取出每个零件工单的工艺路线信息*/ List<ApsPartRouteStat> apsPartRouteStatList = entry.getValue(); @@ -124,7 +127,7 @@ /*临时保存 上一道工序的工序总工时*/ ApsPartRouteStat last=null; for (int i = 0; i <apsPartRouteStatList.size(); i++) { ApsPartRouteStat stat = apsPartRouteStatList.get(0); ApsPartRouteStat stat = apsPartRouteStatList.get(i); /*判断当前工序 当前工序只有一条*/ if (stat.getCurrentProcessNumber().equals(stat.getRoadProcessNumber())) { /* 对 stat.getProcessPlanStartDay() 和当前日期 进行对比,只对比到日,不用管十分秒*/ @@ -133,7 +136,7 @@ } } /*未开工工序的计划开工日=上一道工序的计划开工日+上一道工序的工序总工时。*/ if (stat.getCurrentProcessNumber().compareTo(stat.getRoadProcessNumber()) > 0) { if (stat.getCurrentProcessNumber().compareTo(stat.getRoadProcessNumber()) < 0) { if (last != null) { stat.setProcessPlanStartDay(last.getProcessPlanStartDay().plusHours(last.getProcessTotalTime())); } @@ -152,7 +155,9 @@ @Override public AjaxResult selectResourceDateStat() { /*查出所有统计的数据*/ AjaxResult result = new AjaxResult(200, "生成成功"); List<ApsResourceDateStat> list = apsPartRouteStatMapper.selectResourceDateStat(); if (!list.isEmpty()) { /*求出计划的最大时间,没有 设置为当前时间+15天*/ ApsResourceDateStat apsResourceDateStat = list.stream().max(Comparator.comparing(ApsResourceDateStat::getPlanDay)).orElse(null); LocalDate maxPlanDay = LocalDate.now().plus(15, ChronoUnit.DAYS); @@ -163,27 +168,45 @@ List<String> planDays = new ArrayList<>(); LocalDate startDay = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); while (startDay .isBefore( maxPlanDay)){ while (!startDay.isAfter(maxPlanDay)) { planDays.add(startDay.format(formatter)); startDay=startDay.plus(1,ChronoUnit.DAYS); } /*组织出列头数据*/ List<String> resourceNames =list.stream().map(ApsResourceDateStat::getResourceName).distinct().toList(); /*准备资源组信息*/ List<Map<String, List<ApsResourceDateStat>>> targetList = new ArrayList<>(); resourceNames.forEach(resourceName -> { /*根据日期表头的顺序,组织出每个日期下的统计项目*/ List<ApsResourceDateStat> targetList = new ArrayList<>(); Map<String, List<ApsResourceDateStat>> maps = new HashMap<>(Map.of()); List<ApsResourceDateStat> currentDaysResouces=new ArrayList<>(); for (String planDay : planDays) { ApsResourceDateStat apsResourceDateStat1 = list.stream() .filter(item -> item.getPlanDay().equals(LocalDate.parse(planDay, formatter))) .findFirst().orElse(null); if(apsResourceDateStat1!=null){ targetList.add(apsResourceDateStat1); }else{ ApsResourceDateStat apsResourceDateStat2 = new ApsResourceDateStat(); apsResourceDateStat2.setPlanDay( LocalDate.parse(planDay, formatter)); targetList.add(apsResourceDateStat2); /*查找当前计划日期下的所有资源组的数据*/ Optional<ApsResourceDateStat> first = list.stream() .filter(item -> item.getPlanDay().equals(LocalDate.parse(planDay, formatter)) && item.getResourceGroupName().equals(resourceName) ).collect(Collectors.toList()).stream().findFirst(); if(first.isPresent()){ currentDaysResouces.add(first.get()); } else { ApsResourceDateStat empty = new ApsResourceDateStat(); empty.setPlanDay(LocalDate.parse(planDay, formatter)); empty.setDesignTimes(0); empty.setRequireTimes(0); empty.setResourceName(resourceName); empty.setResourceGroupName(resourceName); empty.setCapacityLoad(BigDecimal.ZERO); currentDaysResouces.add(empty); } AjaxResult result=new AjaxResult(200,"生成成功") .put("planTitle",planDays) .put("planTable",targetList); }; maps.put(resourceName, currentDaysResouces); targetList.add(maps); }); result.put("planTitle", planDays); result.put("planTable", targetList); } return result; } aps-modules/aps-core/src/main/resources/mapper/core/ApsPartRouteStatMapper.xml
@@ -54,11 +54,12 @@ <if test="productionQuantity != null">production_quantity,</if> <if test="standardTime != null">standard_time,</if> <if test="processTotalTime != null">process_total_time,</if> <if test="processPlanStartDay != null and processPlanStartDay != ''">process_plan_start_day,</if> <if test="processPlanStartDay != null ">process_plan_start_day,</if> <if test="designTimes != null">design_times,</if> <if test="delFlag != null">del_flag,</if> <if test="createBy != null">create_by,</if> <if test="batchNumber != null">batch_number,</if> <if test="resourceGroupName != null">resource_group_name,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null">#{id},</if> @@ -68,11 +69,12 @@ <if test="productionQuantity != null">#{productionQuantity},</if> <if test="standardTime != null">#{standardTime},</if> <if test="processTotalTime != null">#{processTotalTime},</if> <if test="processPlanStartDay != null and processPlanStartDay != ''">#{processPlanStartDay},</if> <if test="processPlanStartDay != null">#{processPlanStartDay},</if> <if test="designTimes != null">#{designTimes},</if> <if test="delFlag != null">#{delFlag},</if> <if test="createBy != null">#{createBy},</if> <if test="batchNumber != null">#{batchNumber},</if> <if test="resourceGroupName != null">#{resourceGroupName},</if> </trim> </insert> @@ -110,7 +112,7 @@ </update> <select id="selectPartRoutStat" resultMap="ApsPartRouteStatResult" > select rt.work_order_no, rt.process_name, rt.process_name as resource_group_name, cast( rt.process_number as numeric(18,2)) as road_process_number, cast( pl.process_number as numeric(18,2)) as current_process_number, pl.production_quantity, @@ -128,22 +130,34 @@ and rt.process_plan_start_day <= rs.request_date order by rt.work_order_no,process_plan_start_day </select> <select id="selectResourceDateStat" resultType="com.aps.core.domain.ApsResourceDateStat"> with pl as ( select DATE( st.process_plan_start_day) AS plan_day, <resultMap type="ApsResourceDateStat" id="ApsResourceDateStatResult"> <result property="planDay" column="plan_day" /> <result property="resourceName" column="resource_name" /> <result property="requireTimes" column="require_times" /> <result property="designTimes" column="design_times" /> <result property="capacityLoad" column="capacity_load" /> <result property="resourceGroupName" column="resource_name" /> </resultMap> <select id="selectResourceDateStat" resultMap="ApsResourceDateStatResult"> with pl as (select DATE(st.process_plan_start_day) AS plan_day, resource_group_name as resource_name, sum(process_total_time) as require_times from aps_part_route_stat as st where st.del_flag='0' group by resource_group_name, plan_day order by plan_day,resource_group_name ) select pl.resource_name ,pl.plan_day select pl.plan_day ,pl.resource_name ,require_times ,(gp.theory_hours*gp.devices_quantity) as design_times ,((gp.theory_hours*gp.devices_quantity) / require_times * 100) as capacity_load from pl left join aps_resource_group as gp on pl.resource_group_name=gp.resource_group_name from pl left join aps_resource_group as gp on pl.resource_name = gp.resource_group_name where gp.del_flag='0' </select>