package com.webclient.beans.resultshowlist;

import psdi.app.iface.gfss.Gfss2EamHandler;
import psdi.app.iface.oa.EAM2OaAtfacHandler;
import psdi.app.iface.sap.Sap2EamHandler;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXApplicationException;
import psdi.util.MXException;
import psdi.webclient.system.beans.AppBean;
import psdi.webclient.system.beans.ResultsBean;
import psdi.webclient.system.controller.WebClientEvent;
import com.alibaba.fastjson.JSONObject;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.rmi.RemoteException;
import java.util.Date;

/**
 * 任务管理AppBean
 * edit 2023-10-17
 */
public class UDBUDGETTASKAppBean extends AppBean {

    public void initializeApp() throws MXException, RemoteException {
        super.initializeApp();
        ResultsBean resultsbean = app.getResultsBean();
        MboSetRemote set=resultsbean.getMboSet();
        String userid=set.getUserInfo().getPersonId();
        MboSetRemote pset= MXServer.getMXServer().getMboSet("person", set.getUserInfo());
        pset.setWhere("personid='"+userid+"'");
        if(!pset.isEmpty() && pset.count()>0){
            MboRemote per=pset.getMbo(0);
            //权限等级
            String aut=per.getString("UDAUTGRADE");
            String orgid=per.getString("LOCATIONORG");
            String siteid=per.getString("LOCATIONSITE");

            if("Level 1".equalsIgnoreCase(aut)){
                set.setWhere(" 1=1 ");
            }else if("Level 2".equalsIgnoreCase(aut)){
                set.setWhere("  ORGID='"+orgid+"' ");
            }else if("Level 3".equalsIgnoreCase(aut)){
                set.setWhere(" SITEID='"+siteid+"' ");
            }else if("Level 4".equalsIgnoreCase(aut)){
//                set.setWhere(" ORGID='"+orgid+"' and SITEID='"+siteid+"' and CREATEBY='"+userid+"'");
            }else{
                //没有等级
                set.setWhere("1=2");
            }
        }
        pset.close();

    }

    //设备转固---固定资产创建推送SAP：Z_EAM_ASSET_CREATE
    public void ASSETZG() throws Exception {
        System.out.println("--------start sap---------");
        MboRemote appMbo = this.app.getAppBean().getMbo();
        WebClientEvent webclientevent;
        webclientevent = this.clientSession.getCurrentEvent();
        String STATUS = appMbo.getString("STATUS");
        //OA审批通过，进行转固，
        if("APPR".equalsIgnoreCase(STATUS) || "TOZG".equalsIgnoreCase(STATUS)){
            Sap2EamHandler Sap2EamHandler = new Sap2EamHandler();
            Sap2EamHandler.Z_EAM_ASSET_ZG(appMbo); //SD和TF系统都调用该方法进行转固（创建固定资产卡片和结算规则）
            //保存刷新
            app.getAppBean().save();
            app.getAppBean().refreshTable();
            app.getAppBean().reloadTable();
            app.getAppBean().fireDataChangedEvent();
            app.getAppBean().fireStructureChangedEvent();
        }else{
            this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZGSAP", "CHECKZGSAPST", new String[0]));
            return;
        }
        System.out.println("-------end sap-------------");
    }

