OverrideHandleServiceImpl.java 10.7 KB
package com.huaheng.api.wcs.service.overrideHandle;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.wcs.domain.TaskFinishDomain;
import com.huaheng.api.wcs.service.warecellAllocation.WarecellAllocationService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.FilterConfigDetail.domain.FilterConfigDetail;
import com.huaheng.pc.config.FilterConfigDetail.service.FilterConfigDetailService;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.config.locationType.domain.LocationType;
import com.huaheng.pc.config.locationType.service.LocationTypeService;
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiving.service.ReceivingService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class OverrideHandleServiceImpl implements OverrideHandleService {


    @Autowired
    private TaskHeaderService taskHeaderService;
    @Autowired
    private TaskDetailService taskDetailService;
    @Autowired
    private LocationService locationService;
    @Autowired
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Autowired
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private WarecellAllocationService warecellAllocationService;
    @Resource
    private FilterConfigDetailService filterConfigDetailService;
    @Resource
    private LocationTypeService locationTypeService;
    @Resource
    private ReceivingService receivingService;
    @Resource
    private ContainerService containerService;
    /**
     * 重入处理
     * 1、判断非空字段
     * 2、根据任务号查找任务
     * 3、修改任务目的库位,修改入库组盘的库位,修改库位状态
     */

    @Override
    @Transactional
    public AjaxResult OverrideHandle(TaskFinishDomain taskFinishDomain) {

        String taskNo = taskFinishDomain.getTaskNo();

        //1、判断非空字段
        if(StringUtils.isEmpty(taskNo)){
            return AjaxResult.error("任务号为空");
        }

        //2、根据任务号查找任务
        TaskHeader taskHeader = taskHeaderService.getById(taskNo);
        if(taskHeader == null){
            return AjaxResult.error("任务号错误,没有找到该任务");
        }

        int status = taskHeader.getStatus();
        if(status == QuantityConstant.TASK_STATUS_COMPLETED){
            return AjaxResult.error("任务已完成");
        }

        //3、修改任务目的库位,修改入库组盘的库位,修改库位状态
        //修改原来目的库位的状态
        LambdaQueryWrapper<Location> locationLam = Wrappers.lambdaQuery();
        locationLam.eq(Location::getCode,taskHeader.getToLocation())
                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
        Location location = locationService.getOne(locationLam);
        if(location == null) {
            return AjaxResult.error("此任务的原目的库位在系统中不存在");
        }
        location.setStatus(QuantityConstant.STATUS_LOCATION_EMPTY);
        location.setContainerCode("");
        Boolean flag = locationService.updateById(location);
        if(flag == false){
            return AjaxResult.error("修改此任务的原目的库位错误");
        }


        /**
         *  查看新库位有两种情况
         *  1、重入的库位由wcs提供
         *  2、重入的库位由wms提供
         */

        Location newlocation = new Location();
        String newLocationCode = null;
        String redirectionLocation = taskFinishDomain.getRedirectionLocationCode();
        //重入的库位由wcs提供
        if(!"0".equals(redirectionLocation)) {
            LambdaQueryWrapper<Location> locationLa = Wrappers.lambdaQuery();
            locationLa.eq(Location::getCode, redirectionLocation)
                    .eq(Location::getStatus,QuantityConstant.STATUS_LOCATION_EMPTY)
                    .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
            newlocation = locationService.getOne(locationLa);
            if (newlocation == null) {
                throw new ServiceException("新目的库位在系统中不存在或非空闲");
            }
            if(StringUtils.isNotEmpty(newlocation.getContainerCode())){
                throw new ServiceException("新目的库位在系统中已经有容器");
            }
        }else {
            //重入的库位由wms提供
            //查询任务明细
            LambdaQueryWrapper<TaskDetail> taskDetailLambda = Wrappers.lambdaQuery();
            taskDetailLambda.eq(TaskDetail::getTaskId, taskFinishDomain.getTaskNo());
            List<TaskDetail> taskDetailList = taskDetailService.list(taskDetailLambda);
            String locatingRule = warecellAllocationService.taskPositioning();
            String[] locatingRules = locatingRule.split("cut");
            LambdaQueryWrapper<Location> locationLambda = Wrappers.lambdaQuery();
            locationLambda.last(locatingRules[0]);
            locationLambda.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
            List<Location> locationList = locationService.list(locationLambda);
            List<Location> removeLocaationList = new ArrayList<>();
            for(Location location1 : locationList) {
                if (taskHeaderService.getUncompleteTaskInNear(location1) > 0) {
                    removeLocaationList.add(location1);
                } else {
                    break;
                }
            }
            locationList.removeAll(removeLocaationList);
            if (locationList == null || locationList.size() == 0) {
                locationLambda.last(locatingRules[1]);
                locationList = locationService.list(locationLambda);
                removeLocaationList = new ArrayList<>();
                for(Location location1 : locationList) {
                    if (taskHeaderService.getUncompleteTaskInNear(location1) > 0) {
                        removeLocaationList.add(location1);
                    } else {
                        break;
                    }
                }
                locationList.removeAll(removeLocaationList);
            }

            LambdaQueryWrapper<LocationType> lambdaQueryWrapper2 = Wrappers.lambdaQuery();
            List<LocationType> locationTypeList = locationTypeService.list(lambdaQueryWrapper2);
            //根据定位规则查询库位编码
            QueryWrapper<Location> locationLambdaQueryWrapper = new QueryWrapper<>();
            locationLambdaQueryWrapper.eq("1", 1).last(locatingRules[0]);
            newlocation = locationService.getOne(locationLambdaQueryWrapper);
            Container container = containerService.getContainerByCode(taskHeader.getContainerCode());
            String locationCode = receivingService.filter(locationList, locationTypeList, container);
            newLocationCode = locationCode;
            if (taskHeader.getInternalTaskType().equals(QuantityConstant.TASK_INTENERTYPE_RECEIPT)) {
                //查询入库组盘明细
                List<ReceiptContainerDetail> receiptContainerDetailList = new ArrayList<>();
                for (TaskDetail taskDetail : taskDetailList) {
                    receiptContainerDetailList.add(receiptContainerDetailService.getById(taskDetail.getAllocationId()));
                }
                ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getById(receiptContainerDetailList.get(0).getReceiptContainerId());
                LambdaUpdateWrapper<ReceiptContainerDetail> wrapper = Wrappers.lambdaUpdate();
                wrapper.set(ReceiptContainerDetail::getLocationCode, locationCode)
                        .in(ReceiptContainerDetail::getId, receiptContainerDetailList.stream().map(ReceiptContainerDetail::getId).collect(Collectors.toList()));
                receiptContainerDetailService.update(wrapper);
                receiptContainerHeader.setToLocation(locationCode);
                receiptContainerHeaderService.updateById(receiptContainerHeader);
            }
        }

        //修改任务
        taskHeader.setToLocation(newLocationCode);
        taskHeader.setExceptionCode("重入处理");
        if(!taskHeaderService.updateById(taskHeader)){
            throw new ServiceException("修改此任务错误");
        }

        //修改子任务
        LambdaQueryWrapper<TaskDetail> taskDetailLam = Wrappers.lambdaQuery();
        taskDetailLam.eq(TaskDetail::getWarehouseCode,ShiroUtils.getWarehouseCode())
                .eq(TaskDetail::getTaskId,taskHeader.getId());
        List<TaskDetail> taskDetails = taskDetailService.list(taskDetailLam);
        List<TaskDetail> taskDetailList = new ArrayList<>();
        if(taskDetails != null && taskDetails.size()> 0){
            for(TaskDetail taskDetail : taskDetails){
                taskDetail.setToLocation(newLocationCode);
                taskDetailList.add(taskDetail);
            }
            if(!taskDetailService.updateBatchById(taskDetailList)){
                throw new ServiceException("修改此任务的明细错误");
            }
        }

        Map<String, String> map = new HashMap<>();
        map.put("RedirectionLocationCode", newLocationCode);
        map.put("taskNo", String.valueOf(taskHeader.getId()));
        return AjaxResult.success("重入处理成功").setData(map);
    }
}