package psdi.app.iface.oa;

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

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

/**
 * eam推送资产处置信息到oa
 * edit 2023-09-13 17:57
 * 修改：bumen字段
 */
public class EAM2OAAssetdispoHandler {
    
    public JSONObject Z_EAM_ASSETDISPO_REQUISITION(MboRemote mbo) throws IOException, MXException {
        JSONObject doCreReqJso=null;
        try {
            String requestedby= (Objects.isNull(mbo.getString("CREATEBY"))?"":mbo.getString("CREATEBY"));
            String DISPLAYNAME=Objects.isNull(mbo.getString("PS.DISPLAYNAME"))?"":mbo.getString("PS.DISPLAYNAME");//创建人名称(关系名.字段名)
            String orgid=Objects.isNull(mbo.getString("ORGID"))?"":mbo.getString("ORGID");
            int assetdispoid=mbo.getInt("ASSETDISPOID");
            SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
            String issuedate=sf.format(mbo.getDate("CREATEDATE"));
            String zzcw=Objects.isNull(mbo.getString("ZZCW"))?"":mbo.getString("ZZCW");
            String NDIAR = Objects.isNull(mbo.getString("UDGDZC.NDIAR"))?"0":mbo.getString("UDGDZC.NDIAR");//使用年限
            Integer NDIARD = Integer.parseInt(NDIAR);
            String RESMONS = mbo.getString("UDGDZC.RESMONS");//剩余月份(剩余折旧月份)
            Integer RESMONSD = Integer.parseInt(RESMONS);
            Integer zjys = NDIARD*12;//折旧月数
            Integer yjtzjys = zjys-RESMONSD;  //已计提折旧月数
            String AFEND = Objects.isNull(mbo.getString("UDGDZC.AFEND"))?"":mbo.getString("UDGDZC.AFEND");//实际开始使用日期
            //获取人员信息
            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);
            JSONObject alldata = formatDataPerson(heads,orgid);
            JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
            JSONObject RESPONSE = (JSONObject) result.get("RESPONSE");

            //总账财务
            JSONObject cgjlRESPONSE=new JSONObject();
            if(!mbo.isNull("ZZCW")){
                Map cgjlheads = new HashMap();
                cgjlheads.put("appid", appid);
                cgjlheads.put("token", token);
                cgjlheads.put("userid",userid);
                cgjlheads.put("workcode",zzcw);
                JSONObject cgjlalldata = formatDataPerson(cgjlheads,orgid);
                JSONObject cgjlresult = HttpUtilOa.post(UrlConstants.restEsbUrl, cgjlalldata);
                cgjlRESPONSE = (JSONObject) cgjlresult.get("RESPONSE");
            }
            //资产接收方财务
            String zcjsfcw=mbo.getString("RECEIVECW");
            String RECEIVEDEPTNUM="";
            String zcjsfcwuser_id="";
            if(!mbo.isNull("RECEIVECW")){ //判断是否为空
                Map zcjsfcwheads = new HashMap();
                zcjsfcwheads.put("appid", appid);
                zcjsfcwheads.put("token", token);
                zcjsfcwheads.put("userid",userid);
                zcjsfcwheads.put("workcode",zcjsfcw);
                JSONObject zcjsfcwheadsdata = formatDataPerson(zcjsfcwheads,orgid);
                JSONObject zcjsfcwresult = HttpUtilOa.post(UrlConstants.restEsbUrl, zcjsfcwheadsdata);
                JSONObject zcjsfcwRESPONSE = (JSONObject) zcjsfcwresult.get("RESPONSE");
                JSONObject zcjsfcwRETURN_DATA = (JSONObject) zcjsfcwRESPONSE.get("RETURN_DATA");
                String zcjsfcwdata2=zcjsfcwRETURN_DATA.getString("data");
                JSONObject zcjsfcwjsonObject2 = JSONObject.parseObject(zcjsfcwdata2);
                //财务接收方所在部门
                RECEIVEDEPTNUM=Objects.isNull(zcjsfcwjsonObject2.getString("departmentid"))?"":zcjsfcwjsonObject2.getString("departmentid");
                zcjsfcwuser_id=Objects.isNull(zcjsfcwjsonObject2.getString("id"))?"":zcjsfcwjsonObject2.getString("id");
            }
            if(null!=RESPONSE && null!=cgjlRESPONSE){
                JSONObject RETURN_DATA = (JSONObject) RESPONSE.get("RETURN_DATA");
                JSONObject cgjlRETURN_DATA = (JSONObject) cgjlRESPONSE.get("RETURN_DATA");
                if(null!=RETURN_DATA && null!=cgjlRETURN_DATA){
                    String code=RETURN_DATA.getString("msgcode");
                    String cgjlcode=cgjlRETURN_DATA.getString("msgcode");
                    if("1".equalsIgnoreCase(code) && "1".equalsIgnoreCase(cgjlcode)){
                        String data2=RETURN_DATA.getString("data");
                        String cgjldata2=cgjlRETURN_DATA.getString("data");

                        JSONObject jsonObject2 = JSONObject.parseObject(data2);
                        JSONObject cgjljsonObject2 = JSONObject.parseObject(cgjldata2);

                        String user_id=Objects.isNull(jsonObject2.getString("id"))?"":jsonObject2.getString("id");
                        String zzcwuser_id=Objects.isNull(cgjljsonObject2.getString("id"))?"":cgjljsonObject2.getString("id");

                        String departmentid=Objects.isNull(jsonObject2.getString("departmentid"))?"":jsonObject2.getString("departmentid");
                        String jobtitleid=Objects.isNull(jsonObject2.getString("jobtitleid"))?"":jsonObject2.getString("jobtitleid");
                        String company=Objects.isNull(jsonObject2.getString("company"))?"":jsonObject2.getString("company");
                        String point=Objects.isNull(jsonObject2.getString("point"))?"":jsonObject2.getString("point");
                        String line=Objects.isNull(jsonObject2.getString("line"))?"":jsonObject2.getString("line");

                        //调用OA创建流程接口
                        Map<String, String> heads2 = new HashMap<String, String>();
                        Map<String, String> mainMap=new HashMap<String, String>();
                        double sddj=0.0;
                        if(mbo.getDouble("UDGDZC.MENGE")>0){
                            sddj=(mbo.getDouble("UDGDZC.KANSWCNY")/mbo.getDouble("UDGDZC.MENGE"));
                        }
                        String userid2=EamToOaWorkflowUtils.getUserid(user_id);//传入当前登录人在OA人员信息接口中的id
                        //zhicyzhz：资产原值汇总→zcyzcny：资产原值（CNY）
                        //sdzcyzjje：资产已折旧金额（本币）→zcyzjjecny：资产已折旧金额（CNY）
                        //sdzcjz：资产净值（本币）→zcjzcny：资产净值（CNY）
                        String str1="[{\"fieldName\":\"gongsxz\",\"fieldValue\":\""+(Objects.isNull(mbo.getString("ASSETOWN"))?"":mbo.getString("ASSETOWN"))+"\"}," + //资产归属
                                "{\"fieldName\":\"eamdjh\",\"fieldValue\":\""+assetdispoid+"\"}," + //EAM单据号，唯一ID
                                "{\"fieldName\":\"gonghao\",\"fieldValue\":\""+requestedby+"\"}," + //工号
                                "{\"fieldName\":\"shenqingren\",\"fieldValue\":\""+user_id+"\"}," +
                                "{\"fieldName\":\"bumen\",\"fieldValue\":\""+departmentid+"\"}," +
                                "{\"fieldName\":\"zhiwu\",\"fieldValue\":\""+jobtitleid+"\"}," +
                                "{\"fieldName\":\"fengongsi\",\"fieldValue\":\""+company+"\"}," +
                                "{\"fieldName\":\"fendian\",\"fieldValue\":\""+point+"\"}," +
                                "{\"fieldName\":\"fenxian\",\"fieldValue\":\""+line+"\"}," +
                                "{\"fieldName\":\"riqi\",\"fieldValue\":\""+issuedate+"\"}," +  //创建时间
                                "{\"fieldName\":\"sdsapzcbh\",\"fieldValue\":\""+(Objects.isNull(mbo.getString("SDGDZCBM"))?"":mbo.getString("SDGDZCBM"))+"\"}," +   //SAP资产编号
                                "{\"fieldName\":\"sdzcmc\",\"fieldValue\":\""+(Objects.isNull(mbo.getString("UDGDZC.TXT50"))?"":mbo.getString("UDGDZC.TXT50"))+"\"}," +   //资产名称
                                "{\"fieldName\": \"zcyzcny\",\"fieldValue\": \""+mbo.getDouble("UDGDZC.KANSWCNY")+"\"}," +  //资产原值(CNY)
                                "{\"fieldName\": \"zcyzjjecny\",\"fieldValue\": \""+mbo.getDouble("UDGDZC.ZIAMTCNY")+"\"}," +  //资产已折旧金额(CNY)
                                "{\"fieldName\": \"zcjzcny\",\"fieldValue\": \""+mbo.getDouble("UDGDZC.KNAFACNY")+"\"}," +  //资产净值(CNY)
                                "{\"fieldName\": \"cbzx\",\"fieldValue\": \""+(Objects.isNull(mbo.getString("UDGDZC.KOSTL"))?"":mbo.getString("UDGDZC.KOSTL"))+"\"}," +   //成本中心
                                "{\"fieldName\": \"sddj\",\"fieldValue\": \""+sddj+"\"}," +  //单价
                                "{\"fieldName\": \"shifITcp\",\"fieldValue\": \""+(Objects.isNull(mbo.getString("ISIT"))?"":mbo.getString("ISIT"))+"\"}," +  //是否IT资产
                                "{\"fieldName\": \"sdsl\",\"fieldValue\": \""+mbo.getDouble("UDGDZC.MENGE")+"\"}," +  //数量
                                "{\"fieldName\": \"sdppxh\",\"fieldValue\": \""+(Objects.isNull(mbo.getString("SDUNITTYPE"))?"":mbo.getString("SDUNITTYPE"))+"\"}," +   //品牌型号
                                "{\"fieldName\": \"sjbmsrbz\",\"fieldValue\": \""+(Objects.isNull(mbo.getString("COIN"))?"":mbo.getString("COIN"))+"\"}," +  //变卖收入币种
                                "{\"fieldName\": \"hl\",\"fieldValue\": \""+mbo.getDouble("COINRATE")+"\"}," +  //汇率
                                "{\"fieldName\": \"sjbmsrje\",\"fieldValue\": \""+mbo.getDouble("SELLSR")+"\"}," +  //变卖收入金额（变卖币种）手填
                                "{\"fieldName\": \"sjbmsrbbje\",\"fieldValue\": \""+mbo.getDouble("SELLSRCNY")+"\"}," +  //变卖收入金额（CNY） 自动计算
                                "{\"fieldName\": \"sdczfs\",\"fieldValue\": \""+(Objects.isNull(mbo.getString("DEALTYPE"))?"":mbo.getString("DEALTYPE"))+"\"}," +   //处置方式
                                "{\"fieldName\": \"sdsjkssyrq\",\"fieldValue\": \""+AFEND+"\"}," +  //实际开始使用时间
                                "{\"fieldName\": \"sjhjhczrq\",\"fieldValue\": \""+sf.format(mbo.getDate("SJDEALDATE"))+"\"}," +  //实际或计划处置日期
                                "{\"fieldName\": \"sapacc\",\"fieldValue\": \""+zzcwuser_id+"\"}," + //总账财务
                                "{\"fieldName\": \"zcfl\",\"fieldValue\": \""+(Objects.isNull(mbo.getString("UDGDZC.ANLK"))?"":mbo.getString("UDGDZC.ANLK"))+"\"}," +   //资产分类
                                "{\"fieldName\": \"syzjys\",\"fieldValue\": \""+RESMONSD+"\"}," +   //剩余折旧月数
                                "{\"fieldName\": \"yjtzjys\",\"fieldValue\": \""+yjtzjys+"\"}," +   //已计提折旧月数
                                "{\"fieldName\": \"zjys\",\"fieldValue\": \""+zjys+"\"}," +   //折旧月数
                                "{\"fieldName\": \"zcjsbm\",\"fieldValue\": \""+RECEIVEDEPTNUM+"\"}," +   //资产接收部门 mbo.getString("RECEIVEDEPTNUM")
                                "{\"fieldName\": \"zcjsfcw\",\"fieldValue\": \""+zcjsfcwuser_id+"\"}," +   //资产接收方财务
                                "{\"fieldName\": \"sdcsbfyy\",\"fieldValue\": \""+(Objects.isNull(mbo.getString("REASON"))?"":mbo.getString("REASON"))+"\"}" +  //资产处置原因
                                "]";

                        if("FMCG".equalsIgnoreCase(orgid)){
                            //IPO
                            mainMap.put("workflowId",UrlConstants.zcczlcid_ipo);
                        }else{
                            //非IPO
                            mainMap.put("workflowId",UrlConstants.zcczlcid);
                        }
                        JSONArray jsonArray = JSONArray.parseArray(str1);
                        mainMap.put("mainData", jsonArray.toString());
                        mainMap.put("detailData","");
                        mainMap.put("remark","");
                        mainMap.put("requestLevel",mbo.getString("URGENCY"));//紧急程度
                        mainMap.put("requestName","3165-"+requestedby+DISPLAYNAME+"-"+issuedate+"-"+mbo.getString("DESCRIPTION"));//单据描述（对应OA的标题）
                        int pcount=mbo.getInt("PCOUNT");
                        if(pcount<=0){
                            mainMap.put("otherParams","{\"eam3165count\":\""+(1+0)+"\"}");
                        }else{
                            mainMap.put("otherParams","{\"eam3165count\":\""+(1+pcount)+"\"}");
                        }
                        heads2.put("appid", appid);
                        heads2.put("token", token);
                        heads2.put("userid",userid2);

                        JSONObject alldata2 = formatDataEsb(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;
    }

    /**
     * 对数据进行格式化
     */
    public JSONObject formatDataEsb(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();//包含主、子表数据
        //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 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;
    }
}
