aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java
@@ -29,6 +29,9 @@ * 判断是否存在锁 * */ public boolean existLock(String key,String value){ if(null==this.redisTemplate.opsForValue().get(key)){ return false; } return this.redisTemplate.opsForValue().get(key).equals(value); } aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsBomHeaderController.java
@@ -129,7 +129,8 @@ @PostMapping("/setBomDataToRedis") public void setBomDataToRedis() { apsBomHeaderService.setBomDataToRedis(""); apsBomHeaderService.setBomDataToRedis("FORTUNA"); //apsBomHeaderService.setBomDataToRedis("FORTUNE"); } @PostMapping("/test") @@ -137,4 +138,10 @@ { apsBomHeaderService.setBomDataToRedis("FORTUNA"); } @GetMapping("/getBomRdsCount/{orgCode}") public Integer getBomRdsCount(String orgCode) { return apsBomHeaderService.getBomKeys(orgCode); } } aps-modules/aps-core/src/main/java/com/aps/core/enums/PLAN_TASK_STATUS.java
@@ -2,8 +2,8 @@ public enum PLAN_TASK_STATUS { IN_PROCESS("InProgress","进行中"), FINISHED("Finished","完成"); FINISHED("Finished","完成"), ERROR("Error","失败"); private String code; private String desc; aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlate/IApsPlateStandardRequireBatchService.java
@@ -63,5 +63,5 @@ String getNewBatchNumber(); @Transactional void initRequireBatch(); void initRequireBatch(String batchNumber); } aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlate/IApsPlateStandardRequireErrorService.java
@@ -1,6 +1,8 @@ package com.aps.core.service.ApsPlate; import java.util.List; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequire; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireError; /** @@ -58,4 +60,6 @@ * @return 结果 */ public int deleteApsPlateStandardRequireErrorById(Long id); void saveRequireError(ApsPlateStandardRequire require, String message); } aps-modules/aps-core/src/main/java/com/aps/core/service/IApsBomHeaderService.java
@@ -66,4 +66,6 @@ * @return */ public boolean setBomDataToRedis(String orgCode); Integer getBomKeys(String orgCode); } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsBomHeaderServiceImpl.java
@@ -131,4 +131,8 @@ } return true; } @Override public Integer getBomKeys(String orgCode){ return redisTemplate.keys("BOM:BOM_"+orgCode+"*").size(); } } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsBomServiceImpl.java
@@ -140,10 +140,6 @@ bomLineList.add(apsBom); } } // else { // bomLineList = selectApsBomLineList(plant, itemNumber); // } return bomLineList; } } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java
@@ -90,8 +90,7 @@ } @Override public AjaxResult generatorPlan() { public AjaxResult generatorPlan() { String plateOrderPlanKey = PLATE_ORDER_PLAN.getKey(); boolean existsLock = redisLockUtils.existLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_PLAN.getCode()); if (existsLock){ @@ -104,19 +103,21 @@ if (existsDbTask){ return AjaxResult.warn("钣金工单计划任务正在执行中!!"); } String currentBatchNum = requireBatchService.getNewBatchNumber(); try { redisLockUtils.getLock(plateOrderPlanKey,PLAN_TASK_TYPE.PLATE_PLAN.getCode(), 3*60L); String batchNum= requireBatchService.getNewBatchNumber(); this.savePlanTask(batchNum); apsPlateStandardRequireService.generatorPlan(batchNum); this.updateTaskStatus(batchNum, PLAN_TASK_STATUS.FINISHED); redisLockUtils.getLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_PLAN.getCode(), 15 * 60L); this.savePlanTask(currentBatchNum); //Thread.sleep(60*1000); apsPlateStandardRequireService.generatorPlan(currentBatchNum); /*清除已经存在的 工单计划完工时间*/ orderEndDayMapper.batchRemove(); log.info("计划任务执行完成!"+batchNum); this.updateTaskStatus(currentBatchNum, PLAN_TASK_STATUS.FINISHED); log.info("计划任务执行完成!" + currentBatchNum); return success(); }catch (Exception e){ redisLockUtils.releaseLock(plateOrderPlanKey,PLAN_TASK_TYPE.PLATE_PLAN.getCode()); log.error("计划任务执行失败!"+e.getMessage()); this.updateTaskStatus(currentBatchNum, PLAN_TASK_STATUS.ERROR); return AjaxResult.error("计划任务执行失败!"+e.getMessage()); }finally { redisLockUtils.releaseLock(plateOrderPlanKey,PLAN_TASK_TYPE.PLATE_PLAN.getCode()); aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java
@@ -18,6 +18,7 @@ import com.aps.core.domain.ApsPlate.ApsPlateProcessShopStat; import com.aps.core.domain.ApsPlate.ApsPlateProcessStat; import com.aps.core.mapper.*; import com.aps.core.service.ApsPlate.IApsPlateProcessStatService; import com.aps.system.api.domain.SysDictData; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -59,6 +60,9 @@ @Resource private ApsPlatePlanMapper apsPlatePlanMapper; @Autowired private IApsPlateProcessStatService apsPlateProcessStatService; /** @@ -136,6 +140,7 @@ @Override public void saveShopStat() { try { apsPlateProcessStatService.savePlateProcessStat(); // 开始之前先删除所有历史数据 apsPlateProcessShopStatMapper.deleteAll(); aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessStatServiceImpl.java
@@ -2,12 +2,15 @@ import java.math.BigDecimal; import java.time.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import cn.hutool.core.util.IdUtil; import com.aps.common.core.utils.uuid.IdUtils; import com.aps.common.security.utils.SecurityUtils; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireBomOrderDetail; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.aps.core.mapper.ApsPlateProcessStatMapper; @@ -109,9 +112,11 @@ public void savePlateProcessStat() { String batchNum = IdUtils.fastSimpleUUID(); List<ApsPlateProcessStat> tempList = apsPlateProcessStatMapper.queryTempStat(); ApsPlateProcessStat apsPlateProcessStat = tempList.stream().filter(x -> x.getWorkOrderNo().equals("MO-250409003498")).findFirst().get(); Map<String, List<ApsPlateProcessStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsPlateProcessStat::getWorkOrderNo)); Boolean hasBefore = false; LocalDateTime now = LocalDateTime.now(); List<ApsPlateProcessStat> totalList=new ArrayList<>(); for (Map.Entry<String, List<ApsPlateProcessStat>> entry : groupByOrderNo.entrySet()) { List<ApsPlateProcessStat> statPerOrder = entry.getValue(); /*num 为根据完工时间排序出的序号,按此排序,可保证是按完工时间倒叙排列*/ @@ -176,13 +181,21 @@ } } last = stat; apsPlateProcessStatMapper.insertApsPlateProcessStat(stat); totalList.add(stat); //apsPlateProcessStatMapper.insertApsPlateProcessStat(stat); } hasBefore=false; } apsPlateProcessStatMapper.removeOtherStat(batchNum); if(!totalList.isEmpty()){ int batchSize = 1000; totalList.forEach(x->x.setId(String.valueOf(IdUtil.getSnowflakeNextId()))); for (int i = 0; i < totalList.size(); i += batchSize) { int end = Math.min(i + batchSize, totalList.size()); List<ApsPlateProcessStat> batch = totalList.subList(i, end); apsPlateProcessStatMapper.batchInsertPlateStat(batch); } } } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateStandardRequireBatchServiceImpl.java
@@ -136,16 +136,12 @@ @Transactional @Override public void initRequireBatch() { ApsPlateStandardRequireBatch batch=apsPlateStandardRequireBatchMapper.selectLastRequireBatch(); if (batch!=null){ String batchNumber = batch.getBatchNumber(); apsPlateStandardRequireMapper.deleteLastPatch(batchNumber); apsPlateStandardRequireBomOrderDetailMapper.deleteLastPatch(batchNumber); apsPlateStandardRequireBomStockDetailMapper.deleteLastPatch(batchNumber); apsPlateStandardRequireErrorMapper.deleteLastPatch(batchNumber); public void initRequireBatch(String currentBatchNumber) { apsPlateStandardRequireMapper.deleteLastPatch(currentBatchNumber); apsPlateStandardRequireBomOrderDetailMapper.deleteLastPatch(currentBatchNumber); apsPlateStandardRequireBomStockDetailMapper.deleteLastPatch(currentBatchNumber); apsPlateStandardRequireErrorMapper.deleteLastPatch(currentBatchNumber); apsPlatePlanMapper.initUnMatchQty(); apsMaterialStorageManagementMapper.initRemainderStock(); } } } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateStandardRequireErrorServiceImpl.java
@@ -1,7 +1,11 @@ package com.aps.core.service.impl.ApsPlate; import java.util.List; import cn.hutool.core.util.IdUtil; import com.aps.common.core.utils.DateUtils; import com.aps.common.security.utils.SecurityUtils; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.aps.core.mapper.ApsPlateStandardRequireErrorMapper; @@ -93,4 +97,21 @@ { return apsPlateStandardRequireErrorMapper.deleteApsPlateStandardRequireErrorById(id); } @Override public void saveRequireError(ApsPlateStandardRequire require, String message) { ApsPlateStandardRequireError data = ApsPlateStandardRequireError.builder() .id(IdUtil.getSnowflakeNextId()) .requireId(require.getId()) .batchNumber(require.getBatchNumber()) .docNum(require.getDocNum()) .itemNum(require.getBomLineCode()) .orgCode(require.getOrgCode()) .message(message) .delFlag("0") .build(); data.setCreateBy(SecurityUtils.getUsername()); data.setCreateTime(DateUtils.getNowDate()); apsPlateStandardRequireErrorMapper.insertApsPlateStandardRequireError(data); } } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateStandardRequireServiceImpl.java
@@ -1,29 +1,27 @@ package com.aps.core.service.impl.ApsPlate; import java.math.BigDecimal; import java.util.*; import cn.hutool.core.util.IdUtil; import com.aps.common.core.utils.DateUtils; import com.aps.common.security.utils.DictUtils; import com.aps.common.security.utils.SecurityUtils; import com.aps.core.domain.*; import com.aps.core.domain.ApsPlate.ApsPlatePlan; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireBomOrderDetail; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireBomStockDetail; import com.aps.core.domain.ApsBom; import com.aps.core.domain.ApsMaterialStorageManagement; import com.aps.core.domain.ApsPlate.*; import com.aps.core.domain.ApsStandardProcessRouteLine; import com.aps.core.mapper.*; import com.aps.core.service.*; import com.aps.core.service.ApsPlate.*; import com.aps.core.service.IApsBomService; import com.aps.core.service.IApsMaterialStorageManagementService; import com.aps.core.service.IApsStandardProcessRouteLineService; import com.aps.system.api.domain.SysDictData; import jakarta.annotation.Resource; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequire; import com.aps.core.mapper.ApsPlateStandardRequireMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.math.BigDecimal; import java.util.*; /** * 钣金工单标准需求Service业务层处理 @@ -39,29 +37,17 @@ private ApsPlateStandardRequireMapper apsPlateStandardRequireMapper; @Resource private ApsPlateStandardRequireBatchMapper requireBatchMapper; @Resource ApsPlatePlanMapper platePlanMapper; @Resource ApsBomHeaderMapper bomHeaderMapper; @Resource IApsBomService bomLineService; @Resource ApsMaterialStorageManagementMapper itemStorageMapper; @Resource ApsPlateStandardRequireBomStockDetailMapper plateBomStockDetailMapper; @Resource IApsPlateStandardRequireBomStockDetailService bomStockDetailService; @Resource ApsStandardProcessRouteHeaderMapper standardProcessRouteHeaderMapper; @Resource ApsStandardProcessRouteLineMapper ApsStandardProcessRouteLineMapper; @Resource ApsPlateStandardRequireBomOrderDetailMapper plateBomOrderDetailMapper; @@ -76,10 +62,11 @@ IApsStandardProcessRouteLineService routeLineService; @Resource IApsPlateStandardRequireBatchService requireBatchService; IApsPlateStandardRequireErrorService requireErrorService; @Resource private IApsMaterialStorageManagementService storageManagementService; @Resource IApsPlateStandardRequireBatchService requireBatchService; /** * 查询钣金工单标准需求 * @@ -167,9 +154,7 @@ @Transactional @Override public void generatorPlan(String batchNum){ /*初始化数据*/ requireBatchService.initRequireBatch(); requireBatchService.initRequireBatch(batchNum); /*定义工厂为南通 */ String plantCode="FORTUNA"; /*获取钣金主单信息*/ @@ -296,7 +281,10 @@ if (itemStorageOpt.isPresent()) { ApsMaterialStorageManagement itemStorage=itemStorageOpt.get(); BigDecimal remainderStock =itemStorage.getRemainderStock(); BigDecimal remainderStock =BigDecimal.ZERO; if(null!=itemStorage.getRemainderStock()){ remainderStock = itemStorage.getRemainderStock(); } /*计算净需求 默认=需求数量*/ if (remainderStock.compareTo(BigDecimal.ZERO) == 0) { require.setNetRequirement(require.getBomUseAmount()); aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsStandardProcessRouteLineServiceImpl.java
@@ -12,6 +12,7 @@ import com.aps.core.domain.ApsStandardProcessRouteHeader; import com.aps.core.mapper.ApsPlateStandardRequireErrorMapper; import com.aps.core.mapper.ApsStandardProcessRouteHeaderMapper; import com.aps.core.service.ApsPlate.IApsPlateStandardRequireErrorService; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -34,7 +35,7 @@ @Resource ApsStandardProcessRouteHeaderMapper standardProcessRouteHeaderMapper; @Resource ApsPlateStandardRequireErrorMapper requireErrorMapper; IApsPlateStandardRequireErrorService requireErrorService; @Resource private RedisTemplate redisTemplate; @@ -141,7 +142,7 @@ ret.setRouteTime(totalRouteTime); ret.setRouteId(routeHeader.getRouteId()); }else { saveRequireError(require,"标准工艺路线不存在"); requireErrorService.saveRequireError(require,"标准工艺路线不存在"); } // 返回总工时 return ret; @@ -170,7 +171,7 @@ ret.setRouteTime(totalRouteTime.multiply(netRequirement)); return ret; } else { saveRequireError(require,"标准工艺路线不存在"); requireErrorService.saveRequireError(require,"标准工艺路线不存在"); /*// 查询标准工艺路线头部信息 Optional<ApsStandardProcessRouteHeader> firstProcessRoute = standardProcessRouteHeaderMapper.queryStandardProcessRouteHeaderByPlantAndItemCode(plant, itemCode).stream().findFirst(); if (firstProcessRoute.isPresent()) { @@ -193,19 +194,4 @@ } } private void saveRequireError(ApsPlateStandardRequire require,String message) { ApsPlateStandardRequireError data = ApsPlateStandardRequireError.builder() .id(IdUtil.getSnowflakeNextId()) .requireId(require.getId()) .batchNumber(require.getBatchNumber()) .docNum(require.getDocNum()) .itemNum(require.getBomLineCode()) .orgCode(require.getOrgCode()) .message(message) .delFlag("0") .build(); data.setCreateBy(SecurityUtils.getUsername()); data.setCreateTime(DateUtils.getNowDate()); requireErrorMapper.insertApsPlateStandardRequireError(data); } } aps-modules/aps-core/src/main/resources/mapper/core/ApsBomHeaderMapper.xml
@@ -109,13 +109,10 @@ LEFT JOIN aps_bom_line b on a.bom_header_id=b.bom_header_id LEFT JOIN aps_material_management d on b.item_code=d.item_number LEFT JOIN aps_material_management c on a.item_code=c.item_number <where> where d.material_type='制造件' and c.material_type='制造件' <if test="orgCode != null and orgCode != ''"> and a.org_code=#{orgCode} and d.applicable_factories=#{orgCode} </if> and d.material_type='制造件' and c.material_type='制造件' </where> ORDER BY mainItemCode </select> </mapper> aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateProcessStatMapper.xml
@@ -173,10 +173,13 @@ production_quantity, standard_time, process_total_time, process_plan_start_day, process_plan_end_day, order_plan_end_day, batch_number, create_by, del_flag del_flag, warning ) values <foreach collection="list" item="item" index="index" separator=","> @@ -190,10 +193,13 @@ #{item.productionQuantity}, #{item.standardTime}, #{item.processTotalTime}, #{item.processPlanStartDay}, #{item.processPlanEndDay}, #{item.orderPlanEndDay}, #{item.batchNumber}, #{item.createBy}, '0' '0', #{item.warning} ) </foreach> </insert> aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateStandardRequireBomOrderDetailMapper.xml
@@ -127,7 +127,7 @@ </delete> <update id="deleteLastPatch" parameterType="String"> update aps_plate_standard_require_bom_order_detail set del_flag = '1' where batch_number = #{batchNumber} update aps_plate_standard_require_bom_order_detail set del_flag = '1' where del_flag = '0' and batch_number != #{batchNumber} </update> <insert id="batchInsert" parameterType="com.aps.core.domain.ApsPlate.ApsPlateStandardRequireBomOrderDetail"> aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateStandardRequireBomStockDetailMapper.xml
@@ -120,7 +120,9 @@ </delete> <update id="deleteLastPatch" parameterType="String"> update aps_plate_standard_require_bom_stock_detail set del_flag = '1' where batch_number = #{batchNumber} update aps_plate_standard_require_bom_stock_detail set del_flag = '1' where del_flag = '0' and batch_number != #{batchNumber} </update> <insert id="batchInsert" parameterType="com.aps.core.domain.ApsPlate.ApsPlateStandardRequireBomStockDetail"> aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateStandardRequireErrorMapper.xml
@@ -103,6 +103,8 @@ </foreach> </delete> <update id="deleteLastPatch" parameterType="String"> update aps_plate_standard_require_error set del_flag = '1' where batch_number = #{batchNumber} update aps_plate_standard_require_error set del_flag = '1' where del_flag = '0' and batch_number != #{batchNumber} </update> </mapper> aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateStandardRequireMapper.xml
@@ -226,6 +226,6 @@ </foreach> </insert> <update id="deleteLastPatch" parameterType="String"> update aps_plate_standard_require set del_flag = '1' where batch_number = #{batchNumber} update aps_plate_standard_require set del_flag = '1' where del_flag = '0' and batch_number != #{batchNumber} </update> </mapper>