package nc.bs.mmpac.pmo.pac0002.bp.rule;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import nc.bs.dao.BaseDAO;
import nc.bs.logging.Log;
import nc.bs.trade.business.HYPubBO;
import nc.bs.uapbd.util.MyHelper;
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.jdbc.framework.processor.MapProcessor;
import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO;
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.scmpub.util.ArrayUtil;

import java.util.Map;

/**
 * 流程生产订单审批后推送高压MES
 *
 * @author lihao
 * @date 2025/9/1
 */
public class AfterApproveSyncHighpressureMesRule implements IRule<PMOAggVO> {

    private static final String LOG_INFO_NAME = "gymeslog";
    private static final Log logger = Log.getInstance(LOG_INFO_NAME);
    private Map<String, String> configParams;

    @Override
    public void process(PMOAggVO[] pmoAggVOS) {
        if (ArrayUtil.isEmpty(pmoAggVOS)) {
            return;
        }
        configParams = MyHelper.getConfigParams("gy-config", null);
        try {
            buildSyncData(pmoAggVOS);
        } catch (Exception e) {
            logger.error("同步生产订单到高压MES系统失败: " + e.getMessage(), e);
            ExceptionUtils.wrappException(e);
        }
    }

    /**
     * 构建同步数据
     */
    private void buildSyncData(PMOAggVO[] useVOs) throws BusinessException {
        BaseDAO baseDAO = new BaseDAO();

        HYPubBO hybo = new HYPubBO();
        for (PMOAggVO vo : useVOs) {
            PMOHeadVO pmoHeadVO = vo.getParentVO();
            PMOItemVO[] itemVOS = vo.getChildrenVO();
            // 判断物料的业务单元是否是箱变公司，不是则跳过
            String pkOrg = pmoHeadVO.getPk_org();
            String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
            if (checkIfOrg(orgCode, configParams)) {
                continue;
            }
            JSONObject singleObj = new JSONObject();
            singleObj.put("bipProcessProductionOrderId", pmoHeadVO.getVbillcode());
            singleObj.put("bipId", pmoHeadVO.getCpmohid());// 主键ID
//            singleObj.put("orderQuantity", pmoHeadVO.getPlanQuantity()); // 订单数量（计划数量）
            singleObj.put("billDate", pmoHeadVO.getDbilldate().toString()); // 单据日期
            singleObj.put("orderVersion", pmoHeadVO.getVersion()); // 版本号
            singleObj.put("orderTranType", pmoHeadVO.getVtrantypecode()); // 订单交易类型
            String sql1 = " select user_name from sm_user where cuserid = '" + pmoHeadVO.getCreator() + "' ";
            String bipCreateBy = (String) baseDAO.executeQuery(sql1, new ColumnProcessor());

            singleObj.put("bipCreateBy", bipCreateBy); // 创建人ID

            // 创建子项数组
            JSONArray contentArray = new JSONArray();
            for (PMOItemVO item : itemVOS) {
                JSONObject itemObj = new JSONObject();

                // 填充子项基础信息

                String sql = " select pk_defdoclist from bd_defdoclist  where  code='zdy-001' and  dr=0 ";
                String o = (String) baseDAO.executeQuery(sql, new ColumnProcessor());

                Object contractNum = hybo.findColValue("bd_defdoc", "code", " (pk_defdoclist = '" + o + "' and pk_defdoc='" + item.getVdef1() + "') ");

                itemObj.put("contractNum", contractNum); // 合同编号
                Object pk_project = hybo.findColValue("bd_project", "project_name", " pk_project = '" + item.getCprojectid() + "' ");

                itemObj.put("entryName", pk_project); // 项目名称
                itemObj.put("bipChildId", item.getCmoid()); // 子项主键ID

                // 部门信息
                String deptsql = " select code,name from org_dept  where  pk_dept='" + item.getCdeptid() + "' and  dr=0 ";
                Map<String, Object> tr = (Map<String, Object>) baseDAO.executeQuery(deptsql, new MapProcessor());
                itemObj.put("bipDeptName", tr.get("name")); // 生产部门名称
                itemObj.put("bipDeptId", tr.get("code")); // 生产部门编码

                // 日期信息
                itemObj.put("requiredDate", item.getTrequiredate().toString()); // 需用日期

                itemObj.put("bipParentProcessProductionOrderId", item.getVparentbillcode());
                itemObj.put("bipParentProcessProductionOrderRowNum", item.getVparentmorowno());
                itemObj.put("bipOriginProcessProductionOrderId", item.getVsrccode());
                itemObj.put("bipOriginProcessProductionOrderRowNum", item.getVsrcrowno());

                // 物料信息
                String mrlsql = "select code,name,graphid,pk_measdoc,materialspec from bd_material where pk_material = '" + item.getCmaterialvid() + "' ";
                Map<String, Object> mrl = (Map<String, Object>) baseDAO.executeQuery(mrlsql, new MapProcessor());
                itemObj.put("materialCode", mrl.get("code")); // 物料编码
                itemObj.put("materialName", mrl.get("name")); // 物料名称
                itemObj.put("drawingNumber", mrl.get("graphid")); // 图号编码 graphid

                Object unit = hybo.findColValue("bd_measdoc", "code", " pk_measdoc = '" + mrl.get("pk_measdoc") + "' ");

                itemObj.put("unit", unit); // 单位 pk_measdoc

                // 生产信息
                itemObj.put("intervalModel", mrl.get("materialspec")); // 产品类型
//                itemObj.put("processCode", item.getProcedures()); // 工序编码
                itemObj.put("lineNumber", String.valueOf(item.getVrowno())); // 行号

                // 库存信息
                itemObj.put("demandInventoryOrganization", item.getCrequireorg()); // 需求库存组织
                itemObj.put("plannedInputQuantity", item.getNplanputastnum().doubleValue()); // 计划投入量
                itemObj.put("plannedOutputQuantity", item.getNmmastnum().doubleValue()); // 计划产出量
                itemObj.put("plannedStartTime", item.getTplanstarttime().toString()); // 计划开工时间
                itemObj.put("plannedCompletionTime", item.getTplanendtime().toString()); // 计划完工时间
                itemObj.put("customerMaterialCode", item.getCcustmaterialid()); // 客户物料编码
                itemObj.put("productionBatch", item.getCbatchid()); // 生产批次(按BIP格式)
                itemObj.put("productionBatchNumber", item.getVbatchcode()); // 生产批次号(按BIP格式)

                contentArray.add(itemObj); // 将子项添加到数组
            }

            singleObj.put("itemList", contentArray); // 将子项数组添加到主对象

            pushData(singleObj);
        }
    }

