package com.app.hxqh.pmstdard;

import com.app.crontask.ChangeTimeUtils;
import psdi.mbo.Mbo;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSet;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXException;

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

/**
 * 点检保养标准Mbo
 */
public class UdPmstdardMbo extends Mbo implements MboRemote {

    public UdPmstdardMbo(MboSet ms) throws MXException, RemoteException {
        super(ms);
    }

    @Override
    public void init() throws MXException {
        super.init();
        try {
            String[] mainFields = new String[] {"TEMPLATEID","DESCRIPTION"};
            String status=getString("STATUS");
            if("ACTIVE".equalsIgnoreCase(status)){
                setFieldFlag(mainFields, 7L, true);
                getMboSet("PMSTDARD_PMSTDARDLINES").setFlag(7L, true);
                getMboSet("UDDJBZMBH").setFlag(7L, true);
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void save() throws MXException, RemoteException {
        super.save();
        String status=getString("STATUS");
        if(isModified("STATUS")){
            setValue("STATUSTIME", new Date(),11L);
        }
        if("ACTIVE".equalsIgnoreCase(status) && isModified("STATUS")){
            String templateid=getString("TEMPLATEID");
            String orgid=getString("ORGID");
            int pmstdardid=getInt("PMSTDARDID");
            String pmpointnum=getString("PMPOINTNUM");
//            MboSetRemote pmlineSet=getMboSet("PMSTDARD_PMSTDARDLINES");
            MboSetRemote pmlineSet = MXServer.getMXServer().getMboSet("PMSTDARDLINES",MXServer.getMXServer().getSystemUserInfo());
            //ORGID=:ORGID  and PMPOINTNUM =:PMPOINTNUM
            pmlineSet.setWhere("ORGID='"+orgid+"' and PMPOINTNUM ='"+pmpointnum+"' ");
            pmlineSet.reset();
            pmlineSet.setOrderBy("NUM");

//            MboSetRemote assetSet=getMboSet("$ASSET", "ROUTE_STOP","ASSETNUM in(SELECT ASSETNUM FROM ASSET WHERE TEMPLATEID in(SELECT TEMPLATEID FROM UDDJBZMBH WHERE parentid="+pmstdardid+" group BY TEMPLATEID)  ) AND ORGID='"+orgid+"' ");
            MboSetRemote assetSet = getMboSet("$ASSET", "ROUTE_STOP", "ASSETNUM in(SELECT ASSETNUM FROM ASSET WHERE TEMPLATEID='" + templateid + "'  ) AND ORGID='" + orgid + "' ");
            if(null!=assetSet && !assetSet.isEmpty() && null!=pmlineSet && !pmlineSet.isEmpty()){

                Calendar calendar = Calendar.getInstance();
                MboSetRemote djbzpmlineSet = MXServer.getMXServer().getMboSet("PMSTDARDLINES",MXServer.getMXServer().getSystemUserInfo());
                MboRemote zctzdjbzMbo=null;
                for(int i=0;i<assetSet.count();i++){
                    MboRemote routelineMbo=assetSet.getMbo(i);
                    String assetnum=routelineMbo.getString("ASSETNUM");
                    String siteid=routelineMbo.getString("SITEID");
                    int route_stopid=routelineMbo.getInt("ROUTE_STOPID");
                    MboSetRemote assetSetF=routelineMbo.getMboSet("$ASSET", "ASSET","ASSETNUM='"+assetnum+"' ");
                    MboRemote assetFmbo=assetSetF.getMbo(0);
                    Date assetTyrq=assetFmbo.getDate("CREATEDATE");

                    for(int j=0;j<pmlineSet.count();j++){
                        MboRemote pmlineMbo=pmlineSet.getMbo(j);
                        djbzpmlineSet.setWhere("PARENTID="+pmlineMbo.getInt("PMSTDARDLINESID")+" and ASSETNUM='"+assetnum+"' and SPOTRUNID="+route_stopid+" ");
                        djbzpmlineSet.reset();
                        if(null!=djbzpmlineSet && !djbzpmlineSet.isEmpty()){
                            zctzdjbzMbo=djbzpmlineSet.getMbo(0);
                            zctzdjbzMbo.setValue("NUM", pmlineMbo.getInt("NUM"), 2L);
                            zctzdjbzMbo.setValue("DESCRIPTION",pmlineMbo.getString("DESCRIPTION"),2L);
                            zctzdjbzMbo.setValue("POSITION",pmlineMbo.getString("POSITION"),2L);
                            zctzdjbzMbo.setValue("POINTTOOLS",pmlineMbo.getString("POINTTOOLS"),2L);
                            zctzdjbzMbo.setValue("WORKTYPE",pmlineMbo.getString("WORKTYPE"),2L);
                            zctzdjbzMbo.setValue("STATUS",pmlineMbo.getString("STATUS"),2L);
                            zctzdjbzMbo.setValue("PERGROUP",pmlineMbo.getString("PERGROUP"),2L);
                            zctzdjbzMbo.setValue("ISINPUT",pmlineMbo.getBoolean("ISINPUT"),2L);
                            zctzdjbzMbo.setValue("POINTDATUM",pmlineMbo.getString("POINTDATUM"),2L);
                            zctzdjbzMbo.setValue("FWAY",pmlineMbo.getString("FWAY"),2L);
                            zctzdjbzMbo.setValue("UNSUAL",pmlineMbo.getString("UNSUAL"),2L);
                            zctzdjbzMbo.setValue("FREQUENCY",pmlineMbo.getInt("FREQUENCY"),2L);
                            zctzdjbzMbo.setValue("FREQUNIT",pmlineMbo.getString("FREQUNIT"),2L);
                            zctzdjbzMbo.setValue("POINTMETHOD",pmlineMbo.getString("POINTMETHOD"),2L);
                            zctzdjbzMbo.setValue("REMARKS",pmlineMbo.getString("REMARKS"),2L);
                            zctzdjbzMbo.setValue("UPPERACTION",pmlineMbo.getDouble("UPPERACTION"),2L);
                            zctzdjbzMbo.setValue("LOWERACTION",pmlineMbo.getDouble("LOWERACTION"),2L);
                            zctzdjbzMbo.getThisMboSet().save();
                        }else{
                            MboSetRemote djkssjwhbSet=getMboSet("$UDDJKSSJWH", "UDDJKSSJWH","ORGID='"+orgid+"' ");
                            if(null!=djkssjwhbSet && !djkssjwhbSet.isEmpty()){
                                Date serverstart=djkssjwhbSet.getMbo(0).getDate("SERVERSTART");
                                int hours = serverstart.getHours();
                                int minutes = serverstart.getMinutes();
                                int seconds = serverstart.getSeconds();

                                zctzdjbzMbo=djbzpmlineSet.add(2L);
                                zctzdjbzMbo.setValue("ASSETNUM", assetnum,2L);
                                zctzdjbzMbo.setValue("ORGID", orgid,2L);
                                zctzdjbzMbo.setValue("SITEID", siteid,2L);
                                zctzdjbzMbo.setValue("SPOTRUNID", route_stopid,2L);
                                zctzdjbzMbo.setValue("NUM", pmlineMbo.getInt("NUM"), 2L);
                                zctzdjbzMbo.setValue("PARENTID",pmlineMbo.getInt("PMSTDARDLINESID"),2L);
                                zctzdjbzMbo.setValue("DESCRIPTION",pmlineMbo.getString("DESCRIPTION"),2L);
                                zctzdjbzMbo.setValue("POSITION",pmlineMbo.getString("POSITION"),2L);
                                zctzdjbzMbo.setValue("POINTTOOLS",pmlineMbo.getString("POINTTOOLS"),2L);
                                zctzdjbzMbo.setValue("WORKTYPE",pmlineMbo.getString("WORKTYPE"),2L);
                                zctzdjbzMbo.setValue("STATUS",pmlineMbo.getString("STATUS"),2L);
                                zctzdjbzMbo.setValue("PERGROUP",pmlineMbo.getString("PERGROUP"),2L);
                                zctzdjbzMbo.setValue("ISINPUT",pmlineMbo.getBoolean("ISINPUT"),2L);
                                zctzdjbzMbo.setValue("POINTDATUM",pmlineMbo.getString("POINTDATUM"),2L);
                                zctzdjbzMbo.setValue("FWAY",pmlineMbo.getString("FWAY"),2L);
                                zctzdjbzMbo.setValue("UNSUAL",pmlineMbo.getString("UNSUAL"),2L);
                                zctzdjbzMbo.setValue("FREQUENCY",pmlineMbo.getInt("FREQUENCY"),2L);
                                zctzdjbzMbo.setValue("FREQUNIT",pmlineMbo.getString("FREQUNIT"),2L);
                                zctzdjbzMbo.setValue("POINTMETHOD",pmlineMbo.getString("POINTMETHOD"),2L);
                                zctzdjbzMbo.setValue("REMARKS",pmlineMbo.getString("REMARKS"),2L);
                                zctzdjbzMbo.setValue("UPPERACTION",pmlineMbo.getDouble("UPPERACTION"),2L);
                                zctzdjbzMbo.setValue("LOWERACTION",pmlineMbo.getDouble("LOWERACTION"),2L);

                                try {

                                    //按当地的投运时间取下次执行时间
                                    Date curDate=new Date();
                                    Date curSerDate=null;
                                    Date nextComDate=nextComDate(pmlineMbo.getString("FREQUNIT"),assetTyrq,pmlineMbo.getInt("FREQUENCY"));
                                    if("GF03".equalsIgnoreCase(siteid) || "GF02".equalsIgnoreCase(siteid) || "GF51".equalsIgnoreCase(siteid) || "GF08".equalsIgnoreCase(siteid) || "GH01".equalsIgnoreCase(siteid)
                                            || "SN51".equalsIgnoreCase(siteid) ){
                                        curDate = ChangeTimeUtils.changeHour(curDate, -8);//转换成当地时间
                                        curSerDate=ChangeTimeUtils.changeHour(curDate, 8);//转换成北京时间
                                    }else if("KF61".equalsIgnoreCase(siteid) || "KF51".equalsIgnoreCase(siteid)
                                            || "TF51".equalsIgnoreCase(siteid) || "TF01".equalsIgnoreCase(siteid) || "TZ01".equalsIgnoreCase(siteid)){
                                        curDate = ChangeTimeUtils.changeHour(curDate, -5);//转换成当地时间
                                        curSerDate= ChangeTimeUtils.changeHour(curDate, 5);//转换成北京时间
                                    }else if("ZM31".equalsIgnoreCase(siteid)){
                                        curDate = ChangeTimeUtils.changeHour(curDate, -6);//转换成当地时间
                                        curSerDate= ChangeTimeUtils.changeHour(curDate, 6);//转换成北京时间s
                                    }

                                    int comparisonResult =nextComDate.compareTo(curDate);
                                    if (comparisonResult < 0) {
                                        calendar.setTime(curSerDate);
                                        calendar.set(Calendar.HOUR_OF_DAY, hours);
                                        calendar.set(Calendar.MINUTE, minutes);
                                        calendar.set(Calendar.SECOND, seconds);
                                        Date NEXTEXDATE=calendar.getTime();
                                        zctzdjbzMbo.setValue("NEXTEXDATE",NEXTEXDATE,2L);
                                    } else if (comparisonResult > 0) {
                                        calendar.setTime(nextComDate);
                                        // 设置指定的年、月、日、时、分、秒
                                        calendar.set(Calendar.HOUR_OF_DAY, hours);
                                        calendar.set(Calendar.MINUTE, minutes);
                                        calendar.set(Calendar.SECOND, seconds);
                                        Date NEXTEXDATE=calendar.getTime();
                                        zctzdjbzMbo.setValue("NEXTEXDATE",NEXTEXDATE,2L);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    e.getCause();
                                    e.getMessage();
                                }
                                zctzdjbzMbo.getThisMboSet().save();
                            }

                        }

                    }
                }
            }

        }

    }


    /**
     * 获取下次执行时间
     * @param frequnit
     * @param firsDate
     * @param frequency
     * @return
     * @throws Exception
     */
    public Date nextComDate(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);
        }
        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;
    }

    @Override
    public void add() throws MXException, RemoteException {
        super.add();
        setValue("PMPOINTNUM", getInt("PMSTDARDID")+"",2L);
    }


    @Override
    public void delete() throws MXException, RemoteException {
        super.delete();
    }
}
