package com.aps.core.service.impl; import cn.hutool.core.util.IdUtil; 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.mapper.ApsPlateStandardRequireOrderEndDayMapper; import com.aps.core.service.ApsPlate.IApsPlateProcessShopStatService; 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.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 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 implements ApsPlanTaskService{ @Autowired ApsPlanTaskMapper mapper; @Autowired private IApsPlateStandardRequireService apsPlateStandardRequireService; @Resource IApsPlateStandardRequireBatchService requireBatchService; @Resource RedisLockUtils redisLockUtils; @Resource ApsPlateStandardRequireOrderEndDayMapper orderEndDayMapper; @Resource IApsPlateProcessShopStatService plateProcessShopStatService; @Override public Page pagingList(Page page ,ApsPlanTask task){ LambdaQueryWrapper queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.like( null!=task.getTaskType(), ApsPlanTask::getTaskType,task.getTaskType()); return mapper.selectPage(page, queryWrapper); } /** * 创建新生计划任务 */ @Override public void savePlanTask(String batchNum){ ApsPlanTask task = ApsPlanTask.builder().id(IdUtil.getSnowflakeNextId()) .batchNum(batchNum) .taskStatus(PLAN_TASK_STATUS.IN_PROCESS.getCode()) .taskType(PLAN_TASK_TYPE.PLATE_PLAN.getCode()) .createBy(SecurityUtils.getUsername()) .createTime(DateUtils.getNowDate()) .delFlag(0) .build(); baseMapper.insert(task); } /** * 根据批次号 更新状态 * */ @Override public void updateTaskStatus(String batchNum, PLAN_TASK_STATUS status){ LambdaQueryWrapper queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.like(ApsPlanTask::getBatchNum,batchNum); ApsPlanTask task = ApsPlanTask.builder() .taskStatus(status.getCode()) .updateBy(SecurityUtils.getUsername()) .updateTime(DateUtils.getNowDate()) .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 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("钣金工单计划任务正在执行中!!"); } String currentBatchNum = requireBatchService.getNewBatchNumber(); try { redisLockUtils.getLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_PLAN.getCode(), 15 * 60L); this.savePlanTask(currentBatchNum); //Thread.sleep(60*1000); apsPlateStandardRequireService.generatorPlan(currentBatchNum); /*清除已经存在的 工单计划完工时间*/ orderEndDayMapper.batchRemove(); 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()); } } @Override public AjaxResult generatorPlatePlanTable() { String plateOrderPlanKey = REDIS_LOCK_KEY.PLATE_SHOP_PLAN_TABLE.getKey(); boolean existsLock = redisLockUtils.existLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode()); if (existsLock) { return AjaxResult.warn("钣金计划大表计划任务正在执行中!"); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApsPlanTask::getTaskType, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode()); queryWrapper.eq(ApsPlanTask::getTaskStatus, PLAN_TASK_STATUS.IN_PROCESS.getCode()); boolean existsDbTask = mapper.exists(queryWrapper); if (existsDbTask) { return AjaxResult.warn("钣金计划大表任务正在执行中!!"); } String currentBatchNum = String.valueOf(IdUtil.getSnowflakeNextId()) ; try { redisLockUtils.getLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.getCode(), 15 * 60L); this.savePlanTask( currentBatchNum); Thread.sleep(60000); plateProcessShopStatService.saveShopStat(); this.updateTaskStatus(currentBatchNum, PLAN_TASK_STATUS.FINISHED); log.info("钣金计划大表任务执行完成!" + currentBatchNum); return success(); } catch (Exception e) { redisLockUtils.releaseLock(plateOrderPlanKey, PLAN_TASK_TYPE.PLATE_SHOP_PLAN_TABLE.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_SHOP_PLAN_TABLE.getCode()); } } }