bluejay
2025-04-12 a40d3116690c0584e933b2f76ea2951e528c297d
零件统计数据查询
已修改6个文件
218 ■■■■ 文件已修改
aps-modules/aps-core/src/main/java/com/aps/core/controller/ApsPartRouteStatController.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsResourceGroupTempController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsResourceDateStat.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsPartRouteStatService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsPartRouteStatMapper.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/controller/ApsPartRouteStatController.java
@@ -100,10 +100,25 @@
    {
        return toAjax(apsPartRouteStatService.deleteApsPartRouteStatByIds(ids));
    }
    @GetMapping("/query")
    public AjaxResult queryStat()
    /**
     * 1.根据现有零件计划 和工艺路线、资源池信息 更新统计表
     * */
    @PostMapping("/updateStat")
    public AjaxResult updateStat()
    {
        return apsPartRouteStatService.selectResourceDateStat();
        apsPartRouteStatService.updatePartRoutPlanDate();
        return success();
    }
    /***
    * 2. 根据日期、工艺路线、资源池信息 查询统计表
    * */
    @GetMapping("/query")
    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,38 +155,58 @@
    @Override
    public AjaxResult selectResourceDateStat() {
        /*查出所有统计的数据*/
        AjaxResult result = new AjaxResult(200, "生成成功");
        List<ApsResourceDateStat> list = apsPartRouteStatMapper.selectResourceDateStat();
        /*求出计划的最大时间,没有 设置为当前时间+15天*/
        ApsResourceDateStat apsResourceDateStat = list.stream().max(Comparator.comparing(ApsResourceDateStat::getPlanDay)).orElse(null);
        LocalDate maxPlanDay = LocalDate.now().plus(15, ChronoUnit.DAYS);
        if(apsResourceDateStat!=null){
            maxPlanDay=apsResourceDateStat.getPlanDay();
        }
        /*组织出日期表头*/
        List<String> planDays = new ArrayList<>();
        LocalDate startDay = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        while (startDay .isBefore( maxPlanDay)){
            planDays.add(startDay.format(formatter));
            startDay=startDay.plus(1,ChronoUnit.DAYS);
        }
        /*根据日期表头的顺序,组织出每个日期下的统计项目*/
        List<ApsResourceDateStat> targetList = 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);
        if (!list.isEmpty()) {
            /*求出计划的最大时间,没有 设置为当前时间+15天*/
            ApsResourceDateStat apsResourceDateStat = list.stream().max(Comparator.comparing(ApsResourceDateStat::getPlanDay)).orElse(null);
            LocalDate maxPlanDay = LocalDate.now().plus(15, ChronoUnit.DAYS);
            if (apsResourceDateStat != null) {
                maxPlanDay = apsResourceDateStat.getPlanDay();
            }
            /*组织出日期表头*/
            List<String> planDays = new ArrayList<>();
            LocalDate startDay = LocalDate.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            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 -> {
                        /*根据日期表头的顺序,组织出每个日期下的统计项目*/
                Map<String, List<ApsResourceDateStat>> maps = new HashMap<>(Map.of());
                List<ApsResourceDateStat> currentDaysResouces=new ArrayList<>();
                for (String planDay : planDays) {
                    /*查找当前计划日期下的所有资源组的数据*/
                    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);
                    }
                };
                maps.put(resourceName, currentDaysResouces);
                targetList.add(maps);
            });
            result.put("planTitle", planDays);
            result.put("planTable", targetList);
        }
        AjaxResult result=new AjaxResult(200,"生成成功")
                .put("planTitle",planDays)
                .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,23 +130,35 @@
            and rt.process_plan_start_day  &lt;= 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,
                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
    <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
                ,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
        where gp.del_flag='0'
        </select>
        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_name = gp.resource_group_name
        where gp.del_flag = '0'
    </select>
</mapper>