zhanghl
2025-05-14 b0858cfb5addf0adfbb618c671334878e0d17780
钣金工单计划:从redis读取库存,在本地计算版本,批量更新库存数据
已修改9个文件
137 ■■■■■ 文件已修改
aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsBom.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsMaterialStorageManagementService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsMaterialStorageManagementServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireBomOrderDetailServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireBomStockDetailServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsAbnormalProcessAnalysisMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsBomHeaderMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsBomMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsBom.java
@@ -58,7 +58,7 @@
    /** 总数量 */
    @Excel(name = "总数量")
    private BigDecimal total_num;
    private BigDecimal totalNum;
    /** 准备工时 */
    @Excel(name = "准备工时")
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsMaterialStorageManagementService.java
@@ -66,7 +66,7 @@
    Optional<ApsMaterialStorageManagement> getItemStorage(String plant, String itemNumber);
    ApsMaterialStorageManagement getRdsStorage(String plant, String itemCode);
    Optional<ApsMaterialStorageManagement> getRdsStorage(String plant, String itemCode);
    /**
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsMaterialStorageManagementServiceImpl.java
@@ -129,30 +129,23 @@
     * @return ApsMaterialStorageManagement 返回获取到的库存信息对象,如果没有找到,则返回null
     */
    @Override
    public ApsMaterialStorageManagement getRdsStorage(String plant, String itemCode){
        ApsMaterialStorageManagement ams=null;
    public Optional<ApsMaterialStorageManagement> getRdsStorage(String plant, String itemCode){
        // 尝试从Redis中获取库存信息
        JSONObject materialStorage = (JSONObject)redisTemplate.opsForValue().get("MaterialStorage:Material_"+plant+"_"+itemCode);
        String key = "MaterialStorage:Material_" + plant + "_" + itemCode;
        JSONObject materialStorage = (JSONObject)redisTemplate.opsForValue().get(key);
        if(materialStorage!=null){
            // 如果Redis中有缓存,将其转换为ApsMaterialStorageManagement对象并返回
            ams = materialStorage.toJavaObject(ApsMaterialStorageManagement.class);
            return ams;
            ApsMaterialStorageManagement ams= materialStorage.toJavaObject(ApsMaterialStorageManagement.class);
            Optional<ApsMaterialStorageManagement>   optional =  Optional.ofNullable(ams);
            return optional  ;
        }else {
            // 如果Redis中没有缓存,创建查询参数对象
            ApsMaterialStorageManagement storageParam = new ApsMaterialStorageManagement();
            storageParam.setItemNumber(itemCode);
            storageParam.setApplicableFactories(plant);
            // 从数据库中查询库存信息
            Optional<ApsMaterialStorageManagement> first = apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(storageParam).stream()
                    .findFirst();
            if (first.isPresent()){
                // 如果查询到库存信息,将其缓存到Redis中
                ams = first.get();
                redisTemplate.opsForValue().set("MaterialStorage:Material_"+plant+"_"+itemCode,JSONObject.parseObject(JSON.toJSONString(ams)));
            Optional<ApsMaterialStorageManagement> first = getItemStorage( plant, itemCode);
            first.ifPresent(apsMaterialStorageManagement ->
                    redisTemplate.opsForValue().set(key, JSONObject.parseObject(JSON.toJSONString(apsMaterialStorageManagement)))
            );
            return first;
            }
        }
        // 返回库存信息对象
        return ams;
    }
    /**
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireBomOrderDetailServiceImpl.java
@@ -127,7 +127,7 @@
        bomOrderDetail.setCreateBy(SecurityUtils.getUsername());
        orderDetailsList.add(bomOrderDetail);
        apsPlateStandardRequireBomOrderDetailMapper.insertApsPlateStandardRequireBomOrderDetail(bomOrderDetail);
        //apsPlateStandardRequireBomOrderDetailMapper.insertApsPlateStandardRequireBomOrderDetail(bomOrderDetail);
    }
    @Override
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireBomStockDetailServiceImpl.java
@@ -117,7 +117,7 @@
            ,List<ApsPlateStandardRequireBomStockDetail> stockDetailsList){
        itemStorageMapper.updateMaterialStorageByVersion(itemStorage.getId(), afterStockAmount,itemStorage.getVersion());
        //itemStorageMapper.updateMaterialStorageByVersion(itemStorage.getId(), afterStockAmount,itemStorage.getVersion());
        /*记录扣减明细*/
        ApsPlateStandardRequireBomStockDetail bomStockDetail = ApsPlateStandardRequireBomStockDetail.builder()
                .id(IdUtil.getSnowflakeNextId())
@@ -136,13 +136,13 @@
        bomStockDetail.setCreateTime(DateUtils.getNowDate());
        stockDetailsList.add(bomStockDetail);
        plateBomStockDetailMapper.insertApsPlateStandardRequireBomStockDetail(bomStockDetail);
       // plateBomStockDetailMapper.insertApsPlateStandardRequireBomStockDetail(bomStockDetail);
        /*更新内存中物料剩余库存*/
        /*itemStorage.setRemainderStock(afterStockAmount);
        itemStorage.setRemainderStock(afterStockAmount);
        if(null== itemStorage.getVersion()){
            itemStorage.setVersion(1);
        }else{
            itemStorage.setVersion(itemStorage.getVersion()+1);
        }*/
        }
    }
}
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java
@@ -175,7 +175,7 @@
        String batchNum= requireBatchService.getNewBatchNumber();
        /*获取钣金主单信息*/
        List<ApsPlatePlan> mainPlans = platePlanMapper.selectPlatePlanByPlantMajor(plantCode,mainOrderType);
        Hashtable<String, BigDecimal> usedStorage = new Hashtable<>();
        Hashtable<String, ApsMaterialStorageManagement> usedStorage = new Hashtable<>();
        log.info("开始生成需求:");
        for (ApsPlatePlan mainPlan : mainPlans) {
            String itemNumber = mainPlan.getItemNumber();
@@ -200,38 +200,31 @@
                    apsPlateStandardRequireMapper.batchInsert(batch);
                }
            }
            log.info("生成完成");
