ShipmentAPIService.java 13.5 KB
package com.huaheng.api.general.service;


import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;


import com.alibaba.fastjson.JSON;
import com.huaheng.api.general.domain.ShipmentApiDetail;
import com.huaheng.api.general.domain.ShipmentApiHeader;
import com.huaheng.api.general.domain.ShipmentObject;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.HttpUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.general.company.domain.Company;
import com.huaheng.pc.general.company.service.ICompanyService;
import com.huaheng.pc.general.material.domain.Material;
import com.huaheng.pc.general.material.service.IMaterialService;
import com.huaheng.pc.general.warehouse.domain.Warehouse;
import com.huaheng.pc.general.warehouse.service.IWarehouseService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.IShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.IShipmentHeaderService;
import com.huaheng.pc.system.dict.service.IDictDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;
@Service
public class ShipmentAPIService {

    @Autowired
    private IDictDataService dictDataService;
    @Autowired
    IShipmentDetailService shipmentDetailService;
    @Autowired
    ICompanyService companyService;
    @Autowired
    IShipmentHeaderService shipmentHeaderService;
    @Autowired
    private IMaterialService materialService;
    @Autowired
    private IWarehouseService warehouseService;





    //出库单下发
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult insertShipment(ShipmentObject shipmentObject){
        //主单校验
        if(StringUtils.isNull(shipmentObject.getShipmentApiHeader())){
            return AjaxResult.error("出库单头数据异常!");
        }
        if(StringUtils.isEmpty(shipmentObject.getShipmentApiHeader().getShipmentCode()) ||
                StringUtils.isEmpty(shipmentObject.getShipmentApiHeader().getWarehouseCode()) ||
                StringUtils.isEmpty(shipmentObject.getShipmentApiHeader().getCompanyCode()) ||
                StringUtils.isEmpty(shipmentObject.getShipmentApiHeader().getShipmentType())
        ){
            return AjaxResult.error("入库信息主单数据必填项有误");
        }
        ShipmentApiHeader shipmentApiHeader = shipmentObject.getShipmentApiHeader();
        //明细校验
        if(shipmentObject.getShipmentApiDetailList() == null || shipmentObject.getShipmentApiDetailList().size() < 1){
            return AjaxResult.error("明细子单没有数据!");
        }

        if(shipmentObject.getShipmentApiDetailList().size() > 200){
            return AjaxResult.error("明细单不能超过200行");
        }
        List<ShipmentApiDetail> shipmentApiDetailList = shipmentObject.getShipmentApiDetailList();
        /*if(dictDataService.checkConfig("shipmentType", shipmentApiHeader.getShipmentType()) == false)
        {
            throw new ServiceException("没有对应的出库单类型");
        }*/
        //插入出库主单数据
        ShipmentHeader shipmentHeader = new ShipmentHeader();
        shipmentHeader.setCode(shipmentHeaderService.createCode(shipmentApiHeader.getShipmentType()));
        Company company=new Company();
        Warehouse warehouse= new Warehouse();
        company.setCode(shipmentApiHeader.getCompanyCode());
        company = companyService.selectFirstEntity(company);
        if (company == null) {
            return AjaxResult.error("系统没有该货主");
        } else {
            shipmentHeader.setCompanyId(company.getId());
        }
        warehouse.setCode(shipmentApiHeader.getWarehouseCode());
        warehouse = warehouseService.selectFirstEntity(warehouse);
        if (warehouse == null) {
            return AjaxResult.error("系统没有该仓库");
        } else {
            shipmentHeader.setWarehouseId(warehouse.getId());
        }
        Date date = null;
        if(StringUtils.isNotEmpty(shipmentApiHeader.getcDatetime())){
            try{
                DateFormat fmt =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                date = fmt.parse(shipmentApiHeader.getcDatetime());
            }catch (Exception e){
                throw new ServiceException(e.toString());
            }
            shipmentHeader.setCreated(date);
        }else {
            shipmentHeader.setCreated(new Date());
        }
        shipmentHeader.setWarehouseCode(warehouse.getCode());
        shipmentHeader.setCompanyCode(company.getCode());
        shipmentHeader.setSourceCode(shipmentApiHeader.getShipmentCode()); //上游系统编码
        shipmentHeader.setSourcePlatform("ERP");
        shipmentHeader.setType(shipmentApiHeader.getShipmentType());
        shipmentHeader.setPriority(10);
        shipmentHeader.setStation(("1"));
        shipmentHeader.setTotalQty(new BigDecimal("0"));
        shipmentHeader.setTotalLines(0);
        shipmentHeader.setFirstStatus(0);
        shipmentHeader.setLastStatus(0);
        shipmentHeader.setUploadStatus(0);
        //shipmentHeader.setCreated(new Date());
        shipmentHeader.setCreatedBy("ERP");
        shipmentHeader.setLastUpdated(new Date());
        shipmentHeader.setLastUpdatedBy("ERP");
        shipmentHeader.setUserDef1(shipmentApiHeader.getShipmentId().toString());//上游系统单号
        shipmentHeader.setUserDef2("");
        shipmentHeader.setUserDef3("");
        int j = shipmentHeaderService.insert(shipmentHeader);
        if(j < 1){
            throw new ServiceException("插入出库主单失败");
        }
        //添加细表到shipmentDetail
        List<ShipmentDetail> shipmentDetailList = new ArrayList<>();
        BigDecimal totalQty = BigDecimal.ZERO;
        for(ShipmentApiDetail item : shipmentApiDetailList) {
            //先校验
            if(StringUtils.isEmpty(item.getItemCode()) ||
                    item.getQty() == null ||
                    item.getQty() ==0 ){
                throw new ServiceException("入库明细单必填项数据错误!");
            }

            Material materialTmp = new Material();
            materialTmp.setCode(item.getItemCode());
            materialTmp.setSpecification(item.getItemSpecification());
            materialTmp.setName(item.getItemName());
            materialTmp.setWarehouseCode(shipmentHeader.getWarehouseCode());
            Material material = materialService.selectFirstEntity(materialTmp);
            if (StringUtils.isNull(material)) {
                throw new ServiceException("物料未找到");
            }
            ShipmentDetail shipmentDetail = new ShipmentDetail();
            shipmentDetail.setWarehouseId(shipmentHeader.getWarehouseId());
            shipmentDetail.setWarehouseCode(shipmentHeader.getWarehouseCode());
            shipmentDetail.setCompanyId(shipmentHeader.getCompanyId());
            shipmentDetail.setCompanyCode(shipmentHeader.getCompanyCode());
            shipmentDetail.setSourceCode(shipmentApiHeader.getShipmentCode());
            shipmentDetail.setSourceLine(shipmentApiHeader.getShipmentId().toString());
            shipmentDetail.setShipmentId(shipmentHeader.getId());
            shipmentDetail.setShipmentCode(shipmentHeader.getCode());
            shipmentDetail.setMaterialId(material.getId());
            shipmentDetail.setMaterialCode(material.getCode());
            //shipmentDetail.setMaterialName(material.getName());
            //shipmentDetail.setSpecification(material.getSpecification());
            shipmentDetail.setZoneCode("LK");
            shipmentDetail.setUnit("PCS");
            shipmentDetail.setBatch("");
            shipmentDetail.setLot("");
            shipmentDetail.setProject(item.itemBatch);
            shipmentDetail.setManufactureDate(null);
            shipmentDetail.setExpirationDate(null);
            shipmentDetail.setAgingDate(null);
            if(StringUtils.isNotEmpty(item.getItemState())){
                shipmentDetail.setInventoryStatus(item.getItemState());
            }else{
                shipmentDetail.setInventoryStatus("good");
            }
            shipmentDetail.setQtyCompleted(new BigDecimal("0"));
            try {
                shipmentDetail.setQty(BigDecimal.valueOf(item.getQty()));
            }catch (Exception e){
                throw new ServiceException(e.toString());
            }
            shipmentDetail.setPrice(new BigDecimal("0"));
            shipmentDetail.setStatus((short)0);
            shipmentDetail.setCreated(date);
            shipmentDetail.setCreatedBy("ERP");
            shipmentDetail.setLastUpdated(new Date());
            shipmentDetail.setLastUpdatedBy("ERP");
            shipmentDetail.setUserDef1("");
            shipmentDetail.setUserDef2("");
            shipmentDetail.setUserDef3("");

            //shipmentDetailService.insert(shipmentDetail);
            shipmentDetailList.add(shipmentDetail);
            //更新表头的总行数和总数量统计
            totalQty = totalQty.add(shipmentDetail.getQty());

        }
        //批量插入出库单
        int k = shipmentDetailService.insertBatch(shipmentDetailList);
        if(k != shipmentDetailList.size()){
            throw new ServiceException("明细插入失败!");
        }
        //更新单据总行数与总数量
        shipmentHeader.setTotalLines(shipmentDetailList.size());
        shipmentHeader.setTotalQty(totalQty);
        shipmentHeaderService.updateByModel(shipmentHeader );
        return AjaxResult.success("出库单下发成功");
    }

