AcsReceiptService.java 13.6 KB
package com.huaheng.api.acs.service;

import com.alibaba.fastjson.JSONException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.acs.domain.RobotDomain;
import com.huaheng.api.acs.domain.StackInfo;
import com.huaheng.api.acs.domain.StackPoint;
import com.huaheng.api.general.service.BasicDataApiService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.BusinessException;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.DataUtils;
import com.huaheng.common.utils.DateUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.mobile.receipt.ReceiptBill;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
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.sap.domain.SapReceiptData;
import com.huaheng.pc.sap.domain.SapReceiptDetailData;
import com.huaheng.pc.sap.service.SapReceiptDataService;
import com.huaheng.pc.sap.service.SapReceiptDetailDataService;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

/**
 * @ClassName AcsServiceImpl
 * @Description TODO
 * @Author Administrator
 * @Date 2019/12/2615:38
 */
@Service
public class AcsReceiptService {

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

    @Resource
    private SapReceiptDataService sapReceiptDataService;
    @Resource
    private SapReceiptDetailDataService sapReceiptDetailDataService;
    @Resource
    private MaterialService materialService;
    @Resource
    private BasicDataApiService basicDataApiService;
    @Resource
    private AcsReceiptService acsReceiptService;
    @Resource
    private ContainerService containerService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private AgvTaskService agvTaskService;


