MesCallbackService.java 7.82 KB
package com.huaheng.api.mes.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.huaheng.api.mes.domain.MesNearExpiryInspectionBody;
import com.huaheng.api.mes.domain.MesNearExpiryInspectionItem;
import com.huaheng.api.mes.domain.MesNearExpiryInspectionRequest;
import com.huaheng.api.mes.domain.PushBoxStatusItem;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.restful.RestUtil;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.address.service.AddressService;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

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

/**
 * MES回调服务。
 */
@Service
public class MesCallbackService {

    private static final int MES_SUCCESS_CODE = 1;

    private static final int MES_NEAR_EXPIRY_SUCCESS_CODE = 200;

    /**
     * 成品箱已入库状态。
     */
    public static final String BOX_STATUS_INBOUND = "已入库";

    @Resource
    private AddressService addressService;

    /**
     * WMS上架完成后,向MES推送成品箱入库状态。
     *
     * @param qrcode 成品箱码(箱标签)
     * @return MES响应结果
     */
    public AjaxResult pushProductBoxInboundStatus(String qrcode) {
        PushBoxStatusItem item = new PushBoxStatusItem();
        item.setQrcode(qrcode);
        item.setBoxstatus(BOX_STATUS_INBOUND);
        return pushBoxStatus(Collections.singletonList(item));
    }

    /**
     * 向MES推送成品箱状态。
     *
     * @param items 箱状态列表,每项包含 qrcode、boxstatus
     * @return MES响应结果(code、msg、data 与接口一致)
     */
    public AjaxResult pushBoxStatus(List<PushBoxStatusItem> items) {
        if (StringUtils.isEmpty(items)) {
            return AjaxResult.error("推送明细不能为空");
        }
        for (PushBoxStatusItem item : items) {
            if (item == null) {
                return AjaxResult.error("推送明细项不能为空");
            }
            if (StringUtils.isEmpty(item.getQrcode())) {
                return AjaxResult.error("成品箱码不能为空");
            }
            if (StringUtils.isEmpty(item.getBoxstatus())) {
                return AjaxResult.error("成品箱状态不能为空");
            }
        }

        String jsonParam = JSON.toJSONString(items);

        try {
            String url = addressService.selectAddress(QuantityConstant.ADDRESS_MES_CALLBACK,
                    QuantityConstant.DEFAULT_WAREHOUSE, QuantityConstant.DEFAULT_AREA);
            ResponseEntity<JSONObject> result = RestUtil.request_post(url, QuantityConstant.DEFAULT_WAREHOUSE, jsonParam);

            if (result == null || result.getBody() == null) {
                return AjaxResult.error("调用MES推送成品入库状态接口失败,接口地址错误或返回为空");
            }

            JSONObject body = result.getBody();
            int code = body.getIntValue("code");
            String msg = body.getString("msg");
            Object data = body.get("data");

            if (code == MES_SUCCESS_CODE) {
                return AjaxResult.success(msg, data);
            }
            return AjaxResult.error(msg, data);
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 向MES推送临期检验送检数据。
     *
     * @param requests 送检请求列表,结构与MES接口报文一致
     * @return MES响应结果(code、success、msg、data)
     */
    public AjaxResult pushNearExpiryInspection(List<MesNearExpiryInspectionRequest> requests) {
        AjaxResult validateResult = validateNearExpiryInspectionRequests(requests);
        if (validateResult != null) {
            return validateResult;
        }

        String jsonParam = JSON.toJSONString(requests);

        try {
            String url = addressService.selectAddress(QuantityConstant.ADDRESS_MES_CALLBACK,
                    QuantityConstant.DEFAULT_WAREHOUSE, QuantityConstant.DEFAULT_AREA);
            ResponseEntity<JSONObject> result = RestUtil.request_post(url, QuantityConstant.DEFAULT_WAREHOUSE, jsonParam);

            if (result == null || result.getBody() == null) {
                return AjaxResult.error("调用MES临期检验送检接口失败,接口地址错误或返回为空");
            }

            JSONObject body = result.getBody();
            int code = body.getIntValue("code");
            boolean success = body.getBooleanValue("success");
            String msg = body.getString("msg");
            Object data = body.get("data");

            if (code == MES_NEAR_EXPIRY_SUCCESS_CODE && success) {
                return AjaxResult.success(msg, data);
            }
            return AjaxResult.error(msg, data);
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    private AjaxResult validateNearExpiryInspectionRequests(List<MesNearExpiryInspectionRequest> requests) {
        if (StringUtils.isEmpty(requests)) {
            return AjaxResult.error("送检请求不能为空");
        }
        for (MesNearExpiryInspectionRequest request : requests) {
            if (request == null) {
                return AjaxResult.error("送检请求项不能为空");
            }
            if (StringUtils.isEmpty(request.getCompanyId())) {
                return AjaxResult.error("组织id不能为空");
            }
            if (StringUtils.isEmpty(request.getEntId())) {
                return AjaxResult.error("企业代号不能为空");
            }
            if (StringUtils.isEmpty(request.getBillNo())) {
                return AjaxResult.error("单据号不能为空");
            }
            if (StringUtils.isEmpty(request.getBody())) {
                return AjaxResult.error("送检明细不能为空");
            }
            for (MesNearExpiryInspectionBody bodyItem : request.getBody()) {
                AjaxResult bodyValidateResult = validateNearExpiryInspectionBody(bodyItem);
                if (bodyValidateResult != null) {
                    return bodyValidateResult;
                }
            }
        }
        return null;
    }

    private AjaxResult validateNearExpiryInspectionBody(MesNearExpiryInspectionBody bodyItem) {
        if (bodyItem == null) {
            return AjaxResult.error("送检明细项不能为空");
        }
        if (StringUtils.isEmpty(bodyItem.getMaterial())) {
            return AjaxResult.error("物料号不能为空");
        }
        if (bodyItem.getQty() == null) {
            return AjaxResult.error("物料数量不能为空");
        }
        if (StringUtils.isEmpty(bodyItem.getDefine1())) {
            return AjaxResult.error("平库/立库标识不能为空");
        }
        if (StringUtils.isEmpty(bodyItem.getSourceXc())) {
            return AjaxResult.error("来源标识不能为空");
        }
        if (StringUtils.isEmpty(bodyItem.getWarehouseCode())) {
            return AjaxResult.error("仓库编码不能为空");
        }
        if (StringUtils.isEmpty(bodyItem.getDeliveryDate())) {
            return AjaxResult.error("送检日期不能为空");
        }
        if (StringUtils.isEmpty(bodyItem.getItem())) {
            return AjaxResult.error("标签明细不能为空");
        }
        for (MesNearExpiryInspectionItem item : bodyItem.getItem()) {
            if (item == null) {
                return AjaxResult.error("标签明细项不能为空");
            }
            if (item.getQty() == null) {
                return AjaxResult.error("标签数量不能为空");
            }
            if (StringUtils.isEmpty(item.getQrcode())) {
                return AjaxResult.error("二维码不能为空");
            }
        }
        return null;
    }
}