    /**
     * 推送同步数据
     */
    private void pushData(JSONObject param) throws BusinessException {
        // 转json字符串的时候保留null值
        String jsonStr = JSON.toJSONString(param,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty
        );
        logger.error("gyMes-PMO-param = " + jsonStr);
        String baseUrl = configParams.get("mesBaseUrl");
        String requestUrl = baseUrl + configParams.get("productionOrderAdd");
        logger.error("gyMes-PMO-url = " + requestUrl);
        String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr);
        JSONObject resultObj = JSONObject.parseObject(result);
        logger.error("gyMes-PMO-res = " + result);

        if (!"200".equals(resultObj.getString("code"))) {
            logger.error("gyMes-PMO-error,result[" + resultObj.toJSONString() + "]");
            throw new BusinessException("流程生产订单推送高压MES错误:" + resultObj.getString("msg"));
        }
    }

    private boolean checkIfOrg(String code, Map<String, String> configParams) throws BusinessException {
        String targetCode = configParams.get("gyOrg");
        if (targetCode == null || nc.vo.am.common.util.StringUtils.isEmpty(targetCode)) {
            throw new BusinessException("未配置组织参数");
        }
        String[] orgItem = targetCode.split(",");
        for (String orgCode : orgItem) {
            if (!orgCode.isEmpty() && orgCode.equals(code)) {
                return false;
            }
        }
        return true;
    }


}
