ICSShipmentApiService.java 14.2 KB
package com.huaheng.pc.u8.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.huaheng.api.general.domain.ShipmentDomain;
import com.huaheng.api.general.service.ShipmentApiService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.DateUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.Wrappers;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.documentWarning.service.IDocumentWarningService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.warehouse.domain.WarehouseU8;
import com.huaheng.pc.config.warehouse.service.WarehouseU8Service;
import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
import com.huaheng.pc.shipment.shipmentContainerDetail.service.ShipmentContainerDetailService;
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.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.u8.domain.ICSShipmentDetail;
import com.huaheng.pc.u8.domain.ICSShipmentHeader;
import com.huaheng.pc.u8.domain.ICSShipmentModel;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class ICSShipmentApiService {

    @Resource
    private IDocumentWarningService documentWarningService;
    @Resource
    private WarehouseU8Service warehouseU8Service;
    @Resource
    private ShipmentApiService shipmentApiService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ICSShipmentDetailService icsShipmentDetailService;
    @Resource
    private ICSShipmentHeaderService icsShipmentHeaderService;
    @Resource
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
    private ShipmentContainerDetailService shipmentContainerDetailService;
    @Resource
    private TaskDetailService taskDetailService;






        //u8-wms出库下发
    @Transactional
    public AjaxResult procureShipment(ICSShipmentModel icsShipmentModel){
    //获取主单和子单列
        ICSShipmentHeader icsShipmentHeader=icsShipmentModel.getIcsShipmentHeader();
        List<ICSShipmentDetail> icsShipmentDetails=icsShipmentModel.getIcsShipmentDetails();
        String type = icsShipmentHeader.getType();
        switch (type){
            case "QO" :
            case "MO" :
            case "OO" :
            case "PKO" :
            case "TO" :
                return AjaxResult.error("出库类型不匹配");
            default:
                break;
        }
        if(StringUtils.isEmpty(icsShipmentHeader.getIsNew())){
            return AjaxResult.error("isNew为空");
        }
        Date date = null;
        try {
            date = DateUtils.parseDate(icsShipmentHeader.getDDate(), DateUtils.YYYY_MM_DD_HH_MM_SS);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //根据icsShipmentHeader生成shipmentHeader
        ShipmentHeader shipmentHeader=new ShipmentHeader();

        String warehouseCode=null;
        switch (type){
            case "PKO" :
            case "TO" :
                return AjaxResult.success("出库单下发成功");
            case "OO" :
                warehouseCode = "20";
                break;
            default:
                warehouseCode = icsShipmentHeader.getCWHCode();
                break;
        }

        if (StringUtils.isEmpty(warehouseCode)) {
            if(icsShipmentHeader.getCCode()!= null) {
                documentWarningService.ErpSendWarning(icsShipmentHeader.getCCode(), "仓库编码不存在");
            }else {
                documentWarningService.ErpSendWarning(icsShipmentHeader.getCTVCode(), "仓库编码不存在");
            }
            return AjaxResult.error("仓库编码为空");
        }
        //通过u8的货主和仓库匹配wms的仓库
        WarehouseU8 warehouseU8 = warehouseU8Service.getOne(new LambdaQueryWrapper<WarehouseU8>()
                .eq(WarehouseU8::getUCompanyCode, icsShipmentHeader.getCompanyCode())
                .eq(WarehouseU8::getUWarehouseCode, warehouseCode));

        if (warehouseU8 == null) {
            return AjaxResult.error("系统没有此仓库");
        }

        String maker = icsShipmentHeader.getCMaker();
        shipmentHeader.setShipmentType(type);
        shipmentHeader.setId(null);
        shipmentHeader.setLastUpdatedBy(maker);
        shipmentHeader.setCreatedBy(maker);
        shipmentHeader.setCreated(date);
        shipmentHeader.setLastUpdated(date);
        shipmentHeader.setCustomerCode(icsShipmentHeader.getCCusCode());
        shipmentHeader.setShipmentNote(icsShipmentHeader.getCMemo());
        shipmentHeader.setWarehouseCode(warehouseU8.getWarehouseCode());
        shipmentHeader.setUWarehouseCode(warehouseCode);
        shipmentHeader.setCompanyCode(warehouseU8.getCompanyCode());
//            shipmentHeader.setcDepName(icsShipmentHeader.getcDepName());
        switch (type){
            case "OO" :
                shipmentHeader.setReferCode(icsShipmentHeader.getMoCode());
                break;
            case "TO" :
                shipmentHeader.setReferCode(icsShipmentHeader.getCTVCode());
                break;
            default:
                shipmentHeader.setReferCode(icsShipmentHeader.getCCode());
                break;
        }
        if (StringUtils.isEmpty(shipmentHeader.getReferCode())) {
            documentWarningService.ErpSendWarning("", "没有单号");
            throw new ServiceException("没有单号");
        }
        checkShipmentBill(icsShipmentHeader,shipmentHeader.getReferCode());
        //将主表插入到新的接收主表里去
        boolean save = icsShipmentHeaderService.save(icsShipmentHeader);
        if (!save) {
            documentWarningService.ErpSendWarning(shipmentHeader.getReferCode(), "出库主单传输失败");
            throw new ServiceException("出库主单传输失败!");
        }

        //将子表插入到新的接收子表里去
        for (ICSShipmentDetail item : icsShipmentDetails) {
            if ("PKO".equals(icsShipmentHeader.getType())) {
                item.setCCode(icsShipmentHeader.getCTVCode());
            } else {
                item.setCCode(icsShipmentHeader.getCCode());
            }
            boolean save1 = icsShipmentDetailService.save(item);
            if (!save1) {
                documentWarningService.ErpSendWarning(shipmentHeader.getReferCode(), "出库子单传输失败");
                throw new ServiceException("出库子单传输失败!");
            }
        }
        //根据icsShipmentDetail生成shipmentAetail
        List<ShipmentDetail> shipmentDetails = new ArrayList<ShipmentDetail>();
        for (ICSShipmentDetail icsShipmentDetail : icsShipmentDetails) {
            //查找物料
            Material material = materialService.getOne(new LambdaQueryWrapper<Material>()
                    .eq(Material::getCode, icsShipmentDetail.getCInvCode())
                    .eq(Material::getCode, warehouseU8.getWarehouseCode()));
            if (material == null) {
                documentWarningService.ErpSendWarning(shipmentHeader.getReferCode(), "该物料不存在:" + icsShipmentDetail.getCInvCode());
                throw new ServiceException("该物料不存在:" + icsShipmentDetail.getCInvCode());
            }

            ShipmentDetail shipmentDetail = new ShipmentDetail();
            shipmentDetail.setId(null);
            shipmentDetail.setReferCode(shipmentHeader.getReferCode());
            shipmentDetail.setMoCode(icsShipmentDetail.getMoCode());
            shipmentDetail.setLot(icsShipmentDetail.getCDefine23());
//            shipmentDetail.setAutoId(icsShipmentDetail.getAutoID());
            shipmentDetail.setWarehouseCode(warehouseU8.getWarehouseCode());
            shipmentDetail.setMaterialCode(icsShipmentDetail.getCInvCode());
//                    shipmentDetail.setZoneCode(material.getZoneCode());
            shipmentDetail.setCreated(date);
//                    shipmentDetail.setUWarehouseCode(shipmentHeader.getuWarehouseCode());
            shipmentDetail.setMaterialUnit(icsShipmentDetail.getCComUnitName());
            shipmentDetail.setCreatedBy(maker);
            shipmentDetail.setLastUpdated(date);
            shipmentDetail.setLastUpdatedBy(maker);
            if (!icsShipmentDetail.getCompanyCode().equals(icsShipmentHeader.getCompanyCode())) {
                documentWarningService.ErpSendWarning(shipmentHeader.getReferCode(), "子单货主与主单不对应");
                throw new ServiceException("子单货主与主单不对应");
            }
            shipmentDetail.setCompanyCode(warehouseU8.getCompanyCode());
            shipmentDetail.setProjectNo(icsShipmentDetail.getCItemName());
            shipmentDetail.setQty((icsShipmentDetail.getIQuantity()).abs());
            shipmentDetail.setQtyCompleted(icsShipmentDetail.getIQuantity());
            shipmentDetail.setInventorySts("good");
            if (icsShipmentDetail.getIrowno() != null && StringUtils.isNotEmpty(icsShipmentDetail.getIrowno().toString())) {
                shipmentDetail.setReferLineNum(icsShipmentDetail.getIrowno().toString());
            }
            if (icsShipmentDetail.getSortSeq() != null && StringUtils.isNotEmpty(icsShipmentDetail.getSortSeq().toString())) {
                shipmentDetail.setReferLineNum(icsShipmentDetail.getSortSeq().toString());
            }
            shipmentDetails.add(shipmentDetail);
        }

        //调用公共API
        ShipmentDomain shipmentDomain = new ShipmentDomain();
        shipmentDomain.setShipmentHeader(shipmentHeader);
        shipmentDomain.setShipmentDetails(shipmentDetails);
        AjaxResult ajaxResult = shipmentApiService.shipment(shipmentDomain);

        if(ajaxResult.hasErr()){
            return ajaxResult;
        }
        if(icsShipmentHeader.getIsNew().equals("1")){
             return AjaxResult.success("出库单下发成功");
        }else if (icsShipmentHeader.getIsNew().equals("0")) {
            return AjaxResult.success("出库单更新成功");
        }
        return AjaxResult.success("出库单下发成功");
    }




    /**
          * 判断出库单是否可以更新
          * @param icsShipmentHeader U8出库单
          * @param code U8单号
          */
    private void checkShipmentBill(ICSShipmentHeader icsShipmentHeader,String code){
        //U8单据类型
        String type = icsShipmentHeader.getType();
        if(type.equals("OO")){
            return;
        }
        LambdaQueryWrapper<ICSShipmentHeader> queryWrapper = Wrappers.lambdaQuery();
        if(type.equals("SO")){
            queryWrapper.eq(ICSShipmentHeader::getCDLCode,icsShipmentHeader.getCDLCode());
        }else if(type.equals("TO")){
            queryWrapper.eq(ICSShipmentHeader::getCTVCode,icsShipmentHeader.getCTVCode());
        }else{
            queryWrapper.eq(ICSShipmentHeader::getCCode,icsShipmentHeader.getCCode());
        }
        //WMS出库单
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(new LambdaQueryWrapper<ShipmentHeader>()
                .eq(ShipmentHeader::getReferCode,code));
        //U8出库单
        ICSShipmentHeader referShipmentHeader = icsShipmentHeaderService.getOne(queryWrapper);

        //WMS出库单 和 U8出库单 都不能为空 才能更新
        if (StringUtils.isNotNull(shipmentHeader) && StringUtils.isNotNull(referShipmentHeader)) {
            if(icsShipmentHeader.getIsNew().equals("1")){
                throw  new ServiceException("单号重复,已跳过");
            }
            else
            if(icsShipmentHeader.getIsNew().equals("0")){
                if(StringUtils.isNotNull(shipmentHeader) ){
                    //找出 出库单未完成的任务
                    List<TaskDetail> taskDetailList = taskDetailService.list(new LambdaQueryWrapper<TaskDetail>()
                            .eq(TaskDetail::getBillCode, shipmentHeader.getCode())
                            .lt(TaskDetail::getStatus,120));
                    if(taskDetailList!=null&&taskDetailList.size()>0){
                        throw  new ServiceException("更新失敗,此出库单存在未完成的任务");
                    }
                    //找出库配盘明细 未配盘的单据
                    List<ShipmentContainerDetail> shipmentContainerDetails = shipmentContainerDetailService.list(new LambdaQueryWrapper<ShipmentContainerDetail>()
                            .eq(ShipmentContainerDetail::getShipmentCode, shipmentHeader.getCode())
                            .lt(ShipmentContainerDetail::getStatus, QuantityConstant.SHIPMENT_CONTAINER_FINISHED));

                    if(shipmentContainerDetails!=null&&shipmentContainerDetails.size()>0){
                        throw  new ServiceException("更新失敗,此出库单存在未完成的组盘");
                    }
                    //删除wms出库单头表
                    shipmentHeaderService.removeById(shipmentHeader.getId());
                    //删除wms出库单明细表
                    shipmentDetailService.remove(new LambdaQueryWrapper<ShipmentDetail>()
                            .eq(ShipmentDetail::getShipmentCode,shipmentHeader.getCode()));
                }
                //上游单据关联头表 删除
                icsShipmentHeaderService.removeById(referShipmentHeader.getID());
                //上游单据关联明细表 删除
                icsShipmentDetailService.remove(new LambdaQueryWrapper<ICSShipmentDetail>()
                        .eq(ICSShipmentDetail::getCCode, code));
            }
            else {
                throw new ServiceException("isNew值无法识别");
            }
        }
    }

}