    /**
     * 商片仓拍照入库
     *
     * @param stackInfo
     * @return
     */
    public AjaxResult getReceiptContainerByB(StackInfo stackInfo) {
        String containerCode = stackInfo.getContainerCode();
        Container container = containerService.getContainerByCode(containerCode, QuantityConstant.WAREHOUSECODE);
        if (container == null) {
            return AjaxResult.error(containerCode + "容器号:不存在系统");
        }
        if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) {
            return AjaxResult.error(containerCode + " 容器状态不为空");
        }
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(new LambdaQueryWrapper<InventoryDetail>()
                .eq(InventoryDetail::getContainerCode, containerCode));
        if (!inventoryDetails.isEmpty()) {
            return AjaxResult.error(containerCode + " 容器存在库存");
        }
        Integer integer = taskHeaderService.UncompleteCount(containerCode, QuantityConstant.WAREHOUSECODE);
        if (integer.intValue() > 0) {
            return AjaxResult.error(containerCode + "容器存在未完成的立库任务");
        }
        int unCompleteTask = agvTaskService.getUnCompleteTask(containerCode);
        if (unCompleteTask > 0) {
            return AjaxResult.error(containerCode + "容器存在未完成的AGV任务");
        }
        return acsReceiptService.saveReceiptContainer(stackInfo);
    }

    public Map<Integer,String> checkContainerPosition(StackInfo  stackInfo){
        List<StackPoint> stackPoints = stackInfo.getStackPoints();
        if(stackPoints.isEmpty()){
            throw new ServiceException("容器物料位置信息为空");
        }
        switch (stackInfo.getStackType()){
            case 1:
            case 2:
            case 3:
                break;
            default:
                throw new ServiceException(stackInfo.getStackType()+" 码垛类型不存在请确认码垛类型");
        }
        Map<Integer,String> map = new HashMap<>();
        for (StackPoint stackPoint : stackPoints) {
            if(stackPoint.getPosition() > 12){
                throw new ServiceException("位置信息不能大于12");
            }
            if(stackPoint.getPosition().compareTo(0) > 0){
                if(map.containsKey(stackPoint.getPosition())){
                    throw new ServiceException("位置号重复请检查数据");
                }
                map.put(stackPoint.getPosition(),stackPoint.getLot());
            }else{
                throw new ServiceException("位置信息不能小于0");
            }
        }
        return map;
    }

    @Transactional(rollbackFor = Exception.class)
    public AjaxResult saveReceiptContainer(StackInfo stackInfo) {
        String containerCode = stackInfo.getContainerCode();
        Integer stackType = stackInfo.getStackType();
        int area = stackInfo.getArea();
        boolean tag = sapReceiptDataService.checkDataExist(containerCode, null);
        if (!tag) {
            throw new BusinessException("入库:请不要重复发送相同的数据");
        }

        SapReceiptData sapReceiptData = new SapReceiptData();
        if (area == 11) {
            sapReceiptData.setLgort("SC01");
            sapReceiptData.setLgnum("SP2");
            sapReceiptData.setFromPos("2B03");
            sapReceiptData.setPlType(1);
        }
        Map<Integer, String> map = checkContainerPosition(stackInfo);
        int num = map.size();
        Integer boxTotalQty = stackInfo.getBoxTotalQty();
        //是否可以发送SAP 如果机械手给的数量 和明细数量对不上就需要进入修改页面进行修改
        if(num == boxTotalQty.intValue()){
            sapReceiptData.setSendOK(1);
        }
        sapReceiptData.setDetailTotalQty(num);
        sapReceiptData.setBoxTotalQty(boxTotalQty);
        sapReceiptData.setUniqueId(DataUtils.createUniqueId());
        sapReceiptData.setDrumId(containerCode);
        sapReceiptData.setMFlag("2");
        sapReceiptData.setDatum(DateUtils.getDate());
        sapReceiptData.setUzeit(DateUtils.getTimes());
        sapReceiptData.setInKind(1);
        sapReceiptData.setStackType(stackType);

        if (!sapReceiptDataService.save(sapReceiptData)) {
            throw new BusinessException("入库:保存信息异常");
        }
        Container container = new Container();
        LambdaQueryWrapper<Container> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Container::getCode,containerCode);
        container.setStackType(stackType);
        container.setWoodenPalletHeight(stackInfo.getHeight());
        if(!containerService.update(container,queryWrapper)){
            throw new BusinessException("");
        }
        saveSapReceiptDetail(stackInfo, sapReceiptData);
        return AjaxResult.success();
    }

    public void saveSapReceiptDetail(StackInfo stackInfo, SapReceiptData sapReceiptData) {
        List<SapReceiptDetailData> list = new ArrayList<>();
        List<StackPoint> stackPoints = stackInfo.getStackPoints();
        for (StackPoint stackPoint : stackPoints) {
            SapReceiptDetailData sapReceiptDetailData = new SapReceiptDetailData();
            sapReceiptDetailData.setDrumId(sapReceiptData.getDrumId());
            sapReceiptDetailData.setLgnum(sapReceiptData.getLgnum());
            sapReceiptDetailData.setLgort(sapReceiptData.getLgort());
            sapReceiptDetailData.setUniqueId(sapReceiptData.getUniqueId());
            sapReceiptDetailData.setVerme(stackPoint.getQty());
            sapReceiptDetailData.setCharg(stackPoint.getLot());
            sapReceiptDetailData.setMatnr(stackPoint.getMaterialCode());
            sapReceiptDetailData.setErrmsg(stackPoint.getPosition().toString());

            Material material = materialService.getMaterialByCode(stackPoint.getMaterialCode(), QuantityConstant.WAREHOUSECODE);
            if (StringUtils.isNull(material)) {
                material = new Material();
                material.setCode(stackPoint.getMaterialCode());
                material.setName(stackPoint.getMaterialCode());
                basicDataApiService.material(material);
            }
            list.add(sapReceiptDetailData);
        }
        if (!sapReceiptDetailDataService.saveBatch(list)) {
            throw new BusinessException("入库:保存信息异常1");
        }
    }

    @Transactional(rollbackFor = Exception.class)
    public AjaxResult saveReceiptDetail(RobotDomain domain){
        String containerCode = domain.getContainerCode();
        Integer stackType = domain.getStackType();
        LambdaQueryWrapper<SapReceiptData> query = Wrappers.lambdaQuery();
        query.eq(SapReceiptData::getDrumId,containerCode)
                    .eq(SapReceiptData::getStackType,stackType)
                    .eq(SapReceiptData::getSendOK,0)
                .last("LIMIT 1");

        Container container = containerService.getContainerByCode(containerCode, QuantityConstant.WAREHOUSECODE);
        if(container == null){
            throw new ServiceException("容器不存在:"+containerCode);
        }

        if(!QuantityConstant.STATUS_CONTAINER_EMPTY.equals(container.getStatus())){
            throw new ServiceException("容器状态不为空:发送入库明细失败!");
        }

        Material material = materialService.getMaterialByCode(domain.getMaterialCode(), QuantityConstant.WAREHOUSECODE);
        if (StringUtils.isNull(material)) {
            material = new Material();
            material.setCode(domain.getMaterialCode());
            material.setName(domain.getMaterialCode());
            AjaxResult material1 = basicDataApiService.material(material);
            if(material1.hasErr()){
                throw new ServiceException(material1.getMsg());
            }
        }

        SapReceiptData receiptData = sapReceiptDataService.getOne(query);
        if(receiptData == null){
            receiptData = new SapReceiptData();
            receiptData.setLgort("SC01");
            receiptData.setLgnum("SP2");
            receiptData.setFromPos("2B03");
            receiptData.setPlType(1);
            receiptData.setUniqueId(DataUtils.createUniqueId());
            receiptData.setDrumId(containerCode);
            receiptData.setMFlag("2");
            receiptData.setDatum(DateUtils.getDate());
            receiptData.setUzeit(DateUtils.getTimes());
            receiptData.setInKind(1);
            receiptData.setStackType(stackType);
            if (!sapReceiptDataService.save(receiptData)) {
                throw new BusinessException("入库:保存信息异常");
            }
        }

        SapReceiptDetailData sapReceiptDetailData = new SapReceiptDetailData();
        sapReceiptDetailData.setDrumId(receiptData.getDrumId());
        sapReceiptDetailData.setLgnum(receiptData.getLgnum());
        sapReceiptDetailData.setLgort(receiptData.getLgort());
        sapReceiptDetailData.setUniqueId(receiptData.getUniqueId());
        sapReceiptDetailData.setVerme(domain.getQty());
        sapReceiptDetailData.setCharg(domain.getLot());
        sapReceiptDetailData.setMatnr(domain.getMaterialCode());
        sapReceiptDetailData.setErrmsg(domain.getPosition().toString());

        if(!sapReceiptDetailDataService.save(sapReceiptDetailData)){
            throw new BusinessException("入库:保存信息异常1");
        }

        Integer finish = domain.getFinish();
        if(finish.intValue() == 1){
            LambdaQueryWrapper<SapReceiptDetailData> receiptDetailDataQuery = Wrappers.lambdaQuery();
            receiptDetailDataQuery.eq(SapReceiptDetailData::getUniqueId,receiptData.getUniqueId())
                    .eq(SapReceiptDetailData::getDrumId,containerCode);

            List<SapReceiptDetailData> receiptDetailData = sapReceiptDetailDataService.list(receiptDetailDataQuery);

            if(receiptDetailData.size() != domain.getStackTypeTotal()){
                throw new ServiceException("扫码传入数量与实际垛型数量不匹配");
            }

            LambdaUpdateWrapper<Container> containerUpdate = Wrappers.lambdaUpdate();
            containerUpdate.eq(Container::getCode,containerCode)
                    .set(Container::getWoodenPalletHeight,domain.getHeight())
                    .set(Container::getStackType,domain.getStackType());
            if(!containerService.update(containerUpdate)){
                throw new BusinessException("更新容器表数据失败");
            }
            LambdaUpdateWrapper<SapReceiptData> sapReceiptUpdate = Wrappers.lambdaUpdate();
            sapReceiptUpdate.eq(SapReceiptData::getUniqueId,receiptData.getUniqueId())
                    .eq(SapReceiptData::getDrumId,containerCode)
                    .set(SapReceiptData::getSendOK,1);
            if(!sapReceiptDataService.update(sapReceiptUpdate)){
                throw new BusinessException("更新发送SAP入库数据表状态失败!");
            }
        }
        return AjaxResult.success(sapReceiptDetailData);
    }

}