//            if(!stockDetailsList.isEmpty()){
//                int batchSize = 1000;
//                stockDetailsList.forEach(x->x.setId(IdUtil.getSnowflakeNextId()));
//                for (int i = 0; i < stockDetailsList.size(); i += batchSize) {
//                    int end = Math.min(i + batchSize, stockDetailsList.size());
//                    List<ApsPlateStandardRequireBomStockDetail> batch = stockDetailsList.subList(i, end);
//                    plateBomStockDetailMapper.batchInsert(batch);
//                }
//            }
//
//            if(!orderDetailsList.isEmpty()){
//                int batchSize = 1000;
//                orderDetailsList.forEach(x->x.setId(IdUtil.getSnowflakeNextId()));
//                for (int i = 0; i < orderDetailsList.size(); i += batchSize) {
//                    int end = Math.min(i + batchSize, orderDetailsList.size());
//                    List<ApsPlateStandardRequireBomOrderDetail> batch = orderDetailsList.subList(i, end);
//                    plateBomOrderDetailMapper.batchInsert(batch);
//                }
//            }
            if(!stockDetailsList.isEmpty()){
                int batchSize = 1000;
                stockDetailsList.forEach(x->x.setId(IdUtil.getSnowflakeNextId()));
                for (int i = 0; i < stockDetailsList.size(); i += batchSize) {
                    int end = Math.min(i + batchSize, stockDetailsList.size());
                    List<ApsPlateStandardRequireBomStockDetail> batch = stockDetailsList.subList(i, end);
                    plateBomStockDetailMapper.batchInsert(batch);
                }
            }
            if(!orderDetailsList.isEmpty()){
                int batchSize = 1000;
                orderDetailsList.forEach(x->x.setId(IdUtil.getSnowflakeNextId()));
                for (int i = 0; i < orderDetailsList.size(); i += batchSize) {
                    int end = Math.min(i + batchSize, orderDetailsList.size());
                    List<ApsPlateStandardRequireBomOrderDetail> batch = orderDetailsList.subList(i, end);
                    plateBomOrderDetailMapper.batchInsert(batch);
                }
            }
        }
            /*集中保存库存信息*/
           /* if(!usedStorage.isEmpty()){
        if(!usedStorage.isEmpty()){
                usedStorage.forEach((key, sm) -> {
                    storageManagementService.updateRemainderStock(sm.getId(),sm.getRemainderStock(),sm.getVersion());
                });
            }*/
        }
        usedStorage.forEach((key,value)->{
            log.info("料号:"+key+",库存:"+value);
        });
    }
    /**
@@ -255,7 +248,7 @@
                                List<ApsPlateStandardRequire> allRequires,
                                Long level,List<ApsPlateStandardRequireBomStockDetail> stockDetailsList,
                                List<ApsPlateStandardRequireBomOrderDetail> orderDetailsList,
                                 Hashtable<String, BigDecimal> usedStorage
                                Hashtable<String, ApsMaterialStorageManagement> usedStorage
    ) {
        /*构建需求信息*/
        ApsPlateStandardRequire require = new ApsPlateStandardRequire();
