package com.vincent.rsf.server.manager.schedules; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.manager.service.impl.LocServiceImpl; import com.vincent.rsf.server.system.utils.SystemAuthUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * @author Ryan * @version 1.0 * @date 2025/7/18 * @description: 盘点单任务档 */ @Component public class CheckOrderSchedules { @Autowired private TaskService taskService; @Autowired private TaskItemService taskItemService; @Autowired private CheckDiffService checkDiffService; @Autowired private CheckDiffItemService checkDiffItemService; @Autowired private CheckOrderService checkOrderService; @Autowired private CheckOrderItemService checkOrderItemService; @Autowired private LocServiceImpl locService; /** * @author Ryan * @date 2025/7/18 * @description: 自动获取已生成盘点任务的盘点列表 * @version 1.0 */ @Scheduled(cron = "0/15 * * * * ?") @Transactional(rollbackFor = Exception.class) public void genReCheck() { List tasks = taskService.list(new LambdaQueryWrapper() .select(Task::getId) .eq(Task::getTaskStatus, TaskStsType.GENERATE_OUT.id) .eq(Task::getTaskType, TaskType.TASK_TYPE_CHECK_OUT.type)); if (tasks.isEmpty()) { return; } List list = checkDiffItemService .list(new LambdaQueryWrapper() .select(CheckDiffItem::getTaskItemId)); Set taskIds = tasks.stream().map(Task::getId).collect(Collectors.toSet()); List itemIds = list.stream().map(CheckDiffItem::getTaskItemId).collect(Collectors.toList()); List taskItems = taskItemService .list(new LambdaQueryWrapper() .in(TaskItem::getTaskId, taskIds) .notIn(!itemIds.isEmpty(), TaskItem::getId, itemIds)); if (taskItems.isEmpty()) { return; } Long loginUserId = SystemAuthUtils.getLoginUserId(); Map> taskMps = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getOrderId)); taskMps.keySet().forEach(orderId -> { WkOrder order = checkOrderService.getById(orderId); if (Objects.isNull(order)) { throw new CoolException("盘点单据不存在!!"); } CheckDiff checkDiff = checkDiffService.getOne(new LambdaQueryWrapper().eq(CheckDiff::getOrderId, orderId)); if (Objects.isNull(checkDiff)) { checkDiff = new CheckDiff(); checkDiff.setAnfme(order.getAnfme()) .setCheckType(order.getCheckType()) .setId(null) .setOrderCode(order.getCode()) .setExceStatus(CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_INIT.val) .setCreateBy(loginUserId) .setCreateTime(new Date()) .setUpdateBy(loginUserId) .setUpdateTime(new Date()) .setOrderId(order.getId()); if (!checkDiffService.saveOrUpdate(checkDiff)) { throw new CoolException("盘点差异单保存失败!!"); } } List items = taskMps.get(orderId); List diffItems = new ArrayList<>(); CheckDiff finalCheckDiff = checkDiff; for (TaskItem item : items) { Task task = taskService.getById(item.getTaskId()); if (Objects.isNull(task)) { throw new CoolException("数据错误:任务不存在!!"); } CheckDiffItem checkDiffItem = new CheckDiffItem(); BeanUtils.copyProperties(item, checkDiffItem); checkDiffItem.setCheckId(checkDiff.getId()) .setTaskItemId(item.getId()) .setTaskId(item.getTaskId()) .setCreateBy(loginUserId) .setCreateTime(new Date()) .setBarcode(task.getBarcode()) .setUpdateBy(loginUserId) .setUpdateTime(new Date()) .setOrderCode(checkDiff.getOrderCode()); diffItems.add(checkDiffItem); if (Objects.isNull(checkDiff.getAreaId())) { Loc loc = locService.getOne(new LambdaQueryWrapper() .eq(Loc::getCode, task.getOrgLoc()) .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_R.type)); if (Objects.isNull(loc)) { throw new CoolException("盘点库位不存在!!"); } finalCheckDiff.setAreaId(loc.getAreaId()).setAreaName(loc.getAreaId$()); } } checkDiff.setAreaId(finalCheckDiff.getAreaId()).setAreaName(finalCheckDiff.getAreaName()); if (!checkDiffService.updateById(checkDiff)) { throw new CoolException("库区信息修改失败!!"); } if (!checkDiffItemService.saveBatch(diffItems)) { throw new CoolException("盘点差异单保存失败!!"); } }); } }