PdaApiServiceImpl.java 17.3 KB
package com.huaheng.api.pda.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.general.domain.ReceiptDomain;
import com.huaheng.api.general.domain.ShipmentDomain;
import com.huaheng.api.general.service.ReceiptApiService;
import com.huaheng.api.general.service.ShipmentApiService;
import com.huaheng.api.pda.domain.PdaParameter;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.datasource.DynamicDataSource;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.U8.domain.U8Inventory;
import com.huaheng.pc.U8.domain.U8ReceiptDetail;
import com.huaheng.pc.U8.domain.U8ReceiptHeader;
import com.huaheng.pc.U8.service.U8InventoryService;
import com.huaheng.pc.U8.service.U8ReceiptDetailService;
import com.huaheng.pc.U8.service.U8ReceiptHeaderService;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
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.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;


/**
 * pda逻辑处理层
 * @author xcq
 */
@Service
public class PdaApiServiceImpl {
    @Resource
    private U8ReceiptHeaderService u8ReceiptHeaderService;
    @Resource
    private U8ReceiptDetailService u8ReceiptDetailService;
    @Resource
    private ReceiptApiService receiptApiService;
    @Resource
    private ShipmentApiService shipmentApiService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private U8InventoryService u8InventoryService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
    private ShipmentHeaderService shipmentHeaderService;

