ShipmentApiService.java 8.87 KB
package com.huaheng.api.general.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.general.domain.ShipmentDomain;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.company.domain.Company;
import com.huaheng.pc.config.company.service.CompanyService;
import com.huaheng.pc.config.customer.domain.Customer;
import com.huaheng.pc.config.customer.service.CustomerServiceImpl;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.shipmentType.domain.ShipmentType;
import com.huaheng.pc.config.shipmentType.service.ShipmentTypeService;
import com.huaheng.pc.config.warehouse.domain.Warehouse;
import com.huaheng.pc.config.warehouse.service.WarehouseService;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author ricard
 * @time   19/11/11
 *
 */


@Component
@Transactional
public class ShipmentApiService {

    @Autowired
    private ShipmentHeaderService shipmentHeaderService;

    @Autowired
    private ShipmentDetailService shipmentDetailService;

    @Autowired
    private WarehouseService warehouseService;

    @Autowired
    private CompanyService companyService;

    @Autowired
    private CustomerServiceImpl customerService;

    @Autowired
    private ShipmentTypeService shipmentTypeService;

    @Autowired
    private MaterialService materialService;

    /**
     *  出库单下发
     *
     * @param shipmentDomain
     * @return
     */
    @Transactional
    public AjaxResult shipment(ShipmentDomain shipmentDomain){

        //1、判断出库主单和子单列是否为空
        ShipmentHeader shipmentHeader = shipmentDomain.getShipmentHeader();
        List<ShipmentDetail> shipmentDetails = shipmentDomain.getShipmentDetails();
        if(shipmentHeader == null){
            return AjaxResult.error("出库主单为空");
        }
        if(shipmentDetails.size() < 1 || shipmentDetails == null ){
            return AjaxResult.error("出库子单为空");
        }

        //2、检查出库主单的合法性
        AjaxResult ajaxResult = this.checkShipmentHeader(shipmentHeader);

        //3、检查出库子单的合法性
        shipmentDetails =this.checkShipmentDetail(shipmentDetails,shipmentHeader);

        //4、保存出库主表
        BigDecimal totalQty = new BigDecimal(0);
        for (ShipmentDetail item: shipmentDetails) {
            totalQty.add(item.getShipQty());
        }
        shipmentHeader.setTotalLines(shipmentDetails.size());
        shipmentHeader.setTotalQty(totalQty);
        shipmentHeader.setCode(shipmentHeaderService.createCode(shipmentHeader.getShipmentType()));

        if(!shipmentHeaderService.save(shipmentHeader)){
            throw new ServiceException("保存出库主表失败");
        }

        //5、保存出库子表
        for(ShipmentDetail shipmentDetail : shipmentDetails){
            shipmentDetail.setShipmentId(shipmentHeader.getId());
            shipmentDetail.setShipmentCode(shipmentHeader.getCode());
        }

        int num = 0;
        List<ShipmentDetail> shipmentDetailList = new ArrayList<>();
        if(shipmentDetails.size() >500 ){
            for(ShipmentDetail item : shipmentDetails){
                num++;
                shipmentDetailList.add(item);
                if(num % 500 ==0 || num == shipmentDetails.size()){
                    if(!shipmentDetailService.insertDetails(shipmentDetailList)){
                        throw new ServiceException("保存出库子表失败");
                    }
                    shipmentDetailList=new ArrayList<>();
                }
            }
        }else {
            if(!shipmentDetailService.insertDetails(shipmentDetails)){
                throw new ServiceException("保存出库子表失败");
            }
        }
        return AjaxResult.success("出库单下发成功");

//        //6回传添加对象
//        LambdaQueryWrapper<ShipmentDetail> lambdaQueryWrapper =Wrappers.lambdaQuery();
//        lambdaQueryWrapper.eq(ShipmentDetail::getShipmentId ,shipmentHeader.getId());
//
//        ShipmentDomain jsonShipmentDomain =new ShipmentDomain();
//        jsonShipmentDomain.setShipmentHeader(shipmentHeader);
//        jsonShipmentDomain.setShipmentDetails(shipmentDetailService.list(lambdaQueryWrapper));
//
//        return AjaxResult.success(jsonShipmentDomain);
    }


