package psdi.app.iface.spms;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
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.Mbo;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXException;

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

/**
 * 数据方向 SPMS-->EAM
 */
public class Spms2EamHandler {

    //物料库存预留接口 EAM--->ESB--->SPMS
    public void Z_EAM_RESERVE_INVENTORY(List<Map<String, Object>> orderWerksInfo) throws RemoteException, MXException {
        //模拟数据
        List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = new HashMap<String, Object>();

        String wonum = (String) orderWerksInfo.get(0).get("WONUM");//工单编号
        String siteid = (String) orderWerksInfo.get(0).get("SITEID");//地点
        MboSetRemote mobSet = MXServer.getMXServer().getMboSet("WPMATERIAL",MXServer.getMXServer().getSystemUserInfo());//工单计划子表
        mobSet.setWhere(" wonum='"+wonum+"' and siteid='"+siteid+"'");
        mobSet.reset();
        for(int i=0;i< mobSet.getSize();i++){
           Mbo mbo = (Mbo) mobSet.getMbo(i);
            String ITEMNUM = mbo.getString("ITEMNUM");//物料编号
            String LOCATION = mbo.getString("LOCATION");//库房
            String BINNUM = mbo.getString("LOCATION");//库位
            String WONUM = wonum;//工单编号
            double ACTUALQTY = mbo.getDouble("ACTUALQTY");//数量
            String SITEID = siteid;
            String ZDEL = mbo.getString("ZDEL");//是否预留（空代表预留；X代表预留取消）

            map.put("WONUM",WONUM);
            map.put("SITEID",SITEID);
            map.put("ITEMNUM",ITEMNUM);
            map.put("LOCATION",LOCATION);
            map.put("BINNUM",BINNUM);
            map.put("ACTUALQTY",ACTUALQTY);
            map.put("ZDEL",ZDEL);
            dataList.add(map);
        }
        // 发送请求数据格式化
        JSONObject alldata = formatDataSend(dataList);
        // 调用接口
        String result = HttpUtil.post(UrlConstants.restEsbUrl, JSON.toJSONString(alldata), 600000);//方式1 可行
//        String result = HttpUtils2.sendPostDataByJson(restUrl, JSON.toJSONString(alldata));//方式2 可行
        // 解析接口返回数据
        JSONObject list = formatDataReceived(result, dataList);
    }
    /**
     * -----------------------------start------库存全量拉取-------------------------------------
     * EAM定时或者手动获取工厂的物料全量库存
     * 1-手动：传当前登录人所在的工厂编号
     * 2-自动：查询当前系统的所有上线工厂
     */
    public JSONObject Z_SPMS_TOTAL_STORAGE_INVENTORY_TO_EAM(String SITEIDStr,String ORGIDStr) throws IOException, MXException {
        //1、判断是手动还是自动？
        System.out.println("--------enter in---------");
        JSONObject returnDate = new JSONObject();
        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH24:mm:ss");
        // 发送请求数据格式化
//        JSONArray jsonArr = new JSONArray();
        String str = "";//工厂，多个工厂用逗号隔开
        MboSetRemote siteSet = MXServer.getMXServer().getMboSet("SITE",MXServer.getMXServer().getSystemUserInfo());//地点表
        if(SITEIDStr!=null && !"".equalsIgnoreCase(SITEIDStr) && ORGIDStr!=null && !"".equalsIgnoreCase(ORGIDStr)){
            //手动
            str = SITEIDStr;
        }else{
            //自动
            siteSet.setWhere("ACTIVE=1 AND SITEID != 'CN01' and ORGID='"+ORGIDStr+"'");//有效
            siteSet.reset();
            if(siteSet!=null && !siteSet.isEmpty()){
                for(int i=0;i<siteSet.count();i++){
                   MboRemote siteMbo = siteSet.getMbo(i);
                   String SITE = siteMbo.getString("SITEID");
                    str += SITE + ",";
                }
                str = str.trim();
                str = str.substring(0,str.length()-1);
            }
        }
        System.out.println("--------str="+str);
        //物资全量拉取-格式化
        JSONObject alldata = Z_SPMS_TOTAL_FAT_ESB(str);
        //调用返回
        JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl2, alldata);
        //返回结果判断
        JSONObject jsResult = result.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
        String codeStr = jsResult.getString("code");//返回值
        if("200".equalsIgnoreCase(codeStr)){
            JSONObject dataJs = jsResult.getJSONObject("data");
            JSONArray dataArray = JSONArray.parseArray(dataJs.getString("itemList"));
            try {
                //库存表
                MboSetRemote mobSet = MXServer.getMXServer().getMboSet("UDKC",MXServer.getMXServer().getSystemUserInfo());
                MboSetRemote mobSett = MXServer.getMXServer().getMboSet("UDKC",MXServer.getMXServer().getSystemUserInfo());
                for (int i = 0; i < dataArray.size(); i++) {
                    JSONObject jobj = (JSONObject) dataArray.get(i);//获取每个json对象
                    String MATNR = (String) jobj.get("materialNo"); //物料号
                    String ISSUEUNIT = (String) jobj.get("unit"); //单位
                    String werks = (String) jobj.get("werks"); //工厂/地点
                    String BINNUM = (String) jobj.get("storageNo"); //储位编号
                    String BINNUMFLAG = (String) jobj.get("storageType"); //储位标记
                    String unitcostStr = (jobj.get("unitCost")==null || "".equals(jobj.get("unitCost"))) ? "0" : (String) jobj.get("unitCost");
                    Double UNITCOST = Double.parseDouble(unitcostStr); //单价
                    String CURRENCY = (String) jobj.get("currency"); //币种
                    String STORELOC = (String) jobj.get("whsLocationCode"); //库房
                    Double PHYSCNTTOTAL = jobj.getDouble("availableQty") ; //数量
                    if(PHYSCNTTOTAL==null){
                        PHYSCNTTOTAL = (double) 0;
                    }
                    //获取组织
                    String ORGID = "";
                    siteSet.setWhere(" siteid='"+werks+"' and ACTIVE=1");
                    siteSet.reset();
                    if(siteSet!=null && !siteSet.isEmpty()){
                        MboRemote siteMbo = siteSet.getMbo(0);
                        if(siteMbo!=null){
                            ORGID = siteMbo.getString("ORGID");
                        }
                    }else{
                        continue;
                    }
                    mobSet.setWhere(" ITEMNUM='"+MATNR+"' and BINNUM='"+BINNUM+"' and LOCATION='"+STORELOC+"' and siteid='"+werks+"'");//一个物料对应多个库位
                    mobSet.reset();
                    if(mobSet!=null && !mobSet.isEmpty()){
                        MboRemote kcMbo  = mobSet.getMbo(0);
                        //日志记录
                        kcMbo.setValue("MODIFTIME",new Date(),2L);
                 /*       if(result.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
                            kcMbo.setValue("RECEIVED", UrlConstants.restEsbUrl+result.toString(), 2L);
                        }else{
                            kcMbo.setValue("RECEIVED", (UrlConstants.restEsbUrl+result.toString()).substring(0,1333), 2L);
                        }*/
                        kcMbo.setValue("ISSUEUNIT",ISSUEUNIT,2L);
                        kcMbo.setValue("LOCATION",STORELOC,2L);
                        kcMbo.setValue("CURBALTOTAL",PHYSCNTTOTAL,2L);
                        kcMbo.setValue("BINNUM",BINNUM,2L);
                        kcMbo.setValue("UNITCOST",UNITCOST,2L);
                        kcMbo.setValue("CURRENCY",CURRENCY,2L);
                        kcMbo.setValue("BINNUMFLAG",BINNUMFLAG,2L);
                        kcMbo.getThisMboSet().save();
                    }else{
                        MboRemote kcMbo = mobSet.add();//创建对象
                        //日志记录
                        kcMbo.setValue("MODIFTIME",new Date(),2L);
                   /*     if(result.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
                            kcMbo.setValue("RECEIVED", UrlConstants.restEsbUrl+result.toString(), 2L);
                        }else{
                            kcMbo.setValue("RECEIVED", (UrlConstants.restEsbUrl+result.toString()).substring(0,1333), 2L);
                        }*/
                        kcMbo.setValue("ITEMNUM",MATNR,2L);//给对象赋值
                        kcMbo.setValue("ISSUEUNIT",ISSUEUNIT,2L);
                        kcMbo.setValue("SITEID",werks,2L);
                        kcMbo.setValue("ORGID",ORGID,2L);
                        kcMbo.setValue("LOCATION",STORELOC,2L);
                        kcMbo.setValue("CURBALTOTAL",PHYSCNTTOTAL,2L);
                        kcMbo.setValue("BINNUM",BINNUM,2L);
                        kcMbo.setValue("UNITCOST",UNITCOST,2L);
                        kcMbo.setValue("CURRENCY",CURRENCY,2L);
                        kcMbo.setValue("BINNUMFLAG",BINNUMFLAG,2L);
                        kcMbo.getThisMboSet().save();
                    }
                }
                //全量拉取完成之后，需要对没有更新日期的数据（即该储位在SPMS已经删除，需要在EAM中把该储位上的数量设置为0）-------------------
                mobSett.setWhere("BINNUM is not null and CURBALTOTAL >0 AND SITEID='"+str+"' and TRUNC(MODIFTIME) < TRUNC(SYSDATE)");
                mobSett.reset();
                if(mobSett!=null && !mobSett.isEmpty()){
                    for(int i=0;i<mobSett.count();i++){
                        MboRemote mboR = mobSett.getMbo(i);
                        mboR.setValue("CURBALTOTAL",0,2L);
                    }
                    mobSett.save();
                    mobSett.close();
                }
                //----------------------------------------------------------------------------------
                returnDate.put("code", "success");
                returnDate.put("msg", "成功");
            }catch (Exception e){
                e.getMessage();
                e.getCause();
                returnDate.put("code", "failure");
                returnDate.put("msg", "失败="+e.getMessage());
            }finally {
                return returnDate;
            }
        }
        return returnDate;
    }

    //物资全量拉取-格式化
    public JSONObject Z_SPMS_TOTAL_FAT_ESB(String str) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject Z_DATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject HEAD_DATA = new JSONObject();
        JSONObject SITE_DATA = new JSONObject();
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
//        ESB_ATTRS.put("Target_ID", "SPMS-SAP"); //目标系统(生产和测试一样)
        ESB_ATTRS.put("Target_ID",UrlConstants.spmsClient1); //目标系统(生产和测试一样)
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        //入参数据
        SITE_DATA.put("SITEID",str);
        HEAD_DATA.put("SITE",SITE_DATA);
        REQUEST_DATA.put("SendData", HEAD_DATA);
        REQUEST_DATA.put("token", "EAM");
        REQUEST_DATA.put("HeadType", 0);
        REQUEST_DATA.put("Operation", "Z_SPMS_TOTAL_STORAGE_INVENTORY_TO_EAM");
        REQUEST_DATA.put("Type", "Z_SPMS_TOTAL_STORAGE_INVENTORY_TO_EAM");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }
    /**
     * -----------------------------end------库存全量更新-------------------------------------
     */

    /**
     *物料出库申请单（出库单主信息，该出库单下的物料信息）
     * EAM领料申请单往SPMS同步
     */
    public JSONObject Z_EAM_OVERSEA_REQUISITION(MboRemote mbo) throws IOException, MXException {
        //领料单主信息
        Map zmap = new HashMap();
        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
        String appname=mbo.getString("APPNAME");
        if("udlld".equalsIgnoreCase(appname) || "udcllld".equalsIgnoreCase(appname)){//领料单 || 车辆领料单
            zmap.put("WONUM",mbo.getString("WONUM"));
            zmap.put("CREATEBY",mbo.getString("CREATEBY"));
            zmap.put("CREATEDATE",sf.format(mbo.getDate("CREATEDATE")));
            zmap.put("SITEID",mbo.getString("SITEID"));
            zmap.put("WORKSHOP",mbo.getString("WORKSHOP")+"-"+mbo.getString("UDWORKSHOP.DESCRIPTION"));
            zmap.put("LOCNUM",mbo.getString("LOCNUM"));
            zmap.put("KOSTL",mbo.getString("KOSTL"));
            zmap.put("APPTYPE",mbo.getString("APPNAME").toLowerCase());
            zmap.put("REMARKS",mbo.getString("REMARKS"));

            //获取子表
            List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
            MboSetRemote lldlineSet =  mbo.getMboSet("UDLLDLINE");
            for(int i=0;i<lldlineSet.count();i++){
                Map<String, Object> map = new HashMap<String, Object>();
                MboRemote lineMbo = lldlineSet.getMbo(i);
//                if("udlld".equalsIgnoreCase(appname) || "udcllld".equalsIgnoreCase(appname)) {//领料单
                    map.put("LINENUM", lineMbo.getInt("LINENUM")+"");//行项目
                    map.put("ITEMNUM",lineMbo.getString("ITEMNUM") );//物料编码
                    map.put("ORDERQTY", String.valueOf(lineMbo.getDouble("TFITEMQTY")));//申请数量（转换后的数量）
                    map.put("APPRQUANTITY", lineMbo.getDouble("APPRQUANTITY")+"");//批准数量（和转换后的申请数量保持一致）
                    map.put("ORDERUNIT",lineMbo.getString("TFITEMQTYUNIT"));//出库单位（基本单位）
                    map.put("SJYDTYPE",mbo.getString("SJYDTYPE"));//移动类型
                    map.put("BINNUM",lineMbo.getString("BINNUM"));//储位
                    map.put("AUFNR",mbo.getString("AUFNR"));//内部订单
                    map.put("REMARKS",lineMbo.getString("REMARKS"));//备注
//                }
                dataList.add(map);
            }
            // 发送请求数据格式化
            JSONObject alldata = formatDataEsb(zmap, dataList);
            // 调用接口
            JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
            if(alldata.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
                mbo.setValue("SPMSREQUEST", UrlConstants.restEsbUrl+alldata.toString(), 2L);
            }else{
                mbo.setValue("SPMSREQUEST", (UrlConstants.restEsbUrl+alldata.toString()).substring(0,1333), 2L);
            }
            return result;
        }else {//日常维修工单

            zmap.put("WONUM",mbo.getString("WONUM"));
            zmap.put("CREATEBY",mbo.getString("CREATEBY"));
            zmap.put("CREATEDATE",mbo.getString("CREATEDATE"));
            zmap.put("SITEID",mbo.getString("SITEID"));
            zmap.put("WORKSHOP",mbo.getString("WORKSHOP")); //根据当前创建人找车间
            zmap.put("LOCNUM",mbo.getString("LOCATION"));
            zmap.put("KOSTL",mbo.getString("KOSTL")); //主表待加成本中心
            zmap.put("APPTYPE","udworkorder");
            zmap.put("REMARKS",mbo.getString("REMARKS"));//主表待添加备注

            //获取子表
            List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
            MboSetRemote lldlineSet =  mbo.getMboSet("SHOWPLANMATERIAL");
            for(int i=0;i<lldlineSet.count();i++){
                Map<String, Object> map = new HashMap<String, Object>();
                MboRemote lineMbo = lldlineSet.getMbo(i);
                map.put("LINENUM", lineMbo.getInt("LINENUM")+"");//行项目
                map.put("ITEMNUM",lineMbo.getString("ITEMNUM") );//物料编码
                map.put("ORDERQTY", String.valueOf(lineMbo.getDouble("TFITEMQTY")));//申请数量（转换后数量）
                map.put("APPRQUANTITY", String.valueOf(lineMbo.getDouble("APPRQUANTITY")));//批准数量（转换后数量）
                map.put("ORDERUNIT",lineMbo.getString("TFITEMQTYUNIT"));//出库单位(基本单位)
                map.put("SJYDTYPE",lineMbo.getString("UDYDLX"));//移动类型
                map.put("BINNUM",lineMbo.getString("UDKC.BINNUM"));//储位
                map.put("AUFNR",lineMbo.getString("AUFNR"));//内部订单 待加
                map.put("REMARKS",lineMbo.getString("REMARKS"));//备注 待加
                dataList.add(map);
            }
            // 发送请求数据格式化
            JSONObject alldata = formatDataEsb(zmap, dataList);
            // 调用接口
            JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
            return result;
        }
    }

    /**
     *物料退库申请单
     * EAM退库申请推送SPMS
     */
    public JSONObject Z_EAM_RETURN_REQUISITION(MboRemote mbo) throws IOException, MXException {
        //退库申请主信息
        Map zmap = new HashMap();
        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
        String WONUM = mbo.getString("WONUM");//退库申请单编号
        String DESCRIPTION = mbo.getString("DESCRIPTION");//退库单描述
        String SITEID = mbo.getString("SITEID");//地点/工厂
        String LOCNUM = mbo.getString("LOCNUM");//仓库代码
        String WORKSHOP = mbo.getString("WORKSHOP");//车间/部门编号
        String WORKSHOPDESC=mbo.getString("UDWORKSHOP.DESCRIPTION");//车间/部门描述
        String YWONUM = mbo.getString("YWONUM");//原领料申请单
        String KOSTL = mbo.getString("KOSTL");//成本中心
        String CREATEBY = mbo.getString("CREATEBY");//创建用户
        String REMARKS = mbo.getString("REMARKS");//备注
        zmap.put("WONUM",WONUM);
        zmap.put("SITEID",SITEID);
        zmap.put("LOCNUM",LOCNUM);
        zmap.put("WORKSHOP",WORKSHOP+"-"+WORKSHOPDESC);
        zmap.put("YWONUM",YWONUM);
        zmap.put("KOSTL",KOSTL);
        zmap.put("CREATEBY",CREATEBY);
        zmap.put("REMARKS",REMARKS);
        //获取子表
        List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
        MboSetRemote lldlineSet =  mbo.getMboSet("UDLLDLINE");//退库申请单子表
        for(int i=0;i<lldlineSet.count();i++){
            Map<String, Object> map = new HashMap<String, Object>();
            MboRemote lineMbo = lldlineSet.getMbo(i);
            String LINENUM = lineMbo.getString("LINENUM");//行号
            String ITEMNUM = lineMbo.getString("ITEMNUM");//物料编号
            String ORDERQTY = String.valueOf(lineMbo.getDouble("ORDERQTY"));//退库数量
            String ORDERUNIT = lineMbo.getString("ORDERUNIT");//退库单位
            String APPRQUANTITY = String.valueOf(lineMbo.getDouble("APPRQUANTITY"));//批准数量
            String BINNUM = lineMbo.getString("UDKC.BINNUM");//库位
            String AUFNR = mbo.getString("AUFNR");//内部订单号
            String SJYDTYPE = mbo.getString("SJYDTYPE");//移动类型
            String REMARKS1 = lineMbo.getString("REMARKS");//备注
            map.put("LINENUM", LINENUM);
            map.put("ITEMNUM", ITEMNUM);
            map.put("ORDERQTY", ORDERQTY);
            map.put("ORDERUNIT", ORDERUNIT);
            map.put("APPRQUANTITY", APPRQUANTITY);
            map.put("BINNUM", BINNUM);
            map.put("AUFNR", AUFNR);
            map.put("SJYDTYPE", SJYDTYPE);
            map.put("REMARKS", REMARKS1);
            map.put("LOCATION", LOCNUM);
            map.put("SITEID", SITEID);
            dataList.add(map);
        }
        // 发送请求数据格式化
        JSONObject alldata = formatDataEsbReturn(zmap, dataList);
        // 调用接口
        JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
        if(alldata.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
            mbo.setValue("SPMSREQUEST", UrlConstants.restEsbUrl+alldata.toString(), 2L);
        }else{
            mbo.setValue("SPMSREQUEST", (UrlConstants.restEsbUrl+alldata.toString()).substring(0,1333), 2L);
        }
        return result;
    }

    /**
     *旧件回收，相关标记物料推送到spms系统，进行入库
     * EAM-->SPMS
     */
    public JSONObject Z_EAM_ITEM_RUKU(MboRemote mbo) throws IOException, MXException {
        //旧件回收申请主表
        Map zmap = new HashMap();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String ORGID = mbo.getString("ORGID");//组织
        String SITEID = mbo.getString("SITEID");//工厂/地点
        String RCNUM = mbo.getString("RCNUM");//旧件回收申请单编号
        String DESCRIPTION = mbo.getString("DESCRIPTION");//旧件回收申请单描述
        String STATUS = mbo.getString("STATUS");//状态
        String WONUM = mbo.getString("WONUM");//领料申请单号
        String CREATEBY = mbo.getString("CREATEBY");//申请人
        String REASON = mbo.getString("REASON");//旧件入库原因
        Date CREATEDATE = mbo.getDate("CREATEDATE");//申请日期
        String FLAG = "RC";//旧件回收入库的标识：固定值：RC
        //----------------------------------------------------------------------
        MboSetRemote personSet = MXServer.getMXServer().getMboSet("PERSON",MXServer.getMXServer().getSystemUserInfo());//人员表
        MboSetRemote deptSet = MXServer.getMXServer().getMboSet("DEPT",MXServer.getMXServer().getSystemUserInfo());//车间/部门、、
        MboSetRemote deptZHSet = MXServer.getMXServer().getMboSet("L_DEPT",MXServer.getMXServer().getSystemUserInfo());//中文下的车间/部门
        MboSetRemote LCSet = MXServer.getMXServer().getMboSet("LOCATIONS",MXServer.getMXServer().getSystemUserInfo());//仓库
        MboSetRemote recListSet = MXServer.getMXServer().getMboSet("UDRECLIST",MXServer.getMXServer().getSystemUserInfo());//旧件回收清单
        personSet.setWhere("personid='"+CREATEBY+"'");
        personSet.reset();
        String displayname = "";//用户名
        String department = "";//部门编号
        Integer deptid = null;//部门表ID
        String deptName = "";//部门名称
        String location = "";//仓库编号
        if(personSet!=null && !personSet.isEmpty()){
            MboRemote personMbo = personSet.getMbo(0);
            displayname = personMbo.getString("DISPLAYNAME");
            department = personMbo.getString("DEPARTMENT");
        }
        deptSet.setWhere("deptnum='"+department+"'");
        deptSet.reset();
        if(deptSet!=null && !deptSet.isEmpty()){
            MboRemote deptMbo = deptSet.getMbo(0);
            deptid =  deptMbo.getInt("DEPTID");
        }
        deptZHSet.setWhere("ownerid="+deptid+"");
        deptZHSet.reset();
        if(deptZHSet!=null && !deptZHSet.isEmpty()){
            MboRemote deptZHMbo = deptZHSet.getMbo(0);
            deptName = deptZHMbo.getString("DESCRIPTION");
        }
        LCSet.setWhere(" ORGID='"+ORGID+"' and SITEID='"+SITEID+"' and TYPE='STOREROOM'");
        LCSet.reset();
        if(LCSet!=null && !LCSet.isEmpty()){
           MboRemote lcMbo =  LCSet.getMbo(0);
           location = lcMbo.getString("location");
        }
        String WORKSHOP = department + "-" + deptName; //车间-车间名称
        //----------------------------------------------------------------------
        zmap.put("SITEID",SITEID);
        zmap.put("RCNUM",RCNUM);
        zmap.put("DESCRIPTION",DESCRIPTION);
        zmap.put("STATUS",STATUS);
        zmap.put("WONUM",WONUM);
        zmap.put("CREATEBY",CREATEBY);
        zmap.put("CREATEBYDESC",displayname);
        zmap.put("CREATEDATE",CREATEDATE);
        zmap.put("FLAG",FLAG);
        zmap.put("REASON",REASON);
        zmap.put("LOCNUM",location);
        zmap.put("WORKSHOP",WORKSHOP);
        //获取子表
        List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
        MboSetRemote rclineSet =  mbo.getMboSet("UDRECOVERYLINE");//旧件回收申请子表
        for(int i=0;i<rclineSet.count();i++){
            Map<String, Object> map = new HashMap<String, Object>();
            MboRemote lineMbo = rclineSet.getMbo(i);
            String ITEMNUM = lineMbo.getString("ITEMNUM");//物料编号
            Double YYNUM = lineMbo.getDouble("YYNUM");//应还(领料)数量
            if(YYNUM==null){
                YYNUM = 0.0;
            }
            Double BFNUM = lineMbo.getDouble("BFNUM");//报废数量
            if(BFNUM==null){
                BFNUM = 0.0;
            }
            Double LYNUM = lineMbo.getDouble("LYNUM");//留用数量
            if(LYNUM==null){
                LYNUM = 0.0;
            }
            Double RKNUM = lineMbo.getDouble("RKNUM");//入库SPMS数量
            if(RKNUM==null){
                RKNUM = 0.0;
            }
            String RKREASON = lineMbo.getString("RKREASON");//入库说明
            recListSet.setWhere("ITEMNUM='"+ITEMNUM+"' and ORGID='"+ORGID+"' AND SITEID='"+SITEID+"'");
            recListSet.reset();
            String ITEMUNIT = "";
            if(recListSet!=null && !recListSet.isEmpty()){
                MboRemote recMbo = recListSet.getMbo(0);
                ITEMUNIT = recMbo.getString("ITEMUNIT");
            }
            map.put("ITEMNUM", ITEMNUM);
            map.put("YYNUM", YYNUM);//回收任务数量
            map.put("BFNUM", BFNUM);//报废数量
            map.put("LYNUM", (LYNUM-RKNUM));//实际回收数量
            map.put("RKNUM", RKNUM);//入库SPMS数量
            map.put("ITEMUNIT", ITEMUNIT);//基本单位
            map.put("REMARK", RKREASON);
            dataList.add(map);
        }
        // 发送请求数据格式化
        JSONObject alldata = formatDataEsbRc(zmap, dataList);
        // 调用接口
        JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
        //写入日志
        if(alldata.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
            mbo.setValue("SENDJS", UrlConstants.restEsbUrl+alldata.toString(), 2L);
            mbo.setValue("ACCEPTJS", UrlConstants.restEsbUrl+result.toString(), 2L);
        }else{
            mbo.setValue("SENDJS", (UrlConstants.restEsbUrl+alldata.toString()).substring(0,1333), 2L);
            mbo.setValue("ACCEPTJS", UrlConstants.restEsbUrl+result.toString(), 2L);
        }
        String codeStr = result.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getString("code");//返回值
        if("200".equalsIgnoreCase(codeStr)){
            mbo.setValue("STATUS", "INPRG",2L);
        }
        mbo.getThisMboSet().save();
        return result;
    }

    /**
     * 旧件回收，相关标记物料入库spms库,需经esb，进行格式化
     */
    public JSONObject formatDataEsbRc(Map<String, Object> zMap, List<Map<String, Object>> orderWerksInfo) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject Z_DATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject HEAD_DATA = new JSONObject();
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        ESB_ATTRS.put("Target_ID",UrlConstants.spmsClient); //目标系统
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        JSONArray IT_REQUEST = new JSONArray();
        //主数据
        Z_DATA.put("SITEID", zMap.get("SITEID"));
        Z_DATA.put("RCNUM", zMap.get("RCNUM"));
        Z_DATA.put("DESCRIPTION", zMap.get("DESCRIPTION"));
        Z_DATA.put("STATUS", zMap.get("STATUS"));
        Z_DATA.put("WONUM", zMap.get("WONUM"));
        Z_DATA.put("CREATEBY", zMap.get("CREATEBY"));
        Z_DATA.put("CREATEBYDESC", zMap.get("CREATEBYDESC"));
        Z_DATA.put("CREATEDATE", zMap.get("CREATEDATE"));
        Z_DATA.put("FLAG", zMap.get("FLAG"));
        Z_DATA.put("REASON", zMap.get("REASON"));
        Z_DATA.put("LOCNUM", zMap.get("LOCNUM"));
        Z_DATA.put("WORKSHOP", zMap.get("WORKSHOP"));
        //物料数据
        for (Map<String, Object> map : orderWerksInfo) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("ITEMNUM", String.valueOf(map.get("ITEMNUM")));
            jsonObject.put("YYNUM", String.valueOf(map.get("YYNUM")));
            jsonObject.put("BFNUM", String.valueOf(map.get("BFNUM")));
            jsonObject.put("LYNUM", String.valueOf(map.get("LYNUM")));
            jsonObject.put("RKNUM", String.valueOf(map.get("RKNUM")));
            jsonObject.put("ITEMUNIT", map.get("ITEMUNIT"));
            jsonObject.put("REMARK", map.get("REMARK"));
            IT_REQUEST.add(jsonObject);
        }
        HEAD_DATA.put("WORKORDER", Z_DATA);
        HEAD_DATA.put("WPITEM", IT_REQUEST);
        REQUEST_DATA.put("SendData", HEAD_DATA);
        REQUEST_DATA.put("Operation", "Z_EAM_FORMER_TO_SPMS");//esb定义
        REQUEST_DATA.put("Type", "Z_EAM_FORMER_TO_SPMS");//esb定义
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }


    /**
     * 物料预留-发送REST请求到ESB，先进行数据格式化
     */
    public JSONObject formatDataSend(List<Map<String, Object>> orderWerksInfo) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject HEAD_DATA = new JSONObject();
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        ESB_ATTRS.put("Target_ID",UrlConstants.spmsClient); //目标系统
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        JSONArray IT_REQUEST = new JSONArray();
        for (Map<String, Object> map : orderWerksInfo) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("REQUESTNUM", map.get("REQUESTNUM"));
            jsonObject.put("ITEMNUM", map.get("ITEMNUM"));
            jsonObject.put("LOCATION", map.get("LOCATION"));
            jsonObject.put("WONUM", map.get("WONUM"));
            jsonObject.put("ACTUALQTY", map.get("ACTUALQTY"));
            jsonObject.put("RESERVEDQTY", map.get("RESERVEDQTY"));
            jsonObject.put("INITFLAG", map.get("INITFLAG"));
            jsonObject.put("DIRECTREQ", map.get("DIRECTREQ"));
            jsonObject.put("ORGID", map.get("ORGID"));
            jsonObject.put("SITEID", map.get("SITEID"));
            jsonObject.put("INVRESERVEID", map.get("INVRESERVEID"));
            jsonObject.put("LANGCODE", map.get("LANGCODE"));
            jsonObject.put("HASLD", map.get("HASLD"));
            jsonObject.put("SHOWALLRESERVATION", map.get("SHOWALLRESERVATION"));
            jsonObject.put("RESTYPE", map.get("RESTYPE"));
            jsonObject.put("BINNUM", map.get("BINNUM"));
            jsonObject.put("ZDEL", map.get("ZDEL"));
            IT_REQUEST.add(jsonObject);
        }
        HEAD_DATA.put("IT_REQUEST", IT_REQUEST);
        REQUEST_DATA.put("Head", HEAD_DATA);
        REQUEST_DATA.put("token", "EAM");
        REQUEST_DATA.put("HeadType", 0);
        REQUEST_DATA.put("Operation", "Z_EAM_RESERVE_INVENTORY");
        REQUEST_DATA.put("Type", "Z_EAM_RESERVE_INVENTORY");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }

    /**
     * 退库申请单数据格式化-发送REST请求到ESB，先进行数据格式化
     */
    public JSONObject formatDataEsbReturn(Map<String, Object> zMap, List<Map<String, Object>> orderWerksInfo) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject Z_DATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject HEAD_DATA = new JSONObject();
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        ESB_ATTRS.put("Target_ID",UrlConstants.spmsClient); //目标系统
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        JSONArray IT_REQUEST = new JSONArray();
        //主数据
        Z_DATA.put("WONUM", zMap.get("WONUM"));
        Z_DATA.put("SITEID", zMap.get("SITEID"));
        Z_DATA.put("LOCNUM", zMap.get("LOCNUM"));
        Z_DATA.put("WORKSHOP", zMap.get("WORKSHOP"));
        Z_DATA.put("YWONUM", zMap.get("YWONUM"));
        Z_DATA.put("KOSTL", zMap.get("KOSTL"));
        Z_DATA.put("CREATEBY", zMap.get("CREATEBY"));
        Z_DATA.put("REMARKS", zMap.get("REMARKS"));
        //物料数据
        for (Map<String, Object> map : orderWerksInfo) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("LINENUM", map.get("LINENUM"));
            jsonObject.put("ITEMNUM", map.get("ITEMNUM"));
            jsonObject.put("ORDERQTY", map.get("ORDERQTY"));
            jsonObject.put("ORDERUNIT", map.get("ORDERUNIT"));
            jsonObject.put("APPRQUANTITY", map.get("APPRQUANTITY"));
            jsonObject.put("BINNUM", map.get("BINNUM"));
            jsonObject.put("AUFNR", map.get("AUFNR"));
            jsonObject.put("SJYDTYPE", map.get("SJYDTYPE"));
            jsonObject.put("REMARKS", map.get("REMARKS"));
            jsonObject.put("LOCATION", map.get("LOCATION"));
            jsonObject.put("SITEID", map.get("SITEID"));
            IT_REQUEST.add(jsonObject);
        }
        HEAD_DATA.put("WORKORDER", Z_DATA);
        HEAD_DATA.put("WPITEM", IT_REQUEST);
        REQUEST_DATA.put("SendData", HEAD_DATA);
        REQUEST_DATA.put("SendHead", new Object());
        REQUEST_DATA.put("SendURL", new Object());
        REQUEST_DATA.put("Operation", "Z_EAM_RETURN_SKU_STO");
        REQUEST_DATA.put("Type", "Z_EAM_RETURN_SKU_STO");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }

    /**
     * 领料出库-发送REST请求到ESB，先进行数据格式化
     */
    public JSONObject formatDataEsb(Map<String, Object> zMap, List<Map<String, Object>> orderWerksInfo) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject Z_DATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject HEAD_DATA = new JSONObject();
        JSONObject BODY_DATA = new JSONObject();
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        ESB_ATTRS.put("Target_ID", UrlConstants.spmsClient); //目标系统
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        JSONArray IT_REQUEST = new JSONArray();
        //主数据
        Z_DATA.put("WONUM", zMap.get("WONUM"));
        Z_DATA.put("CREATEBY", zMap.get("CREATEBY"));
        Z_DATA.put("CREATEDATE", zMap.get("CREATEDATE"));
        Z_DATA.put("SITEID", zMap.get("SITEID"));
        Z_DATA.put("WORKSHOP", zMap.get("WORKSHOP"));
        Z_DATA.put("LOCNUM", zMap.get("LOCNUM"));
        Z_DATA.put("KOSTL", zMap.get("KOSTL"));
        Z_DATA.put("APPTYPE", zMap.get("APPTYPE"));
        Z_DATA.put("REMARKS", zMap.get("REMARKS"));

        //物料数据
        for (Map<String, Object> map : orderWerksInfo) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("LINENUM", map.get("LINENUM"));
            jsonObject.put("ITEMNUM", map.get("ITEMNUM"));
            jsonObject.put("ORDERQTY", map.get("ORDERQTY"));
            jsonObject.put("APPRQUANTITY", map.get("APPRQUANTITY"));
            jsonObject.put("ORDERUNIT", map.get("ORDERUNIT"));
            jsonObject.put("SJYDTYPE", map.get("SJYDTYPE"));
            jsonObject.put("BINNUM", map.get("BINNUM"));
            jsonObject.put("AUFNR", map.get("AUFNR"));
            jsonObject.put("REMARKS", map.get("REMARKS"));
            IT_REQUEST.add(jsonObject);
        }
        BODY_DATA.put("WORKORDER", Z_DATA);
        BODY_DATA.put("WPITEM", IT_REQUEST);
//        REQUEST_DATA.put("Head", HEAD_DATA);
        REQUEST_DATA.put("SendHead",HEAD_DATA);
        REQUEST_DATA.put("SendData",BODY_DATA);
        REQUEST_DATA.put("token", "EAM");
        REQUEST_DATA.put("HeadType", 0);
//        REQUEST_DATA.put("Operation", "Z_EAM_OVERSEA_REQUISITION");
//        REQUEST_DATA.put("Type", "Z_EAM_OVERSEA_REQUISITION");
        //-2024-7-23许佩文提出接口改造------------------------------
        REQUEST_DATA.put("Operation", "Z_EAM_OVERSEA_REQUISITION_NEW");
        REQUEST_DATA.put("Type", "Z_EAM_OVERSEA_REQUISITION_NEW");
        //-------------------------------
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }

    /**
     * 解析接口返回数据
     **/
    public JSONObject formatDataReceived(String received, List<Map<String, Object>> mapList) {
        JSONObject jsonObject = JSONObject.parseObject(received);
        String codeStr = String.valueOf(jsonObject.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getString("code"));//返回值
        if ("200".equals(codeStr)) {
        } else {
        }
        return null;
    }
}