    /**
     * 通过送货单号创建出库单
     * @param parameter
     * @return
     */
    public AjaxResult createShipmentService(PdaParameter parameter){
        if (parameter == null){
            return AjaxResult.error("请勿发送空数据!");
        }
        if (StringUtils.isEmpty(parameter.getCode())
                || StringUtils.isEmpty(parameter.getMaterialCode())
                || StringUtils.isEmpty(parameter.getLot())
                || StringUtils.isEmpty(parameter.getQualityTestingCode())){
            return AjaxResult.error("采购订单号、物料编号、厂家批次号、质检单号不能不能为空值!");
        }
        ShipmentDomain shipmentDomain = new ShipmentDomain();
        // 查询采购订单是否已经存在
        LambdaQueryWrapper<ShipmentDetail> lambdaQuery = Wrappers.lambdaQuery();
        lambdaQuery.eq(ShipmentDetail::getUserDef1, parameter.getCode())
                .eq(ShipmentDetail::getLot, parameter.getLot())
                .eq(ShipmentDetail::getMaterialCode, parameter.getMaterialCode());
        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(lambdaQuery);
        if (shipmentDetailList != null && shipmentDetailList.size() > 0){
            // 判断采购入库单是否已经回传
            for (ShipmentDetail shipmentDetail :shipmentDetailList){
                if (QuantityConstant.SHIPMENT_HEADER_RETURN.equals(shipmentDetail.getStatus())){
                    return AjaxResult.error("该采购入库单已回传请勿重复扫码!");
                }
            }
            LambdaQueryWrapper<ShipmentHeader> headerLambdaQueryWrapper = Wrappers.lambdaQuery();
            headerLambdaQueryWrapper.eq(ShipmentHeader::getCode, shipmentDetailList.get(0).getShipmentCode());
            ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(headerLambdaQueryWrapper);
            shipmentDomain.setShipmentHeader(shipmentHeader);
            shipmentDomain.setShipmentDetails(shipmentDetailList);
            AjaxResult result = AjaxResult.success("出库单已存在!");
            result.setData(shipmentDomain);
            return result;
        }
        // 切换至从库
        DynamicDataSource.slave();
        // 查询物料默认仓库
        LambdaQueryWrapper<U8Inventory> u8InventoryLambdaQueryWrapper = Wrappers.lambdaQuery();
        u8InventoryLambdaQueryWrapper.eq(U8Inventory::getCode, parameter.getMaterialCode());
        U8Inventory u8Inventory = u8InventoryService.getOne(u8InventoryLambdaQueryWrapper);
        if (u8Inventory == null){
            return AjaxResult.error("该物料编码:"+ parameter.getMaterialCode()+"在U8系统中查询失败!");
        }
        // 判断U8物料编码是否存在仓库字段
        String cWhCode;
        if (StringUtils.isEmpty(u8Inventory.getU8Warehouse())){
            cWhCode = QuantityConstant.U8_GENERAL_MATERIAL_WAREHOUSE;
        }else {
            cWhCode = u8Inventory.getU8Warehouse();
        }
        // 创建入库单头表
        ShipmentHeader header = new ShipmentHeader();
        // 创建出库单详情
        List<ShipmentDetail> shipmentDetails = new ArrayList<>();
        try {
            // 通过erp数据查询到货单
            LambdaQueryWrapper<U8ReceiptHeader> lambda = Wrappers.lambdaQuery();
            lambda.eq(U8ReceiptHeader::getReferCode, parameter.getCode());
            U8ReceiptHeader u8ReceiptHeader = u8ReceiptHeaderService.getOne(lambda);
            if (u8ReceiptHeader == null){
                return AjaxResult.error("采购订单查询失败!");
            }
            // 通过到货单号和物料编号查询到货单详情
            LambdaQueryWrapper<U8ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(U8ReceiptDetail::getReferCode, parameter.getCode())
                    .eq(U8ReceiptDetail::getMaterialCode, parameter.getMaterialCode());
            List<U8ReceiptDetail> u8ReceiptDetails = u8ReceiptDetailService.list(queryWrapper);
            if (u8ReceiptDetails.size() == 0){
                return AjaxResult.error("查询采购订单号详情失败!");
            }
            // 设置单据类型为采购退货单
            header.setShipmentType(QuantityConstant.RETURN_RAW_MATERIALS);
            // 存储采购订单号
            header.setUserDef1(parameter.getCode());
            // 设置U8仓库编号
            header.setUserDef2(cWhCode);
            // 设置货主
            header.setCompanyCode(QuantityConstant.COMPANYCODE);
            // 设置仓库
            header.setWarehouseCode(QuantityConstant.WAREHOUSECODE);
            // 出库头表保存批次号
            header.setUserDef3(parameter.getLot());
            // 采购订单主表id
            header.setReferId(Integer.valueOf(u8ReceiptHeader.getReferId()));
            // 质检单号
            header.setShipmentNote(parameter.getQualityTestingCode());
            // 供应商编码
            header.setCarrierServer(u8ReceiptHeader.getSupplierCode());
            u8ReceiptDetails.forEach(item->{
                ShipmentDetail shipmentDetail = new ShipmentDetail();
                // 数量
                shipmentDetail.setQty(item.getQty());
                // 物料编码
                shipmentDetail.setMaterialCode(item.getMaterialCode());
                // 货主
                shipmentDetail.setCompanyCode(QuantityConstant.COMPANYCODE);
                // 仓库编码
                shipmentDetail.setWarehouseCode(QuantityConstant.WAREHOUSECODE);
                // 制单人
                shipmentDetail.setCreatedBy(ShiroUtils.getUser().getUserName());
                // 采购单号
                shipmentDetail.setUserDef1(parameter.getCode());
                // 批次
                shipmentDetail.setLot(parameter.getLot());
                // 采购订单子单id
                shipmentDetail.setUserDef2(item.getAutoId());
                // 库存状态
                shipmentDetail.setInventorySts(QuantityConstant.GOOD);
                shipmentDetails.add(shipmentDetail);
            });
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.error(e.getMessage());
        }finally {
            // 切换至主库
            DynamicDataSource.master();
        }
        shipmentDomain.setShipmentHeader(header);
        shipmentDomain.setShipmentDetails(shipmentDetails);
        AjaxResult result = shipmentApiService.shipment(shipmentDomain);
        if (result.hasErr()){
            return result;
        }
        result.setData(shipmentDomain);
        return result;
    }

