ZarshService.java 16.1 KB
package com.huaheng.pc.sap.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.bean.BeanUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.address.service.AddressService;
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.receiptType.domain.ReceiptType;
import com.huaheng.pc.monitor.apilog.domain.ApiLog;
import com.huaheng.pc.monitor.apilog.service.IApiLogService;
import com.huaheng.pc.monitor.apilog.service.impl.ApiLogServiceImpl;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.sap.domain.Zarsh;
import com.huaheng.pc.sap.domain.Zarsi;
import com.huaheng.pc.sap.mapper.ZarshMapper;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
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.Date;
import java.util.List;
import java.util.UUID;

/**
 * Created by Enzo Cotter on 2022/5/11.
 * @author zhouhong
 */
@Service
public class ZarshService extends ServiceImpl<ZarshMapper, Zarsh> {
    @Resource
    private ZarsiService zarsiService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ShipmentContainerHeaderService shipmentContainerHeaderService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private ContainerService containerService;
    @Resource
    private LocationService locationService;
    @Resource
    private IApiLogService apiLogService;
    @Autowired
    private AddressService addressService;

    public boolean saveZarsh(Zarsh zarsh){
        Date date=new Date();
        String uniqueId=UUID.randomUUID().toString();
        zarsh.setUniqueId(uniqueId);
        zarsh.setCreateTime(date);
        zarsh.setCreateBy("wms");
        zarsh.setUpdateBy("wms");
        zarsh.setUpdateTime(date);
        return this.save(zarsh);
    }
    public boolean editZarsh(Zarsh zarsh){
        Date date=new Date();
        zarsh.setUpdateBy("wms");
        zarsh.setUpdateTime(date);
        return this.updateById(zarsh);
    }

    /**
     * 生成任务保存同步表
     * @param task
     * @param taskDetailList
     * @param container
     */
    public void saveZarshByTask(TaskHeader task, List<TaskDetail> taskDetailList, Container container){
        Zarsh zarsh=saveZarshTask(task,taskDetailList,container);
        //保存子表
        saveZarsiTask(taskDetailList,zarsh);
    }

    public Zarsh saveZarshTask(TaskHeader task, List<TaskDetail> taskDetailList, Container container){
        Zarsh zarsh=new Zarsh();
        zarsh.setMandt("2");
        zarsh.setWerks("3");
        zarsh.setDrunId(task.getContainerCode());
        if(container.getContainerType().equals("D1")||
                container.getContainerType().equals("E1")){
            //片状托架
            zarsh.setPlType(1);
        }else if(container.getContainerType().equals("D2")||
                container.getContainerType().equals("E2")||
                container.getContainerType().equals("D3")||
                container.getContainerType().equals("E3")){
            //卷状托架
            zarsh.setPlType(0);
        }else{
            //特殊托架
            zarsh.setPlType(2);
        }

        if(taskDetailList!=null&&taskDetailList.size()>0){
            //有料
            zarsh.setInKind(1);
        }else{
            //无料
            zarsh.setInKind(2);
        }
        zarsh.setInitDate(new Date());
        zarsh.setCFlag("R");
        int taskType=task.getTaskType();
        if (taskType == QuantityConstant.TASK_TYPE_WHOLERECEIPT ||
                taskType == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT||
                taskType == QuantityConstant.TASK_TYPE_EMPTYRECEIPT||
                taskType == QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT) {
           //入库
            zarsh.setMFlag(2);
            zarsh.setFromPos(task.getPort());
            if(StringUtils.isNotEmpty(task.getFromLocation())){
                zarsh.setLocation(task.getFromLocation());
            }else{
                zarsh.setLocation(task.getToLocation());
            }
        }else{
            //出库
            zarsh.setMFlag(3);
            zarsh.setToPos(task.getPort());
            if(StringUtils.isNotEmpty(task.getFromLocation())){
                zarsh.setLocation(task.getFromLocation());
            }else{
                zarsh.setLocation(task.getToLocation());
            }
        }
        zarsh.setTaskId(task.getId());
        if(saveZarsh(zarsh)){
            return zarsh;
        }else{
            throw new ServiceException("zarsh保存失败");
        }
    }

    public void saveZarsiTask(List<TaskDetail> taskDetailList,Zarsh zarsh){
        List<Zarsi> zarsilist=new ArrayList<>();
        for(TaskDetail taskDetail:taskDetailList){
            Zarsi zarsi=new Zarsi();
            BeanUtils.copyBeanProp(zarsi, zarsh);
            zarsi.setId(null);
            zarsi.setMantr(taskDetail.getMaterialCode());
            zarsi.setVerme(taskDetail.getQty());
            //批号
            zarsi.setCharg(taskDetail.getLot());
            //项目号(板台上由多个位置得具体位置)
            zarsi.setPosnr(taskDetail.getContainerDetailNumber());
            zarsilist.add(zarsi);
        }
        if ( zarsiService.saveBatch(zarsilist)){
        } else {
            throw new ServiceException("zarsi保存失败");
        }
    }

