TaskHeaderServiceImpl.java 8.32 KB
package com.huaheng.pc.task.taskHeader.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
import com.huaheng.pc.shipment.shipmentContainerDetail.service.ShipmentContainerDetailService;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.mapper.TaskHeaderMapper;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.transaction.annotation.Transactional;

@Service
public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHeader> implements TaskHeaderService{

    @Autowired
    private ShipmentContainerHeaderService shipmentContainerHeaderService;
    @Autowired
    private ShipmentContainerDetailService shipmentContainerDetailService;
    @Autowired
    private LocationService locationService;
    @Autowired
    private InventoryDetailService inventoryDetailService;
    @Autowired
    private TaskDetailService taskDetailService;

    /**
     * 生成出库任务
     * @param shipmentTaskCreateModel
     * @return
     */
    @Override
    @Transactional
    public AjaxResult createTaskFromShipmentContainers(ShipmentTaskCreateModel shipmentTaskCreateModel)  {
        Integer shipmentContainerHeaderId = shipmentTaskCreateModel.getShipmentContainerHeaderIds();
        //获取表头
        ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.getById(shipmentContainerHeaderId);
        if(shipmentContainerHeader == null){
            return AjaxResult.error("出库货箱" + shipmentContainerHeaderId + "未找到,操作中止");
        }
        if(shipmentContainerHeader.getStatus() > 9){
            return AjaxResult.error("出库货箱" + shipmentContainerHeader.getContainerCode() + "已经生成任务,请不要重复生成,操作中止");
        }
        //获取所有子货箱
        LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper= Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId,shipmentContainerHeader.getId());
        List<ShipmentContainerDetail> shipmentContainerDetails = shipmentContainerDetailService.list(lambdaQueryWrapper);
        if(shipmentContainerDetails==null||shipmentContainerDetails.size()==0){
            return AjaxResult.error("货箱" + shipmentContainerHeader.getContainerCode() + "没有子任务,操作中止");
        }
        //检测库位
        LambdaQueryWrapper<Location> locationLambdaQueryWrapper=Wrappers.lambdaQuery();
        locationLambdaQueryWrapper.eq(Location::getCode,shipmentContainerHeader.getLocationCode())
                .eq(Location::getWarehouseCode,ShiroUtils.getWarehouseCode())
                .eq(Location::getDeleted,false);
        Location location = locationService.getOne(locationLambdaQueryWrapper);
        if (location == null)   {
            return AjaxResult.error("库位禁用或不存在!");
        }
        //创建任务头
        TaskHeader task = new TaskHeader();
        //分拣出库
        task.setTaskType(400);
        task.setLocationCode(shipmentContainerHeader.getLocationCode());
        //判断是否整出任务,钱柜和AGV不能整出
        if(shipmentContainerHeader.getStatus().intValue() == 300){
            //表示整出优先
            //判断当前子货箱所有数量是否等于该托盘对应的所有库存的数量,
            //这里必须与库存的在库数量对比,后期可能存在一个配盘在执行任务,后一个配盘又在配这个的情况(这个时候不能整出)
            // 如果相等,则说明这个货箱包含了所有的数量,则可以整出,否则,创建拣选任务;
            //查询所有库存
            InventoryDetail inventoryCondition = new InventoryDetail();
            LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper=Wrappers.lambdaQuery();
            inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getLocationCode,shipmentContainerHeader.getLocationCode())
                    .eq(InventoryDetail::getWarehouseCode,ShiroUtils.getWarehouseCode());
            List<InventoryDetail> inventories = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
            BigDecimal inventoryTotal=new BigDecimal("0");
            for(InventoryDetail item : inventories){
                inventoryTotal = inventoryTotal.add(item.getQty());
            }
            BigDecimal containerTotal = new BigDecimal("0");
            for(ShipmentContainerDetail item: shipmentContainerDetails){
                containerTotal = containerTotal.add(item.getQty());
            }
            if(inventoryTotal.compareTo(containerTotal) == 0){
                task.setTaskType(300);//整盘出库
                task.setLocationCode("");
            }
        }
        task.setWarehouseCode(shipmentContainerHeader.getWarehouseCode());
        task.setCompanyCode(shipmentContainerHeader.getCompanyCode());
        task.setInternalTaskType("");
        task.setAssignedUser(ShiroUtils.getLoginName());
        task.setConfirmedBy(ShiroUtils.getLoginName());
        task.setStatus(1);
        task.setContainerCode(shipmentContainerHeader.getContainerCode());
        task.setCreatedBy(ShiroUtils.getLoginName());
        task.setCreated(new Date());
        task.setLastUpdatedBy(ShiroUtils.getLoginName());
        task.setLastUpdated(null);
        this.save(task);
        //遍历子货箱创建子任务
        for(ShipmentContainerDetail shipmentContainerDetail : shipmentContainerDetails){
            TaskDetail taskDetail = new TaskDetail();
            taskDetail.setTaskId(task.getId());
            taskDetail.setWarehouseCode(task.getWarehouseCode());
            taskDetail.setCompanyCode(task.getCompanyCode());
            taskDetail.setTaskType("s");
            taskDetail.setBillCode(shipmentContainerDetail.getShipmentCode());
            taskDetail.setBillId(shipmentContainerDetail.getShipmentId());
            taskDetail.setBillDetailId(shipmentContainerDetail.getShipmentDetailId());
            taskDetail.setMaterialCode(shipmentContainerDetail.getMaterialCode());
            taskDetail.setMaterialName(shipmentContainerDetail.getMaterialName());
            taskDetail.setMaterialSpec(shipmentContainerDetail.getMaterialSpec());
            taskDetail.setMaterialUnit(shipmentContainerDetail.getMaterialUnit());
            taskDetail.setFromInventoryId(shipmentContainerDetail.getInventoryId());
            taskDetail.setQty(shipmentContainerDetail.getQty());
            taskDetail.setContainerCode(task.getContainerCode());
            taskDetail.setFromLocation(task.getLocationCode());
            taskDetail.setToLocation(task.getLocationCode());
            taskDetail.setStatus(1);
            taskDetail.setTaskType("s");
            taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            taskDetail.setLastUpdated(null);
            taskDetailService.save(taskDetail);
        }
        //更新货位状态
        ShipmentContainerHeader record = new ShipmentContainerHeader();
        record.setId(shipmentContainerHeaderId);
        record.setStatus(10);
        record.setStatus(task.getTaskType());//实际出库类型
        shipmentContainerHeaderService.saveOrUpdate(record);
        return AjaxResult.success(task.getId());

    }
}