    /**
     * 通过送货单号创建入库
     * @param parameter
     * @return
     */
    public AjaxResult createReceiptService(PdaParameter parameter){
        if (parameter == null){
            return AjaxResult.error("请勿发送空数据!");
        }
        String code = parameter.getCode();
        String lot = parameter.getLot();
        String materialCode = parameter.getMaterialCode();;
        ReceiptDomain receiptDomain = new ReceiptDomain();
        if (StringUtils.isEmpty(code) || StringUtils.isEmpty(lot) || StringUtils.isEmpty(materialCode)){
            return AjaxResult.error("到货单号、批号或物料编号不能为空!");
        }
        // 查询到货单是否已经存在
        LambdaQueryWrapper<ReceiptDetail> lambdaQuery = Wrappers.lambdaQuery();
        lambdaQuery.eq(ReceiptDetail::getUserDef1, code)
                .eq(ReceiptDetail::getLot, lot)
                .eq(ReceiptDetail::getMaterialCode, materialCode);
        List<ReceiptDetail> receiptDetails = receiptDetailService.list(lambdaQuery);
        if (receiptDetails != null && receiptDetails.size() > 0){
            // 判断采购入库单是否已经回传
            for (ReceiptDetail receiptDetail :receiptDetails){
                if (QuantityConstant.RECEIPT_HEADER_POSTING <= Integer.valueOf(receiptDetail.getProcessStamp())){
                    return AjaxResult.error("该采购入库单已收货请勿重复扫码!");
                }
            }
            LambdaQueryWrapper<ReceiptHeader> headerLambdaQueryWrapper = Wrappers.lambdaQuery();
            headerLambdaQueryWrapper.eq(ReceiptHeader::getCode, receiptDetails.get(0).getReceiptCode());
            ReceiptHeader receiptHeader = receiptHeaderService.getOne(headerLambdaQueryWrapper);
            receiptDomain.setReceiptHeader(receiptHeader);
            receiptDomain.setReceiptDetails(receiptDetails);
            AjaxResult result = AjaxResult.success("入库单已存在!");
            result.setData(receiptDomain);
            return result;
        }
        // 切换至从库
        DynamicDataSource.slave();
        // 查询物料默认仓库
        LambdaQueryWrapper<U8Inventory> u8InventoryLambdaQueryWrapper = Wrappers.lambdaQuery();
        u8InventoryLambdaQueryWrapper.eq(U8Inventory::getCode, materialCode);
        U8Inventory u8Inventory = u8InventoryService.getOne(u8InventoryLambdaQueryWrapper);
        if (u8Inventory == null){
            return AjaxResult.error("该物料编码:"+ materialCode+"在U8系统中查询失败!");
        }
        // 判断U8物料编码是否存在仓库字段
        String cWhCode;
        if (StringUtils.isEmpty(u8Inventory.getU8Warehouse())){
            cWhCode = QuantityConstant.U8_GENERAL_MATERIAL_WAREHOUSE;
        }else {
            cWhCode = u8Inventory.getU8Warehouse();
        }
        // 创建入库单头表
        ReceiptHeader header = new ReceiptHeader();
        // 创建入库单详情
        List<ReceiptDetail> receiptDetailList = new ArrayList<>();
        try {
            // 通过erp数据查询到货单
            LambdaQueryWrapper<U8ReceiptHeader> lambda = Wrappers.lambdaQuery();
            lambda.eq(U8ReceiptHeader::getReferCode, code);
            U8ReceiptHeader u8ReceiptHeader = u8ReceiptHeaderService.getOne(lambda);
            if (u8ReceiptHeader == null){
                return AjaxResult.error("采购订单查询失败!");
            }
            // 通过到货单号和物料编号查询到货单详情
            LambdaQueryWrapper<U8ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(U8ReceiptDetail::getReferCode, code)
                    .eq(U8ReceiptDetail::getMaterialCode, materialCode);
            List<U8ReceiptDetail> u8ReceiptDetails = u8ReceiptDetailService.list(queryWrapper);
            if (u8ReceiptDetails.size() == 0){
                return AjaxResult.error("查询采购订单号详情失败!");
            }
            // 设置单据类型为采购入库单
            header.setReceiptType(QuantityConstant.PURCHASE_RECEIPT_DOC);
            // 存储采购订单号
            header.setUserDef1(code);
            // 设置U8仓库编号
            header.setUserDef2(cWhCode);
            // 设置货主
            header.setCompanyCode(QuantityConstant.COMPANYCODE);
            // 设置仓库
            header.setWarehouseCode(QuantityConstant.WAREHOUSECODE);
            // 供应商编码
            header.setSupplierCode(u8ReceiptHeader.getSupplierCode());
            // 入库头表保存批次号
            header.setUserDef3(lot);
            // 采购订单主表id
            header.setReferId(Integer.valueOf(u8ReceiptHeader.getReferId()));
            u8ReceiptDetails.forEach(item->{
                ReceiptDetail receiptDetail = new ReceiptDetail();
                // 数量
                receiptDetail.setQty(item.getQty());
                // 物料编码
                receiptDetail.setMaterialCode(item.getMaterialCode());
                // 货主
                receiptDetail.setCompanyCode(QuantityConstant.COMPANYCODE);
                // 仓库编码
                receiptDetail.setWarehouseCode(QuantityConstant.WAREHOUSECODE);
                // 制单人
                receiptDetail.setCreatedBy(ShiroUtils.getUser().getUserName());
                // 采购单号
                receiptDetail.setUserDef1(code);
                // 批次
                receiptDetail.setLot(lot);
                // 采购订单子单id
                receiptDetail.setUserDef2(item.getAutoId());
                // 库存状态
                receiptDetail.setInventorySts(QuantityConstant.GOOD);
                receiptDetailList.add(receiptDetail);
            });
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.error(e.getMessage());
        }finally {
            // 切换至主库
            DynamicDataSource.master();
        }
        receiptDomain.setReceiptHeader(header);
        receiptDomain.setReceiptDetails(receiptDetailList);
        AjaxResult result = receiptApiService.receipt(receiptDomain);
        if (result.hasErr()){
            return result;
        }
        result.setData(receiptDomain);
        return result;
    }