    /**
     * TaskHeader task 修改状态
     * @param task
     */
    public void updateZarshByTaskComplete(TaskHeader task,String cFlag){
        int taskType=task.getTaskType();
        String location=null;
        LambdaQueryWrapper<Zarsh> lambdaQueryWrapper = Wrappers.lambdaQuery();
        if (taskType == QuantityConstant.TASK_TYPE_WHOLERECEIPT ||
                taskType == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT||
                taskType == QuantityConstant.TASK_TYPE_EMPTYRECEIPT||
                taskType == QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT) {
            //入库
            location=task.getToLocation();
            lambdaQueryWrapper.eq(Zarsh::getMFlag, 2);
        }else{
            location=task.getFromLocation();
            lambdaQueryWrapper.eq(Zarsh::getMFlag, 3);
        }

        /*lambdaQueryWrapper.eq(Zarsh::getDrunId, task.getContainerCode())
                .eq(Zarsh::getLocation,location);*/
        lambdaQueryWrapper.eq(Zarsh::getTaskId,task.getId());
        lambdaQueryWrapper.orderByDesc(Zarsh::getCFlag);
                //.eq(Zarsh::getCFlag, "R");
        List<Zarsh> list = this.list(lambdaQueryWrapper);
        if(null!=list&&list.size()>0){
            Zarsh zarsh=list.get(0);
            zarsh.setCFlag(cFlag);
            zarsh.setLocation(task.getToLocation());
            zarsh.setFromPos(task.getPort());
            zarsh.setToPos(task.getPort());
            zarsh.setTaskId(task.getId());
            zarsh.setUpdateBy("wms");
            zarsh.setUpdateTime(new Date());
            this.updateById(zarsh);
        }else{
            //throw new ServiceException("未找到Zarsh对象");
        }
    }

    /**
     * RyTask扫描同步表保存逻辑
     * @param zarsh
     */
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult saveDataBySap(Zarsh zarsh){
        //用主表UniqueId查找子表zarsi信息
        LambdaQueryWrapper<Zarsi> zarsilambdaQueryWrapper = Wrappers.lambdaQuery();
        zarsilambdaQueryWrapper.eq(Zarsi::getUniqueId, zarsh.getUniqueId());
        List<Zarsi> zarsiList=zarsiService.list(zarsilambdaQueryWrapper);
        //检测数据为空情况
        checkDataBySap(zarsh,zarsiList);
        //判断出库、入库,然后在判断是否空托盘出入库
        TaskHeader taskHeader=null;
        switch (zarsh.getMFlag()) {
            //整盘入库、补充入库
            case 2:
            case 8:
                //入库
                taskHeader=receiptBySap(zarsiList,zarsh);
                break;
            case 1:
            case 3:
                //出库
                taskHeader=shipmentBySap(zarsiList,zarsh);
                break;
            default:
                throw new ServiceException("MFlag不支持的业务类型");
        }
        //修改同步表C_FLAG命令状态
        this.updateZarshByTaskComplete(taskHeader,"R");
        return AjaxResult.success("",taskHeader);
    }
    //入库
    public TaskHeader receiptBySap(List<Zarsi> zarsiList,Zarsh zarsh){
        TaskHeader taskHeader=null;
        //空托盘入库
        if(zarsiList==null||zarsiList.size()==0){
            //检测空容器状态
            checkEmptyContainerBySap(zarsh.getDrunId(),zarsh.getLocation());
            //创建任务表数据
            AjaxResult ajaxResult_taskheader=taskHeaderService.saveTaskBySap(null,null,zarsh,zarsiList,true);
            if (ajaxResult_taskheader != null && ajaxResult_taskheader.hasErr()) {
                throw new ServiceException(ajaxResult_taskheader.getMsg());
            }
            taskHeader=(TaskHeader) ajaxResult_taskheader.getData();
            return taskHeader;
        }
        //保存入库信息
        ReceiptHeader receiptHeader=null;
        AjaxResult ajaxResult_receiptheader=receiptHeaderService.saveReceiptBySap(zarsh,zarsiList);
        if (ajaxResult_receiptheader != null && ajaxResult_receiptheader.hasErr()) {
            throw new ServiceException(ajaxResult_receiptheader.getMsg());
        }
        receiptHeader=(ReceiptHeader)ajaxResult_receiptheader.getData();
        //保存组盘信息
        ReceiptContainerHeader receiptContainerHeader=null;
        AjaxResult ajaxResult_receiptcontainerH=receiptContainerHeaderService.saveReceiptContainerBySap(receiptHeader,zarsh,zarsiList);
        if (ajaxResult_receiptcontainerH != null && ajaxResult_receiptcontainerH.hasErr()) {
            throw new ServiceException(ajaxResult_receiptcontainerH.getMsg());
        }
        receiptContainerHeader=(ReceiptContainerHeader)ajaxResult_receiptcontainerH.getData();
        //创建任务表数据
        AjaxResult ajaxResult_taskheader=taskHeaderService.saveTaskBySap(receiptContainerHeader,null,zarsh,zarsiList,false);
        if (ajaxResult_taskheader != null && ajaxResult_taskheader.hasErr()) {
            throw new ServiceException(ajaxResult_taskheader.getMsg());
        }
        taskHeader=(TaskHeader) ajaxResult_taskheader.getData();
        return taskHeader;
    }
    //出库
    public TaskHeader shipmentBySap(List<Zarsi> zarsiList,Zarsh zarsh){
        TaskHeader taskHeader=null;
        //空托盘出库
        if(zarsiList==null||zarsiList.size()==0){
            //创建任务表数据
            checkEmptyContainerBySap(zarsh.getDrunId(),zarsh.getLocation());
            AjaxResult ajaxResult_taskheader=taskHeaderService.saveTaskBySap(null,null,zarsh,zarsiList,true);
            if (ajaxResult_taskheader != null && ajaxResult_taskheader.hasErr()) {
                throw new ServiceException(ajaxResult_taskheader.getMsg());
            }
            taskHeader=(TaskHeader) ajaxResult_taskheader.getData();
            return taskHeader;
        }
        //保存出库信息
        ShipmentHeader shipmentHeader=null;
        AjaxResult ajaxResult=shipmentHeaderService.saveShipmentBySap(zarsh, zarsiList);
        if (ajaxResult != null && ajaxResult.hasErr()) {
            throw new ServiceException(ajaxResult.getMsg());
        }
        shipmentHeader=(ShipmentHeader) ajaxResult.getData();
        //保存组盘信息
        ShipmentContainerHeader shipmentContainerHeader=null;
        AjaxResult ajaxResult_shipCH=shipmentContainerHeaderService.saveShipmentContainerBySap(shipmentHeader,zarsh,zarsiList);
        if (ajaxResult_shipCH != null && ajaxResult_shipCH.hasErr()) {
            throw new ServiceException(ajaxResult_shipCH.getMsg());
        }
        shipmentContainerHeader=(ShipmentContainerHeader) ajaxResult_shipCH.getData();
        //创建任务表数据
        AjaxResult ajaxResult_taskheader=taskHeaderService.saveTaskBySap(null,shipmentContainerHeader,zarsh,zarsiList,false);
        if (ajaxResult_taskheader != null && ajaxResult_taskheader.hasErr()) {
            throw new ServiceException(ajaxResult_taskheader.getMsg());
        }
        taskHeader=(TaskHeader) ajaxResult_taskheader.getData();
        return taskHeader;
    }

