MesReceiptController.java 12.4 KB
package com.huaheng.api.mes.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.mes.dto.ReceiptDTO;
import com.huaheng.api.mes.dto.Detail;
import com.huaheng.api.mes.dto.Header;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.domain.RetCode;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
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 io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequestMapping("/API/WMS/v2")
public class MesReceiptController extends BaseController {

    @Resource
    private ReceiptHeaderService receiptHeaderService;

    @Resource
    private ReceiptDetailService receiptDetailService;

    @Resource
    private ShipmentHeaderService shipmentHeaderService;

    @Resource
    private ShipmentDetailService shipmentDetailService;

    @Resource
    private InventoryDetailService inventoryDetailService;

    @PostMapping("/receipt")
    @ApiLogger(apiName = "添加入库单及其明细", from="ROBOT")
    @ApiOperation("添加入库单及其明细")
    public AjaxResult receipt(@RequestBody ReceiptDTO receiptDTO) {
        Header header = receiptDTO.getShipmentHeader();
        List<Detail> details = receiptDTO.getShipemtnDetails();

        AjaxResult ajaxResult = new AjaxResult();
        boolean isNull = enterIsNull(ajaxResult, header, details);
        if (isNull){
            return ajaxResult;
        }

        ReceiptHeader receiptHeader = new ReceiptHeader();
        receiptHeader.setCode(header.getReferCode());
        receiptHeader.setReceiptType("CS");
        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setWarehouseCode("CS001");
        receiptHeader.setCompanyCode("BHF");
        receiptHeaderService.save(receiptHeader);

        List<ReceiptDetail> shipemtnDetailList = new ArrayList<>();
        details.forEach(detail->{
            ReceiptDetail receiptDetail = new ReceiptDetail();
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptHeader.getCode());
            receiptDetail.setMaterialCode(detail.getMaterialCode());
            receiptDetail.setMaterialName(detail.getMaterialName());
            receiptDetail.setQty(new BigDecimal(detail.getTotalQty()));
            receiptDetail.setWarehouseCode("CS001");
            receiptDetail.setCompanyCode("BHF");
            shipemtnDetailList.add(receiptDetail);
        });
        receiptDetailService.saveBatch(shipemtnDetailList);

