AcsReceiptService.java 9.42 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.toolkit.Wrappers;
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();
        Integer stackType = stackInfo.getStackType();
        Integer area = stackInfo.getArea();
        if (StringUtils.isEmpty(containerCode)) {
            throw new JSONException("商片仓入库:没有托盘信息");
        }
        if (StringUtils.isNull(stackType)) {
            throw new JSONException("商片仓入库:没有码垛信息");
        }
        if(StringUtils.isNull(area)){
            return AjaxResult.error("商片仓入库:库区不能为空");
        }
        if (area != 11) {
            return AjaxResult.error("商片仓入库:库区不能为空");
        }

        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("2B01");
            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);
        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");
        }
    }

}