    //定时任务扫描时,检查数据是否合规,必填字段是否都有,保存进zarsh表
    public void checkDataBySap(Zarsh zarsh,List<Zarsi> zarsiList){
        if(StringUtils.isEmpty(zarsh.getCFlag())||
                StringUtils.isEmpty(zarsh.getDrunId())||
                StringUtils.isEmpty(zarsh.getLocation())){
            throw new ServiceException("数据id:"+zarsh.getId()+",命令状态,容器号,库位不能为空");
        }
        for (Zarsi zarsi:zarsiList){
            if(StringUtils.isEmpty(zarsi.getMantr())||
                    StringUtils.isNull(zarsi.getVerme())){
                throw new ServiceException("数据id:"+zarsi.getId()+",物料、库存不能为空");
            }
        }
    }
    //空托盘入库出库检测容器和库位是否空闲
    public void checkEmptyContainerBySap(String containerCode,String locationCode){
        Container container = containerService.getContainerByCode(containerCode,ShiroUtils.getWarehouseCode());
        if(StringUtils.isNull(container)) {
            throw new ServiceException("容器不存在");
        }
        if (StringUtils.isNotEmpty(container.getLocationCode()))  {
            throw new ServiceException("容器已在库位" + container.getLocationCode() + "上");
        }
        Location location = locationService.getLocationByCode(locationCode,ShiroUtils.getWarehouseCode());
        if (StringUtils.isNull(location)) {
            throw new ServiceException("目标库位不存在");
        }
        if (StringUtils.isNotEmpty(location.getContainerCode())) {
            throw new ServiceException(locationCode+"上已存在容器"+location.getContainerCode());
        }
        if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(location.getStatus())) {
            throw new ServiceException("目标库位非空闲");
        }
    }


    public void saveApiLog(String url,String requestBody,String responseBody){
        ApiLog apiLog = new ApiLog();
        apiLog.setApiName("审核回传ERP");
        apiLog.setApiMethod("POST");
        apiLog.setRequestFrom("WMS");
        apiLog.setResponseBy("ERP");
        apiLog.setUrl(url);
        apiLog.setRequestTime(new Date());
        apiLog.setResponseTime(new Date());
        apiLog.setRequestBody(requestBody);
        apiLog.setResponseBody(responseBody);
        apiLogService.save(apiLog);
    }
}