ScPdaService.java 15.6 KB
package com.huaheng.api.tv.service;

import com.aliyun.oss.ServiceException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.huaheng.api.general.domain.ReceiptDomain;
import com.huaheng.api.general.domain.ShipmentDomain;
import com.huaheng.api.general.service.ReceiptApiService;
import com.huaheng.api.general.service.ShipmentApiService;
import com.huaheng.api.mes.domain.MesTask;
import com.huaheng.api.tv.domain.ScpPdaReceiptBean;
import com.huaheng.api.tv.domain.ScpPdaShipmentBean;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.DateUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.Wrappers;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
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.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction;
import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransactionReport;
import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerBatchService;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.report.excelReport.mapper.ExcelReportMapper;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentCombinationModel;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.ReceiptTaskService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class ScPdaService {

    @Autowired
    protected RedisTemplate<String, Object> redisTemplate;

    private static final Logger logger = LoggerFactory.getLogger(ScPdaService.class);


    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private ContainerService containerService;

    @Resource
    private InventoryDetailService inventoryDetailService;

    @Resource
    private ShipmentContainerHeaderService shipmentContainerHeaderService;

    @Resource
    private ReceiptApiService receiptApiService;
    @Resource
    private ShipmentApiService shipmentApiService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ReceiptContainerBatchService receiptContainerBatchService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptTaskService receiptTaskService;


    /**
     * 创建主任务,定时任务创建agv任务
     * @param shipmentBeans
     * @return
     */
    @Transactional
    public AjaxResult createReceiptTask(List<ScpPdaReceiptBean> scpPdaReceiptBeans){
        String containerCode = scpPdaReceiptBeans.get(0).getContainerCode();
        String port = scpPdaReceiptBeans.get(0).getPort();
        List<ReceiptDetail> receiptDetails=createReceiptSc(scpPdaReceiptBeans);
        List<ReceiptContainerView> lists=new ArrayList<>();
        for (ReceiptDetail receiptDetail : receiptDetails) {
            ReceiptContainerView receiptContainerView = new ReceiptContainerView();
            receiptContainerView.setReceiptCode(receiptDetail.getReceiptCode());
            if(StringUtils.isNull(receiptDetail.getTaskQty())){
                receiptDetail.setTaskQty(new BigDecimal(0));
            }
            receiptContainerView.setQty(receiptDetail.getQty().subtract(receiptDetail.getTaskQty()));
            receiptContainerView.setContainerCode(containerCode);
            receiptContainerView.setReceiptDetailId(receiptDetail.getId());
            receiptContainerView.setMocodeFlag(0);
            lists.add(receiptContainerView);
        }
        AjaxResult ajaxResult = receiptContainerBatchService.saveContainerList(lists);
        if (ajaxResult.hasErr()) {
            throw new ServiceException("pda入库任务:"+ajaxResult.getMsg());
        }
        //创建任务
        LambdaQueryWrapper<ReceiptContainerHeader> lambdaQueryWrapper= Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ReceiptContainerHeader::getContainerCode,containerCode);
        lambdaQueryWrapper.le(ReceiptContainerHeader::getStatus,10);
        List<ReceiptContainerHeader> receiptContainerHeaders=receiptContainerHeaderService.list(lambdaQueryWrapper);
        String ids2 = receiptContainerHeaders.get(0).getId().toString();
        Integer[] idArray = Convert.toIntArray(ids2);
        List<Integer> islist= Arrays.asList(idArray);
        AjaxResult ajaxResult1=receiptTaskService.createReceiptTask(islist);
        if (ajaxResult1.hasErr()) {
            throw new ServiceException("pda入库任务:"+ajaxResult1.getMsg());
        }
        List<String> taskIds=(List<String>) ajaxResult1.getData();
        // 将mes的任务号写入入库任务头表
        TaskHeader taskHeaderTemp = new TaskHeader();
        taskHeaderTemp.setPort(port);
        taskHeaderTemp.setId(Integer.valueOf(taskIds.get(0)));
        taskHeaderService.updateById(taskHeaderTemp);
        return AjaxResult.success("pda入库任务创建成功");
    }

    public List<ReceiptDetail> createReceiptSc(List<ScpPdaReceiptBean> scpPdaReceiptBeans) {
        // 创建入库单
        ReceiptDomain receiptDomain = new ReceiptDomain();
        ReceiptHeader receiptHeader = new ReceiptHeader();
        String companyCode = "schuahengweld";
        String erpcompanyCode = "SC";
        String warehouseCode = QuantityConstant.WAREHOUSE_SC;
        String receiptType="PPII";
        receiptHeader.setReceiptType(receiptType);
        receiptHeader.setWarehouseCode(warehouseCode);
        receiptHeader.setCompanyCode(companyCode);
        receiptHeader.setCreatedBy(ShiroUtils.getUser().getLoginName());
        receiptHeader.setErpCompanyCode(erpcompanyCode);
        receiptHeader.setUWarehouseCode("01");
        receiptHeader.setErpWarehouseCode("SC01");

        List<ReceiptDetail> receiptDetails = new ArrayList<>();
        for (ScpPdaReceiptBean scpPdaReceiptBean : scpPdaReceiptBeans){
            ReceiptDetail receiptDetail = new ReceiptDetail();
            String materialCode = scpPdaReceiptBean.getMaterialCode();
            if(materialCode==null){
                throw new ServiceException("物料编码不能为空");
            }
            if(scpPdaReceiptBean.getQty().compareTo(BigDecimal.ZERO)==0){
                throw new ServiceException("数量不能为空");
            }
            receiptDetail.setMaterialCode(materialCode);
            Material material=materialService.getMaterialByCode(materialCode);
            if(material==null){
                throw new ServiceException("找不到该物料"+materialCode);
            }
            receiptDetail.setMaterialName(material.getName());
            receiptDetail.setMaterialSpec(material.getSpec());
            receiptDetail.setMaterialUnit(material.getUnit());
            receiptDetail.setQty(scpPdaReceiptBean.getQty());
            receiptDetail.setWarehouseCode(receiptHeader.getWarehouseCode());
            receiptDetail.setUWarehouseCode(receiptHeader.getUWarehouseCode());
            receiptDetail.setErpWarehouseCode(receiptHeader.getErpWarehouseCode());
            receiptDetail.setInventorySts(QuantityConstant.DEFECTIVE);
            receiptDetails.add(receiptDetail);
        }
        receiptDomain.setReceiptHeader(receiptHeader);
        receiptDomain.setReceiptDetails(receiptDetails);
        AjaxResult result = receiptApiService.receipt(receiptDomain);
        if (result.hasErr()){
            throw new ServiceException(result.getMsg());
        }
        return receiptDetails;
    }

    /**
     * 创建主任务,定时任务创建agv任务
     * @param shipmentBeans
     * @return
     */
    @Transactional
    public AjaxResult createShipmentTaskSc(List<ScpPdaShipmentBean> shipmentBeans){
        String warehouseCode = QuantityConstant.WAREHOUSE_SC;
        String containerCode = shipmentBeans.get(0).getContainerCode();
        String port = shipmentBeans.get(0).getPort();
        Container container=containerService.getContainerByCode(containerCode,warehouseCode);
        if(container==null){
            throw new ServiceException("出库任务:找不到该容器"+containerCode);
        }
        if(container.getStatus()==QuantityConstant.STATUS_CONTAINER_LOCK){
            throw new ServiceException("出库任务;容器"+containerCode+"已锁,不允许出库");
        }
        List<ShipmentDetail> shipmentDetails=createShipmentSc(shipmentBeans);
        ShipmentContainerHeader shipmentContainerHeader=null;
        for (ShipmentDetail shipmentDetail : shipmentDetails){
            if(StringUtils.isEmpty(shipmentDetail.getUserDef1())){
                throw new ServiceException("出库任务;请选择要出库的物料");
            }
            InventoryDetail inventoryDetail=inventoryDetailService.getById(shipmentDetail.getUserDef1());
            if(inventoryDetail==null){
                throw new ServiceException("出库任务:找不到该库存"+shipmentDetail.getUserDef1());
            }
            if(inventoryDetail.getQty().compareTo(shipmentDetail.getQty())<0){
                throw new ServiceException("出库任务:物料"+inventoryDetail.getMaterialCode()+"库存不足");
            }
            List<ShipmentDetail> shipmentDetailList = new ArrayList<>();
            shipmentDetailList.add(shipmentDetail);
            ShipmentCombinationModel shipmentCombinationModel = new ShipmentCombinationModel();
            shipmentCombinationModel.setShipmentDetailId(shipmentDetail.getId());
            shipmentCombinationModel.setShipQty(shipmentDetail.getQty());
            shipmentCombinationModel.setInventoryDetailId(inventoryDetail.getId());
            shipmentContainerHeader = shipmentContainerHeaderService.combination(shipmentCombinationModel);
            if (shipmentContainerHeader == null){
                throw new ServiceException("出库任务;创建出库组盘失败!"+shipmentDetail.getMaterialCode());
            }
        }
        List<Integer> idList = Arrays.asList(Convert.toIntArray(shipmentContainerHeader.getId().toString()));
        AjaxResult result = shipmentContainerHeaderService.createTask(idList);
        if (result.hasErr()){
            throw new ServiceException(result.getMsg());
        }
        // 查询出库任务
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getAllocationHeadId, shipmentContainerHeader.getId());
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
        if (taskHeader == null){
            throw new RuntimeException("创建出库任务失败!");
        }
        TaskHeader taskHeaderTemp = new TaskHeader();
        taskHeaderTemp.setId(taskHeader.getId());
        taskHeaderTemp.setPort(port);
        taskHeaderService.updateById(taskHeaderTemp);
        return AjaxResult.success("出库任务创建成功");
    }

    public List<ShipmentDetail> createShipmentSc(List<ScpPdaShipmentBean> shipmentBeans) {
        // 创建出库单
        ShipmentDomain shipmentDomain = new ShipmentDomain();
        ShipmentHeader shipmentHeader = new ShipmentHeader();
        String companyCode = "schuahengweld";
        String erpcompanyCode = "SC";
        String warehouseCode = QuantityConstant.WAREHOUSE_SC;
        String receiptType="PO";
        shipmentHeader.setShipmentType(receiptType);
        shipmentHeader.setCompanyCode(companyCode);
        shipmentHeader.setWarehouseCode(warehouseCode);
        shipmentHeader.setCompanyCode(companyCode);
        shipmentHeader.setCreatedBy(ShiroUtils.getUser().getLoginName());
        shipmentHeader.setErpCompanyCode(erpcompanyCode);
        shipmentHeader.setUWarehouseCode("01");
        shipmentHeader.setErpWarehouseCode("SC01");
        List<ShipmentDetail> shipmentDetails = new ArrayList<>();
        for (ScpPdaShipmentBean shipmentBean : shipmentBeans){
            ShipmentDetail shipmentDetail = new ShipmentDetail();
            String materialCode = shipmentBean.getMaterialCode();
            if(StringUtils.isNull(shipmentBean.getInventoryId())){
                throw new ServiceException("库存ID为空");
            }
            if(shipmentBean.getQty().compareTo(BigDecimal.ZERO)==0){
                continue;
//                throw new ServiceException("数量不能为空");
            }
            shipmentDetail.setMaterialCode(materialCode);
            Material material=materialService.getMaterialByCode(materialCode);
            if(material==null){
                throw new ServiceException("找不到该物料"+materialCode);
            }
            shipmentDetail.setMaterialName(material.getName());
            shipmentDetail.setMaterialSpec(material.getSpec());
            shipmentDetail.setMaterialUnit(material.getUnit());
            shipmentDetail.setQty(shipmentBean.getQty());
            shipmentDetail.setCompanyCode(shipmentHeader.getCompanyCode());
            shipmentDetail.setWarehouseCode(shipmentHeader.getWarehouseCode());
            shipmentDetail.setUWarehouseCode(shipmentHeader.getUWarehouseCode());
            shipmentDetail.setErpWarehouseCode(shipmentHeader.getErpWarehouseCode());
            shipmentDetail.setInventorySts(QuantityConstant.DEFECTIVE);
            shipmentDetail.setUserDef1(shipmentBean.getInventoryId().toString());
            shipmentDetails.add(shipmentDetail);
        }
        shipmentDomain.setShipmentHeader(shipmentHeader);
        shipmentDomain.setShipmentDetails(shipmentDetails);
        AjaxResult result = shipmentApiService.shipment(shipmentDomain);
        if (result.hasErr()){
            throw new ServiceException(result.getMsg());
        }
        return shipmentDetails;
    }
}