    //设备转固---固定资产创建推送OA：Z_EAM_ASSET_CREATE
    public void ASSETZGOA() throws Exception {
        System.out.println("--------start oa---------");
        MboRemote appMbo=app.getAppBean().getMbo();
        String PROJECTNUM = appMbo.getString("UDBUDGET.PROJECTNUM");//获取主表的项目编号
        String SITEID = appMbo.getString("SITEID");
        Integer UDBUDGETTASKID = appMbo.getInt("UDBUDGETTASKID");
        WebClientEvent webclientevent;
        webclientevent = this.clientSession.getCurrentEvent();
        if("TOOA".equalsIgnoreCase(appMbo.getString("STATUS"))){
            this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtooa", "prsubtooa_dup", new String[0]));
            return;
        }else if(!"EDIT".equalsIgnoreCase(appMbo.getString("STATUS")) && !"CAN".equalsIgnoreCase(appMbo.getString("STATUS"))){
            this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtooa", "prsubtooa_xoa", new String[0]));
            return;
        }
        //推送OA审批前，先对一些字段进行验证----------------start--------------------------
        MboSetRemote assetSet = MXServer.getMXServer().getMboSet("ASSET", MXServer.getMXServer().getSystemUserInfo());//设备台账
        assetSet.setWhere("SITEID='"+SITEID+"' AND UDBUDGETTASKID="+UDBUDGETTASKID+"");
        assetSet.reset();
        //1-验证这些必填    期间/年度：USEDFROM  折旧年限：NDJAR  折旧月份：NDPER   折旧开始日期：AFABG  资产分类：ANLKL  单位：MEINS    结算百分比：PROZS
        //2-结算百分比总和是：100%；
        if(assetSet!=null && !assetSet.isEmpty()){
            //项目编号不为空，说明转固金额大于3w，必须要立项，就要验证。
            if(PROJECTNUM!=null && !"".equalsIgnoreCase(PROJECTNUM)){
                double prozsTotal = assetSet.sum("PROZS");//求和
                if(100 != prozsTotal){
                    this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZGBFB", "CHECKZGASSETBFB", new String[0]));//结算百分比之和是100%
                    return;
                }
                for(int i=0;i<assetSet.count();i++){
                    MboRemote assetMbo = assetSet.getMbo(i);
                    String ASSETNUM = assetMbo.getString("ASSETNUM");//资产编号
                    String USEDFROM = assetMbo.getString("USEDFROM");//期间/年度,
                    //必须传年+月（6位数） 202403
                    if(USEDFROM.length()!=6){
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZGLT", "CHECKZGASSETLT", new String[]{ASSETNUM}));
                        return;
                    }
//                    String NDJAR = assetMbo.getString("NDJAR");//折旧年限
                    String NDPER = assetMbo.getString("NDPER");//折旧月份
                    String AFABG = assetMbo.getString("AFABG"); //折旧开始日期
                    String ANLKL = assetMbo.getString("ANLKL");//资产分类
                    String MEINS = assetMbo.getString("MEINS");//单位
                    String PROZS = assetMbo.getString("PROZS");//结算百分比
                    //取消必填限制
//                    if((USEDFROM==null||"".equalsIgnoreCase(USEDFROM)) || (NDPER==null||"".equalsIgnoreCase(NDPER)) || (AFABG==null || "".equalsIgnoreCase(AFABG)) || (ANLKL==null||"".equalsIgnoreCase(ANLKL)) || (MEINS==null||"".equalsIgnoreCase(MEINS)) || (PROZS==null||"".equalsIgnoreCase(PROZS))){
//                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZG", "CHECKZGASSET", new String[]{ASSETNUM}));
//                        return;
//                    }
                }
            }else {
                //项目编号为空，说明转固金额小于3w，不用立项，其中“结算百分比”字段就不用验证了，可填可不填。但是拆分金额（资产金额）是必填（但是在导入的时候已经做了校验）
                for(int i=0;i<assetSet.count();i++){
                    MboRemote assetMbo = assetSet.getMbo(i);
                    String ASSETNUM = assetMbo.getString("ASSETNUM");//资产编号
                    String USEDFROM = assetMbo.getString("USEDFROM");//期间/年度,
                    //必须传年+月（6位数） 202403
                    if(USEDFROM.length()!=6){
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZGLT", "CHECKZGASSETLT", new String[]{ASSETNUM}));
                        return;
                    }
//                    String NDJAR = assetMbo.getString("NDJAR");//折旧年限
                    String NDPER = assetMbo.getString("NDPER");//折旧月份
                    String AFABG = assetMbo.getString("AFABG"); //折旧开始日期
                    String ANLKL = assetMbo.getString("ANLKL");//资产分类
                    String MEINS = assetMbo.getString("MEINS");//单位
//                    String PROZS = assetMbo.getString("PROZS");//结算百分比 --------该字段不用验证
                    if((USEDFROM==null||"".equalsIgnoreCase(USEDFROM)) || (NDPER==null||"".equalsIgnoreCase(NDPER)) || (AFABG==null || "".equalsIgnoreCase(AFABG)) || (ANLKL==null||"".equalsIgnoreCase(ANLKL)) || (MEINS==null||"".equalsIgnoreCase(MEINS))){
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZG", "CHECKZGASSET", new String[]{ASSETNUM}));
                        return;
                    }
                }
            }
        }
        //推送OA审批前，先对一些字段进行验证----------------end--------------------------
        JSONObject result = new EAM2OaAtfacHandler().Z_EAM_ATFAC_REQUISITION(appMbo);//验证通过，推送OA审批
        System.out.println("-------------result="+result);
        if(result.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
            appMbo.setValue("JRESULT", result.toString(), 2L);
        }else{
            appMbo.setValue("JRESULT", result.toString().substring(0,1333), 2L);
        }
        JSONObject RESPONSE = (JSONObject) result.get("RESPONSE");
        if(null!=RESPONSE) {
            JSONObject RETURN_DATA = (JSONObject) RESPONSE.get("RETURN_DATA");
            if (null != RETURN_DATA) {
                String code2 = RETURN_DATA.getString("code");
                JSONObject RETURN_DATA2 = (JSONObject) RETURN_DATA.get("data");
                String requestid = "";
                if(RETURN_DATA2!=null){
                    requestid = RETURN_DATA2.getString("requestid");
                    appMbo.setValue("REQUESTID", requestid,2L);
                }else{
                    requestid = appMbo.getString("REQUESTID");
                }
                if ("SUCCESS".equalsIgnoreCase(code2)) {
                    appMbo.setFieldFlag("STATUS", 7L, false);
                    appMbo.setFieldFlag("STATUSDATE", 7L, false);
                    appMbo.setValue("STATUS", "TOOA",2L);
                    appMbo.setValue("STATUSDATE", new Date(),2L);
                    appMbo.setFieldFlag("STATUS", 7L, true);
                    appMbo.setFieldFlag("STATUSDATE", 7L, true);
                    appMbo.getThisMboSet().save(2L);//保存
                    this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtooa", "prsubtooa_sus", new String[]{requestid}));
                }else{
                    appMbo.getThisMboSet().save(2L);//保存
                    this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtooa", "prsubtooa_fai", new String[]{RETURN_DATA.toString()}));
                    return;
                }
                //最后再刷新
//                app.getAppBean().save();
                app.getAppBean().refreshTable();
                app.getAppBean().reloadTable();
                app.getAppBean().fireDataChangedEvent();
                app.getAppBean().fireStructureChangedEvent();
            }
        }
        System.out.println("-------end oa-------------");
    }

