aps-common/aps-common-redis/src/main/java/com/aps/common/redis/service/RedisLockUtils.java
@@ -26,6 +26,13 @@ /** * 夿æ¯å¦åå¨é * */ public boolean existLock(String key,String value){ return this.redisTemplate.opsForValue().get(key).equals(value); } /** * å é **/ public Boolean getLock(String key,String value,Long timeoutSeconds){ aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlanTaskController.java
@@ -1,13 +1,11 @@ package com.aps.core.controller.mainPlan; import com.aps.common.core.domain.R; import com.aps.common.core.web.controller.BaseController; import com.aps.common.core.web.page.PageDomain; import com.aps.common.core.web.page.TableDataInfo; import com.aps.common.core.web.page.TableSupport; import com.aps.common.security.annotation.RequiresPermissions; import com.aps.core.domain.ApsPlanTask; import com.aps.core.service.ApsPlanTaskService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -25,7 +23,7 @@ @Autowired private ApsPlanTaskService apsPlanTaskService; // @RequiresPermissions("planTask:list") @RequiresPermissions("planTask:list") @GetMapping("/list") public Page<ApsPlanTask> list(ApsPlanTask task){ PageDomain pageDomain = TableSupport.buildPageRequest(); aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlate/ApsPlateStandardRequireController.java
@@ -138,14 +138,11 @@ /** * çæé£é计å * */ @PostMapping("/generatorPlan") public AjaxResult generatorPlan() { String batchNum= requireBatchService.getNewBatchNumber(); planTaskService.savePlanTask(batchNum); apsPlateStandardRequireService.generatorPlan(batchNum); planTaskService.updateTaskStatus(batchNum, PLAN_TASK_STATUS.FINISHED); return success(); return planTaskService.generatorPlan(); } } aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlate/ApsPlateStandardRequireOrderEndDay.java
@@ -22,30 +22,6 @@ private Long id; /** * BomâOrderå ³ç³»ID */ @TableField(value = "bom_order_id") private Long bomOrderId; /** * éæ±ID */ @TableField(value = "require_id") private Long requireId; /** * éæ±è¿½æº¯ID */ @TableField(value = "require_track_id") private String requireTrackId; /** * æå· */ @TableField(value = "bom_line_code") private String bomLineCode; /** * 订åå· */ @TableField(value = "doc_no") @@ -54,6 +30,11 @@ /** * èªå®ä¹è®¡å宿æ¶é´ */ @TableField(value = "plan_start_day") private Date planStartDay; /** * èªå®ä¹è®¡å宿æ¶é´ */ @TableField(value = "plan_end_day") private Date planEndDay; aps-modules/aps-core/src/main/java/com/aps/core/enums/REDIS_LOCK_KEY.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.aps.core.enums; public enum REDIS_LOCK_KEY { /*é£éå·¥å计åä»»å¡*/ PLATE_ORDER_PLAN("PLAN_TASK:PLATE_ORDER_PLAN"); private String key; public String getKey() { return key; } REDIS_LOCK_KEY(String key) { this.key = key; } } aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsPlateStandardRequireOrderEndDayMapper.java
@@ -1,7 +1,11 @@ package com.aps.core.mapper; import com.aps.core.domain.ApsPlate.ApsPlateOrderPlanDate; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireOrderEndDay; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * @author zhl @@ -9,8 +13,13 @@ * @createDate 2025-05-19 10:20:50 * @Entity com.aps.core.domain.ApsPlate.ApsPlateStandardRequireOrderEndDay */ @Mapper public interface ApsPlateStandardRequireOrderEndDayMapper extends BaseMapper<ApsPlateStandardRequireOrderEndDay> { Integer batchInsert(List<Long> planIds,String createBy); Integer batchRemove(List<Long> planIds); } aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlanTaskService.java
@@ -1,5 +1,6 @@ package com.aps.core.service; import com.aps.common.core.web.domain.AjaxResult; import com.aps.core.domain.ApsPlanTask; import com.aps.core.enums.PLAN_TASK_STATUS; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -20,4 +21,6 @@ void savePlanTask(String batchNum); void updateTaskStatus(String batchNum, PLAN_TASK_STATUS status); AjaxResult generatorPlan(); } aps-modules/aps-core/src/main/java/com/aps/core/service/ApsPlateStandardRequireOrderEndDayService.java
@@ -3,6 +3,8 @@ import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireOrderEndDay; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * @author zhl * @description é对表ãaps_plate_standard_require_order_end_day(éæ±è®¡åå®ææ¥æè¡¨)ãçæ°æ®åºæä½Service @@ -10,4 +12,5 @@ */ public interface ApsPlateStandardRequireOrderEndDayService extends IService<ApsPlateStandardRequireOrderEndDay> { int saveBatch(List<Long> planIds); } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlanTaskServiceImpl.java
@@ -1,34 +1,52 @@ package com.aps.core.service.impl; import cn.hutool.core.util.IdUtil; import com.aps.common.core.domain.R; import com.aps.common.core.utils.DateUtils; import com.aps.common.core.web.domain.AjaxResult; import com.aps.common.redis.service.RedisLockUtils; import com.aps.common.security.utils.SecurityUtils; import com.aps.core.enums.PLAN_TASK_STATUS; import com.aps.core.enums.PLAN_TASK_TYPE; import com.aps.core.enums.REDIS_LOCK_KEY; import com.aps.core.service.ApsPlate.IApsPlateStandardRequireBatchService; import com.aps.core.service.ApsPlate.IApsPlateStandardRequireService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.aps.core.domain.ApsPlanTask; import com.aps.core.service.ApsPlanTaskService; import com.aps.core.mapper.ApsPlanTaskMapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import static com.aps.common.core.web.domain.AjaxResult.success; import static com.aps.core.enums.REDIS_LOCK_KEY.PLATE_ORDER_PLAN; /** * @author zhl * @description é对表ãaps_plan_task(计åçææ¥å¿è¡¨)ãçæ°æ®åºæä½Serviceå®ç° * @createDate 2025-05-16 14:41:49 */ @Slf4j @Service public class ApsPlanTaskServiceImpl extends ServiceImpl<ApsPlanTaskMapper, ApsPlanTask> implements ApsPlanTaskService{ @Autowired ApsPlanTaskMapper mapper; @Autowired private IApsPlateStandardRequireService apsPlateStandardRequireService; @Resource IApsPlateStandardRequireBatchService requireBatchService; @Resource RedisLockUtils redisLockUtils; @Override public Page<ApsPlanTask> pagingList(Page<ApsPlanTask> page ,ApsPlanTask task){ LambdaQueryWrapper<ApsPlanTask> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.like( !task.getTaskType().isEmpty(), ApsPlanTask::getTaskType,task.getTaskType()); @@ -65,6 +83,39 @@ .build(); baseMapper.update(task,queryWrapper); } @Override public AjaxResult generatorPlan() { String plateOrderPlanKey = PLATE_ORDER_PLAN.getKey(); boolean existsLock = redisLockUtils.existLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_PLAN.getCode()); if (existsLock){ return AjaxResult.warn("é£éå·¥å计å任塿£å¨æ§è¡ä¸!"); } LambdaQueryWrapper<ApsPlanTask> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(ApsPlanTask::getTaskType,PLAN_TASK_TYPE.PLATE_PLAN.getCode()); queryWrapper.eq(ApsPlanTask::getTaskStatus,PLAN_TASK_STATUS.IN_PROCESS.getCode()); boolean existsDbTask = mapper.exists(queryWrapper); if (existsDbTask){ return AjaxResult.warn("é£éå·¥å计å任塿£å¨æ§è¡ä¸!!"); } 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); log.info("计å任塿§è¡å®æ!"+batchNum); return success(); }catch (Exception e){ redisLockUtils.releaseLock(plateOrderPlanKey,PLAN_TASK_TYPE.PLATE_PLAN.getCode()); log.error("计å任塿§è¡å¤±è´¥!"+e.getMessage()); 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/ApsPlateOrderPlanManagerServiceImpl.java
@@ -11,6 +11,7 @@ import com.aps.core.service.ApsPlate.IApsPlateOrderPlanManagerService; import com.aps.core.service.ApsPlate.IApsPlateStandardRequireBatchService; import com.aps.core.service.ApsPlate.IApsPlateStandardRequireService; import com.aps.core.service.ApsPlateStandardRequireOrderEndDayService; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -35,6 +36,9 @@ IApsPlateStandardRequireBatchService requireBatchService; @Resource ApsPlanTaskService planTaskService; @Resource ApsPlateStandardRequireOrderEndDayService orderEndDayService; /** * æ¥è¯¢é£éå·¥å计å管ç * @@ -69,15 +73,18 @@ apsPlateOrderPlanDate.setUpdateBy(SecurityUtils.getUsername()); apsPlateOrderPlanManagerMapper.updatePlanDateByCustom(apsPlateOrderPlanDate); } else { List<ApsPlateOrderPlanRequireDate> planRequireDates = apsPlateOrderPlanManagerMapper.selectPlanRequireIds(apsPlateOrderPlanDate.getPlanIds()); List<Long> planIds = apsPlateOrderPlanDate.getPlanIds(); orderEndDayService.saveBatch(planIds); /*List<ApsPlateOrderPlanRequireDate> planRequireDates = apsPlateOrderPlanManagerMapper.selectPlanRequireIds(planIds); planRequireDates.forEach(planRequireDate -> { planRequireDate.setUpdateBy(SecurityUtils.getUsername()); apsPlateOrderPlanManagerMapper.updatePlanDateByBatch(planRequireDate); }); });*/ } String batchNum= requireBatchService.getNewBatchNumber(); /* String batchNum= requireBatchService.getNewBatchNumber(); planTaskService.savePlanTask(batchNum); apsPlateStandardRequireService.generatorPlan(batchNum); planTaskService.updateTaskStatus(batchNum, PLAN_TASK_STATUS.FINISHED); planTaskService.updateTaskStatus(batchNum, PLAN_TASK_STATUS.FINISHED);*/ } } aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateStandardRequireOrderEndDayServiceImpl.java
@@ -1,10 +1,15 @@ package com.aps.core.service.impl.ApsPlate; import com.aps.common.security.utils.SecurityUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireOrderEndDay; import com.aps.core.service.ApsPlateStandardRequireOrderEndDayService; import com.aps.core.mapper.ApsPlateStandardRequireOrderEndDayMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * @author zhl @@ -15,6 +20,17 @@ public class ApsPlateStandardRequireOrderEndDayServiceImpl extends ServiceImpl<ApsPlateStandardRequireOrderEndDayMapper, ApsPlateStandardRequireOrderEndDay> implements ApsPlateStandardRequireOrderEndDayService{ @Resource ApsPlateStandardRequireOrderEndDayMapper mapper; @Transactional @Override public int saveBatch(List<Long> planIds) { mapper.batchRemove(planIds); return mapper.batchInsert(planIds, SecurityUtils.getUsername()); } } aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateProcessStatMapper.xml
@@ -143,10 +143,13 @@ (rt.standard_time * pl.production_quantity) as process_total_time, rt.process_plan_start_day, rt.process_plan_end_day, pl.plan_end_day as order_plan_end_day pl.plan_end_day, COALESCE(rd.plan_end_day,pl.plan_end_day) as order_plan_end_day from aps_plate_plan as pl left join aps_process_route as rt on pl.document_number = rt.work_order_no where pl.document_number is not null and rt.work_order_no is not null and pl.plan_end_day is not null left join aps_plate_standard_require_order_end_day as rd on pl.document_number = rd.doc_no and rd.del_flag =0 where pl.document_number is not null and rt.work_order_no is not null and (pl.plan_end_day is not null or rd.plan_end_day is not null ) order by rt.work_order_no asc, rt.process_number desc </select> <update id="removeOtherStat" parameterType="String"> aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateStandardRequireOrderEndDayMapper.xml
@@ -6,11 +6,9 @@ <resultMap id="BaseResultMap" type="com.aps.core.domain.ApsPlate.ApsPlateStandardRequireOrderEndDay"> <id property="id" column="id" /> <result property="bomOrderId" column="bom_order_id" /> <result property="requireId" column="require_id" /> <result property="requireTrackId" column="require_track_id" /> <result property="bomLineCode" column="bom_line_code" /> <result property="docNo" column="doc_no" /> <result property="planStartDay" column="plan_end_day" /> <result property="planEndDay" column="plan_end_day" /> <result property="orgCode" column="org_code" /> <result property="batchNumber" column="batch_number" /> @@ -26,4 +24,45 @@ plan_end_day,org_code,batch_number,del_flag,create_by, create_time,update_by,update_time </sql> <sql id="select_plan_time"> with a as ( select snow_next_id() as id, plan.id as plan_id, detail.doc_no, min(require.start_date) as start_date, min(require.complete_date) as end_date, detail.org_code, detail.batch_number from aps_plate_standard_require_bom_order_detail detail left join aps_plate_standard_require require on detail.require_id = require.id and require.del_flag = '0' left join aps_plate_plan plan on detail.doc_no = plan.document_number and plan.del_flag = '0' where detail.del_flag = '0' and require.del_flag = '0' and detail.del_flag='0' and plan.id in <foreach collection="planIds" item="planId" open="(" separator="," close=")"> #{planId} </foreach> group by plan.id ,detail.doc_no,detail.org_code,detail.batch_number ) </sql> <insert id="batchInsert" parameterType="Long"> <include refid="select_plan_time" /> insert into aps_plate_standard_require_order_end_day (id,plan_id, doc_no, plan_start_day, plan_end_day, org_code, batch_number , del_flag, create_time, create_by ) select a.id, a.plan_id, a.doc_no, a.start_date, a.end_date, a.org_code, a.batch_number, 0, now(), #{createBy} from a </insert> <update id="batchRemove" parameterType="Long"> update aps_plate_standard_require_order_end_day set del_flag=1 where plan_id in <foreach collection="planIds" item="planId" open="(" separator="," close=")"> #{planId} </foreach> </update> </mapper>