package psdi.app.iface.srm;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import psdi.app.iface.comm.UrlConstants;
import psdi.app.iface.oa.HttpUtilOa;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.util.MXException;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

import static psdi.app.iface.comm.generateSerialCode.GetSerialCode;

/**
 * 数据方向 SRM-->EAM
 * 接口调用方向：EAM-->ESB-->SRM
 * 工厂层级：EAM提 物料、设备、服务采购
 */
public class Srm2EamHandler {
    public static void main (String[] args) throws Exception {
//        new Srm2EamHandler().EAM_TO_SRM_PR(null);
//        new Srm2EamHandler().EAM_TO_SRM_PRLINE(null);
    }

    /**
     * EAM工厂需求申请往SRM同步
     */
    public JSONObject EAM_TO_SRM_PR(MboRemote mbo) throws IOException, MXException {
        //模拟数据
        List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
        Map<String, Object> headMap = new HashMap<String, Object>();
        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
        //工厂采购需求单
        headMap.put("PRNUM",mbo.getString("UDPRNUM"));
        headMap.put("CREATEDATE",sf.format(mbo.getDate("ISSUEDATE"))+"");
        headMap.put("APPRODATE",sf.format(mbo.getDate("STATUSDATE"))+"");
        headMap.put("ISURGENT",mbo.getString("URGENCY"));
        String orgid=mbo.getString("ORGID");//组织
        String siteid=mbo.getString("SITEID");//地点
        String UDLOC=mbo.getString("UDLOC");//采购地点 0-中国  1-海外
        String prfactory = "";//工厂
        if("0".equalsIgnoreCase(UDLOC)){
            prfactory="CN61";
        }else{
            prfactory=siteid;
        }
        String client = "";//client
        if("HHMC".equalsIgnoreCase(orgid)){
            client="SRM-SAP";
        }else if("TILE".equalsIgnoreCase(orgid)){
            client=UrlConstants.srmTileClient;
        }else if("FMCG".equalsIgnoreCase(orgid)){
            //SRM测试环境：森大的targetId是SRM-SAP，乐舒适的targetId是SRM-510
            //SRM生产环境：森大的targetId是SRM-SAP，乐舒适的targetId是SRM-810
            client=UrlConstants.srmClient;
        }else if("NFMCG".equalsIgnoreCase(orgid)){
            client="SRM-SAP";
        }
        headMap.put("PRFACTORY",prfactory);
        headMap.put("client",client);//区分client
        headMap.put("NOTE",mbo.getString("DESCRIPTION"));
        headMap.put("CREATER",mbo.getString("REQUESTEDBY"));
        headMap.put("CREATENAME",mbo.getString("PR_PERSON_REQUEST.DISPLAYNAME"));
        headMap.put("TRANSPORT",mbo.getString("SHIPTYPE"));
        headMap.put("PJSTATUS",mbo.getString("PROSTATUS"));
        headMap.put("PRTYPE",mbo.getString("REPCATEGORY"));

        MboSetRemote prlineSet=mbo.getMboSet("PRLINE");

        if(null!=prlineSet && !prlineSet.isEmpty()){
            for(int i=0;i<prlineSet.count();i++){
                Map<String, Object> lineMap = new HashMap<String, Object>();
                MboRemote prlineMbo=prlineSet.getMbo(i);
                //工厂采购需求单子表信息
                lineMap.put("PRLINENUM", prlineMbo.getString("PRLINENUM").replace(",", ""));
                lineMap.put("RQFACTORY", siteid);
                lineMap.put("RQFACTORYDESC", prlineMbo.getString("SITE.DESCRIPTION"));
                lineMap.put("WORKSHOPREQNUM", prlineMbo.getString("UDPRNUM"));
                lineMap.put("ITEMNUM", prlineMbo.getString("ITEMNUM"));
                lineMap.put("ITEMDESC", prlineMbo.getString("DESCRIPTION"));
                lineMap.put("QUANTITY", prlineMbo.getDouble("ORDERQTY"));//
                lineMap.put("APPQUANTITY", prlineMbo.getDouble("APPRQUANTITY"));
                lineMap.put("BASICUNIT", prlineMbo.getString("ORDERUNIT"));
                lineMap.put("DATEREQ", sf.format(mbo.getDate("REQUIREDDATE"))+"");
                lineMap.put("PRLINEDESC", prlineMbo.getString("REMARKS"));
                lineMap.put("COUNTRY", prlineMbo.getString("PRONUM.GJ"));
                lineMap.put("PROJECTNUM", prlineMbo.getString("PRONUM"));
                lineMap.put("PROJECTNAME", prlineMbo.getString("PRONUM.XMMC"));
                lineMap.put("PRLINEDESC", prlineMbo.getString("REMARKS"));
                dataList.add(lineMap);
            }
        }
        // 发送请求数据格式化
        JSONObject alldata = formatDataSend(headMap,dataList);
        // 调用接口
        JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
        System.out.println("EAM推送至SRM： "+UrlConstants.restEsbUrl+"/"+alldata.toString());
        return result;
    }

