package nc.bs.qc.c003.maintain.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.framework.common.NCLocator;
import nc.bs.logging.Log;
import nc.bs.uapbd.util.MyHelper;
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.itf.bd.supplier.baseinfo.ISupplierBaseInfoQryService;
import nc.vo.bd.material.MaterialVO;
import nc.vo.bd.material.measdoc.MeasdocVO;
import nc.vo.bd.psn.PsndocVO;
import nc.vo.bd.supplier.SupplierVersionVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.qc.c003.entity.ReportHeaderVO;
import nc.vo.qc.c003.entity.ReportItemVO;
import nc.vo.qc.c003.entity.ReportVO;
import nccloud.baseapp.core.log.NCCForUAPLogger;

import java.util.Map;

/**
 * 箱变-质检报告推启源MES
 *
 * @author mzr
 * @date 2025/8/26
 */
public class SyncQcQmsRule implements IRule<ReportVO> {

    private static final String LOG_INFO_NAME = "qyMesLog";
    private static final Log logger = Log.getInstance(LOG_INFO_NAME);
    private static final String reqUrl = "/IF_QyErpApi.ashx?action=addsjd";
    private Map<String, String> configParams;

    @Override
    public void process(ReportVO[] reportVOS) {
        try {
            if (reportVOS == null || reportVOS.length == 0) {
                return;
            }
            configParams = MyHelper.getConfigParams("xb-config", null);
            if (configParams.isEmpty()) {
                throw new BusinessException("箱变的QMS接口缺少配置");
            }
            buildSyncData(reportVOS);
        } catch (Exception e) {
            ExceptionUtils.wrappException(e);
        }
    }

    /**
     * 构建同步数据
     */
    private void buildSyncData(ReportVO[] useVOs) throws BusinessException {
        for (ReportVO vo : useVOs) {
            ReportHeaderVO hvo = vo.getHVO();
            ReportItemVO[] bvo = vo.getBVO();
            // 判断物料的业务单元是否是箱变公司，不是则跳过
            String pkOrg = hvo.getPk_org();
            String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
            if (checkIfOrg(orgCode, configParams)) {
                continue;
            }
            // 查询供应商信息
            String pk_supplier_v = hvo.getPk_supplier_v();
            ISupplierBaseInfoQryService baseQryService = NCLocator.getInstance().lookup(ISupplierBaseInfoQryService.class);
            SupplierVersionVO supplierVersionVO = baseQryService.querySupplierVersionByVID(pk_supplier_v);
            // 查询人员信息
            String pkApplyer = hvo.getPk_applyer();
            String applyerName = MyHelper.getStrValByCondition(PsndocVO.getDefaultTableName(), PsndocVO.NAME,
                    PsndocVO.PK_PSNDOC + " = '" + pkApplyer + "'");
            String bz = "", cghth = "";
            if (bvo != null && bvo.length > 0) {
                bz = bvo[0].getVbdef1(); // BOM备注
                cghth = bvo[0].getVbdef2(); // 采购单号
            }
            // 组装数据
            JSONObject singleObj = new JSONObject();
            long cts = System.currentTimeMillis();
            singleObj.put("batchid", cts);
            singleObj.put("csdh", hvo.getVapplybillcode());// 送检单号，采购送检单的唯一标识编号
            singleObj.put("sjrq", hvo.getDapplydate().toString());// 送检日期，格式建议为 yyyy-MM-dd
            singleObj.put("wlgysid", supplierVersionVO.getCode());// 供应商编码
            singleObj.put("wlgysmc", supplierVersionVO.getName());// 供应商名称
            singleObj.put("sjr", applyerName);// 送检人，负责提交送检单的人员姓名
            singleObj.put("cghth", cghth);// 采购合同号，关联对应的采购合同
            singleObj.put("bz", hvo.getVmemo());// 摘要备注，用于填写送检单的补充说明信息

            String pkMaterial = hvo.getPk_material();
            Map<String, Object> materialMap = MyHelper.getMapValByCondition(MaterialVO.getDefaultTableName(), "code,name,materialspec,materialtype",
                    "pk_material = '" + pkMaterial + "'");
            String cunitid = hvo.getCunitid();// 主单位
            String cunitname = MyHelper.getStrValByCondition(MeasdocVO.getDefaultTableName(), MeasdocVO.NAME,
                    MeasdocVO.PK_MEASDOC + " = '" + cunitid + "'");
            // 处理Content数组
            JSONArray contentArray = new JSONArray();
            JSONObject itemObj = new JSONObject();
            itemObj.put("wlbh", materialMap.getOrDefault("code", "")); // 物料编码
            itemObj.put("wlmc", materialMap.getOrDefault("name", "")); // 物料名称
            String materialtype = materialMap.getOrDefault("materialtype", "") + "";
            String materialspec = materialMap.getOrDefault("materialspec", "") + "";
            itemObj.put("wlxhgg", materialtype + materialspec); // 物料型号规格
            itemObj.put("sjsl", hvo.getNapplynum().toString()); // 送检数量（设计单位），按设计计量单位统计的送检数量
            itemObj.put("jldw", cunitname); // 计量单位
            itemObj.put("bz", bz); // 明细备注，用于填写该送检物料的补充说明
            contentArray.add(itemObj);

            singleObj.put("Content", contentArray);
/*            {
                "batchid": "10002",
                "csdh": "SJ202405001",
                "sjrq": "2024-05-20",
                "wlgysid": "GY001",
                "wlgysmc": "XX 金属材料有限公司",
                "sjr": "张三",
                "cghth": "HT202405003",
                "bz": "紧急送检，需优先检测",
                "Content": [
                    {
                        "wlbh": "ACC26711",
                            "wlmc": "铜排",
                            "wlxhgg": "15558190831",
                            "jldw": "米",
                            "sjsl": "50",
                            "bz": "无特殊要求"
                    }
                ]
               }*/
            pushData(singleObj);
        }
    }

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

        if (!"true".equals(resultObj.getString("success"))) {
            // throw new BusinessException("QMS-QC-error:" + resultObj.getString("msg"));
            logger.error("QMS-QC-error,result[" + resultObj.toJSONString() + "]");
        }
    }

    private boolean checkIfOrg(String code, Map<String, String> configParams) throws BusinessException {
        String targetCode = configParams.get("xbOrg");
        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;
    }

}
