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.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<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());
|
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<ApsPlanTask> 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<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());
|
}
|
}
|
|
}
|