    /**
     * EAM为获取采购需求行状态相关信息，需要传：采购需求单号和需求单行号
     * EAM工厂需求申请明细行，从SRM中获取
     */
    public void EAM_TO_SRM_PRLINE(MboRemote prlineMbo,String udprnum,String prlinenum) throws IOException, MXException, ParseException {
        Map<String, Object> headMap = new HashMap<String, Object>();
        //工厂采购需求单
        headMap.put("ORGID",prlineMbo.getString("ORGID"));
        headMap.put("PRNUM",udprnum);
        //工厂采购需求单子表信息
        headMap.put("PRLINENUM", prlinenum);
        // 发送请求数据格式化
        JSONObject alldata = formatDataLineSend(headMap);
        // 调用接口
        JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
        // 解析接口返回数据
        JSONArray dataArray = formatDataLineReceived(result.toString());
        if(dataArray!=null && dataArray.size()>0){
            ArrayList<String> sqlList = new ArrayList<>();
            for (int i = 0; i < dataArray.size(); i++) {
                Map<String, Object> map = new HashMap<String, Object>();
                JSONObject jsonObj = (JSONObject) dataArray.get(i);//获取每个json对象
                String PRNUM = (String) jsonObj.get("PRNUM");//工厂请购单号
                String PRLINENUM = (String) jsonObj.get("PRLINENUUM");//工厂请购单行号
                String STATUS = (String) jsonObj.get("STATUS");//单据状态,SRM用（状态码-状态名），拼过来
                String PURCHASESPE = (String) jsonObj.get("PURCHASESPE");//采购专员
                String PURCHASEENGINEER = (String) jsonObj.get("PURCHASEENGINEER");//采购工程师
                String UNLOCK = (String) jsonObj.get("UNLOCK");//解锁原因
                String PONUM = (String) jsonObj.get("PONUM");//采购订单号,多个订单号会以英文逗号,拆分
                String POLINENUM = (String) jsonObj.get("POLINENUM");//采购订单行号
                String SRMPONUM = (String) jsonObj.get("SRMPONUM");//SRM采购订单号
                String POCREATEDATE = (String) jsonObj.get("POCREATEDATE");//采购订单创建日期
                String PACKLISTNUM = (String) jsonObj.get("PACKLISTNUM");//包装单号
                String PACKNUM = (String) jsonObj.get("PACKNUM");//包装码
                String SENDDATE = (String) jsonObj.get("SENDDATE");//发货日期
//                String INTERNALORDERNO = (String) jsonObj.get("INTERNALORDERNO");//线下合同号
//                String PRICEREVIEWTIME = (String) jsonObj.get("PRICEREVIEWTIME");//定商定价时间
                //更新工厂需求申请明细行SRM返回的采购明细信息
                prlineMbo.setValue("STATUS", STATUS,2L);
                prlineMbo.setValue("PURCHASESPE", PURCHASESPE,2L);
                prlineMbo.setValue("PURCHASEENGINEER", PURCHASEENGINEER,2L);
                prlineMbo.setValue("UNLOCK", UNLOCK,2L);
                prlineMbo.setValue("UDPONUM", PONUM,2L);
                if(null!=POLINENUM && !"".equalsIgnoreCase(POLINENUM)){
                    prlineMbo.setValue("POLINENUM",Integer.valueOf(Integer.parseInt(POLINENUM)),2L);//2L表示：强制插入
                }
                prlineMbo.setValue("SRMPONUM", SRMPONUM,2L);
                prlineMbo.setValue("POCREATEDATE", POCREATEDATE,2L);
                prlineMbo.setValue("PACKLISTNUM", PACKLISTNUM,2L);
                prlineMbo.setValue("PACKNUM", PACKNUM,2L);
                prlineMbo.setValue("SENDDATE", SENDDATE,2L);
//                prlineMbo.setValue("INTERNALORDERNO", INTERNALORDERNO,2L);
//                prlineMbo.setValue("PRICEREVIEWTIME", PRICEREVIEWTIME,2L);
                prlineMbo.getThisMboSet().save();
//                prlineMbo.getThisMboSet().close();
            }
        }
    }

