AcsReceiptService.java 11.8 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;



    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 saveReceiptDetail(RobotDomain domain){
        String containerCode = domain.getContainerCode();
        Integer position = domain.getPosition();
        Integer stackType = domain.getStackType();
        Integer height = domain.getHeight();
        String sapPort = domain.getSapPort();

        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());
            }
        }
        LambdaQueryWrapper<SapReceiptData> query = Wrappers.lambdaQuery();
        query.eq(SapReceiptData::getDrumId,containerCode)
                .eq(SapReceiptData::getStackType,stackType)
                .eq(SapReceiptData::getSendOK,0)
                .last("LIMIT 1");
        boolean createReceiptDataFlag = false;
        SapReceiptData receiptData = sapReceiptDataService.getOne(query);
        if(receiptData != null){
            if(StringUtils.isNotNull(position) && position == 1){
                // 校验物料是否一致 如果不一致则将原有记录标注
                LambdaQueryWrapper<SapReceiptDetailData> receiptDetailDataQuery = Wrappers.lambdaQuery();
                receiptDetailDataQuery.eq(SapReceiptDetailData::getUniqueId,receiptData.getUniqueId())
                        .eq(SapReceiptDetailData::getDrumId,containerCode);
                List<SapReceiptDetailData> sapReceiptDetailDataList = sapReceiptDetailDataService.list(receiptDetailDataQuery);
                if(sapReceiptDetailDataList.size() == 1){
                    // 如果这条记录不是和当前的位置号 1 一致,则将原有记录标注失效
                    if(!sapReceiptDetailDataList.get(0).getErrmsg().equals(position.toString())){
                        createReceiptDataFlag = true;
                    }
                }else{
                    // 是这个托盘的第一个码垛,但是数据中已经有多个数据了。需要将之前的数据进行标注
                    createReceiptDataFlag = true;
                }
                if(createReceiptDataFlag){
                    /* 将源有记录标注 */
                    LambdaUpdateWrapper<SapReceiptData> receiptDataUpdate = Wrappers.lambdaUpdate();
                    receiptDataUpdate.eq(SapReceiptData::getUniqueId,receiptData.getUniqueId())
                            .eq(SapReceiptData::getDrumId,containerCode)
                            .set(SapReceiptData::getSendOK,2);
                    if(!sapReceiptDataService.update(receiptDataUpdate)){
                        throw new ServiceException("标注之前数据失败");
                    }
                }
            }
        }else{
            createReceiptDataFlag = true;
        }

        if( createReceiptDataFlag ){
            receiptData = new SapReceiptData();
            receiptData.setLgort("SC01");
            receiptData.setLgnum("SP2");
            receiptData.setFromPos(sapPort);
            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("入库:保存信息异常");
            }
        }
        LambdaQueryWrapper<SapReceiptDetailData> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper
                .eq(SapReceiptDetailData::getUniqueId,receiptData.getUniqueId())
                .eq(SapReceiptDetailData::getDrumId,receiptData.getDrumId())
                .eq(SapReceiptDetailData::getLgnum,receiptData.getLgnum())
                .eq(SapReceiptDetailData::getLgort,receiptData.getLgort())
                .eq(SapReceiptDetailData::getCharg,domain.getLot())
                .eq(SapReceiptDetailData::getMatnr,domain.getMaterialCode())
                .eq(SapReceiptDetailData::getErrmsg,domain.getPosition());
        SapReceiptDetailData receiptDetailData1 = sapReceiptDetailDataService.getOne(queryWrapper);
        if(receiptDetailData1 == null){
            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("扫码传入数量与实际垛型数量不匹配【扫码数量:"+receiptDetailData.size()+"】,实际垛型数量:【"+domain.getStackTypeTotal()+"】");
            }
            //木托高度
            switch (domain.getHeight()){
                case 1:
                    height = 125;
                    break;
                case 2:
                    height = 135;
                    break;
                case 3:
                    height = 145;
                    break;
                case 4:
                    height = 170;
                    break;
                default:
            }

            LambdaUpdateWrapper<Container> containerUpdate = Wrappers.lambdaUpdate();
            containerUpdate.eq(Container::getCode,containerCode)
                    .set(height > 0,Container::getWoodenPalletHeight,height)
                    .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();
    }

}