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<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() 
 | 
                .select(Task::getId) 
 | 
                .eq(Task::getTaskStatus, TaskStsType.GENERATE_OUT.id) 
 | 
                .eq(Task::getTaskType, TaskType.TASK_TYPE_CHECK_OUT.type)); 
 | 
        if (tasks.isEmpty()) { 
 | 
            return; 
 | 
        } 
 | 
        List<CheckDiffItem> list = checkDiffItemService 
 | 
                .list(new LambdaQueryWrapper<CheckDiffItem>() 
 | 
                        .select(CheckDiffItem::getTaskItemId)); 
 | 
        Set<Long> taskIds = tasks.stream().map(Task::getId).collect(Collectors.toSet()); 
 | 
        List<Long> itemIds = list.stream().map(CheckDiffItem::getTaskItemId).collect(Collectors.toList()); 
 | 
        List<TaskItem> taskItems = taskItemService 
 | 
                .list(new LambdaQueryWrapper<TaskItem>() 
 | 
                        .in(TaskItem::getTaskId, taskIds) 
 | 
                        .notIn(!itemIds.isEmpty(), TaskItem::getId, itemIds)); 
 | 
        if (taskItems.isEmpty()) { 
 | 
            return; 
 | 
        } 
 | 
        Long loginUserId = SystemAuthUtils.getLoginUserId(); 
 | 
        Map<Long, List<TaskItem>> 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<CheckDiff>().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<TaskItem> items = taskMps.get(orderId); 
 | 
            List<CheckDiffItem> 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<Loc>() 
 | 
                            .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("盘点差异单保存失败!!"); 
 | 
            } 
 | 
        }); 
 | 
    } 
 | 
} 
 |