    /**
     * 发送REST请求到ESB，先进行数据格式化
     */
    public JSONObject formatDataSend(Map<String, Object> headMap,List<Map<String, Object>> dataList) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();//ESB报文
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject Main_DATA = new JSONObject();//主表数据
        JSONArray LINE_DATA = new JSONArray();//子表数据
        JSONObject HEAD = new JSONObject();//包含主、子表数据
        //esb接口平台报文
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        ESB_ATTRS.put("Target_ID", headMap.get("client")); //目标系统--区分client
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        //解析采购需求主表信息
        Main_DATA.put("PRNUM",headMap.get("PRNUM"));//工厂请购单号
        Main_DATA.put("CREATEDATE",headMap.get("CREATEDATE"));//请购单创建日期
        Main_DATA.put("APPRODATE",headMap.get("APPRODATE"));//请购单审批通过日期
        Main_DATA.put("ISURGENT",headMap.get("ISURGENT"));//是否紧急需求  1-紧急、0-正常
        Main_DATA.put("PRFACTORY",headMap.get("PRFACTORY"));//采购工厂 默认：CN01（森大贸易），后面可进行改造
        Main_DATA.put("NOTE",headMap.get("NOTE"));//抬头备注
        Main_DATA.put("CREATER",headMap.get("CREATER"));//申请人工号
        Main_DATA.put("CREATENAME",headMap.get("CREATENAME"));//申请人姓名
        Main_DATA.put("TRANSPORT",headMap.get("TRANSPORT"));//采用的运输方式 0：海运；2：人带；1：空运
        Main_DATA.put("PJSTATUS",headMap.get("PJSTATUS"));//项目状态 1：已投产；0：未投产
        Main_DATA.put("DFTYPE","EAM PR");//需求类型：默认值：EAM请购单
        Main_DATA.put("PRTYPE",headMap.get("PRTYPE"));//类别 0:物料采购申请；1：设备采购申请；2：委外服务采购申
        //采购单行信息解析
        for (Map<String, Object> map : dataList) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("PRLINENUUM", map.get("PRLINENUM"));//工厂请购单行号
            jsonObject.put("RQFACTORY", map.get("RQFACTORY"));//需求工厂
            jsonObject.put("RQFACTORYDESC", map.get("RQFACTORYDESC"));//需求工厂名称
            jsonObject.put("WORKSHOPREQNUM", map.get("WORKSHOPREQNUM"));//车间请购单号
            jsonObject.put("ITEMNUM", map.get("ITEMNUM"));//物料编码
            jsonObject.put("ITEMDESC", map.get("ITEMDESC"));//物料描述
            jsonObject.put("QUANTITY", map.get("QUANTITY"));//申请数量
            jsonObject.put("APPQUANTITY", map.get("APPQUANTITY"));//批准数量
            jsonObject.put("BASICUNIT", map.get("BASICUNIT"));//单位
            jsonObject.put("DATEREQ", map.get("DATEREQ"));//期望交货日期
//            jsonObject.put("BRAND", map.get("BRAND"));//品牌
            jsonObject.put("PRLINEDESC", map.get("PRLINEDESC"));//行项目备注
            jsonObject.put("COUNTRY", map.get("COUNTRY"));//国家
            jsonObject.put("PROJECTNUM", map.get("PROJECTNUM"));//项目立项编号
            jsonObject.put("PROJECTNAME", map.get("PROJECTNAME"));//项目名称
            jsonObject.put("PRLINEDESC", map.get("PRLINEDESC"));//行备注
            LINE_DATA.add(jsonObject);
        }
        HEAD.put("MAINDATA", Main_DATA);
        HEAD.put("LINEDATA",LINE_DATA);