@@ -285,17 +278,14 @@
        /*默认净需求为BOM用量*/
        require.setNetRequirement(require.getRequireAmount());
        /*读取库存信息的优先级-> 内存、redis、db*/
       /* ApsMaterialStorageManagement storage = usedStorage.get(itemCode);
        if(storage==null){
            storage = storageManagementService.getRdsStorage(plant, itemCode);
            if(storage!=null){
                *//*剩余库存*//*
                remainderStock = storage.getRemainderStock();
        Optional<ApsMaterialStorageManagement> itemStorageOpt = Optional.ofNullable(usedStorage.get(itemCode)) ;
        if(itemStorageOpt.isEmpty()){
            itemStorageOpt = storageManagementService.getRdsStorage(plant, itemCode);
            }
        }*/
        Optional<ApsMaterialStorageManagement> itemStorageOpt = storageManagementService.getItemStorage(plant, itemCode);
        if (itemStorageOpt.isPresent()) {
            ApsMaterialStorageManagement     itemStorage=itemStorageOpt.get();
            BigDecimal remainderStock =itemStorage.getRemainderStock();
            /*计算净需求 默认=需求数量*/
@@ -320,7 +310,7 @@
                        , afterStockAmount, require.getId(), stockDetailsList
                );
                /*更新内存中的库存使用信息*/
               usedStorage.put(itemCode, afterStockAmount);
               usedStorage.put(itemCode, itemStorage);
            }
        }
        /*未匹配数量,默认为净需求*/
aps-modules/aps-core/src/main/resources/mapper/core/ApsAbnormalProcessAnalysisMapper.xml
@@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aps.core.mapper.ApsAbnormalProcessAnalysisMapper">
    
    <resultMap type="ApsAbnormalProcessAnalysis" id="ApsAbnormalProcessAnalysisResult">
    <resultMap type="com.aps.core.domain.ApsAbnormalProcessAnalysis" id="ApsAbnormalProcessAnalysisResult">
        <result property="id"    column="id"    />
        <result property="processName"    column="process_name"    />
        <result property="source"    column="source"    />
@@ -18,7 +18,7 @@
        select id, process_name, source, summary, create_time, del_flag, create_by from aps_abnormal_process_analysis
    </sql>
    <select id="selectApsAbnormalProcessAnalysisList" parameterType="ApsAbnormalProcessAnalysis" resultMap="ApsAbnormalProcessAnalysisResult">
    <select id="selectApsAbnormalProcessAnalysisList" parameterType="com.aps.core.domain.ApsAbnormalProcessAnalysis" resultMap="ApsAbnormalProcessAnalysisResult">
        <include refid="selectApsAbnormalProcessAnalysisVo"/>
        <where>
            and del_flag = '0'
@@ -34,7 +34,7 @@
        where id = #{id}
    </select>
    <insert id="insertApsAbnormalProcessAnalysis" parameterType="ApsAbnormalProcessAnalysis" useGeneratedKeys="true" keyProperty="id">
    <insert id="insertApsAbnormalProcessAnalysis" parameterType="com.aps.core.domain.ApsAbnormalProcessAnalysis" useGeneratedKeys="true" keyProperty="id">
        insert into aps_abnormal_process_analysis
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="processName != null">process_name,</if>
@@ -54,7 +54,7 @@
         </trim>
    </insert>
    <update id="updateApsAbnormalProcessAnalysis" parameterType="ApsAbnormalProcessAnalysis">
    <update id="updateApsAbnormalProcessAnalysis" parameterType="com.aps.core.domain.ApsAbnormalProcessAnalysis">
        update aps_abnormal_process_analysis
        <trim prefix="SET" suffixOverrides=",">
            <if test="processName != null">process_name = #{processName},</if>
