package com.webclient.beans.udjobstand;

import com.alibaba.fastjson.JSONObject;
import com.app.crontask.ChangeTimeUtils;
import com.ibm.ism.content.mriu.StringUtil;
import com.webclient.beans.udpr.ImpExcelTool;
import org.apache.poi.ss.usermodel.*;
import org.springframework.util.StringUtils;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXApplicationException;
import psdi.util.MXException;
import psdi.webclient.controls.Messagebox;
import psdi.webclient.system.beans.DataBean;
import psdi.webclient.system.controller.MPFormData;
import psdi.webclient.system.session.WebClientSession;

import javax.servlet.http.HttpSession;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.rmi.RemoteException;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
import java.util.logging.Logger;

/**
 * @author az
 * @since 2024-12-05
 * @deprecated 资产预防性维护计划批量导入数据
 */
public class UdjobplanDataBean extends DataBean {
    static Logger logger = Logger.getLogger(UdjobplanDataBean.class.getName());
    public static WebClientSession wcs;
    public static HttpSession mxSession;
    public static MboRemote mainMbo;
    public static MPFormData mpData;

    public void importExecute() throws MXException, RemoteException, UnsupportedEncodingException {
        logger.info("开始执行导入资产预防性维护计划数据的模板...");
        String str[]={"导入成功!"};
        wcs = this.clientSession;
        mpData = ImpExcelTool.getInstance().checkExcelType(wcs); // 校验文件正确性
        mxSession = wcs.getRequest().getSession();
        if (null == mxSession.getAttribute("mxClientSession")) {
            mxSession.setAttribute("mxClientSession", wcs);
        }
        if (this.app != null && this.app.getAppBean() != null) {
            mxSession.setAttribute("appMainMbo", this.app.getAppBean().getMbo());
        }
        mxSession.setAttribute("mpData", mpData);
        wcs.getResponse().setContentType("text/html; charset=UTF-8"); // 转码
        try {
            //MboRemote mainMbo = this.app.getAppBean().getMbo();
            //以上代码校验是否是文件通过

            //以下验证数据及导入数据

            // 读取文件
            byte[] b = mpData.getFileOutputStream().toByteArray();
            InputStream ips = new ByteArrayInputStream(b);
            Workbook workBook= WorkbookFactory.create(ips);
            Sheet sheet = workBook.getSheetAt(0);
            int beginRowIndex = 2;// 处理数据的开始行，默认从0开始
            int beginColIndex = 0;// 处理数据开始列，默认从0开始
            // 验证EXCEL中的数据
            String result=validDataAndInsert(sheet, beginRowIndex);
            JSONObject resObj = (JSONObject) JSONObject.parse(result);
            String code = resObj.getString("code");
            if(resObj!=null && code !=null && !"".equals(code)){
                if("10000".equals(code)){
                    app.getAppBean().refreshTable();
                    app.getAppBean().reloadTable();
                    app.getAppBean().fireDataChangedEvent();
                    app.getAppBean().fireStructureChangedEvent();
                    this.app.getDataBean("results_showlist").reloadTable();
                    this.app.getDataBean("results_showlist").refreshTable();
                    wcs.showMessageBox("commoninfo", "commoninfo", str);
                }else{
                    String msg = resObj.getString("msg");
                    String str1[]={msg};
                    wcs.showMessageBox("commoninfo", "commoninfo_err", str1);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.gc();
        }

    }

    public String validDataAndInsert(Sheet sheet, int beginRowIndex) throws RemoteException, MXException, ParseException {
        JSONObject result = new JSONObject();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        int rowi=1;
        String str="导入成功!";
        try {
            // 主单编号
            int totalRows = sheet.getLastRowNum(); // 该excel表的总行数
            MboSetRemote udjobplan = MXServer.getMXServer().getMboSet("UDJOBPLAN",MXServer.getMXServer().getSystemUserInfo()); //资产预防性维护计划
            MboSetRemote udjobstand = MXServer.getMXServer().getMboSet("UDJOBSTAND", MXServer.getMXServer().getSystemUserInfo()); //作业标准信息
            //MboSetRemote udmeterhis = MXServer.getMXServer().getMboSet("UDMETERHIS", MXServer.getMXServer().getSystemUserInfo()); //计量管理-历史计量数据
            MboSetRemote udmeter = MXServer.getMXServer().getMboSet("UDMETER", MXServer.getMXServer().getSystemUserInfo()); //计量管理
            MboRemote udjobplanMbo=null;
            for (int i = beginRowIndex; i <= totalRows; i++) {
                logger.info("当前插入行：：" + i + "/" + totalRows);
                Row row = sheet.getRow(i);
                // 判断何时结束循环
                if (row == null || null==row.getCell(0)) {
                    break;
                }
                rowi=row.getRowNum()+1;
                if(StringUtil.isEmpty(getCellString(row, 0))){ //判断资产编号
                    str="第"+rowi+"行资产编码不能为空,请修改后再导入!";
                    result.put("code", "10001");
                    result.put("msg",str);
                    return result.toString();
                }
                if(StringUtil.isEmpty(getCellString(row, 1))){ //判断作业编号
                    str="第"+rowi+"行作业编号不能为空,请修改后再导入!";
                    result.put("code", "10001");
                    result.put("msg",str);
                    return result.toString();
                }
                udjobplan.setWhere("ASSETNUM='"+getCellString(row, 0)+"' AND UDJOBSTANDNUM='"+getCellString(row, 1)+"'");
                udjobplan.reset();
                udjobstand.setWhere("UDJOBSTANDNUM='"+getCellString(row, 1)+"'"); //作业标准
                udjobstand.reset();
                if(!udjobplan.isEmpty() && udjobplan.count()>0){
                    udjobplanMbo = udjobplan.getMbo(0);
                    this.saveData(udjobstand,udjobplanMbo,row,udmeter,udjobplan,sdf);
//                    udjobplanMbo.setValue("ASSETNUM",getCellString(row, 0),2L); //资产编号
//                    udjobplanMbo.setValue("UDJOBSTANDNUM",getCellString(row, 1),2L); //作业编号
//                    udjobplanMbo.setValue("ENABLEDATE", getCellString(row, 2),2L); //启用时间
//                    udjobplanMbo.setValue("ENABLE",Objects.isNull(getCellString(row, 3))?"0":getCellString(row, 3),2L); //是否启用
//                    udjobplanMbo.setValue("SITEID",getCellString(row, 4),2L);//地点
//                    udjobplanMbo.setValue("ORGID",getCellString(row, 5),2L); //组织
//                    udjobplan.save(2L);
                    //udjobplanMbo.getThisMboSet().close();
                }else{
                    udjobplanMbo=udjobplan.add(2L);
                    this.saveData(udjobstand,udjobplanMbo,row,udmeter,udjobplan,sdf);
//                    if(!udjobstand.isEmpty()){
//                        MboRemote udjobstandMbo = udjobstand.getMbo(0);
//                        udjobplanMbo.setValue("CFTYPE", udjobstandMbo.getString("CFTYPE"),11L);//触发类型
//                        udjobplanMbo.setValue("JLPL", udjobstandMbo.getInt("FREQUENCY"),11L);//计量频率
//                        udjobplanMbo.setValue("JLPLDW", udjobstandMbo.getString("FREQUNIT"),11L);//计量频率单位
//                        udjobplanMbo.setValue("RQPL", udjobstandMbo.getInt("TIMEFRECY"),11L);//时间频率
//                        udjobplanMbo.setValue("RQPLDW", udjobstandMbo.getString("TIMEFRECYUNIT"),11L);//时间频率单位
//                    }
//                    if("1".equals(getCellString(row, 3))){ //是否启用 1表示启用
//                        String cftype=udjobplanMbo.getString("CFTYPE");
//                        //计量类型 || 时间&计量类型
//                        if("metering".equalsIgnoreCase(cftype) || "TimeMetering".equalsIgnoreCase(cftype)){
//                            udmeter.setWhere("ASSETNUM='"+getCellString(row, 0)+"' and MEASUREUNITID='"+udjobplanMbo.getString("JLPLDW")+"'");
//                            udmeter.reset();
//                            if (!udmeter.isEmpty()) {
//                                String totalds = udmeter.getMbo(0).getString("TOTALDS");
//                                udjobplanMbo.setValue("SCZXJL",totalds,2L); //累计总读数
//                            }
//                            udjobplanMbo.setValue("XCZXJL", (udjobplanMbo.getDouble("SCZXJL")+udjobplanMbo.getDouble("JLPL")), 2L);//下次执行
//                        }
//                        //时间 || 时间&计量类型
//                        if("time".equalsIgnoreCase(cftype) || "TimeMetering".equalsIgnoreCase(cftype)){
//                            int frequency2=udjobplanMbo.getInt("RQPL");//频率
//                            String frequnit2=udjobplanMbo.getString("RQPLDW");//频率单位
//                            Date firsDate=new Date();
//                            if (udjobplanMbo.isNull("ENABLEDATE")) {
//                                if(!StringUtil.isEmpty(getCellString(row,2))){
//                                    firsDate=sdf.parse(getCellString(row,2));
//                                }
//                            }else {
//                                firsDate=udjobplanMbo.getDate("ENABLEDATE");//第一个开始日期
//                            }
//                            Date lascomDate=udjobplanMbo.getDate("SCZXDATE");//上次完成时间
//                            Date commitTime = nextComDate( frequnit2, lascomDate, firsDate, frequency2);
//                            udjobplanMbo.setValue("XCZXRQ", commitTime,2L);//下次执行
//                        }
//                    }
//                    udjobplanMbo.setValue("ASSETNUM",getCellString(row, 0),2L); //资产编号
//                    udjobplanMbo.setValue("UDJOBSTANDNUM",getCellString(row, 1),2L); //作业编号
//                    udjobplanMbo.setValue("ENABLEDATE", getCellString(row,2),2L); //启用时间
//                    udjobplanMbo.setValue("ENABLE",Objects.isNull(getCellString(row, 3))?"0":getCellString(row, 3),2L); //是否启用
//                    udjobplanMbo.setValue("SITEID",getCellString(row, 4),2L);//地点
//                    udjobplanMbo.setValue("ORGID",getCellString(row, 5),2L); //组织
//                    udjobplan.save(2L);
                    //udjobplan.close();
                }
            }
            result.put("code", "10000");
            result.put("msg", str);
            udmeter.close();
            udjobstand.close();
            udjobplan.close();
        }catch (Exception e){
            e.getMessage();
            e.getCause();
            str="第 "+rowi+" 行导入报错:"+e.getMessage();
            result.put("code", "10001");
            result.put("msg", str);
        }
        return result.toString();
    }

    /**
     * wuhz
     * @param udjobstand
     * @param udjobplanMbo
     * @param row
     * @param udmeter
     * @param udjobplan
     * @param sdf
     * @throws Exception
     */
    public void saveData(MboSetRemote udjobstand,MboRemote udjobplanMbo,Row row ,MboSetRemote udmeter,MboSetRemote udjobplan,SimpleDateFormat sdf)
            throws Exception {
        if(!udjobstand.isEmpty()){
            MboRemote udjobstandMbo = udjobstand.getMbo(0);
            udjobplanMbo.setValue("CFTYPE", udjobstandMbo.getString("CFTYPE"),11L);//触发类型
            udjobplanMbo.setValue("JLPL", udjobstandMbo.getInt("FREQUENCY"),11L);//计量频率
            udjobplanMbo.setValue("JLPLDW", udjobstandMbo.getString("FREQUNIT"),11L);//计量频率单位
            udjobplanMbo.setValue("RQPL", udjobstandMbo.getInt("TIMEFRECY"),11L);//时间频率
            udjobplanMbo.setValue("RQPLDW", udjobstandMbo.getString("TIMEFRECYUNIT"),11L);//时间频率单位
        }
        if("1".equals(getCellString(row, 3))){ //是否启用 1表示启用
            String cftype=udjobplanMbo.getString("CFTYPE");
            //计量类型 || 时间&计量类型
            if("metering".equalsIgnoreCase(cftype) || "TimeMetering".equalsIgnoreCase(cftype)){
                udmeter.setWhere("ASSETNUM='"+getCellString(row, 0)+"' and MEASUREUNITID='"+udjobplanMbo.getString("JLPLDW")+"'");
                udmeter.reset();
                if (!udmeter.isEmpty()) {
                    String totalds = udmeter.getMbo(0).getString("TOTALDS");
                    udjobplanMbo.setValue("SCZXJL",totalds,2L); //累计总读数
                }
                udjobplanMbo.setValue("XCZXJL", (udjobplanMbo.getDouble("SCZXJL")+udjobplanMbo.getDouble("JLPL")), 2L);//下次执行
            }
            //时间 || 时间&计量类型
            if("time".equalsIgnoreCase(cftype) || "TimeMetering".equalsIgnoreCase(cftype)){
                int frequency2=udjobplanMbo.getInt("RQPL");//频率
                String frequnit2=udjobplanMbo.getString("RQPLDW");//频率单位
                Date firsDate=new Date();
                if (udjobplanMbo.isNull("ENABLEDATE")) {
                    if(!StringUtil.isEmpty(getCellString(row,2))){
                        firsDate=sdf.parse(getCellString(row,2));
                    }
                }else {
                    firsDate=udjobplanMbo.getDate("ENABLEDATE");//第一个开始日期
                }
                Date lascomDate=udjobplanMbo.getDate("SCZXDATE");//上次完成时间
                Date commitTime = nextComDate( frequnit2, lascomDate, firsDate, frequency2);
                udjobplanMbo.setValue("XCZXRQ", commitTime,2L);//下次执行
            }
        }
        udjobplanMbo.setValue("ASSETNUM",getCellString(row, 0),2L); //资产编号
        udjobplanMbo.setValue("UDJOBSTANDNUM",getCellString(row, 1),2L); //作业编号
        udjobplanMbo.setValue("ENABLEDATE", getCellString(row,2),2L); //启用时间
        udjobplanMbo.setValue("ENABLE",Objects.isNull(getCellString(row, 3))?"0":getCellString(row, 3),2L); //是否启用
        udjobplanMbo.setValue("SITEID",getCellString(row, 4),2L);//地点
        udjobplanMbo.setValue("ORGID",getCellString(row, 5),2L); //组织
        udjobplan.save(2L);
    }

    private String getCellString(Row row, int i) throws MXApplicationException {
        Cell cell = row.getCell(i);
        String cellStr = "";
        if (cell == null) {
            return cellStr;
        }
        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
            cellStr = cell.getRichStringCellValue().getString().trim();
        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            if (DateUtil.isCellDateFormatted(cell)) { // 自定义的日期类型
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                Date date = cell.getDateCellValue();
                cellStr = sdf.format(date).trim();
            } else {
                NumberFormat nf = NumberFormat.getInstance();
                nf.setGroupingUsed(false); // 设置数字格式，不自动用科学计数法
                if (i == 15 || i == 18 || i == 19 || i == 21 || i == 23 || i == 47) {
                    Integer value = (int) cell.getNumericCellValue(); // 整数
                    cellStr = nf.format(value).trim();
                } else {
                    double value = cell.getNumericCellValue(); // 小数
                    cellStr = nf.format(value).trim();
                }
            }
        } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { // 公式
            cellStr = cell.getCellFormula().trim();
        } else {
            cellStr = cell.getRichStringCellValue().getString().trim();
        }
        return cellStr;
    }

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