    //设备转固---固定资产创建推送财务共享系统（GFSS）
    public void ASSETZGGFSS() throws Exception {
        System.out.println("--------start GFSS---------");
        MboRemote appMbo=app.getAppBean().getMbo();
        String PROJECTNUM = appMbo.getString("UDBUDGET.PROJECTNUM");//获取主表的项目编号
        String SITEID = appMbo.getString("SITEID");
        Integer UDBUDGETTASKID = appMbo.getInt("UDBUDGETTASKID");
        WebClientEvent webclientevent;
        webclientevent = this.clientSession.getCurrentEvent();
        if("TOGFSS".equalsIgnoreCase(appMbo.getString("STATUS"))){
            this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtogfss", "prsubtogfss_dup", new String[0]));//已提交到财务共享系统，请勿重复提交！
            return;
        }else if(!"EDIT".equalsIgnoreCase(appMbo.getString("STATUS")) && !"CAN".equalsIgnoreCase(appMbo.getString("STATUS")) && !"Draft".equalsIgnoreCase(appMbo.getString("STATUS"))){
            this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtogfss", "prsubtogfss_xoa", new String[0]));//该状态下不允许提交，请在编辑状态下提交！
            return;
        }
        //推送财务共享前，先对一些字段进行验证----------------start--------------------------
        MboSetRemote assetSet = MXServer.getMXServer().getMboSet("ASSET", MXServer.getMXServer().getSystemUserInfo());//设备台账
        assetSet.setWhere("SITEID='"+SITEID+"' AND UDBUDGETTASKID="+UDBUDGETTASKID+"");
        assetSet.reset();
        //1-验证这些必填    期间/年度：USEDFROM  折旧年限：NDJAR  折旧月份：NDPER   折旧开始日期：AFABG  资产分类：ANLKL  单位：MEINS    结算百分比：PROZS
        //2-结算百分比总和是：100%；
        String type = "";//固定值   FB：对应在建工程转固接口    FA：创建资产卡片接口
        if(assetSet!=null && !assetSet.isEmpty()){
            //项目编号不为空，说明转固金额大于3w，必须要立项，就要验证。
            if(PROJECTNUM!=null && !"".equalsIgnoreCase(PROJECTNUM)){
                type = "FB";
                double prozsTotal = assetSet.sum("PROZS");//求和
                if(100 != prozsTotal){
                    this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZGBFB", "CHECKZGASSETBFB", new String[0]));
                    return;
                }
                for(int i=0;i<assetSet.count();i++){
                    MboRemote assetMbo = assetSet.getMbo(i);
                    String ASSETNUM = assetMbo.getString("ASSETNUM");//资产编号
                    String USEDFROM = assetMbo.getString("USEDFROM");//期间/年度,
                    //必须传年+月（6位数） 202403
                    if(USEDFROM.length()!=6){
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZGLT", "CHECKZGASSETLT", new String[]{ASSETNUM}));
                        return;
                    }
//                    String NDJAR = assetMbo.getString("NDJAR");//折旧年限
                    String NDPER = assetMbo.getString("NDPER");//折旧月份
                    String AFABG = assetMbo.getString("AFABG"); //折旧开始日期
                    String ANLKL = assetMbo.getString("ANLKL");//资产分类
                    String MEINS = assetMbo.getString("MEINS");//单位
                    String PROZS = assetMbo.getString("PROZS");//结算百分比
                    if((USEDFROM==null||"".equalsIgnoreCase(USEDFROM))  || (NDPER==null||"".equalsIgnoreCase(NDPER)) || (AFABG==null || "".equalsIgnoreCase(AFABG)) || (ANLKL==null||"".equalsIgnoreCase(ANLKL)) || (MEINS==null||"".equalsIgnoreCase(MEINS)) || (PROZS==null||"".equalsIgnoreCase(PROZS))){
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZG", "CHECKZGASSET", new String[]{ASSETNUM}));
                        return;
                    }
                }
            }else {
                type = "FA";
                //项目编号为空，说明转固金额小于3w，不用立项，其中“结算百分比”字段就不用验证了，可填可不填。
                for(int i=0;i<assetSet.count();i++){
                    MboRemote assetMbo = assetSet.getMbo(i);
                    String ASSETNUM = assetMbo.getString("ASSETNUM");//资产编号
                    String USEDFROM = assetMbo.getString("USEDFROM");//期间/年度,
                    //必须传年+月（6位数） 202403
                    if(USEDFROM.length()!=6){
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZGLT", "CHECKZGASSETLT", new String[]{ASSETNUM}));
                        return;
                    }
//                    String NDJAR = assetMbo.getString("NDJAR");//折旧年限
                    String NDPER = assetMbo.getString("NDPER");//折旧月份
                    String AFABG = assetMbo.getString("AFABG"); //折旧开始日期
                    String ANLKL = assetMbo.getString("ANLKL");//资产分类
                    String MEINS = assetMbo.getString("MEINS");//单位
//                    String PROZS = assetMbo.getString("PROZS");//结算百分比 --------该字段不用验证
                    if((USEDFROM==null||"".equalsIgnoreCase(USEDFROM)) || (NDPER==null||"".equalsIgnoreCase(NDPER)) || (AFABG==null || "".equalsIgnoreCase(AFABG)) || (ANLKL==null||"".equalsIgnoreCase(ANLKL)) || (MEINS==null||"".equalsIgnoreCase(MEINS))){
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("CHECKZG", "CHECKZGASSET", new String[]{ASSETNUM}));
                        return;
                    }
                }
            }
        }else {
            System.out.println("------------任务管理子表（设备明细）无数据，不允许提交");
            //弹出框提示
        }
        //推送财务共享审批前，先对一些字段进行验证----------------end--------------------------
        JSONObject result = new Gfss2EamHandler().Z_EAM_FSSC(appMbo,type);//验证通过，推送财务共享审批
        System.out.println("-------------result="+result);
        //返回结果
        if(result.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
            appMbo.setValue("JRESULT", result.toString(), 2L);
        }else{
            appMbo.setValue("JRESULT", result.toString().substring(0,1333), 2L);
        }
        JSONObject RESPONSE = (JSONObject) result.get("RESPONSE");
        if(null!=RESPONSE) {
            JSONObject RETURN_DATA = (JSONObject) RESPONSE.get("RETURN_DATA");
            if (null != RETURN_DATA) {
                String codeStr = RETURN_DATA.getString("TYPE");//  S成功 E失败 R(可选:代表重复请求处理)
                String MESSAGE = RETURN_DATA.getString("MESSAGE");//返回消息
                JSONObject dataObj = RETURN_DATA.getJSONObject("DATA");
                if(dataObj!=null){
                    JSONObject RETURN_DATA2 = dataObj.getJSONObject("head");//接收头部信息
                    String Status = "";//状态
                    String TASKNUM ="";//eam单号
                    String FSSCNUM ="";//报账单号
                    if(RETURN_DATA2!=null){
                        TASKNUM = RETURN_DATA2.getString("sourceDocNumber");//EAM单号
                        FSSCNUM = RETURN_DATA2.getString("businessId");//报账系统单号（财务共享单号）
                    }
                    if ("S".equalsIgnoreCase(codeStr)) {
                        //传输成功
                        appMbo.setValue("STATUS","TOGFSS",2L);//给一个状态值
                        appMbo.setValue("FSSCNUM",FSSCNUM,2L);
                        appMbo.getThisMboSet().save();
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtogfss", "prsubtogfss_sus", new String[]{FSSCNUM}));
                    }else if("E".equalsIgnoreCase(codeStr)){
                        //传输失败
                        appMbo.setValue("STATUS","TOFAILGFSS",2L);//给一个状态值
                        appMbo.setValue("FSSCNUM",FSSCNUM,2L);
                        appMbo.getThisMboSet().save();
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtogfss", "prsubtogfss_failure", new String[]{FSSCNUM}));
                    }else if("R".equalsIgnoreCase(codeStr)){
                        //重新提交--手动
                        appMbo.setValue("STATUS","TOAGAINGFSS",2L);//给一个状态值
                        appMbo.setValue("FSSCNUM",FSSCNUM,2L);
                        appMbo.getThisMboSet().save();
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtogfss", "prsubtogfss_again", new String[]{FSSCNUM}));
                        //重新提交--自动，若一直有问题，就会导致不断地重复调用
                        //Z_EAM_FSSC(mbo,Type);
                    }
                }else{
                    if("E".equalsIgnoreCase(codeStr)){
                        //传输失败
                        this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtogfss", "prsubtogfss_failure", new String[]{MESSAGE}));
                    }
                }
            }
        }
        System.out.println("-------end GFSS-------------");
    }

    //设备转固---结算规则维护：Z_EAM_SETTLE_RULE_MAINT---万一网络断开，可以手动触发一下；
    //该接口也可能用不上，由IT部门后台处理
    public void ASSETRULE() throws Exception {
        System.out.println("--------start---------");
        MboRemote appMbo = this.app.getAppBean().getMbo();
        Sap2EamHandler Sap2EamHandler = new Sap2EamHandler();
        Sap2EamHandler.Z_EAM_ASSET_ZG(appMbo);
        System.out.println("-------end-------------");
    }

    /**
     * 手动调用
     * 将固定资产编号推送给OA
     */
    public void RETURNGDZCBM() throws Exception {
        System.out.println("--------start---------");
        WebClientEvent webclientevent;
        webclientevent = this.clientSession.getCurrentEvent();
        MboRemote appMbo = this.app.getAppBean().getMbo();
        JSONObject result = new EAM2OaAtfacHandler().Z_EAM_RETURN_ASSETNO(appMbo);
        JSONObject RESPONSE = result.getJSONObject("RESPONSE");//
        if(null!=RESPONSE) {
            JSONObject RETURN_DATA = RESPONSE.getJSONObject("RETURN_DATA");
            String code = RETURN_DATA.getString("code");
            String msg = RETURN_DATA.getString("msg");
            if(code!=null && !"".equals(code) && "200".equals(code)){
                //推送OA固定资产编号成功
                appMbo.setValue("ATTR5","TOOASUS",2L);//推送OA固定资产编号成功
                appMbo.getThisMboSet().save(2L);//保存
                this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtooa", "prsubtooa_assetSuss", new String[0]));
            }else{
                //推送OA固定资产编号失败
                appMbo.setValue("ATTR5","TOOAFAIL",2L);//推送OA固定资产编号失败
                appMbo.getThisMboSet().save(2L);//保存
                this.clientSession.showMessageBox(webclientevent, new MXApplicationException("prsubtooa", "prsubtooa_assetFail", new String[0]));
            }
        }
        System.out.println("-------end-------------");
    }
}