@@ -86,7 +86,7 @@
        order by resource_group_name;
    </select>
    <!--批量插入信息-->
    <insert id="batchSaveAbnormalInfo" parameterType="ApsAbnormalProcessAnalysis">
    <insert id="batchSaveAbnormalInfo" parameterType="com.aps.core.domain.ApsAbnormalProcessAnalysis">
        insert into aps_abnormal_process_analysis(process_name,source,summary,create_time,del_flag,create_by)
        values
        <foreach collection="list" item="item" index="index" separator=",">
aps-modules/aps-core/src/main/resources/mapper/core/ApsBomHeaderMapper.xml
@@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aps.core.mapper.ApsBomHeaderMapper">
    
    <resultMap type="ApsBomHeader" id="ApsBomHeaderResult">
    <resultMap type="com.aps.core.domain.ApsBomHeader" id="ApsBomHeaderResult">
        <result property="id"    column="id"    />
        <result property="bomHeaderId"    column="bom_header_id"    />
        <result property="itemCode"    column="item_code"    />
@@ -25,7 +25,7 @@
        from aps_bom_header
    </sql>
    <select id="selectApsBomHeaderList" parameterType="ApsBomHeader" resultMap="ApsBomHeaderResult">
    <select id="selectApsBomHeaderList" parameterType="com.aps.core.domain.ApsBomHeader" resultMap="ApsBomHeaderResult">
        <include refid="selectApsBomHeaderVo"/>
        <where>  
            <if test="bomHeaderId != null  and bomHeaderId != ''"> and bom_header_id = #{bomHeaderId}</if>
@@ -42,7 +42,7 @@
        where id = #{id}
    </select>
    <insert id="insertApsBomHeader" parameterType="ApsBomHeader">
    <insert id="insertApsBomHeader" parameterType="com.aps.core.domain.ApsBomHeader">
        insert into aps_bom_header
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">id,</if>
@@ -74,7 +74,7 @@
         </trim>
    </insert>
    <update id="updateApsBomHeader" parameterType="ApsBomHeader">
    <update id="updateApsBomHeader" parameterType="com.aps.core.domain.ApsBomHeader">
        update aps_bom_header
        <trim prefix="SET" suffixOverrides=",">
            <if test="bomHeaderId != null">bom_header_id = #{bomHeaderId},</if>
aps-modules/aps-core/src/main/resources/mapper/core/ApsBomMapper.xml
@@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aps.core.mapper.ApsBomMapper">
    
    <resultMap type="ApsBom" id="ApsBomResult">
    <resultMap type="com.aps.core.domain.ApsBom" id="ApsBomResult">
        <result property="id"    column="id"    />
        <result property="bomLineId"    column="bom_line_id"    />
        <result property="bomHeaderId"    column="bom_header_id"    />
@@ -34,7 +34,7 @@
        from aps_bom_line
    </sql>
    <select id="selectApsBomList" parameterType="ApsBom" resultMap="ApsBomResult">
    <select id="selectApsBomList" parameterType="com.aps.core.domain.ApsBom" resultMap="ApsBomResult">
        <include refid="selectApsBomVo"/>
        <where>  
            <if test="bomLineId != null  and bomLineId != ''"> and bom_line_id = #{bomLineId}</if>
@@ -55,7 +55,7 @@
        where id = #{id}
    </select>
    <insert id="insertApsBom" parameterType="ApsBom" useGeneratedKeys="true" keyProperty="id">
    <insert id="insertApsBom" parameterType="com.aps.core.domain.ApsBom" useGeneratedKeys="true" keyProperty="id">
        insert into aps_bom_line
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="bomLineId != null">bom_line_id,</if>
@@ -101,7 +101,7 @@
         </trim>
    </insert>
    <update id="updateApsBom" parameterType="ApsBom">
    <update id="updateApsBom" parameterType="com.aps.core.domain.ApsBom">
        update aps_bom_line
        <trim prefix="SET" suffixOverrides=",">
            <if test="bomLineId != null">bom_line_id = #{bomLineId},</if>
@@ -138,7 +138,7 @@
        </foreach>
    </delete>
    <resultMap type="ApsBom" id="ApsBomLineResult">
    <resultMap type="com.aps.core.domain.ApsBom" id="ApsBomLineResult">
        <result property="id"    column="id"    />
        <result property="bomLineId"    column="bom_line_id"    />
        <result property="itemCode"    column="item_code"    />