    /**
     * 检查出库主单的合法性
     * @param shipmentHeader
     * @return
     */
    public  AjaxResult checkShipmentHeader(ShipmentHeader shipmentHeader){
        //1、判断仓库和货主
        if(StringUtils.isEmpty(shipmentHeader.getWarehouseCode())){
            return AjaxResult.error("仓库为空");
        }
        if(StringUtils.isEmpty(shipmentHeader.getCompanyCode())){
            return AjaxResult.error("货主为空");
        }


        LambdaQueryWrapper<Warehouse> warehouseLamb = Wrappers.lambdaQuery();
        warehouseLamb.eq(Warehouse::getCode,shipmentHeader.getWarehouseCode());
        Warehouse warehouse =warehouseService.getOne(warehouseLamb);
        if(warehouse == null){
            return AjaxResult.error("wms没有此仓库");
        }

        LambdaQueryWrapper<Company> companyLamb = Wrappers.lambdaQuery();
        companyLamb.eq(Company::getCode,shipmentHeader.getCompanyCode());
        Company company =companyService.getOne(companyLamb);
        if(company == null){
            return AjaxResult.error("wms没有此货主");
        }

        //2、判断出库类型
        LambdaQueryWrapper<ShipmentType> shipmentTypeLamb = Wrappers.lambdaQuery();
        shipmentTypeLamb.eq(ShipmentType::getCode,shipmentHeader.getShipmentType())
                    .eq(ShipmentType::getWarehouseCode,shipmentHeader.getWarehouseCode());
        ShipmentType shipmentType =shipmentTypeService.getOne(shipmentTypeLamb);
        if(shipmentType == null){
            return AjaxResult.error("wms没有此出库类型");
        }

        //3、检查上游单号是否存在
        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLamb = Wrappers.lambdaQuery();
        shipmentHeaderLamb.eq(ShipmentHeader::getWarehouseCode,shipmentHeader.getWarehouseCode())
                .eq(ShipmentHeader::getReferCode,shipmentHeader.getReferCode());
        List<ShipmentHeader> shipmentHeaders = shipmentHeaderService.list(shipmentHeaderLamb);
        if(shipmentHeaders.size() > 0 || shipmentHeaders != null){
            return AjaxResult.success("出库单已经下发");
        }

        //4、检查客户
        if(StringUtils.isNotEmpty(shipmentHeader.getCustomerCode())){
            LambdaQueryWrapper<Customer> customerLamb = Wrappers.lambdaQuery();
            customerLamb.eq(Customer::getWarehouseCode,shipmentHeader.getWarehouseCode())
                    .eq(Customer::getCode,shipmentHeader.getCustomerCode());
            Customer customer = customerService.getOne(customerLamb);
            if(customer == null){
                return AjaxResult.error("wms没有此客户");
            }
        }
        return AjaxResult.success(shipmentHeader);
    }


    /**
     * 检查出库子单的合法性
     * @param shipmentDetails
     * @return
     */
    public  List<ShipmentDetail> checkShipmentDetail(List<ShipmentDetail> shipmentDetails,ShipmentHeader shipmentHeader){

        for(ShipmentDetail shipmentDetail : shipmentDetails) {
            //1、检查物料
            if(StringUtils.isEmpty(shipmentDetail.getMaterialCode())){
               throw new ServiceException("物料为空");
            }
            LambdaQueryWrapper<Material> materialLamb = Wrappers.lambdaQuery();
            materialLamb.eq(Material::getCode,shipmentDetail.getMaterialCode())
                .eq(Material::getWarehouseCode,shipmentHeader.getWarehouseCode());
            Material material = materialService.getOne(materialLamb);
            if(material == null){
                throw new ServiceException("wms没有此物料");
            }

            //2、赋值物料属性
            shipmentDetail.setMaterialName(material.getName());
            shipmentDetail.setMaterialSpec(material.getSpec());
            shipmentDetail.setMaterialUnit(material.getUnit());
        }
        return shipmentDetails;
    }
}