    @Resource
    private LocationService locationService;
    @Resource
    private ContainerService containerService;


    /**
     * pda获取容器编码
     * @param locationCode 库位编码
     * @return
     */
    public AjaxResult getContainerCodeService(String locationCode){
        if (StringUtils.isEmpty(locationCode)){
            return AjaxResult.error("库位编码不能为空!");
        }
        // 查询平库库位编码
        LambdaQueryWrapper<Location> lambdaQuery = Wrappers.lambdaQuery();
        lambdaQuery.eq(Location::getCode, locationCode)
                .eq(Location::getZoneCode, QuantityConstant.FLAT_LOCATION_CODE);
        Location location = locationService.getOne(lambdaQuery);
        if (location == null){
            return AjaxResult.error("库位查询失败!,请检查库位编码是否正确!");
        }
        // 通过库位查询托盘
        LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery();
        containerLambdaQueryWrapper.eq(Container::getCode, location.getContainerCode());
        Container container = containerService.getOne(containerLambdaQueryWrapper);
        AjaxResult result = AjaxResult.success("容器分配成功!");
        if (container == null){
            // 托盘不存在系统自动分配托盘
            LambdaQueryWrapper<Container> wrapper = Wrappers.lambdaQuery();
            wrapper.eq(Container::getStatus, QuantityConstant.STATUS_CONTAINER_EMPTY)
                    .isNull(Container::getLocationCode)
                    .eq(Container::getContainerType, QuantityConstant.VIRTUAL_CONTAINER).last(" limit 1");
            container = containerService.getOne(wrapper);
            result.setData(container);
            return result;
        }else {
            result.setData(container);
            return result;
        }
    }
}