package com.app.crontask.tfwy;


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

import java.util.Date;

/**
 * 定时扫描 TF51、 设备预防性维护生成预防性维护工单 时间类型
 * edit 20230622
 */
public class JobStandTfwyCronTask extends SimpleCronTask {

    @Override
    public void cronAction() {

        try {
            //资产台账-预防性维护-维保计划

            //预防性维护工单
            MboSetRemote udworkorderSet = MXServer.getMXServer().getMboSet("UDWORKORDER",MXServer.getMXServer().getSystemUserInfo());

            //触发类型为 time & TimeMetering（时间类型 & 时间和计量）
            MboSetRemote jobplanTimeSet = MXServer.getMXServer().getMboSet("UDJOBPLAN",MXServer.getMXServer().getSystemUserInfo());
            jobplanTimeSet.setWhere("ENABLE=1 AND SITEID in('TF51') AND ( (XCZXRQ>=TO_DATE(TO_CHAR(SYSDATE,'yyyy-MM-dd'),'yyyy-MM-dd') and XCZXRQ<TO_DATE(TO_CHAR(SYSDATE+1,'yyyy-MM-dd'),'yyyy-MM-dd') ) ) and CFTYPE in('time') ");
            jobplanTimeSet.reset();
            if(null!=jobplanTimeSet && !jobplanTimeSet.isEmpty()){
                for(int i=0;i<jobplanTimeSet.count();i++){
                    MboRemote jobMbo=jobplanTimeSet.getMbo(i);
                    MboSetRemote udworkorderSet2=jobMbo.getMboSet("$UDWORKORDER","UDWORKORDER","UDWORKORDERID=(SELECT max(UDWORKORDERID) FROM UDWORKORDER WHERE UDJOBSTANDID="+jobMbo.getInt("UDJOBSTANDID")+" AND ASSETNUM ='"+jobMbo.getString("ASSETNUM")+"') ");
                    MboRemote workMbo=null;
                    if(null!=udworkorderSet2 && !udworkorderSet2.isEmpty()){
                        MboRemote udworkorderMbo=udworkorderSet2.getMbo(0);
                        String status=udworkorderMbo.getString("STATUS");
                        if("CLOSE".equalsIgnoreCase(status)){
                            workMbo=udworkorderSet.addAtEnd(2L);
                        }
                    }else{
                        workMbo=udworkorderSet.addAtEnd(2L);
                    }
                    if(null!=workMbo){
                        workMbo.setValue("APPNAME", "UDPMWOORDER",11L);
                        MboSetRemote l_udjobstandSet = MXServer.getMXServer().getMboSet("L_UDJOBSTAND",MXServer.getMXServer().getSystemUserInfo());
                        String zybzdesc=jobMbo.getString("UDJOBSTAND.DESCRIPTION");
                        l_udjobstandSet.setWhere("OWNERID="+jobMbo.getInt("UDJOBSTANDID")+" AND LANGCODE='ZH' ");
                        l_udjobstandSet.reset();
                        if(null!=l_udjobstandSet && !l_udjobstandSet.isEmpty()){
                            zybzdesc=l_udjobstandSet.getMbo(0).getString("DESCRIPTION");
                        }
                        workMbo.setValue("DESCRIPTION", jobMbo.getString("ASSETNUM")+zybzdesc,11L);
                        workMbo.setValue("YFXCJFS", "Automatic", 2L);//预防性工单创建方式，Manual手动，Automatic自动
                        workMbo.setValue("ASSETNUM", jobMbo.getString("ASSETNUM"),2L);
                        workMbo.setValue("UDJOBSTANDID", jobMbo.getInt("UDJOBSTANDID"),2L);
                        workMbo.setValue("STATUS", "EDIT",2L);
                        workMbo.setValue("ORGID", jobMbo.getString("ORGID"),2L);
                        workMbo.setValue("SITEID", jobMbo.getString("SITEID"),2L);

                        //任务子表
                        MboSetRemote wotaskSet=workMbo.getMboSet("UDWOTASK");
                        MboSetRemote jobstandline=jobMbo.getMboSet("UDJOBSTANDLINE");
                        if(null!=jobstandline && !jobstandline.isEmpty()){
                            for(int j=0;j<jobstandline.count();j++){
                                //parentid=:UDWORKORDERID AND siteid=:siteid
                                MboRemote wotaskMbo=wotaskSet.add();
                                MboRemote jobstandlineMbo=jobstandline.getMbo(j);
                                wotaskMbo.setValue("parentid", workMbo.getInt("UDWORKORDERID"),2L);
                                wotaskMbo.setValue("siteid", workMbo.getString("siteid"),2L);
                                wotaskMbo.setValue("TASKID", jobstandlineMbo.getString("TASKID"),2L);
                                wotaskMbo.setValue("DESCRIPTION", jobstandlineMbo.getString("DESCRIPTION"),2L);
                            }
                        }

                        //物料子表
                        MboSetRemote woWlSet=workMbo.getMboSet("SHOWPLANMATERIAL");
                        MboSetRemote joblWlSet=jobMbo.getMboSet("UDJOBZIGF_WL");
                        if(null!=woWlSet && !joblWlSet.isEmpty()){
                            for(int j=0;j<joblWlSet.count();j++){
                                //parentid=:UDWORKORDERID and ISPLAN=1 and LTYPE=2
                                MboRemote woWlMbo=woWlSet.add();
                                MboRemote joblWlMbo=joblWlSet.getMbo(j);
                                woWlMbo.setValue("parentid", workMbo.getInt("UDWORKORDERID"),2L);
                                woWlMbo.setValue("siteid", workMbo.getString("siteid"),2L);
                                woWlMbo.setValue("ORGID", workMbo.getString("ORGID"),2L);
                                woWlMbo.setValue("ISPLAN", 1,2L);
                                woWlMbo.setValue("LTYPE", 2,2L);
                                woWlMbo.setValue("ITEMNUM", joblWlMbo.getString("ITEMNUM"),2L);
                                woWlMbo.setValue("ITEMQTY", joblWlMbo.getDouble("QUANTITY"),11L);
                            }
                        }

                        //员工子表
                        MboSetRemote ygSet=workMbo.getMboSet("SHOWPLANLABOR");
                        MboSetRemote bzZxzSet=jobMbo.getMboSet("UDJOBZIGF_ZXZ");
                        if(null!=bzZxzSet && !bzZxzSet.isEmpty()){
                            for(int k=0;k<bzZxzSet.count();k++){
                                MboRemote zxzMbo=bzZxzSet.getMbo(k);
                                String zxz=zxzMbo.getString("ZXZ");
                                String zxzSql="PERSONGROUP IN(SELECT UDZXZGH FROM UDCJZ WHERE ASSETID="+jobMbo.getString("ASSETNUM")+" AND TYPE='"+zxz+"')";
                                MboSetRemote ryzSet=workMbo.getMboSet("$PERSONGROUPTEAM", "PERSONGROUPTEAM", zxzSql);
                                if(null!=ryzSet){
                                    for(int l=0;l<ryzSet.count();l++){
                                        MboRemote ryzMbo=ryzSet.getMbo(l);
                                        //parentid=:UDWORKORDERID and ISPLAN=1 and LTYPE=1
                                        MboRemote ygMbo=ygSet.add();
                                        ygMbo.setValue("parentid", workMbo.getInt("UDWORKORDERID"),2L);
                                        ygMbo.setValue("ISPLAN", 1,2L);
                                        ygMbo.setValue("LTYPE", 1,2L);
                                        ygMbo.setValue("TASKID", zxzMbo.getString("TASKID"),2L);
                                        ygMbo.setValue("LABORCODE", ryzMbo.getString("RESPPARTYGROUP"),2L);
                                    }
                                }
                            }
                        }
                        ((WorkFlowServiceRemote) MXServer.getMXServer().lookup("WORKFLOW")).initiateWorkflow("UDPMWOORDE", workMbo);
                        workMbo.getThisMboSet().save();
                        workMbo.getThisMboSet().close();
                    }
                }

            }

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

    /**
     * 获取下次执行时间
     * @param frequnit
     * @param lascomDate
     * @param firsDate
     * @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;
    }
}
