package psdi.app.iface.oa;

import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.softlayer.api.service.metric.tracking.Object;
import psdi.app.iface.comm.UrlConstants;
import psdi.mbo.MboRemote;
import psdi.util.MXApplicationException;

import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * EAM工厂需求申请往OA同步接口
 * edit 20230421
 */
public class Eam2OaPrHandler {

    public static void main (String[] args) throws Exception {
//        new Eam2OaPrHandler().EAM_OA_PR_IDLE(null);
    }

    public JSONObject EAM_OA_PR_IDLE(MboRemote mbo) throws Exception {
        JSONObject doCreReqJso=null;
        try {
            String requestedby=mbo.getString("REQUESTEDBY");
            String orgid=mbo.getString("ORGID");
            SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
            String issuedate=sf.format(mbo.getDate("ISSUEDATE"));
            //获取人员信息
            Map heads = new HashMap();
            String token=EamToOaWorkflowUtils.getToken(orgid);
            String userid=EamToOaWorkflowUtils.getUserid("1");//首次调用获取人员接口,id传1
            String appid=UrlConstants.appid;
            heads.put("appid", appid);
            heads.put("token", token);
            heads.put("userid",userid);
            heads.put("workcode",requestedby);
//            Map<String, Object> param=new HashMap<String, Object>();
//            param.put("workcode",requestedby);
//            String data = HttpRequest.get(UrlConstants.getPersonUrl)
//                    .header("appid","b9d69c35-945c-cbef-dc71-e69fe02e8f90")
//                    .header("token",token)
//                    .header("userid",userid)
//                    .header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
//                    .form(param)
//                    .execute().body();
            JSONObject alldata = formatDataPerson(heads,orgid);
            JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
            JSONObject RESPONSE = (JSONObject) result.get("RESPONSE");
            if(null!=RESPONSE){
                JSONObject RETURN_DATA = (JSONObject) RESPONSE.get("RETURN_DATA");
                if(null!=RETURN_DATA){
                    String code=  RETURN_DATA.getString("msgcode");
                    if("1".equalsIgnoreCase(code)){
                        String data2=RETURN_DATA.getString("data");
                        JSONObject jsonObject2 = JSONObject.parseObject(data2);
                        String user_id=jsonObject2.getString("id");
                        String departmentid=jsonObject2.getString("departmentid");
                        String departmentname=jsonObject2.getString("departmentname");
                        String jobtitleid=jsonObject2.getString("jobtitleid");
                        String line = jsonObject2.getString("line");
                        String point = jsonObject2.getString("point");
                        String company = jsonObject2.getString("company");
                        String hjbs = "OA";//环境标识 OA固定值

                        //调用OA创建流程接口
                        Map<String, String> heads2 = new HashMap<String, String>();
                        Map<String, String> mainMap=new HashMap<String, String>();
                        String userid2=EamToOaWorkflowUtils.getUserid(user_id);//传入当前登录人在OA人员信息接口中的id
                        String udoaid=mbo.getString("UDOAID");
                        String str1="";
                        if("3601".equalsIgnoreCase(udoaid)){
                            str1="[{\"fieldName\":\"bianhao\",\"fieldValue\":\"\"}," +
                                    "{\"fieldName\":\"spmsordernum\",\"fieldValue\":\""+mbo.getString("UDPRNUM")+"\"}," + //工厂需求申请单号
                                    "{\"fieldName\":\"shenqingren\",\"fieldValue\":\""+user_id+"\"}," + //创建人id
                                    "{\"fieldName\":\"gonghao\",\"fieldValue\":\""+requestedby+"\"}," + //创建人工号
                                    "{\"fieldName\":\"riqi\",\"fieldValue\":\""+issuedate+"\"}," + //申请日期
                                    "{\"fieldName\": \"bumen\",\"fieldValue\": \""+departmentid+"\"}," + //申请人部门
                                    "{\"fieldName\": \"zhiwu\",\"fieldValue\": \""+jobtitleid+"\"}," + //创建人岗位
                                    "{\"fieldName\": \"fenxian\",\"fieldValue\": \""+line+"\"}," + //创建人-所属分线
                                    "{\"fieldName\": \"fendian\",\"fieldValue\": \""+point+"\"}," + //创建人-所属分点
                                    "{\"fieldName\": \"fengongsi\",\"fieldValue\": \""+company+"\"}," + //创建人-所属分公司
                                    "{\"fieldName\": \"hjbs\",\"fieldValue\": \""+hjbs+"\"}," + //环境标识
                                    "{\"fieldName\": \"facdept\",\"fieldValue\": \""+departmentid+"\"}," + //工厂关联部门
                                    "{\"fieldName\": \"fydep\",\"fieldValue\": \""+departmentid+"\"}," + //费用承担部门
                                    "{\"fieldName\": \"xmzt\",\"fieldValue\": \""+mbo.getString("PROSTATUS")+"\"}," + //项目状态 0已投产 1未投产
                                    "{\"fieldName\": \"xmlx\",\"fieldValue\": \""+mbo.getString("PROTYPE")+"\"}," + //项目类型
                                    "{\"fieldName\": \"wllb\",\"fieldValue\": \""+mbo.getString("REPCATEGORY")+"\"},"+ //（物料类别） 3备品备件；4行政物资；5工厂设备；6筹建物资
                                    "{\"fieldName\": \"yunshu\",\"fieldValue\": \""+mbo.getString("SHIPTYPE")+"\"}," + //运输方式 0海运；1空运；2人带
                                    "{\"fieldName\": \"yqdhrq\",\"fieldValue\": \""+sf.format(mbo.getDate("REQUIREDDATE"))+"\"}," + //需求到货日期
                                    "{\"fieldName\":\"cgdd\",\"fieldValue\":\""+mbo.getString("UDLOC")+"\"}," + //采购地点
                                    "{\"fieldName\":\"sqlb\",\"fieldValue\":\""+mbo.getString("PR2")+"\"}," + //申请类别 0临时采购，1月度；2季度；3年度
                                    "{\"fieldName\":\"hjjeRMB\",\"fieldValue\":\""+mbo.getDouble("PRETAXTOTAL")+"\"}," + //合计金额（人民币）
                                    "{\"fieldName\": \"beizhu\",\"fieldValue\": \""+mbo.getString("APPREASON")+"\"}]"; //备注说明（传申请原因）
                            mainMap.put("workflowId","82522");//4028对应3601流程,固定值，20240807改为82522
                        }else if("1201".equalsIgnoreCase(udoaid)){
                            str1="[{\"fieldName\":\"riqi\",\"fieldValue\":\""+issuedate+"\"}," + //申请日期
                                    "{\"fieldName\":\"shenqingren\",\"fieldValue\":\""+user_id+"\"}," + //创建人id
                                    "{\"fieldName\":\"bumen\",\"fieldValue\":\""+departmentid+"\"}," + //申请人部门
                                    "{\"fieldName\":\"zhiwu\",\"fieldValue\":\""+jobtitleid+"\"}," + //创建人岗位
                                    "{\"fieldName\": \"sdline\",\"fieldValue\": \""+line+"\"}," + //创建人-所属分线
                                    "{\"fieldName\": \"hjbs\",\"fieldValue\": \""+hjbs+"\"}," + //环境标识
                                    "{\"fieldName\": \"fybmspms\",\"fieldValue\": \""+departmentname+"\"}," + //工厂关联部门
                                    "{\"fieldName\": \"fybm\",\"fieldValue\": \""+departmentname+"\"}," + //费用承担部门
                                    "{\"fieldName\":\"xmlx\",\"fieldValue\":\""+mbo.getString("PROTYPE")+"\"}," +  //项目类型
                                    "{\"fieldName\":\"devicetype\",\"fieldValue\":\""+mbo.getString("DEVICETYPE")+"\"}," +  //设备类型
                                    "{\"fieldName\":\"status\",\"fieldValue\":\""+mbo.getString("PROSTATUS")+"\"}," + //项目状态 0已投产 1未投产
                                    "{\"fieldName\":\"sfhy\",\"fieldValue\":\""+(("0".equalsIgnoreCase(mbo.getString("SHIPTYPE")))?1:0)+"\"}," +  //是否海运
                                    "{\"fieldName\":\"cgzje\",\"fieldValue\":\""+mbo.getDouble("PRETAXTOTAL")+"\"}," + //采购金额
                                    "{\"fieldName\":\"remark\",\"fieldValue\":\""+mbo.getString("APPREASON")+"\"}," + //备注说明（传申请原因）
                                    "{\"fieldName\":\"spmsordernum\",\"fieldValue\":\""+mbo.getString("UDPRNUM")+"\"}," + //单据号
                                    "{\"fieldName\":\"cgdd\",\"fieldValue\":\""+mbo.getString("UDLOC")+"\"}," + //采购地点
                                    "{\"fieldName\":\"sqlb\",\"fieldValue\":\""+mbo.getString("PR2")+"\"}," + //申请类别 0临时采购，1月度；2季度；3年度
                                    "{\"fieldName\": \"bianhao\",\"fieldValue\": \"\"}]";
                            if("FMCG".equalsIgnoreCase(orgid)){
                                mainMap.put("workflowId","23521");//23521对应1201流程,固定值 IPO
                            }else{
                                mainMap.put("workflowId","1026");//1026对应1201流程,固定值
                            }
                        }else if("3623".equalsIgnoreCase(udoaid)){//3623对应附件的3602
                            str1="[{\"fieldName\":\"zd2\",\"fieldValue\":\""+issuedate+"\"}," +
                                    "{\"fieldName\": \"zd4\",\"fieldValue\": \""+user_id+"\"}," +
                                    "{\"fieldName\": \"zd5\",\"fieldValue\": \""+departmentid+"\"}," +
                                    "{\"fieldName\": \"zd6\",\"fieldValue\": \""+jobtitleid+"\"}," +
                                    "{\"fieldName\": \"zd3\",\"fieldValue\": \""+requestedby+"\"}," +
                                    "{\"fieldName\": \"zd1\",\"fieldValue\": \"\"}," +
                                    "{\"fieldName\": \"spmsordernum\",\"fieldValue\": \""+mbo.getString("UDPRNUM")+"\"}]";
                            mainMap.put("workflowId","35022");//21021对应3623流程,固定值，20240807联调OA测试特福测试环境"workflowId":"35022"
                        }else if("0735".equalsIgnoreCase(udoaid)){//0735对应附件的0705
                            str1="[{\"fieldName\":\"zd2\",\"fieldValue\":\""+issuedate+"\"}," +
                                    "{\"fieldName\": \"zd4\",\"fieldValue\": \""+user_id+"\"}," +
                                    "{\"fieldName\": \"zd5\",\"fieldValue\": \""+departmentid+"\"}," +
                                    "{\"fieldName\": \"zd6\",\"fieldValue\": \""+jobtitleid+"\"}," +
                                    "{\"fieldName\": \"zd3\",\"fieldValue\": \""+requestedby+"\"}," +
                                    "{\"fieldName\": \"zd1\",\"fieldValue\": \"\"}," +
                                    "{\"fieldName\": \"spmsordernum\",\"fieldValue\": \""+mbo.getString("UDPRNUM")+"\"}]";
                            mainMap.put("workflowId","20521");//21021对应0735流程,固定值
                        }
                        JSONArray jsonArray = JSONArray.parseArray(str1);
                        mainMap.put("mainData", jsonArray.toString());
                        mainMap.put("detailData","");
                        String pr1=mbo.getString("PR1");
                        if("".equalsIgnoreCase(pr1) || null==pr1){
                            mainMap.put("otherParams","{\"eam"+udoaid+"count\":\""+(1+0)+"\"}");
                        }else{
                            mainMap.put("otherParams","{\"eam"+udoaid+"count\":\""+(1+Integer.parseInt(pr1))+"\"}");
                        }
                        mainMap.put("remark","");
                        mainMap.put("requestLevel",mbo.getString("URGENCY"));
                        mainMap.put("requestName",mbo.getString("DESCRIPTION"));
                        heads2.put("appid", appid);
                        heads2.put("token", token);
                        heads2.put("userid",userid2);
//                        String doCreateRequestData= HttpRequest.post(UrlConstants.doCreateRequestUrl)
//                                .header("appid",appid)
//                                .header("token",token)
//                                .header("userid",userid2)
//                                .header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
//                                .form(mainMap)
//                                .execute().body();
//                        doCreReqJso= JSONObject.parseObject(doCreateRequestData);

                        JSONObject alldata2 = formatDataPrFlow(heads2,mainMap,orgid);
                        JSONObject result2 = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata2);
                        if(alldata2.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
                            mbo.setValue("OAREQUEST", UrlConstants.restEsbUrl+alldata2.toString(), 2L);
                        }else{
                            mbo.setValue("OAREQUEST", (UrlConstants.restEsbUrl+alldata2.toString()).substring(0,1333), 2L);
                        }
                        return result2;
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            e.getCause();
            e.getMessage();
            return null;
        }
        return doCreReqJso;
    }


    /**
     * 发送REST请求到ESB，先进行数据格式化 需求申请主表信息
     * @param headMap
     * @return
     */
    public JSONObject formatDataPrFlow(Map<String, String> headMap,Map<String, String> mainMap,String orgid) {
        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();//包含主、子表数据
        JSONObject workcode = new JSONObject();//包含主、子表数据
        JSONObject SendData = new JSONObject();//包含主、子表数据
        //esb接口平台报文
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        if("FMCG".equalsIgnoreCase(orgid)){
            ESB_ATTRS.put("Target_ID", "OA-IPO"); //目标系统
        }else{
            ESB_ATTRS.put("Target_ID", "OA"); //目标系统
        }
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        LINE_DATA.add(Main_DATA);
        HEAD.put("appid",headMap.get("appid"));
        HEAD.put("token",headMap.get("token"));
        HEAD.put("userid",headMap.get("userid"));
        REQUEST_DATA.put("SendHead",HEAD);
        REQUEST_DATA.put("SendData",mainMap);
        REQUEST_DATA.put("SendURL",new java.lang.Object());
        REQUEST_DATA.put("Operation", "Z_OA_FLOW_CREATE_REQUEST");
        REQUEST_DATA.put("Type", "Z_OA_FLOW_CREATE_REQUEST");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }



    /**
     * 发送REST请求到ESB，先进行数据格式化 人员信息
     * @param headMap
     * @return
     */
    public JSONObject formatDataPerson(Map<String, Object> headMap,String orgid) {
        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();//包含主、子表数据
        JSONObject workcode = new JSONObject();//包含主、子表数据
        //esb接口平台报文
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        if("FMCG".equalsIgnoreCase(orgid)){
            ESB_ATTRS.put("Target_ID", "OA-IPO"); //目标系统
        }else{
            ESB_ATTRS.put("Target_ID", "OA"); //目标系统
        }
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        LINE_DATA.add(Main_DATA);
        HEAD.put("appid",headMap.get("appid"));
        HEAD.put("token",headMap.get("token"));
        HEAD.put("userid",headMap.get("userid"));
        workcode.put("workcode", headMap.get("workcode"));
        REQUEST_DATA.put("SendHead",HEAD);
        REQUEST_DATA.put("SendData",new Object());
        REQUEST_DATA.put("SendURL",workcode);
        REQUEST_DATA.put("Operation", "Z_OA_GET_USER_INFO_BY_WORKCODE");
        REQUEST_DATA.put("Type", "Z_OA_GET_USER_INFO_BY_WORKCODE");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }

}