//        REQUEST_DATA.put("Head",HEAD);
        REQUEST_DATA.put("SendData",HEAD);//修改20240202
        REQUEST_DATA.put("Operation", "EAM_TO_SRM_PR");
        REQUEST_DATA.put("Type", "EAM_TO_SRM_PR");
        REQUEST_DATA.put("token", "EAM");
        REQUEST_DATA.put("HeadType", "0");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }

    /**
     * 发送REST请求到ESB，先进行数据格式化
     */
    public JSONObject formatDataLineSend(Map<String, Object> headMap) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();//ESB报文
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject Main_DATA = new JSONObject();//主表数据
        JSONArray LINE_DATA = new JSONArray();//子表数据
        JSONObject HEAD = new JSONObject();//包含主、子表数据
        String orgid = (String) headMap.get("ORGID");
        String client = "";//区分client
        //esb接口平台报文
        if("HHMC".equalsIgnoreCase(orgid)){
            client="SRM-SAP";
        }else if("TILE".equalsIgnoreCase(orgid)){
            client=UrlConstants.srmTileClient;
        }else if("FMCG".equalsIgnoreCase(orgid)){
            client="SRM-510";//测试
//            client="SRM-810";//生产
        }else if("NFMCG".equalsIgnoreCase(orgid)){
            client="SRM-SAP";
        }
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        ESB_ATTRS.put("Target_ID", client); //目标系统
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        //解析采购需求主表信息
        Main_DATA.put("PRNUM",headMap.get("PRNUM"));//工厂请购单号
        Main_DATA.put("PRLINENUUM",headMap.get("PRLINENUM"));//工厂请购单行号
        LINE_DATA.add(Main_DATA);
        HEAD.put("LINEDATA",LINE_DATA);
//        REQUEST_DATA.put("Head",HEAD);
        REQUEST_DATA.put("SendData",HEAD);
        REQUEST_DATA.put("Operation", "SRM_TO_EAM_PRLINE_STATUS");//SRM_TO_EAM_PRLINE_STATUS
        REQUEST_DATA.put("Type", "SRM_TO_EAM_PRLINE_STATUS");
        REQUEST_DATA.put("token", "EAM");
        REQUEST_DATA.put("HeadType", "0");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }
    /**
     * 解析接口返回数据
     **/
    public String formatDataReceived(String received) {
        JSONObject jsonObject = JSONObject.parseObject(received);
        String codeStr = String.valueOf(jsonObject.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getString("status"));//返回值
        String message = String.valueOf(jsonObject.getString("message"));
        return codeStr;
    }

    /**
     * 解析接口返回数据
     **/
    public JSONArray formatDataLineReceived(String received) {
        JSONObject jsonObject = JSONObject.parseObject(received);
        JSONObject RETURN_DATA = jsonObject.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");//返回值
        String status = (String) RETURN_DATA.get("status");
        String data = (String) RETURN_DATA.get("data");
        if ("S".equals(status)) {
            return JSONArray.parseArray(data);
        } else {
            return null;
        }
    }

    /**
     * @author liuxq
     * @param RQFACTORY 需求工厂编号
     * @previous  当前工厂提报的最大的单号
     * @return  工厂采购需求单号
     */
    public String getPRNUM(String RQFACTORY,String previous){
        //根据SRM要求，EAM保持和SPMS采购需求单号一致的命名规则。为避免造成EAM和spms的单号重复，Eam这边加一个前缀EAM.
        //EAM+需求工厂编号 + 年份 + 三位流水号 ; 比如：EAM-GF01-2023-001
        String PRNUM = "";//采购需求单号
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        String year = sdf.format(new Date());
        String serialCode = GetSerialCode(3,999,previous);
        PRNUM = "EAM"+"-"+RQFACTORY+"-"+year+"-"+serialCode;
        return PRNUM;
    }

}