    /**
     * 出库单回传
     * 根据单据回传
     * */
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult confirmShipment(String url)
    {
        //查询符合回传条件的主单,再根据主单回传子单
        ShipmentHeader shipmentHeader = new ShipmentHeader();
        shipmentHeader.setLastStatus(800);
        shipmentHeader.setWarehouseCode("TD001");
        shipmentHeader = shipmentHeaderService.selectFirstEntity(shipmentHeader);
        if (StringUtils.isNull(shipmentHeader)) {
            return AjaxResult.success("没有主单需要回传");
        }
        ShipmentDetail shipmentDetail = new ShipmentDetail();
        shipmentDetail.setWarehouseCode(shipmentHeader.getWarehouseCode());
        shipmentDetail.setShipmentCode(shipmentHeader.getCode());
        List<ShipmentDetail> shipmentDetails = shipmentDetailService.selectListEntityByEqual(shipmentDetail);
        if (shipmentDetails == null || shipmentDetails.size() < 1) {
            return AjaxResult.error("出库回传子单不存在");
        }
        ShipmentApiHeader model = new ShipmentApiHeader();
        String dateTime = null;
        try{
            dateTime = new java.sql.Timestamp(System.currentTimeMillis()).toString();
        }catch (Exception e){
            throw new ServiceException(e.toString());
        }
        //主
        model.setcDatetime(dateTime);
        model.setCompanyCode(shipmentHeader.getCompanyCode());
        model.setShipmentCode(shipmentHeader.getCode());
        model.setShipmentId(shipmentHeader.getId());
        model.setShipmentType(shipmentHeader.getType());
        model.setWarehouseCode(shipmentHeader.getWarehouseCode());
        //明细
        List<ShipmentApiDetail> shipmentApiDetailList = new ArrayList<>();
         for(ShipmentDetail item:shipmentDetails){
            ShipmentApiDetail shipmentApiDetail = new ShipmentApiDetail();
            Material materialTmp = new Material();
            materialTmp.setCode(item.getMaterialCode());
            materialTmp.setWarehouseCode(item.getWarehouseCode());
            Material material = materialService.selectFirstEntity(materialTmp);
            if (StringUtils.isNull(material) ) {
                return AjaxResult.error("没有该物料");
            }
            shipmentApiDetail.setItemBatch(item.getBatch());
            shipmentApiDetail.setItemCode(material.getCode());
            shipmentApiDetail.setItemId(item.getId());
            shipmentApiDetail.setItemName(material.getName());
            shipmentApiDetail.setItemSpecification(material.getSpecification());
            shipmentApiDetail.setItemState(item.getInventoryStatus());
            shipmentApiDetail.setItemUnit("PCS");
            try{
                shipmentApiDetail.setQty(item.getQty().floatValue());
            }catch (Exception e){
                throw new ServiceException(e.toString());
            }
            shipmentApiDetailList.add(shipmentApiDetail);
        }
        //set
        ShipmentObject shipmentObject = new ShipmentObject();
        shipmentObject.setShipmentApiHeader(model);
        shipmentObject.setShipmentApiDetailList(shipmentApiDetailList);
        String JsonParam = JSON.toJSONString(shipmentObject);
        String result = HttpUtils.sendPost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        if(ajaxResult.getCode() != 200){
            throw new ServiceException("出库单回传ERP回复异常,回传失败!");
        }
        shipmentHeader.setFirstStatus(900);
        shipmentHeader.setLastStatus(900);
        shipmentHeader.setUploadTime(new Date());
        shipmentHeaderService.updateByModel(shipmentHeader);
        return ajaxResult;
    }
}