package com.app.crontask;


import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.server.SimpleCronTask;

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

/**
 * ORGID='FMCG' 定时扫描【刀具组】根据检修路线和点检保养标准生成点检保养任务任务
 * edit 20230411  ToolGroup
 */
public class PmStdFMCGToolGroupCronTask extends SimpleCronTask {

    @Override
    public void cronAction() {

        try {
            //检修路线
            MboSetRemote routesSet = MXServer.getMXServer().getMboSet("ROUTES",MXServer.getMXServer().getSystemUserInfo());
            routesSet.setWhere("STATUS ='ACTIVE' and ORGID='FMCG'");
            routesSet.reset();
            //点检保养标准子表
            MboSetRemote pmstdarLineSet = MXServer.getMXServer().getMboSet("PMSTDARDLINES",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote pmstdarLineSet2 = MXServer.getMXServer().getMboSet("PMSTDARDLINES",MXServer.getMXServer().getSystemUserInfo());
            //点检保养任务主表
            MboSetRemote spotrunSet = MXServer.getMXServer().getMboSet("SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
            int routesSetCount=routesSet.count();
            for(int i=0;i<routesSetCount;i++){
                MboRemote routeMbo=routesSet.getMbo(i);
                String route=routeMbo.getString("ROUTE");//检修路线
                String orgid=routeMbo.getString("ORGID");
                String siteid=routeMbo.getString("SITEID");
                String sqlWhere2="PMPOINTNUM IN(SELECT PMPOINTNUM FROM PMSTDARD WHERE TEMPLATEID in(select TEMPLATEID from ASSET where ASSETNUM in(select ASSETNUM from ROUTE_STOP where route='"+route+"' and siteid='"+siteid+"') AND USESTATUS='Running') and ORGID ='"+orgid+"' and SITEID ='"+siteid+"'  )  and ORGID ='"+orgid+"' and SITEID ='"+siteid+"' and ( (FIRSTDATE>=TO_DATE(TO_CHAR(SYSDATE,'yyyy-MM-dd'),'yyyy-MM-dd') and FIRSTDATE<TO_DATE(TO_CHAR(SYSDATE+1,'yyyy-MM-dd') ,'yyyy-MM-dd') ) or (NEXTEXDATE>=TO_DATE(TO_CHAR(SYSDATE,'yyyy-MM-dd'),'yyyy-MM-dd') and NEXTEXDATE<TO_DATE(TO_CHAR(SYSDATE+1,'yyyy-MM-dd'),'yyyy-MM-dd') ) ) and PERGROUP='ToolGroup'";
                pmstdarLineSet2.setWhere(sqlWhere2);
                pmstdarLineSet2.reset();
                if(null!=pmstdarLineSet2 && !pmstdarLineSet2.isEmpty()){
                    MboRemote sporturnMbo=spotrunSet.addAtEnd(2L);
                    MboSetRemote sptrunSet=sporturnMbo.getMboSet("$SPOTRUN", "SPOTRUN","ORGID='"+orgid+"' AND SITEID='"+siteid+"' AND CREATEDATE>=TO_DATE(TO_CHAR(SYSDATE,'yyyy-MM-dd'),'yyyy-MM-dd') and CREATEDATE<TO_DATE(TO_CHAR(SYSDATE+1,'yyyy-MM-dd'),'yyyy-MM-dd')");
                    int count=sptrunSet.count()+1;
                    DecimalFormat de=new DecimalFormat("0000");
                    String sKeynum = "EXE"+new SimpleDateFormat("yyyyMMdd").format(new Date())+"-"+de.format(count);
                    sporturnMbo.setValue("SPOTRUNNUM",sKeynum,11L);//SPOTRUN Spot check Case No
                    sporturnMbo.setValue("DESCRIPTION", routeMbo.getString("DESCRIPTION")+" ToolGroup inspection and maintenance tasks",2L);//描述
                    sporturnMbo.setValue("POINTROUTE", routeMbo.getString("ROUTE"),2L);//点检路线
                    sporturnMbo.setValue("ORGID", orgid,2L);
                    sporturnMbo.setValue("SITEID", siteid,2L);
                    sporturnMbo.setValue("LANGCODE", "EN",2L);
                    //添加语言表
                    MboSetRemote l_spotrunSet=sporturnMbo.getMboSet("$L_SPOTRUN","L_SPOTRUN","1=2");
                    if(null!=l_spotrunSet){
                        MboSetRemote l_routesSet=sporturnMbo.getMboSet("$L_ROUTES","L_ROUTES","OWNERID="+routeMbo.getInt("ROUTESID")+" and LANGCODE='ZH'");
                        if(null!=l_routesSet){
                            MboRemote l_routesMbo=l_routesSet.getMbo(0);
                            MboRemote l_spotrunMbo=l_spotrunSet.addAtEnd(2L);
                            if(null!=l_routesMbo){
                                l_spotrunMbo.setValue("OWNERID", sporturnMbo.getInt("SPOTRUNID"), 2L);
                                l_spotrunMbo.setValue("LANGCODE", "ZH", 2L);
                                l_spotrunMbo.setValue("DESCRIPTION", l_routesMbo.getString("DESCRIPTION")+"刀具组的点检保养任务", 2L);
                            }
                        }
                    }
                    sporturnMbo.getThisMboSet().save();


                    MboSetRemote sporturnLineSet=sporturnMbo.getMboSet("SPOTRUN_SPOTRUNLINES");//点检保养任务子表
                    MboSetRemote l_spotrunlineSet=routeMbo.getMboSet("$L_SPOTRUNLINES", "L_SPOTRUNLINES","1=1");
                    //检修路线子表Set
                    MboSetRemote routeLineSet=routeMbo.getMboSet("ROUTE_STOP");
                    routeLineSet.setOrderBy("ROUTESTOPID");
                    int routeLineSetCount=routeLineSet.count();
                    for(int j=0;j<routeLineSetCount;j++){
                        MboRemote routeLineMbo=routeLineSet.getMbo(j);
                        String assetnum=routeLineMbo.getString("ASSETNUM");
                        int stopsequence=routeLineMbo.getInt("STOPSEQUENCE");
                        MboSetRemote assetSet=routeLineMbo.getMboSet("$ASSET", "ASSET", "ASSETNUM='"+assetnum+"'");
                        if(null!=assetSet && !assetSet.isEmpty()){
                            MboRemote assetMbo=assetSet.getMbo(0);
                            //刀具组 PERGROUP='ToolGroup'
                            String sqlWhere="PMPOINTNUM IN(SELECT PMPOINTNUM FROM PMSTDARD WHERE TEMPLATEID in(select TEMPLATEID from ASSET where ASSETNUM='"+assetnum+"' AND USESTATUS='Running') and ORGID ='"+orgid+"' and SITEID ='"+siteid+"' )  and ORGID ='"+orgid+"' and SITEID ='"+siteid+"' and ( (FIRSTDATE>=TO_DATE(TO_CHAR(SYSDATE,'yyyy-MM-dd'),'yyyy-MM-dd') and FIRSTDATE<TO_DATE(TO_CHAR(SYSDATE+1,'yyyy-MM-dd') ,'yyyy-MM-dd') ) or (NEXTEXDATE>=TO_DATE(TO_CHAR(SYSDATE,'yyyy-MM-dd'),'yyyy-MM-dd') and NEXTEXDATE<TO_DATE(TO_CHAR(SYSDATE+1,'yyyy-MM-dd'),'yyyy-MM-dd') ) ) and PERGROUP='ToolGroup'";
                            pmstdarLineSet.setWhere(sqlWhere);
                            pmstdarLineSet.setOrderBy("PMSTDARDLINESID");
                            pmstdarLineSet.reset();
                            if(null!=pmstdarLineSet && !pmstdarLineSet.isEmpty()){
                                int pmstdarLineSetCount=pmstdarLineSet.count();
                                MboRemote pmslineMbo=null;
                                MboRemote splineMbo=null;
                                for(int k=0;k<pmstdarLineSetCount;k++){
                                    pmslineMbo=pmstdarLineSet.getMbo(k);
                                    int frequency = pmslineMbo.getInt("FREQUENCY");//频率
                                    String frequnit = pmslineMbo.getString("FREQUNIT");//频率单位
                                    String projectnum=pmslineMbo.getString("PROJECTNUM");
                                    splineMbo=sporturnLineSet.addAtEnd(2L);
                                    //ORGID=:ORGID and SITEID =:SITEID and SPOTRUNNUM =:SPOTRUNNUM
                                    splineMbo.setValue("ORGID", orgid,2L);
                                    splineMbo.setValue("SITEID", siteid,2L);
                                    splineMbo.setValue("SPOTRUNNUM", sporturnMbo.getString("SPOTRUNNUM"),2L);

                                    splineMbo.setValue("PMPOINTNUM", pmslineMbo.getString("PMPOINTNUM"),2L);//点检保养标准编号
                                    splineMbo.setValue("PROJECTNUM", pmslineMbo.getString("PROJECTNUM"),2L);//点检保养标准明细行序号

                                    splineMbo.setValue("SPOTRUNLINENUM", stopsequence+"",2L);//序号（字符）
                                    splineMbo.setValue("STOPSEQUENCE", stopsequence,2L);//序号(排序作用)
                                    splineMbo.setValue("DESCRIPTION", pmslineMbo.getString("DESCRIPTION"),2L);//作业任务
                                    splineMbo.setValue("POSITION", pmslineMbo.getString("POSITION"),2L);//部位
                                    splineMbo.setValue("POINTDATUM", pmslineMbo.getString("POINTDATUM"),2L);//判定基准
                                    splineMbo.setValue("WORKTYPE", pmslineMbo.getString("WORKTYPE"),2L);//管理性质
                                    splineMbo.setValue("UNSUAL", pmslineMbo.getString("UNSUAL"),2L);//异常处置
                                    splineMbo.setValue("STATUS", pmslineMbo.getString("STATUS"),2L);//实施状态
                                    splineMbo.setValue("FREQUENCY", frequency,2L);//频率
                                    splineMbo.setValue("FREQUNIT", frequnit,2L);//频率单位
                                    splineMbo.setValue("POINTMETHOD", pmslineMbo.getString("POINTMETHOD"),2L);//点检方法
                                    splineMbo.setValue("SDYRZY", pmslineMbo.getString("PERGROUP"),2L);//执行组

                                    splineMbo.setValue("FWAY", pmslineMbo.getString("FWAY"),2L);//点检方式
                                    splineMbo.setValue("UPPERACTION", pmslineMbo.getInt("UPPERACTION"),2L);
                                    splineMbo.setValue("LOWERACTION", pmslineMbo.getInt("LOWERACTION"),2L);

                                    splineMbo.setValue("ASSETNUM", assetnum,2L);//资产
                                    splineMbo.setValue("LOCATION", assetMbo.getString("LOCATION"),2L);//位置
                                    splineMbo.setValue("LANGCODE", "EN",2L);

                                    //添加明细行语言表
                                    if(null!=l_spotrunlineSet){
                                        MboSetRemote l_pmstdardlineSet=routeMbo.getMboSet("$L_PMSTDARDLINES", "L_PMSTDARDLINES", "OWNERID="+pmslineMbo.getInt("PMSTDARDLINESID")+" and LANGCODE='ZH'");
                                        if(null!=l_pmstdardlineSet){
                                            MboRemote l_pmstdarlineMbo=l_pmstdardlineSet.getMbo(0);
                                            if(null!=l_pmstdarlineMbo){
                                                MboRemote l_spotrunlineMbo=l_spotrunlineSet.addAtEnd(2L);
                                                l_spotrunlineMbo.setValue("OWNERID", splineMbo.getInt("SPOTRUNLINESID"), 2L);
                                                l_spotrunlineMbo.setValue("LANGCODE", "ZH", 2L);
                                                l_spotrunlineMbo.setValue("DESCRIPTION", l_pmstdarlineMbo.getString("DESCRIPTION"), 2L);
                                                l_spotrunlineMbo.setValue("POSITION", l_pmstdarlineMbo.getString("POSITION"), 2L);
                                                l_spotrunlineMbo.setValue("POINTMETHOD", l_pmstdarlineMbo.getString("POINTMETHOD"), 2L);
                                                l_spotrunlineMbo.setValue("UNSUAL", l_pmstdarlineMbo.getString("UNSUAL"), 2L);
                                                l_spotrunlineMbo.setValue("POINTDATUM", l_pmstdarlineMbo.getString("POINTDATUM"), 2L);
                                                l_spotrunlineMbo.getThisMboSet().save();
                                                l_spotrunlineMbo.getThisMboSet().close();
                                            }
                                        }
                                    }
                                    //反填点检标准明细行的上次完成时间
                                    pmslineMbo.setValue("LASTCOMPDATE", new Date(),2L);

                                    //生成日志记录
                                    MboSetRemote pmLogSet=splineMbo.getMboSet("$UDPMSTDLOG","UDPMSTDLOG","1=2");
                                    MboRemote pmlogMbo=pmLogSet.addAtEnd(2L);
                                    pmlogMbo.setValue("DJBZID", pmslineMbo.getInt("PMSTDARDLINESID"),2L);//点检保养标准明细行ID
                                    pmlogMbo.setValue("BYRWID", splineMbo.getInt("SPOTRUNLINESID"),2L);//点检保养任务明细行ID
                                    pmlogMbo.setValue("LOGTIME", new Date());//日志时间
                                }
                                splineMbo.getThisMboSet().save();
                                pmslineMbo.getThisMboSet().save();
                                splineMbo.getThisMboSet().close();
                                pmslineMbo.getThisMboSet().close();
                                sporturnMbo.getThisMboSet().close();
                            }
                        }
                    }
                }
            }

            //所有路线匹配完点检标准后更新点检标准中的下次执行日期
            MboSetRemote djbzZxhUpdateSet = MXServer.getMXServer().getMboSet("PMSTDARDLINES",MXServer.getMXServer().getSystemUserInfo());
            djbzZxhUpdateSet.setWhere("LASTCOMPDATE>=TO_DATE(TO_CHAR(SYSDATE,'yyyy-MM-dd'),'yyyy-MM-dd') and LASTCOMPDATE<TO_DATE(TO_CHAR(SYSDATE+1,'yyyy-MM-dd') ,'yyyy-MM-dd')");
            djbzZxhUpdateSet.reset();
            if(null!=djbzZxhUpdateSet){
                for(int l=0;l<djbzZxhUpdateSet.count();l++){
                    MboRemote djbzZxhMbo=djbzZxhUpdateSet.getMbo(l);
                    int frequency2 = djbzZxhMbo.getInt("FREQUENCY");//频率
                    String frequnit2 = djbzZxhMbo.getString("FREQUNIT");//频率单位
                    Date firsDate2 = djbzZxhMbo.getDate("FIRSTDATE");//第一个开始日期
                    Date lascomDate2 = djbzZxhMbo.getDate("LASTCOMPDATE");//上次完成日期

                    Date commitTime=nextComDate( frequnit2, lascomDate2, firsDate2, frequency2);
                    djbzZxhMbo.setValue("NEXTEXDATE", commitTime,2L);
                }
                djbzZxhUpdateSet.save();
                djbzZxhUpdateSet.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            e.getCause();
            e.getMessage();
        }
    }

    /**
     * 获取下次执行时间
     * @param frequnit
     * @param lascomDate
     * @param firsDate
     * @param frequency
     * @return
     * @throws Exception
     */
    public Date nextComDate(String frequnit,Date lascomDate,Date firsDate,int frequency) throws Exception {
        Date commitTime=null;
        if ("DAY".equalsIgnoreCase(frequnit)) {//日
            if (null == lascomDate) {
                commitTime = ChangeTimeUtils.changeDay(firsDate, frequency);
            } else {
                commitTime = ChangeTimeUtils.changeDay(new Date(), frequency);
            }
        }
        if ("HOUR".equalsIgnoreCase(frequnit)) {//小时
            if (null == lascomDate) {
                commitTime = ChangeTimeUtils.changeHour(firsDate, frequency);
            } else {
                commitTime = ChangeTimeUtils.changeHour(new Date(), frequency);
            }
        }
        if ("MONTH".equalsIgnoreCase(frequnit)) {//月
            if (null == lascomDate) {
                commitTime = ChangeTimeUtils.changeMonth(firsDate, frequency);
            } else {
                commitTime = ChangeTimeUtils.changeMonth(new Date(), frequency);
            }
        }
        if ("QUARTER".equalsIgnoreCase(frequnit)) {//季度
            if (null == lascomDate) {
                commitTime = ChangeTimeUtils.changeQuarter(firsDate, frequency);
            } else {
                commitTime = ChangeTimeUtils.changeQuarter(new Date(), frequency);
            }
        }
        if ("WEEK".equalsIgnoreCase(frequnit)) {//周
            if (null == lascomDate) {
                commitTime = ChangeTimeUtils.changeWeek(firsDate, frequency);
            } else {
                commitTime = ChangeTimeUtils.changeWeek(new Date(), frequency);
            }
        }
        if ("YEAR".equalsIgnoreCase(frequnit)) {//年
            if (null == lascomDate) {
                commitTime = ChangeTimeUtils.changeYear(firsDate, frequency);
            } else {
                commitTime = ChangeTimeUtils.changeYear(new Date(), frequency);
            }
        }
        return commitTime;
    }
}
