package com.app.crontask.gfls;

import com.app.crontask.ChangeTimeUtils;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.server.SimpleCronTask;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * GF03 安全点检任务生成定时类
 * edit 20240723
 */
public class SafetyInsGflsCronTask extends SimpleCronTask {
    @Override
    public void cronAction() {
        try {
            //获取安全点检路线
            MboSetRemote aqdjlxSet = MXServer.getMXServer().getMboSet("UDAQDJLX", MXServer.getMXServer().getSystemUserInfo());
            String aqdjlxStr = " STATUS='ACTIVE' AND SITEID='GF03' AND ORGID='TILE' ";
            aqdjlxSet.setWhere(aqdjlxStr);
            aqdjlxSet.reset();
            if(null!=aqdjlxSet && !aqdjlxSet.isEmpty()){
                //安全点检位置执行组
                MboSetRemote aqdjwzzxzSet = MXServer.getMXServer().getMboSet("UDAQDJWZZXZ", MXServer.getMXServer().getSystemUserInfo());
                //安全点检任务Set
                MboSetRemote udaqdjrwSet = MXServer.getMXServer().getMboSet("UDAQDJRW", MXServer.getMXServer().getSystemUserInfo());
                //安全点检任务明细行Set
                MboSetRemote udaqdjrwLineSet = MXServer.getMXServer().getMboSet("UDAQDJRWLINE", MXServer.getMXServer().getSystemUserInfo());

                //安全点检位置-安全点检任务计划Set
                MboSetRemote udaqdjwzrwjhSet = MXServer.getMXServer().getMboSet("UDAQDJWZRWJH", MXServer.getMXServer().getSystemUserInfo());

                Date curdate=new Date();

                //遍历活动状态下的安全点检路线
                for(int i=0;i<aqdjlxSet.count();i++){
                    MboRemote aqdjlxMbo=aqdjlxSet.getMbo(i);
                    int udaqdjlxid=aqdjlxMbo.getInt("UDAQDJLXID");//表ID
                    String pldw=aqdjlxMbo.getString("PLDW");//路线频率
                    String orgid=aqdjlxMbo.getString("ORGID");//ORGID
                    String siteid=aqdjlxMbo.getString("SITEID");//SITEID
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(curdate);
                    calendar.add(Calendar.HOUR_OF_DAY, -8);
                    Date knysj=calendar.getTime();//转换成肯尼亚当地时间
                    calendar.setTime(knysj);

                    boolean flag=true;//当到达周几，月几作标记
                    if("WEEK".equalsIgnoreCase(pldw)){
                        String dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)+"";
                        String zj=aqdjlxMbo.getString("ZJ");//周几
                        if(!zj.equalsIgnoreCase(dayOfWeek)){
                            flag=false;
                        }
                    }
                    if("MONTH".equalsIgnoreCase(pldw)){
                        String yj=aqdjlxMbo.getString("YJ");//月几
                        String dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH)+"";
                        if(!yj.equalsIgnoreCase(dayOfMonth)){
                            flag=false;
                        }
                    }

                    //安全点检位置执行组
                    String zxzStr="PARENTID in(SELECT UDAQDJWZID FROM UDAQDJWZ WHERE LOCATION IN(SELECT LOCATION FROM UDAQDJLXLINE WHERE PARENTID="+udaqdjlxid+") AND STATUS='ACTIVE' ) AND ORGID='"+orgid+"' AND SITEID='"+siteid+"'";
                    aqdjwzzxzSet.setWhere(zxzStr);
                    aqdjwzzxzSet.reset();
                    if(null!=aqdjwzzxzSet && !aqdjwzzxzSet.isEmpty()){
                        for(int j=0;j<aqdjwzzxzSet.count();j++){
                            MboRemote aqdjwzzxzMbo=aqdjwzzxzSet.getMbo(j);
                            String zxzlx=aqdjwzzxzMbo.getString("ZXZLX");//执行组类型
                            String zxz=aqdjwzzxzMbo.getString("ZXZ");//执行组/人员组
                            int zxzparentid=aqdjwzzxzMbo.getInt("PARENTID");//执行组parentid=安全点检位置表id
                            //安全点检位置主表mbo
                            MboRemote aqdjwzMbo=aqdjwzzxzMbo.getMboSet("$UDAQDJWZ", "UDAQDJWZ", "UDAQDJWZID="+zxzparentid+" AND ORGID='"+orgid+"' AND SITEID='"+siteid+"'").getMbo(0);
                            boolean isnodj=aqdjwzMbo.getBoolean("ISNODJ");//是否周末不点检？
                            String location=aqdjwzMbo.getString("LOCATION");//安全点检位置编号
                            String locationDesc=aqdjwzMbo.getString("DESCRIPTION");//安全点检位置名称
                            if(isnodj){
                                int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
                                if (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) {
//                                    System.out.println("It's the weekend!");
                                    flag=false;
                                }
                            }
                            //校验当前执行组下有没有待执行的任务，如无则不生成安全点检任务
                            MboSetRemote aqdjDzxrwSet=aqdjwzMbo.getMboSet("$UDAQDJWZRWJH","UDAQDJWZRWJH","PLDW='"+pldw+"' AND PARENTID="+zxzparentid+" AND ZXZLX='"+zxzlx+"' AND ORGID='"+orgid+"' AND SITEID='"+siteid+"' AND TRUNC(XCZXSJ)=TRUNC(SYSDATE) ");
                            if(null==aqdjDzxrwSet || aqdjDzxrwSet.isEmpty()){
                                flag=false;
                            }

                            if(flag){
                                try{
                                    MboRemote aqdjrwMbo=udaqdjrwSet.add();//安全点检任务
                                    aqdjrwMbo.setValue("UDAQDJRWNUM", aqdjrwMbo.getInt("UDAQDJRWID")+"", 2L);//安全点检任务编号
                                    aqdjrwMbo.setValue("DESCRIPTION", locationDesc, 2L);//安全点检任务描述
                                    aqdjrwMbo.setValue("ZXZLX", zxzlx, 2L);//执行组类型
                                    aqdjrwMbo.setValue("RYZ", zxz, 2L);//执行组/人员组
                                    aqdjrwMbo.setValue("ROUTE", udaqdjlxid+"", 2L);//安全点检路线表id
                                    aqdjrwMbo.setValue("ORGID", orgid, 2L);//组织
                                    aqdjrwMbo.setValue("SITEID", siteid, 2L);//地点
                                    aqdjrwMbo.setValue("STATUS", "EDIT", 2L);//状态
                                    aqdjrwMbo.setValue("STATUSTIME", curdate, 2L);//状态时间
                                    aqdjrwMbo.setValue("CREATEDATE", curdate, 2L);//任务生成时间
                                    aqdjrwMbo.setValue("LANGCODE", "EN", 2L);
                                    //取安全点检任务描述多语言
                                    MboSetRemote aqdjrwZhSet=aqdjrwMbo.getMboSet("$L_UDAQDJWZ", "L_UDAQDJWZ", "OWNERID="+zxzparentid+" AND LANGCODE='ZH'");
                                    if(null!=aqdjrwZhSet && !aqdjrwZhSet.isEmpty()){
                                        MboRemote aqdjrwZhMbo=aqdjrwZhSet.getMbo(0);
                                        MboSetRemote l_udaqdjrwZhSet=aqdjrwMbo.getMboSet("$L_UDAQDJRW","L_UDAQDJRW","1=2");
                                        MboRemote l_udaqdjrwZhMbo=l_udaqdjrwZhSet.add();
                                        l_udaqdjrwZhMbo.setValue("OWNERID", aqdjrwMbo.getInt("UDAQDJRWID"));
                                        l_udaqdjrwZhMbo.setValue("LANGCODE", "ZH");
                                        l_udaqdjrwZhMbo.setValue("DESCRIPTION", aqdjrwZhMbo.getString("DESCRIPTION"));
                                    }
                                    MboSetRemote aqdjrwFrSet=aqdjrwMbo.getMboSet("$L_UDAQDJWZ", "L_UDAQDJWZ", "OWNERID="+zxzparentid+" AND LANGCODE='FR'");
                                    if(null!=aqdjrwFrSet && !aqdjrwFrSet.isEmpty()){
                                        MboRemote aqdjrwFrMbo=aqdjrwFrSet.getMbo(0);
                                        MboSetRemote l_udaqdjrwFrSet=aqdjrwMbo.getMboSet("$L_UDAQDJRW","L_UDAQDJRW","1=2");
                                        MboRemote l_udaqdjrwFrMbo=l_udaqdjrwFrSet.add();
                                        l_udaqdjrwFrMbo.setValue("OWNERID", aqdjrwMbo.getInt("UDAQDJRWID"));
                                        l_udaqdjrwFrMbo.setValue("LANGCODE", "FR");
                                        l_udaqdjrwFrMbo.setValue("DESCRIPTION", aqdjrwFrMbo.getString("DESCRIPTION"));
                                    }
                                    aqdjrwMbo.getThisMboSet().save();

                                    //安全点检位置-安全点检任务计划
                                    String jhrwStr=" PLDW='"+pldw+"' AND PARENTID="+zxzparentid+" AND ZXZLX='"+zxzlx+"' AND ORGID='"+orgid+"' AND SITEID='"+siteid+"' AND TRUNC(XCZXSJ)=TRUNC(SYSDATE) ";
                                    udaqdjwzrwjhSet.setWhere(jhrwStr);
                                    udaqdjwzrwjhSet.reset();
                                    if(null!=udaqdjwzrwjhSet && !udaqdjwzrwjhSet.isEmpty()){
                                        for(int k=0;k<udaqdjwzrwjhSet.count();k++){
                                            MboRemote udaqdjwzrwjhMbo=udaqdjwzrwjhSet.getMbo(k);

                                            //写入安全点检任务明细子表数据
                                            MboRemote udaqdjrwLineMbo=udaqdjrwLineSet.add(2L);//安全点检任务明细行Mbo
                                            udaqdjrwLineMbo.setValue("PARENTID",aqdjrwMbo.getInt("UDAQDJRWID"));
                                            udaqdjrwLineMbo.setValue("ORGID",orgid);
                                            udaqdjrwLineMbo.setValue("SITEID",siteid);
                                            udaqdjrwLineMbo.setValue("XH",udaqdjwzrwjhMbo.getInt("XH"));//序号
                                            udaqdjrwLineMbo.setValue("LOCATION",location);//安全点检位置表id
                                            udaqdjrwLineMbo.setValue("JCXM",udaqdjwzrwjhMbo.getString("JCXM"));//检查项目
                                            udaqdjrwLineMbo.setValue("DESCRIPTION",udaqdjwzrwjhMbo.getString("DESCRIPTION"));//检查内容及要求
                                            udaqdjrwLineMbo.setValue("JCFS",udaqdjwzrwjhMbo.getString("JCFS"));//检查方式
                                            udaqdjrwLineMbo.setValue("PL",udaqdjwzrwjhMbo.getInt("PL"));//频率
                                            udaqdjrwLineMbo.setValue("PLDW",udaqdjwzrwjhMbo.getString("PLDW"));//频率单位
                                            udaqdjrwLineMbo.setValue("UDSAISTANDLINEID",udaqdjwzrwjhMbo.getInt("UDSAISTANDLINEID"));//安全点检标准明细子表id
                                            udaqdjrwLineMbo.setValue("LANGCODE","EN");

                                            //写入多语言字段
                                            MboSetRemote l_djbzZhSet=udaqdjrwLineMbo.getMboSet("$L_UDSAISTANDLINE", "L_UDSAISTANDLINE", "OWNERID="+udaqdjwzrwjhMbo.getInt("UDSAISTANDLINEID")+" AND LANGCODE='ZH'");
                                            if(null!=l_djbzZhSet && !l_djbzZhSet.isEmpty()){
                                                MboSetRemote l_addjwzjhrwZhSet=udaqdjrwLineMbo.getMboSet("$L_UDAQDJRWLINE", "L_UDAQDJRWLINE", "1=2");
                                                MboRemote l_djbzZhMbo=l_djbzZhSet.getMbo(0);
                                                MboRemote l_addjwzjhrwZhMbo=l_addjwzjhrwZhSet.add();
                                                l_addjwzjhrwZhMbo.setValue("OWNERID", udaqdjrwLineMbo.getInt("UDAQDJRWLINEID"));
                                                l_addjwzjhrwZhMbo.setValue("LANGCODE", "ZH");
                                                l_addjwzjhrwZhMbo.setValue("JCXM", l_djbzZhMbo.getString("JCXM"));
                                                l_addjwzjhrwZhMbo.setValue("DESCRIPTION", l_djbzZhMbo.getString("DESCRIPTION"));
                                                l_addjwzjhrwZhMbo.setValue("JCFS", l_djbzZhMbo.getString("JCFS"));
                                                l_addjwzjhrwZhMbo.getThisMboSet().save();
                                            }
                                            MboSetRemote l_djbzFrSet=udaqdjrwLineMbo.getMboSet("$L_UDSAISTANDLINE", "L_UDSAISTANDLINE", "OWNERID="+udaqdjwzrwjhMbo.getInt("UDSAISTANDLINEID")+" AND LANGCODE='FR'");
                                            if(null!=l_djbzFrSet && !l_djbzFrSet.isEmpty()){
                                                MboSetRemote l_addjwzjhrwFrSet=udaqdjrwLineMbo.getMboSet("$L_UDAQDJRWLINE", "L_UDAQDJRWLINE", "1=2");
                                                MboRemote l_djbzFrMbo=l_djbzFrSet.getMbo(0);
                                                MboRemote l_addjwzjhrwFrMbo=l_addjwzjhrwFrSet.add();
                                                l_addjwzjhrwFrMbo.setValue("OWNERID", udaqdjrwLineMbo.getInt("UDAQDJRWLINEID"));
                                                l_addjwzjhrwFrMbo.setValue("LANGCODE", "FR");
                                                l_addjwzjhrwFrMbo.setValue("JCXM", l_djbzFrMbo.getString("JCXM"));
                                                l_addjwzjhrwFrMbo.setValue("DESCRIPTION", l_djbzFrMbo.getString("DESCRIPTION"));
                                                l_addjwzjhrwFrMbo.setValue("JCFS", l_djbzFrMbo.getString("JCFS"));
                                            }
                                            udaqdjrwLineMbo.getThisMboSet().save();

                                            udaqdjwzrwjhMbo.setValue("SCZXSJ", curdate, 2L);//上次执行时间
                                            udaqdjwzrwjhMbo.getThisMboSet().save();
                                        }
                                    }

                                }catch (Exception e){
                                    e.getMessage();
                                    e.printStackTrace();
                                    e.getCause();
                                }
                            }

                        }
                    }

                }

                //更新下次执行时间
                String jhrwStr2="ORGID='TILE' AND SITEID='GF03' AND TRUNC(XCZXSJ)=TRUNC(SYSDATE) ";
                udaqdjwzrwjhSet.setWhere(jhrwStr2);
                udaqdjwzrwjhSet.reset();
                if(null!=udaqdjwzrwjhSet){
                    MboRemote djbzZxhMbo=null;
                    for(int update=0;update<udaqdjwzrwjhSet.count();update++){
                        djbzZxhMbo=udaqdjwzrwjhSet.getMbo(update);
                        int frequency2 = djbzZxhMbo.getInt("PL");//频率
                        String frequnit2 = djbzZxhMbo.getString("PLDW");//频率单位
                        Date lascomDate2=null;
                        if(null==djbzZxhMbo.getDate("SCZXSJ")){
                            lascomDate2=new Date();
                        }else{
                            lascomDate2= djbzZxhMbo.getDate("SCZXSJ");//上次完成时间
                        }
                        Date updateNextTime=calculateNext(frequnit2,lascomDate2,frequency2);
                        djbzZxhMbo.setValue("XCZXSJ", updateNextTime,2L);
                    }
                    udaqdjwzrwjhSet.save();
                    udaqdjwzrwjhSet.close();
                }

            }
        }catch (Exception e){
            e.getCause();
            e.getMessage();
            e.printStackTrace();
        }finally {
            System.gc();
            System.out.println("--GF03安全点检任务生成成功！");
        }
    }


    /**
     * 根据频率单位、频率计算出下一次的时间
     * @param frequnit
     * @param firsDate
     * @param frequency
     * @return
     * @throws Exception
     */
    public Date calculateNext(String frequnit,Date firsDate,int frequency) throws Exception {
        Date commitTime=null;
        if ("DAY".equalsIgnoreCase(frequnit)) {//日
            commitTime = ChangeTimeUtils.changeDay(firsDate, frequency);
        }
        if ("HOUR".equalsIgnoreCase(frequnit)) {//小时
            commitTime = ChangeTimeUtils.changeHour(firsDate, frequency);
        }
        if ("MONTH".equalsIgnoreCase(frequnit)) {//月
            commitTime = ChangeTimeUtils.changeMonth(firsDate, frequency);
            SimpleDateFormat sf9=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
        if ("QUARTER".equalsIgnoreCase(frequnit)) {//季度
            commitTime = ChangeTimeUtils.changeQuarter(firsDate, frequency);
        }
        if ("WEEK".equalsIgnoreCase(frequnit)) {//周
            commitTime = ChangeTimeUtils.changeWeek(firsDate, frequency);
        }
        if ("YEAR".equalsIgnoreCase(frequnit)) {//年
            commitTime = ChangeTimeUtils.changeYear(firsDate, frequency);
        }
        return commitTime;
    }


}
