zhanghl
2025-05-12 54b067a61093c5c8b5620dab0487c1231395dd78
优化从Redis 获取工艺路线和库存信息
已修改8个文件
113 ■■■■ 文件已修改
aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsBomController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsBom.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsBomService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsStandardProcessRouteLineService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsBomServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsStandardProcessRouteLineServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsBomHeaderMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsBomController.java
@@ -95,4 +95,13 @@
    {
        return toAjax(apsBomService.deleteApsBomByIds(ids));
    }
    @GetMapping("/getbom")
    public void getBom()
    {
        List<ApsBom> ll=apsBomService.selectRdsBomLineList("FORTUNA","A6501-001080");
        System.out.println(ll);
    }
}
aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsBom.java
@@ -89,11 +89,9 @@
    /** 删除标志(0代表存在 2代表删除) */
    private String delFlag;
    private String mainitemcode;
    private BigDecimal mainstock;
    private String subitemcode;
    private BigDecimal usagenum;
    private BigDecimal substock;
    private String selfmade;
    private String mainItemCode;
    private BigDecimal mainStock;
    private BigDecimal subStock;
    private String selfMade;
}
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsBomService.java
@@ -60,4 +60,6 @@
    public int deleteApsBomById(Long id);
    List<ApsBom> selectApsBomLineList(String plant, String itemNumber);
    List<ApsBom> selectRdsBomLineList(String plant, String itemNumber);
}
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsStandardProcessRouteLineService.java
@@ -63,4 +63,6 @@
    public int deleteApsStandardProcessRouteLineById(Long id);
    ApsStandardProcessRouteLine getRouteLineTotalTime(ApsPlateStandardRequire require);
    ApsStandardProcessRouteLine getRouteHeaderRouteTime(ApsPlateStandardRequire require);
}
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsBomServiceImpl.java
@@ -1,5 +1,6 @@
package com.aps.core.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.aps.common.core.utils.DateUtils;
import com.aps.core.domain.ApsBom;
import com.aps.core.domain.ApsBomHeader;
@@ -124,11 +125,24 @@
            build.setOrgCode(apsBomHeader.getOrgCode());
            bomLineList = apsBomMapper.selectApsBomList(build);
        }
