MesServiceImpl.java 14.7 KB
package com.huaheng.api.mes.service;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.mes.domain.MESBackResult;
import com.huaheng.api.mes.domain.MaterialInfo;
import com.huaheng.api.mes.domain.PositionEntity;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.utils.http.OkHttpUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.address.service.AddressService;
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.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.materialWarnning.domain.MaterialWarning;
import com.huaheng.pc.config.materialWarnning.service.IMaterialWarningService;
import com.huaheng.pc.config.warehouse.domain.Warehouse;
import com.huaheng.pc.config.warehouse.service.WarehouseService;
import com.huaheng.pc.config.zone.domain.Zone;
import com.huaheng.pc.config.zone.service.ZoneService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
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 com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class MesServiceImpl implements MesService{

    @Resource
    private InventoryHeaderService inventoryHeaderService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ZoneService zoneService;
    @Resource
    private LocationService locationService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private WarehouseService warehouseService;
    @Resource
    private ContainerService containerService;
    @Resource
    private IMaterialWarningService materialWarningService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private AddressService addressService;

    @Override
    public AjaxResult searchInventory(String materialCode,String area) {
        String zoneCode = null;
        if(!StringUtils.isEmpty(area)){
            Zone zoneByArea = zoneService.getZoneByArea(area);
            zoneCode= zoneByArea.getCode();
        }
        String warehouseCode = QuantityConstant.DEFAULT_WAREHOUSE;
        List<InventoryDetail> inventoryDetails = inventoryDetailService.selectInventoryDetailByWarehouse(warehouseCode, materialCode, zoneCode);
        if(inventoryDetails==null){
            return AjaxResult.success(Collections.emptyList());
        }
        return AjaxResult.success(inventoryDetails);
    }

    @Override
    public AjaxResult searchLocations(String area,String locationCode) {
        String warehouseCode = QuantityConstant.DEFAULT_WAREHOUSE;
        String type = null;
        if(!StringUtils.isEmpty(area)){
            LambdaQueryWrapper<Zone> zoneLambdaQueryWrapper = Wrappers.lambdaQuery();
            zoneLambdaQueryWrapper.in(Zone::getArea, area);
            Zone zone = zoneService.getOne(zoneLambdaQueryWrapper);
            type = zone.getCode();
        }

        /* 查询库位信息*/
        AjaxResult ajaxResult = locationService.selectLocationByLocationTypeAndWarehouseCode(type, warehouseCode);
        if(ajaxResult.hasErr()){
            return ajaxResult;
        }
        List<Location> locations = (List<Location>)ajaxResult.getData();
        List<Location> locationList = new ArrayList<>();
        /* 查询库存明细*/
        List<InventoryDetail> inventoryDetailList = inventoryDetailService.selectInventoryDetailByWarehouse(warehouseCode,null,"A");

        for (Location location1 : locations) {
            List<InventoryDetail> inventoryDetails = inventoryDetailList.stream().filter(inventoryDetail1 ->
                    inventoryDetail1.getLocationCode().equals(location1.getCode())).collect(Collectors.toList());

            List<MaterialInfo> materialInfos = getMaterialInfo(inventoryDetails);
            int materialInfoSize = materialInfos.size();
            String containerCode = location1.getContainerCode();
            String status = location1.getStatus();

            if(QuantityConstant.STATUS_LOCATION_EMPTY.equals(status)){
                if(StringUtils.isNotEmpty(containerCode)){
                    if(materialInfoSize > 0){
                        location1.setContainerStatus(QuantityConstant.STATUS_CONTAINER_SOME);
                    }else if(materialInfoSize == 0){
                        location1.setContainerStatus(QuantityConstant.STATUS_CONTAINER_EMPTY);
                    }
                }
            }
            if(QuantityConstant.STATUS_LOCATION_LOCK.equals(status)){
                if(StringUtils.isNotEmpty(containerCode)){
                    location1.setContainerStatus(QuantityConstant.STATUS_CONTAINER_LOCK);
                }
            }
            location1.setMaterialInfos(materialInfos);
            locationList.add(location1);
        }

        return AjaxResult.success(locationList);
    }

    @Override
    public AjaxResult searchWarehouse() {
        Warehouse one = warehouseService.getOne(new LambdaQueryWrapper<Warehouse>()
                .eq(Warehouse::getCode, QuantityConstant.DEFAULT_WAREHOUSE));
        return AjaxResult.success(one);
    }

    @Override
    public AjaxResult searchContainer() {
        List<Container> list = containerService.list();
        return AjaxResult.success(list);
    }

    @Override
    public AjaxResult searchMaterialWarning() {
        List<MaterialWarning> list = materialWarningService.list();
        return AjaxResult.success(list);
    }

    @Override
    public AjaxResult searchZone() {
        List<Zone> list = zoneService.list();
        return AjaxResult.success(list);
    }

    @Override
    @Transactional
    public AjaxResult back(Integer id) {
        if(StringUtils.isEmpty(id+"")){
            return AjaxResult.error("任务id不存在");
        }
        TaskHeader taskHeader = taskHeaderService.getById(id);
        Integer taskType = taskHeader.getInternalTaskType();
        if(taskHeader==null){
            return AjaxResult.error("id为:【"+id+"】任务不存在");
        }
        List<TaskDetail> taskDetails = taskDetailService.findByTaskId(id);
        if(taskHeader.getStatus()!=QuantityConstant.TASK_STATUS_COMPLETED){
            return AjaxResult.error("id为:【"+id+"】任务没有完成,不可回传。");
        }
        AjaxResult ajaxResult = null;
        switch (taskType){
            case 100:
                ajaxResult = receiptBack(taskHeader, taskDetails);
                break;
            case 200:
                ajaxResult = shipmentBack(taskHeader, taskDetails);
                break;
            default:
                return AjaxResult.success();
        }

        return ajaxResult;
    }

    private AjaxResult receiptBack(TaskHeader taskHeader,List<TaskDetail> taskDetails){
        String referCode = "";
        Integer receiptHeaderId = 0;

        List<PositionEntity> positionList = new ArrayList<>();
        List<ReceiptDetail> updates = new ArrayList<>();
        for (TaskDetail taskDetail : taskDetails) {
            PositionEntity entity = new PositionEntity();
            ReceiptDetail receiptDetail = receiptDetailService.getById(taskDetail.getBillDetailId());
            entity.setDetailId(receiptDetail.getReferId());
            entity.setMaterialCode(receiptDetail.getMaterialCode());
            entity.setTotalQty(taskDetail.getQty());
            //累加回传明细
            receiptDetail.setReturnedQty(receiptDetail.getReturnedQty().add(taskDetail.getQty()));
            referCode = receiptDetail.getReferCode();
            receiptHeaderId = receiptDetail.getReceiptId();
            updates.add(receiptDetail);
            positionList.add(entity);
        }
        MESBackResult mesBackResult = new MESBackResult();
        mesBackResult.setPositionList(positionList);
        mesBackResult.setReferCode(referCode);
        //判断整个入库单是否完成
        boolean noCompletedQty = receiptDetailService.isNoCompletedQty(updates,receiptHeaderId);
        if(noCompletedQty){
            mesBackResult.setReferState(QuantityConstant.MES_STATUS_COMPLETE);
        }else{
            mesBackResult.setReferState(QuantityConstant.MES_STATUS_UN_COMPLETE);
        }

        String url = addressService.selectAddress(QuantityConstant.MES_BACK_ADDRESS,
                QuantityConstant.DEFAULT_WAREHOUSE, "");

        String bodypost = OkHttpUtils.bodypost(url, JSON.toJSONString(mesBackResult));
        if(bodypost==null || "".equals(bodypost)){
            taskHeader.setBack(-1);
            taskHeaderService.updateById(taskHeader);
            return AjaxResult.error("WMS请求发送成功,接收返回内容是空的");
        }
        AjaxResult ajaxResult = JSON.parseObject(bodypost, AjaxResult.class);
        if(ajaxResult.hasErr()){
            taskHeader.setBack(-1);
            taskHeaderService.updateById(taskHeader);
            return AjaxResult.error(ajaxResult.getMsg());
        }
        receiptDetailService.saveOrUpdateBatch(updates);
        if(noCompletedQty){
            ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptHeaderId);
            receiptHeader.setFirstStatus(900);
            receiptHeader.setLastStatus(900);
            receiptHeader.setClosed(1);
            receiptHeaderService.updateById(receiptHeader);
        }
        taskHeader.setBack(1);
        taskHeaderService.updateById(taskHeader);
        return AjaxResult.success();
    }

    private AjaxResult shipmentBack(TaskHeader taskHeader,List<TaskDetail> taskDetails){
        String referCode = "";
        Integer receiptHeaderId = 0;

        List<PositionEntity> positionList = new ArrayList<>();
        List<ShipmentDetail> updates = new ArrayList<>();
        for (TaskDetail taskDetail : taskDetails) {
            PositionEntity entity = new PositionEntity();
            ShipmentDetail shipmentDetail = shipmentDetailService.getById(taskDetail.getBillDetailId());
            entity.setDetailId(shipmentDetail.getReferId());
            entity.setMaterialCode(shipmentDetail.getMaterialCode());
            entity.setTotalQty(taskDetail.getQty());
            //累加回传明细
            shipmentDetail.setReturnedQty(shipmentDetail.getReturnedQty().add(taskDetail.getQty()));
            referCode = shipmentDetail.getReferCode();
            receiptHeaderId = shipmentDetail.getShipmentId();
            updates.add(shipmentDetail);
            positionList.add(entity);
        }
        MESBackResult mesBackResult = new MESBackResult();
        mesBackResult.setPositionList(positionList);
        mesBackResult.setReferCode(referCode);
        //判断整个入库单是否完成
        boolean noCompletedQty = shipmentDetailService.isNoCompletedQty(updates,receiptHeaderId);
        if(noCompletedQty){
            mesBackResult.setReferState(QuantityConstant.MES_STATUS_COMPLETE);
        }else{
            mesBackResult.setReferState(QuantityConstant.MES_STATUS_UN_COMPLETE);
        }

        String url = addressService.selectAddress(QuantityConstant.MES_BACK_ADDRESS,
                QuantityConstant.DEFAULT_WAREHOUSE, "");

        String bodypost = OkHttpUtils.bodypost(url, JSON.toJSONString(mesBackResult));
        if(bodypost==null || "".equals(bodypost)){
            taskHeader.setBack(-1);
            taskHeaderService.updateById(taskHeader);
            return AjaxResult.error("WMS请求发送成功,接收返回内容是空的");
        }
        AjaxResult ajaxResult = JSON.parseObject(bodypost, AjaxResult.class);
        if(ajaxResult.hasErr()){
            taskHeader.setBack(-1);
            taskHeaderService.updateById(taskHeader);
            return AjaxResult.error(ajaxResult.getMsg());
        }
        shipmentDetailService.saveOrUpdateBatch(updates);
        if(noCompletedQty){
            ShipmentHeader shipmentHeader = shipmentHeaderService.getById(receiptHeaderId);
            shipmentHeader.setFirstStatus(900);
            shipmentHeader.setLastStatus(900);
            shipmentHeader.setClosed(1);
            shipmentHeaderService.updateById(shipmentHeader);
        }
        taskHeader.setBack(1);
        taskHeaderService.updateById(taskHeader);
        return AjaxResult.success();
    }


    private List<MaterialInfo> getMaterialInfo(List<InventoryDetail> inventoryDetails){
        List<MaterialInfo> materialInfos = new ArrayList<>();
        if(inventoryDetails== null || inventoryDetails.size()==0){
            return materialInfos;
        }
        for (InventoryDetail inventoryDetail : inventoryDetails) {
            MaterialInfo info = new MaterialInfo();
            info.setMaterialCode(inventoryDetail.getMaterialCode());
            info.setMaterialName(inventoryDetail.getMaterialName());
            info.setMaterialUnit(inventoryDetail.getMaterialUnit());
            info.setQty(inventoryDetail.getQty());
            info.setBatch(inventoryDetail.getBatch());
            info.setTaskQty(inventoryDetail.getTaskQty());
            materialInfos.add(info);
        }
        return materialInfos;
    }
}