package com.app.hxqh.udworkorder;

import com.alibaba.fastjson.JSONObject;
import com.app.crontask.ChangeTimeUtils;
import org.apache.bcel.generic.IF_ACMPEQ;
import psdi.app.iface.spms.Spms2EamHandler;
import psdi.mbo.Mbo;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSet;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXApplicationException;
import psdi.util.MXException;

import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Date;

/**
 * 日常维修工单Mbo
 */
public class UdWorkorderMbo extends Mbo implements MboRemote {

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

    @Override
    public void init() throws MXException {
        super.init();
        try {
            String status = getString("STATUS");
            String appname=getString("APPNAME");
            String[] mainFields = new String[] {"DESCRIPTION","ASSETNUM","LOCATION","SUPERVISOR","HDDEPT","LEAD","TARGSTARTDATE","SCHEDFINISH","ESTDUR","PERSONGROUP","GZDUTY"};
            if("EDIT".equalsIgnoreCase(status)){//草稿
                setFlag(7L, false);
            }
            if("WAPPR".equalsIgnoreCase(status) || "INAPPR".equalsIgnoreCase(status) ){//策划中 || 审核中
//                getMboSet("UDMAINLOGS").setFlag(7L, true); //维修日志
//                getMboSet("SHOWACTUALLABOR").setFlag(7L, true); //员工
//                getMboSet("SHOWACTUALMATERIAL").setFlag(7L, true); //物料
//                getMboSet("SHOWACTUALSERVICE").setFlag(7L, true); //服务
//                getMboSet("SHOWACTUALTOOL").setFlag(7L, true); //工具
                if("UDWORKORDER".equalsIgnoreCase(status)){
                    setFieldFlag("MAINTYPE", 128L, true);
                }else{
                    setFieldFlag("MAINTYPE", 128L, false);
                }
                setFieldFlag(mainFields, 7L, true);
            }
            if("INPRG".equalsIgnoreCase(status) ){//执行工单
                getMboSet("UDMAINLOGS").setFlag(7L, false); //维修日志
                getMboSet("UDWOTASK").setFlag(7L, false); //任务
                getMboSet("SHOWACTUALLABOR").setFlag(7L, false); //员工
                getMboSet("SHOWACTUALMATERIAL").setFlag(7L, false); //物料
                getMboSet("SHOWACTUALSERVICE").setFlag(7L, false); //服务
                getMboSet("SHOWACTUALTOOL").setFlag(7L, false); //工具

                //计划
                getMboSet("SHOWPLANLABOR").setFlag(7L, true); //员工
                getMboSet("SHOWPLANMATERIAL").setFlag(7L, true); //物料
                getMboSet("SHOWPLANSERVICE").setFlag(7L, true); //服务
                getMboSet("SHOWPLANTOOL").setFlag(7L, true); //工具
            }
            if("COMP".equalsIgnoreCase(status) || "CAN".equalsIgnoreCase(status) || "CLOSE".equalsIgnoreCase(status)  ) {//已完成 || 已取消 || 关闭
                setFlag(7L, true);
            }

        } catch (RemoteException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void save() throws MXException, RemoteException {
        super.save();
        if(isModified("STATUS")){
            setValue("STATUSDATE", new Date(), 2L);
        }
        String appname=getString("APPNAME");
        String status=getString("STATUS");
        //预防性维护工单 关闭时更新作业标准计划下次执行时间
        if("UDPMWOORDER".equalsIgnoreCase(appname) && "CLOSE".equalsIgnoreCase(status)){
            MboSetRemote jobSet=getMboSet("$UDJOBPLAN", "UDJOBPLAN","UDJOBSTANDID="+getInt("UDJOBSTANDID")+" and ASSETNUM='"+getString("ASSETNUM")+"'");
            if(null!=jobSet && !jobSet.isEmpty()){
                try {
                    MboRemote jobplanUmbo=jobSet.getMbo(0);
                    String cftype=jobplanUmbo.getString("CFTYPE");//触发类型
                    if("metering".equalsIgnoreCase(cftype) || "TimeMetering".equalsIgnoreCase(cftype)){
                        //更新上次执行计量
                        double xczxjlS=jobplanUmbo.getDouble("XCZXJL");//下次执行计量
                        jobplanUmbo.setValue("SCZXJL2", xczxjlS,2L);//上次执行计量

                        //更新下次执行计量
                        double sczxjl=jobplanUmbo.getDouble("SCZXJL");//当前计量值
                        double jlpl=jobplanUmbo.getDouble("JLPL");//计量频率
                        jobplanUmbo.setValue("XCZXJL", (sczxjl+jlpl),2L);
                        setValue("GZSJLZ", sczxjl,2L);//工单关闭时计量值
                        if( "TimeMetering".equalsIgnoreCase(cftype)){
                            //更新上次执行时间
                            jobplanUmbo.setValue("SCZXDATE", new Date(),2L);//上次执行时间
                            int frequency2=jobplanUmbo.getInt("RQPL");//频率
                            String frequnit2=jobplanUmbo.getString("RQPLDW");//频率单位
                            Date firsDate=jobplanUmbo.getDate("ENABLEDATE");//第一个开始日期
                            Date lascomDate = new Date();//上次完成日期
                            Date commitTime = nextComDate( frequnit2, lascomDate, firsDate, frequency2);
                            jobplanUmbo.setValue("XCZXRQ", commitTime,2L);
                        }
                    }else{
                        int frequency2=jobplanUmbo.getInt("RQPL");//频率
                        String frequnit2=jobplanUmbo.getString("RQPLDW");//频率单位
                        Date firsDate=jobplanUmbo.getDate("ENABLEDATE");//第一个开始日期
                        Date lascomDate = new Date();//上次完成日期
                        Date commitTime = nextComDate( frequnit2, lascomDate, firsDate, frequency2);
                        jobplanUmbo.setValue("XCZXRQ", commitTime,2L);
                        jobplanUmbo.setValue("SCZXDATE", lascomDate,2L);//上次执行时间
                    }


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

            }
//
        }

    }



    @Override
    public void add() throws MXException, RemoteException {
        super.add();
        setValue("WONUM", getInt("UDWORKORDERID")+"", 11L);
    }

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

}