//        JSONArray jsonArray = (JSONArray)redisTemplate.opsForValue().get("BOM:BOM_"+plant+"_"+itemNumber);
//        for (int i = 0; i < jsonArray.size(); i++){
//            ApsBom apsBom = jsonArray.getJSONObject(i).to(ApsBom.class);
//            bomLineList.add(apsBom);
//        }
        return bomLineList;
    }
    @Override
    public List<ApsBom> selectRdsBomLineList(String plant, String itemNumber)
    {
        List<ApsBom> bomLineList =new ArrayList<>();
        JSONArray jsonArray = (JSONArray)redisTemplate.opsForValue().get("BOM:BOM_"+plant+"_"+itemNumber);
        if (jsonArray != null && !jsonArray.isEmpty()) {
            for (int i = 0; i < jsonArray.size(); i++){
                ApsBom apsBom = jsonArray.getJSONObject(i).to(ApsBom.class);
                bomLineList.add(apsBom);
            }
        }else {
            bomLineList = selectApsBomLineList(plant, itemNumber);
        }
        return bomLineList;
    }
}
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java
@@ -234,6 +234,8 @@
        /*默认净需求为BOM用量*/
        require.setNetRequirement(require.getBomUseAmount());
        Optional<ApsMaterialStorageManagement> itemStorage = getItemStorage(plant, itemCode);
        if (itemStorage.isPresent()) {
            ApsMaterialStorageManagement storage = itemStorage.get();
            /*剩余库存*/
@@ -262,7 +264,7 @@
        /*未匹配数量,默认为净需求*/
        require.setUnmatchedDemandAmount(require.getNetRequirement());
        /*工艺路线总需求*/
        ApsStandardProcessRouteLine routeHeader = routeLineService.getRouteLineTotalTime(require);
        ApsStandardProcessRouteLine routeHeader = routeLineService.getRouteHeaderRouteTime(require);
        String routeId = routeHeader.getRouteId();
        BigDecimal totalRouteTime = routeHeader.getRouteTime();
        long millisecond = 60 * 60 * 1000L;
@@ -315,7 +317,7 @@
        if (require.getNetRequirement().compareTo(BigDecimal.ZERO) > 0) {
            /*当前Bom节点处理完成后,处理下级BOM*/
            long nextLevel=level+1;
            List<ApsBom> bomLineList = bomLineService.selectApsBomLineList(plant, itemCode);
            List<ApsBom> bomLineList = bomLineService.selectRdsBomLineList(plant, itemCode);
            if (!bomLineList.isEmpty()) {
                bomLineList.forEach(line -> {
                    getBomRequires(plant, itemCode, line.getBomLineId(),line.getItemCode() ,line.getNum() , batchNum, require.getStartDate(), plan, allRequires, nextLevel);
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsStandardProcessRouteLineServiceImpl.java
@@ -1,10 +1,8 @@
package com.aps.core.service.impl;
import java.math.BigDecimal;
import java.util.Hashtable;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import cn.hutool.core.util.IdUtil;
import com.aps.common.core.utils.DateUtils;
@@ -16,6 +14,7 @@
import com.aps.core.mapper.ApsStandardProcessRouteHeaderMapper;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.aps.core.mapper.ApsStandardProcessRouteLineMapper;
import com.aps.core.domain.ApsStandardProcessRouteLine;
@@ -36,6 +35,9 @@
    ApsStandardProcessRouteHeaderMapper standardProcessRouteHeaderMapper;
    @Resource
    ApsPlateStandardRequireErrorMapper requireErrorMapper;
    @Resource
    private RedisTemplate redisTemplate;
    /**
     * 查询标准工艺路线Line
     * 
@@ -144,6 +146,48 @@
        // 返回总工时
        return ret;
    }
    @Override
    public ApsStandardProcessRouteLine getRouteHeaderRouteTime(ApsPlateStandardRequire require){
        //工厂
        String plant=require.getOrgCode();
        // 物料号
        String itemCode=require.getBomLineCode();
        // 净需求
        BigDecimal netRequirement=  require.getNetRequirement();
        //构建Redis Key
        String key = "ROUTE:ROUTE_"+plant+"_"+itemCode;
        BigDecimal totalRouteTime = BigDecimal.ZERO;
        ApsStandardProcessRouteLine ret=new ApsStandardProcessRouteLine();
        ret.setRouteId("0");
        ret.setRouteTime(totalRouteTime);
        Object routeHeaderObj = redisTemplate.opsForValue().get(key);
        if (routeHeaderObj != null) {
            totalRouteTime = (BigDecimal) routeHeaderObj;
            ret.setRouteTime(totalRouteTime);
            return  ret;
        } else {
            // 查询标准工艺路线头部信息
            Optional<ApsStandardProcessRouteHeader> firstProcessRoute = standardProcessRouteHeaderMapper.queryStandardProcessRouteHeaderByPlantAndItemCode(plant, itemCode).stream().findFirst();
            if (firstProcessRoute.isPresent()) {
                ApsStandardProcessRouteHeader routeHeader = firstProcessRoute.get();
                // 构建工艺路线行参数对象
                ApsStandardProcessRouteLine routeLineParam =new ApsStandardProcessRouteLine();
                routeLineParam.setRouteId(routeHeader.getRouteId());
                // 查询标准工艺路线行信息
                BigDecimal standardTime = apsStandardProcessRouteLineMapper.selectTotalStandTime(routeHeader.getRouteId()).getStandardTime();
                totalRouteTime =standardTime.multiply(netRequirement);
                // 计算返回的数据
                ret.setRouteTime(totalRouteTime);
                ret.setRouteId(routeHeader.getRouteId());
                /*存储至Redis*/
                redisTemplate.opsForValue().set(key, standardTime);
            }
            return ret;
        }
    }
    private void saveRequireError(ApsPlateStandardRequire require,String message) {
        ApsPlateStandardRequireError data = ApsPlateStandardRequireError.builder()
aps-modules/aps-core/src/main/resources/mapper/core/ApsBomHeaderMapper.xml
@@ -104,13 +104,15 @@
    </delete>
    <select id="selectBomRedisData" parameterType="String" resultType="com.alibaba.fastjson2.JSONObject">
        SELECT a.item_code as mainItemCode,f.num as mainStock,b.item_code as subItemCode,b.num as usageNum,c.num as subStock,d.self_made as selfMade FROM aps_bom_header a
        LEFT JOIN aps_bom_line b on a.bom_header_id=b.bom_header_id
        LEFT JOIN aps_material_storage_management c on b.item_code=c.item_number
        LEFT JOIN aps_material_management d on b.item_code=d.item_number
        LEFT JOIN aps_material_storage_management as f on a.item_code=f.item_number
        SELECT a.item_code as mainItemCode,f.num as mainStock,b.bom_line_id as bomLineId, b.item_code as itemCode,b.num ,c.num as subStock,d.self_made as selfMade
        FROM aps_bom_header a
            LEFT JOIN aps_bom_line b on a.bom_header_id=b.bom_header_id
            LEFT JOIN aps_material_storage_management c on b.item_code=c.item_number
            LEFT JOIN aps_material_management d on b.item_code=d.item_number
            LEFT JOIN aps_material_storage_management as f on a.item_code=f.item_number
        <if test="orgCode != null and orgCode != ''">
            WHERE a.org_code=#{orgCode} and d.applicable_factories=#{orgCode} and c.applicable_factories=#{orgCode}
            and a.item_code='A6501-001080'
        </if>
        ORDER BY mainItemCode
    </select>