        return ajaxResult.setCode(RetCode.SUCCESS).setMsg("成功");
    }

    /**
     * 添加出库单及其明细
     * @param receiptDTO
     * @return
     */
    @PostMapping("/shipment")
    @ApiLogger(apiName = "添加出库单及其明细", from="ROBOT")
    @ApiOperation("添加出库单及其明细")
    public AjaxResult shipment(@RequestBody ReceiptDTO receiptDTO) {
        Header header = receiptDTO.getShipmentHeader();
        List<Detail> details = receiptDTO.getShipemtnDetails();

        AjaxResult ajaxResult = new AjaxResult();
        boolean inNull = enterIsNull(ajaxResult, header, details);
        if (inNull)  return ajaxResult;

        ShipmentHeader shipmentHeader = new ShipmentHeader();
        shipmentHeader.setCode(header.getReferCode());
        shipmentHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        shipmentHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        shipmentHeader.setWarehouseCode("CS001");
        shipmentHeader.setCompanyCode("BHF");
        shipmentHeader.setShipmentType(header.getRefeCodeType());
        shipmentHeaderService.save(shipmentHeader);

        List<ShipmentDetail> shipmentDetailList = new ArrayList<>();
        details.forEach(detail->{
            ShipmentDetail shipmentDetail = new ShipmentDetail();
            shipmentDetail.setShipmentId(shipmentHeader.getId());
            shipmentDetail.setShipmentCode(shipmentHeader.getCode());
            shipmentDetail.setMaterialCode(detail.getMaterialCode());
            shipmentDetail.setMaterialName(detail.getMaterialName());
            shipmentDetail.setPort(detail.getEndSation());
            shipmentDetail.setQty(new BigDecimal(detail.getTotalQty()));
            shipmentDetail.setCompanyCode("BHF");
            shipmentDetail.setWarehouseCode("CS001");
            shipmentDetailList.add(shipmentDetail);
        });
        shipmentDetailService.saveBatch(shipmentDetailList);

        return ajaxResult.setCode(RetCode.SUCCESS).setMsg("成功");
    }

    /**
     * 入库单参数_判空处理
     * @param ajaxResult
     * @param shipmentHeader
     * @param shipemtnDetails
     */
    private boolean enterIsNull(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails){

        if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)) return true;

        if (StringUtils.isEmpty(shipmentHeader.getRefeCodeType())) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("单据类型不能为空!!!");
            return true;
        } else if (StringUtils.isEmpty(shipmentHeader.getReferCode())) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!");
            return true;
        }

        shipemtnDetails.forEach(shipemtnDetail->{
            if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!");
            } else if (StringUtils.isEmpty(shipemtnDetail.getTotalQty())) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("总数量不能为空!!!");
            }
        });
        return StringUtils.isNotEmpty(ajaxResult.getMsg());
    }

    /**
     * 出库单参数_判空处理
     * @param ajaxResult
     * @param shipmentHeader
     * @param shipemtnDetails
     */
    private boolean outIsNull (AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails){
        if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)) return true;

        if (StringUtils.isEmpty(shipmentHeader.getReferCode())) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!");
            return true;
        }

        shipemtnDetails.forEach(shipemtnDetail->{
            if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!");
            }
        });
        return StringUtils.isNotEmpty(ajaxResult.getMsg());
    }

    /**
     * 判空处理
     */
    private boolean isNullData(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) {
        if (shipmentHeader == null) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("出库单头表不能为空!!!");
            return true;
        } else if (shipemtnDetails == null || shipemtnDetails.size() < 1) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("出库单明细表集不能为空!!!");
            return true;
        }
        return false;
    }

    /**
     * 单据取消
     */
    @PostMapping("/cancelOrder")
    @ApiOperation("单据取消")
    public AjaxResult cancelOrder(@RequestBody ReceiptDTO receiptDTO) {
        Header header = receiptDTO.getShipmentHeader();
        List<Detail> details = receiptDTO.getShipemtnDetails();

        AjaxResult ajaxResult = new AjaxResult();
        boolean inNull = outIsNull(ajaxResult, header, details);
        details.forEach(detail->{
            if (StringUtils.isEmpty(detail.getTotalQty())) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("总数量不能为空!!!");
            }
        });
        if (inNull || StringUtils.isNotEmpty(ajaxResult.getMsg()))  return ajaxResult;

        // 查询出库单据表头
        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderWrapper = Wrappers.lambdaQuery();
        shipmentHeaderWrapper.eq(ShipmentHeader::getCode, header.getReferCode());
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentHeaderWrapper);
        // 查询出库单据明细
        LambdaQueryWrapper<ShipmentDetail> shipmentDetailWrapper = Wrappers.lambdaQuery();
        shipmentDetailWrapper.eq(ShipmentDetail::getShipmentCode, header.getReferCode());
        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(shipmentDetailWrapper);
        // 获取删除明细
        List<ShipmentDetail> removeShipmentDetails = new ArrayList<>();
        shipmentDetailList.forEach(shipmentDetai->{
            details.forEach(detail->{
                if (detail.getMaterialCode().equals(shipmentDetai.getMaterialCode()) && detail.getTotalQty().equals(shipmentDetai.getQty().toString())){
                    removeShipmentDetails.add(shipmentDetai);
                }
            });
        });

        if (removeShipmentDetails.size() > 0){
            ArrayList<Integer> ids = new ArrayList<>();
            removeShipmentDetails.forEach(shipmentDetail->{
                ids.add(shipmentDetail.getId());
            });
            shipmentDetailService.removeByIds(ids);
        }
        // 出库单明细数量和要删除的明细数量一致,则删除主表
        boolean isRemove = removeShipmentDetails.size() == shipmentDetailList.size();
        if (isRemove){
            shipmentHeaderService.removeById(shipmentHeader);
        }
        return new AjaxResult<T>().setCode(RetCode.SUCCESS).setMsg("删除成功");
    }

    /**
     * 查询库存
     */
    @PostMapping("/searchInventory")
    @ApiLogger(apiName = "查询库存", from="ROBOT")
    @ApiOperation("查询库存")
    public AjaxResult searchInventory(@RequestBody Detail detailed) {

        String materialName =  detailed.getMaterialName();
        String materialCode = detailed.getMaterialCode();
        AjaxResult ajaxResult = new AjaxResult();
        if(StringUtils.isEmpty(materialName) && StringUtils.isEmpty(materialCode)){
            return ajaxResult.setCode(RetCode.FAIL).setMsg("物料名称和物料编码不能同时为空");
        }

        LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        // 物料编码
        if (StringUtils.isNotEmpty(materialName)){
            lambdaQueryWrapper.eq(InventoryDetail::getMaterialName, materialName);
        // 物料名称
        }
        if (StringUtils.isNotEmpty(materialCode)){
            lambdaQueryWrapper.eq(InventoryDetail::getMaterialCode, materialCode);
        }
        List<InventoryDetail> list = inventoryDetailService.list(lambdaQueryWrapper);

        String code = null;
        BigDecimal qty = new BigDecimal(0);
        BigDecimal taskQty =  new BigDecimal(0);
        for (InventoryDetail inventoryDetail : list){
            code = inventoryDetail.getMaterialCode();
            qty = qty.add(inventoryDetail.getQty() == null ? BigDecimal.valueOf(0) : inventoryDetail.getQty());
            taskQty = taskQty.add(inventoryDetail.getTaskQty() == null ? BigDecimal.valueOf(0) : inventoryDetail.getTaskQty());
        }
        JSONObject object = new JSONObject();
        object.put("materialCode",code);
        object.put("qty",qty);
        object.put("taskQty",taskQty);
        ajaxResult.setData(object);
        return ajaxResult.setCode(RetCode.SUCCESS).setMsg("成功");
    }
}