package psdi.app.iface.mobile;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dbms.dbcon.DBCon;
import psdi.app.iface.comm.UrlConstants;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXException;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.nio.charset.StandardCharsets;
import java.rmi.RemoteException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
import java.time.format.DateTimeFormatter;
import java.time.LocalTime;

/**
 * 点检保养任务上传
 *
 * createBy liuxq
 */
@Path("/spot")
public class SpotRunLinetAppService {

    //加纳时间转北京时间
    public static String convertToBeijingTime(String localTime) {
        //非洲当地时间
        ZoneId ghanaZone = ZoneId.of("Africa/Accra");
        ZoneId beijingZone = ZoneId.of("Asia/Shanghai");
        // 定义时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 解析加纳当地时间字符串为 ZonedDateTime 对象
        ZonedDateTime ghanaZonedDateTime = ZonedDateTime.parse(localTime, formatter.withZone(ghanaZone));
        // 将加纳时间转换为北京时间
        ZonedDateTime beijingZonedDateTime = ghanaZonedDateTime.withZoneSameInstant(beijingZone);
        // 格式化北京时间为字符串
        String beijingTimeString = beijingZonedDateTime.format(formatter);
        // 打印结果
//        System.out.println("local datetime" + localTime);
//        System.out.println("beijing datetime" + beijingTimeString);
        return beijingTimeString;
    }

    /**
     *
     * @param localTime 非洲当地时间
     * @param SITEID  地点
     */
    public static String AfricaconvertToBeijingTime(String localTime,String SITEID) {
        //加纳陶瓷，加纳纸尿裤，加纳五金，加纳洁具，加纳贸易公司 同一个时区
        ZoneId ghanaZone = null;
        ZoneId beijingZone = null;
        if("GF03".equalsIgnoreCase(SITEID) || "GF51".equalsIgnoreCase(SITEID) || "GF02".equalsIgnoreCase(SITEID) || "GF08".equalsIgnoreCase(SITEID) || "GH01".equalsIgnoreCase(SITEID)){
            ghanaZone = ZoneId.of("Africa/Accra");
            beijingZone = ZoneId.of("Asia/Shanghai");
        }else{
            //肯尼亚陶瓷，肯尼亚纸尿裤，坦桑洗衣粉，坦桑纸尿裤 同一个时区
            ghanaZone = ZoneId.of("Africa/Nairobi");
            beijingZone = ZoneId.of("Asia/Shanghai");
        }
        // 定义时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 解析加纳当地时间字符串为 ZonedDateTime 对象
        ZonedDateTime ghanaZonedDateTime = ZonedDateTime.parse(localTime, formatter.withZone(ghanaZone));
        // 将加纳时间转换为北京时间
        ZonedDateTime beijingZonedDateTime = ghanaZonedDateTime.withZoneSameInstant(beijingZone);
        // 格式化北京时间为字符串
        String beijingTimeString = beijingZonedDateTime.format(formatter);
        // 打印结果
//        System.out.println("local datetime" + localTime);
//        System.out.println("beijing datetime" + beijingTimeString);
        return beijingTimeString;
    }
    /**
     * 任务显示
     * @param
     */
    @POST
    @Path("/taskOnline")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject taskData(JSONObject jsonObject) throws RemoteException, MXException, ParseException {
        JSONObject returnDate = new JSONObject();
        JSONArray taskDataArr = new JSONArray();//放任务
        System.out.println("taskOnline start....");//当前时间不在指定范围内
        //--接收参数---start--------------------------------
        String USERID = jsonObject.getString("USERID");//APP传过来的当前用户工号
        String LANGCODE = jsonObject.getString("LANGCODE");//登录环境
        String LOGTIME = jsonObject.getString("LOGTIME");//进入到点检保养在线任务界面的时间---传服务器时间
        String LOGTIME1 = jsonObject.getString("LOGTIME1");//当地时间
        String ORGID = jsonObject.getString("ORGID");//组织
        String SITEID = jsonObject.getString("SITEID");//地点
        //-接收参数---end--------------------------------
        //验证
        if(USERID==null || "".equals(USERID)){
            returnDate.put("errcode","201");
            returnDate.put("errmsg","User ID Lost");
            return returnDate;
        }
        if(LANGCODE==null || "".equals(LANGCODE)){
            returnDate.put("errcode","202");
            returnDate.put("errmsg","Language Environment Lost");
            return returnDate;
        }
        if(ORGID==null || "".equals(ORGID)){
            returnDate.put("errcode","203");
            returnDate.put("errmsg","ORGID Lost");
            return returnDate;
        }
        if(SITEID==null || "".equals(SITEID)){
            returnDate.put("errcode","204");
            returnDate.put("errmsg","SITEID Lost");
            return returnDate;
        }
        String LocalStartTime = "";//当地的开始时间
        String LocalEndTime = "";//当地的结束时间
        //时间判断----------------------------------------
        Calendar calendar = Calendar.getInstance();
        // 定义日期时间格式：
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 定义时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 解析当前时间字符串为 LocalDateTime 对象
        LocalDateTime currentDateTime = LocalDateTime.parse(LOGTIME1, formatter);
        if("TILE".equalsIgnoreCase(ORGID) || "SUNDA".equalsIgnoreCase(ORGID)){
            //陶瓷是一天一检
           /*
             //这是早上0点到晚上24点间的范围
             LocalDateTime currentDate = currentDateTime.toLocalDate().atStartOfDay();
            // 构造当天的结束日期时间
            LocalDateTime endOfDayDateTime = currentDate.plusDays(1).minusNanos(1);
            // 判断当前时间是否在当天0点到晚上24点之间
            if (currentDateTime.isAfter(currentDate) && currentDateTime.isBefore(endOfDayDateTime)) {
                // 格式化开始和结束时间为字符串
                LocalStartTime = currentDate.format(formatter);
                LocalEndTime = endOfDayDateTime.format(formatter);
            }*/
            LocalTime startTime = LocalTime.of(7, 0); // 设置开始时间为早上7点
            LocalTime endTime = LocalTime.of(7, 0);// 设置开始时间为早上7点
            LocalDateTime startDateTime;
            LocalDateTime endDateTime;
            if (currentDateTime.toLocalTime().isBefore(startTime)) {
                // 如果当前时间在早上7点之前，结束时间为今天的早上7点，开始时间为前一天的早上7点
                endDateTime  = currentDateTime.with(endTime);
                startDateTime = currentDateTime.with(endTime).minusHours(24);
            } else {
                // 如果当前时间在早上7点之后，开始时间为今天的早上7点，结束时间为明天的早上7点
                startDateTime = currentDateTime.with(startTime);
                endDateTime = currentDateTime.with(startTime).plusHours(24);
            }
            //判断
            if (currentDateTime.isAfter(startDateTime) && currentDateTime.isBefore(endDateTime)) {
                System.out.println("at beforeDay 7am to toDay 7am");
                LocalStartTime = startDateTime.format(formatter);
                LocalEndTime = endDateTime.format(formatter);
            } else {
                System.out.println("at toDay 7am to nextDay 7am");
                LocalStartTime = startDateTime.format(formatter);
                LocalEndTime = endDateTime.format(formatter);
            }
        }else{
            //快消和五金是12小时一检
            // 定义晚上8点和第二天早上8点的时间范围
            LocalTime nightStart = LocalTime.of(20, 0, 0);
            LocalTime nextDayMorningStart = LocalTime.of(8, 0, 0);
            // 定义当天早上8点和晚上20点的时间范围
            LocalTime morningStart = LocalTime.of(8, 0, 0);
            LocalTime eveningStart = LocalTime.of(20, 0, 0);
            // 构造开始和结束的日期时间范围
            LocalDateTime nightRangeStart;
            LocalDateTime nightRangeEnd;
            LocalDateTime dayRangeStart;
            LocalDateTime dayRangeEnd;
            if (currentDateTime.toLocalTime().isBefore(nextDayMorningStart)) {
                nightRangeStart = LocalDateTime.of(currentDateTime.toLocalDate().minusDays(1), nightStart);
                nightRangeEnd = LocalDateTime.of(currentDateTime.toLocalDate(), nextDayMorningStart);
                dayRangeStart = LocalDateTime.of(currentDateTime.toLocalDate(), morningStart);
                dayRangeEnd = LocalDateTime.of(currentDateTime.toLocalDate(), eveningStart);
            } else {
                nightRangeStart = LocalDateTime.of(currentDateTime.toLocalDate(), nightStart);
                nightRangeEnd = LocalDateTime.of(currentDateTime.toLocalDate().plusDays(1), nextDayMorningStart);
                dayRangeStart = LocalDateTime.of(currentDateTime.toLocalDate(), morningStart);
                dayRangeEnd = LocalDateTime.of(currentDateTime.toLocalDate(), eveningStart);
            }
            // 判断并输出时间段
            if (currentDateTime.isAfter(nightRangeStart) && currentDateTime.isBefore(nightRangeEnd)) {
                LocalStartTime = nightRangeStart.format(formatter);
                LocalEndTime = nightRangeEnd.format(formatter);
                System.out.println("at toNight 20 to nextDay Morning 8");//当前时间在晚上8点到第二天早上8点之间
            } else if (currentDateTime.isAfter(dayRangeStart) && currentDateTime.isBefore(dayRangeEnd)) {
                LocalStartTime = dayRangeStart.format(formatter);
                LocalEndTime = dayRangeEnd.format(formatter);
                System.out.println("at toDay 8 at toDay 20");//当前时间在当天早上8点到晚上20点之间
            } else {
                LocalStartTime = "";
                LocalEndTime = "";
                System.out.println("no range");//当前时间不在指定范围内
            }
            System.out.println("starttime：" + LocalStartTime);
            System.out.println("endtime：" + LocalEndTime);
        }
        //转北京时间------
        //注意后续根据工厂判断，加纳是一个时区，坦桑和肯尼亚是一个时区*****************************
//        String bjstartDate = convertToBeijingTime(LocalStartTime);
//        String bjendDate = convertToBeijingTime(LocalEndTime);
        //到肯尼亚，使用下面的转换
        String bjstartDate = AfricaconvertToBeijingTime(LocalStartTime,SITEID);
        String bjendDate = AfricaconvertToBeijingTime(LocalEndTime,SITEID);
        //--********************************************************************************
        //-验证---end--------------------------------
        //获取任务单
        MboSetRemote spotRunSet = MXServer.getMXServer().getMboSet("SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
        spotRunSet.setWhere(" ORGID='"+ORGID+"' and SITEID='"+SITEID+"' and CREATEDATE BETWEEN TO_TIMESTAMP('"+bjstartDate+"','YYYY-MM-DD HH24:MI:SS') and TO_TIMESTAMP ('"+bjendDate+"','YYYY-MM-DD HH24:MI:SS') and PERSONGROUP in (select PERSONGROUP from PERSONGROUPTEAM where RESPPARTYGROUP='"+USERID+"')");
        spotRunSet.reset();
        spotRunSet.setOrderBy("CREATEDATE desc");
        if(spotRunSet!=null && !spotRunSet.isEmpty()){
            //任务描述的多语言查询
            MboSetRemote spotRunLangSet = MXServer.getMXServer().getMboSet("L_SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
            //路线多语言查询
            MboSetRemote routesSet = MXServer.getMXServer().getMboSet("ROUTES",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote routesLangSet = MXServer.getMXServer().getMboSet("L_ROUTES",MXServer.getMXServer().getSystemUserInfo());
            //部门多语言查询
            MboSetRemote deptSet = MXServer.getMXServer().getMboSet("DEPT",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote deptLangSet = MXServer.getMXServer().getMboSet("L_DEPT",MXServer.getMXServer().getSystemUserInfo());
            //人员名称-没有多语言
            MboSetRemote personSet = MXServer.getMXServer().getMboSet("PERSON",MXServer.getMXServer().getSystemUserInfo());
            //任务执行组-没有多语言表
            MboSetRemote persongroupSet = MXServer.getMXServer().getMboSet("PERSONGROUP",MXServer.getMXServer().getSystemUserInfo());
            //任务状态多语言查询
            MboSetRemote alndomainSet = MXServer.getMXServer().getMboSet("ALNDOMAIN",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote alndomainLangSet = MXServer.getMXServer().getMboSet("L_ALNDOMAIN",MXServer.getMXServer().getSystemUserInfo());
            for(int i=0;i<spotRunSet.count();i++){
                JSONObject taskData = new JSONObject();//单个任务
                MboRemote mbo = spotRunSet.getMbo(i);
                Integer SPOTRUNID = mbo.getInt("SPOTRUNID");//主表ID
                String SPOTRUNNUM = mbo.getString("SPOTRUNNUM");//任务单号
                String DESCRIPTION = mbo.getString("DESCRIPTION");//任务描述
                String POINTROUTE = mbo.getString("POINTROUTE");//路线编号
                String DEPTNUM =  mbo.getString("DEPTNUM");//部门
                String EQUPMNTDESC =  mbo.getString("EQUPMNTDESC");//任务单状态
                String POINTTOOLS =  mbo.getString("POINTTOOLS");//任务下载人编号
                String PERSONGROUP =  mbo.getString("PERSONGROUP");//任务执行组
                String ZXZTYPE =  mbo.getString("ZXZTYPE");//执行组类型
                String POINTEQUP =  mbo.getString("POINTEQUP");//任务耗时
                //默认英文环境---------------------------------------------------------
                String EXEUSERID = POINTTOOLS;
                String EXEUSERIDDESC = "";//任务下载人员名称
                String DEPTNAME = "";//部门描述
                String ROUTE = "";//路线描述
                String PERSONGROUPDESC = "";//执行组名称
                Integer ALNDOMAINID = null;
                String EQUPMNTDESC1 = "";//状态描述
                if("EN".equalsIgnoreCase(LANGCODE) || "FR".equalsIgnoreCase(LANGCODE)){
                    if("EDIT".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Undownload";
                    }else if("Appr".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Download";
                    }else if("COMP".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Upload";
                    }
                }
                //查询路线的英文描述和表ID
                routesSet.setWhere("route='"+POINTROUTE+"' and orgid='"+ORGID+"' and SITEID='"+SITEID+"'");
                routesSet.reset();
                Integer ROUTESID = null;
                if(routesSet!=null && !routesSet.isEmpty()){
                   MboRemote routeMbo = routesSet.getMbo(0);
                    ROUTESID = routeMbo.getInt("ROUTESID");
                    ROUTE = routeMbo.getString("DESCRIPTION");
                }
                //查询部门的英文描述和表ID
                deptSet.setWhere("deptnum='"+DEPTNUM+"' and orgid='"+ORGID+"' and SITEID='"+SITEID+"'");
                deptSet.reset();
                Integer DEPTID = null;
                if(deptSet!=null && !deptSet.isEmpty()){
                    MboRemote routeMbo = deptSet.getMbo(0);
                    DEPTID = routeMbo.getInt("DEPTID");
                    DEPTNAME = routeMbo.getString("DESCRIPTION");
                }
                //查询人员名称
                personSet.setWhere("personid='"+POINTTOOLS+"'");
                personSet.reset();
                if(personSet!=null && !personSet.isEmpty()){
                    MboRemote mboDesc = personSet.getMbo(0);
                    EXEUSERIDDESC = mboDesc.getString("DISPLAYNAME");
                }
                //查询执行组名称
                persongroupSet.setWhere("PERSONGROUP='"+PERSONGROUP+"' and orgid='"+ORGID+"' and siteid='"+SITEID+"'");
                persongroupSet.reset();
                if(persongroupSet!=null && !persongroupSet.isEmpty()){
                    MboRemote mboDesc = persongroupSet.getMbo(0);
                    PERSONGROUPDESC = mboDesc.getString("DESCRIPTION");
                }
                //查询域表
                alndomainSet.setWhere("value='"+EQUPMNTDESC+"' and DOMAINID='SPOTSTATUS'");
                alndomainSet.reset();
                if(alndomainSet!=null && !alndomainSet.isEmpty()){
                    MboRemote mboDesc = alndomainSet.getMbo(0);
                    ALNDOMAINID = mboDesc.getInt("ALNDOMAINID");
                }
                //-非英文状态下，需要进行查询----------------------------------------------------------
                if(!"EN".equalsIgnoreCase(LANGCODE)){
                    //任务描述
                    spotRunLangSet.setWhere(" OWNERID="+SPOTRUNID+" and LANGCODE='"+LANGCODE+"'");
                    spotRunLangSet.reset();
                    if(spotRunLangSet!=null && !spotRunLangSet.isEmpty()){
                        MboRemote mboDesc = spotRunLangSet.getMbo(0);
                        DESCRIPTION = mboDesc.getString("DESCRIPTION");
                    }
                    //路线描述
                    routesLangSet.setWhere(" OWNERID="+ROUTESID+" and LANGCODE='"+LANGCODE+"'");
                    routesLangSet.reset();
                    if(routesLangSet!=null && !routesLangSet.isEmpty()){
                        MboRemote mboDesc = routesLangSet.getMbo(0);
                        ROUTE = mboDesc.getString("DESCRIPTION");
                    }
                    //部门描述
                    deptLangSet.setWhere(" OWNERID="+DEPTID+" and LANGCODE='"+LANGCODE+"'");
                    deptLangSet.reset();
                    if(deptLangSet!=null && !deptLangSet.isEmpty()){
                        MboRemote mboDesc = deptLangSet.getMbo(0);
                        DEPTNAME = mboDesc.getString("DESCRIPTION");
                    }
                    //状态描述
                    alndomainLangSet.setWhere(" OWNERID="+ALNDOMAINID+" and LANGCODE='"+LANGCODE+"'");
                    alndomainLangSet.reset();
                    if(alndomainLangSet!=null && !alndomainLangSet.isEmpty()){
                        MboRemote mboDesc = alndomainLangSet.getMbo(0);
                        EQUPMNTDESC1 = mboDesc.getString("DESCRIPTION");
                    }
                }
                //返回任务
                taskData.put("SPOTRUNID",SPOTRUNID);//主表ID
                taskData.put("SPOTRUNNUM",SPOTRUNNUM);//任务单号
                taskData.put("DESCRIPTION",DESCRIPTION);//任务描述
                taskData.put("POINTROUTE",POINTROUTE);//路线编号
                taskData.put("ROUTE",ROUTE);//路线名称
                taskData.put("DEPTNUM",DEPTNUM);//部门编号
                taskData.put("DEPTNAME",DEPTNAME);//部门描述
                taskData.put("EXEUSERID",EXEUSERID);//下载人
                taskData.put("EXEUSERIDDESC",EXEUSERIDDESC);//下载人名称
                taskData.put("EQUPMNTDESC",EQUPMNTDESC);//状态编号
                taskData.put("EQUPMNTDESC1",EQUPMNTDESC1);//状态描述
                taskData.put("PERSONGROUP",PERSONGROUP);//执行组编号
                taskData.put("PERSONGROUPDESC",PERSONGROUPDESC);//执行组描述
                taskData.put("POINTEQUP",POINTEQUP);//任务耗时
                taskDataArr.add(taskData);//加入数组中
            }
            returnDate.put("errcode","200");
            returnDate.put("errmsg","success");
            returnDate.put("taskdata",taskDataArr);//返回任务
        }else{
            returnDate.put("errcode","201");
            returnDate.put("errmsg","No Task...");//1、今天确实没有任务 2、人员不在执行组中
        }
        //-日志记录表------------------------------------------------------
        MboSetRemote appparamlogSet = MXServer.getMXServer().getMboSet("APPPARAMLOG",MXServer.getMXServer().getSystemUserInfo());
        if(null!=appparamlogSet){
            MboRemote appLogMbo=appparamlogSet.addAtEnd(2L);
            appLogMbo.setValue("DESCRIPTION", "taskOnline-"+bjstartDate+"-"+bjendDate, 2L);
            appLogMbo.setValue("USERID",USERID, 2L);
            appLogMbo.setValue("CURRENTDATE","localTime-"+LOGTIME1+"-"+ORGID+"-"+SITEID, 2L);
            appLogMbo.setValue("LANGCODE",LANGCODE, 2L);
            if(returnDate.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
                appLogMbo.setValue("PCRETRUN","all-"+returnDate.toString(), 2L);
            }else {
                appLogMbo.setValue("PCRETRUN","substring-"+returnDate.toString().substring(0, 3000), 2L);
            }
            appLogMbo.getThisMboSet().save();
            appLogMbo.getThisMboSet().close();
        }
        //-------------------------------------------------------
//        System.out.println("returndata="+returnDate.toString());
        return returnDate;
    }

    /**
     * 点检保养任务下载
     * @return
     */
    @POST
    @Path("/taskDownload")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject taskDownload(JSONObject jsonObject) throws RemoteException, MXException {
        JSONObject returnDate = new JSONObject();
        //接收参数---start--------------------------------------------------------
        String USERID = jsonObject.getString("USERID");//APP传过来的当前用户工号
        JSONArray dataArr = jsonObject.getJSONArray("SPOTRUNIDLIST");
        String LANGCODE = jsonObject.getString("LANGCODE");//登录环境
        String ORGID = jsonObject.getString("ORGID");//组织
        String SITEID = jsonObject.getString("SITEID");//地点
        //接收参数---end-------------------------------------------------------
        //验证
        if(USERID==null || "".equals(USERID)){
            returnDate.put("errcode","201");
            returnDate.put("errmsg","User ID Lost");
            return returnDate;
        }
        if(LANGCODE==null || "".equals(LANGCODE)){
            returnDate.put("errcode","202");
            returnDate.put("errmsg","Language Environment Lost");
            return returnDate;
        }
        if(ORGID==null || "".equals(ORGID)){
            returnDate.put("errcode","203");
            returnDate.put("errmsg","ORGID Lost");
            return returnDate;
        }
        if(SITEID==null || "".equals(SITEID)){
            returnDate.put("errcode","204");
            returnDate.put("errmsg","SITEID Lost");
            return returnDate;
        }
        String strID = "";
        if(dataArr!=null && !dataArr.isEmpty()){
            for(int i=0;i<dataArr.size();i++){
                strID +=dataArr.get(i) + ",";
            }
            strID = strID.trim();
            strID = strID.substring(0,strID.length()-1);
        } else {
            returnDate.put("errcode", "100");
            returnDate.put("errmsg", "No data downLoad");
            return returnDate;
        }
        //-验证---end--------------------------------
        //获取任务单
        MboSetRemote spotRunSet = MXServer.getMXServer().getMboSet("SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
        spotRunSet.setWhere("SPOTRUNID in("+strID+")");
        spotRunSet.reset();
        if(spotRunSet!=null && !spotRunSet.isEmpty()){
            //任务描述的多语言查询
            MboSetRemote spotRunLangSet = MXServer.getMXServer().getMboSet("L_SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
            //路线多语言查询
            MboSetRemote routesSet = MXServer.getMXServer().getMboSet("ROUTES",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote routesLangSet = MXServer.getMXServer().getMboSet("L_ROUTES",MXServer.getMXServer().getSystemUserInfo());
            //部门多语言查询
            MboSetRemote deptSet = MXServer.getMXServer().getMboSet("DEPT",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote deptLangSet = MXServer.getMXServer().getMboSet("L_DEPT",MXServer.getMXServer().getSystemUserInfo());
            //人员名称-没有多语言
            MboSetRemote personSet = MXServer.getMXServer().getMboSet("PERSON",MXServer.getMXServer().getSystemUserInfo());
            //任务执行组-没有多语言表
            MboSetRemote persongroupSet = MXServer.getMXServer().getMboSet("PERSONGROUP",MXServer.getMXServer().getSystemUserInfo());
            //任务状态多语言查询
            MboSetRemote alndomainSet = MXServer.getMXServer().getMboSet("ALNDOMAIN",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote alndomainLangSet = MXServer.getMXServer().getMboSet("L_ALNDOMAIN",MXServer.getMXServer().getSystemUserInfo());
            //-子表相关查询------------------------------------------------------------------------------------------------------
            MboSetRemote spotrunlineLangSet = MXServer.getMXServer().getMboSet("L_SPOTRUNLINES",MXServer.getMXServer().getSystemUserInfo());//点检保养子表多于言表
            MboSetRemote assetSet = MXServer.getMXServer().getMboSet("ASSET",MXServer.getMXServer().getSystemUserInfo());//设备表
            MboSetRemote assetLangSet = MXServer.getMXServer().getMboSet("L_ASSET",MXServer.getMXServer().getSystemUserInfo());//设备多语言表
            //-----------------------------------------
            //主表任务循环
            JSONArray taskDataArr = new JSONArray();//放主表任务
            for(int i=0;i<spotRunSet.count();i++){
                JSONObject taskData = new JSONObject();//单个主表任务
                MboRemote mbo = spotRunSet.getMbo(i);
                Integer SPOTRUNID = mbo.getInt("SPOTRUNID");//主表ID
                String SPOTRUNNUM = mbo.getString("SPOTRUNNUM");//任务单号
                String DESCRIPTION = mbo.getString("DESCRIPTION");//任务描述
                String POINTROUTE = mbo.getString("POINTROUTE");//路线编号
                String DEPTNUM =  mbo.getString("DEPTNUM");//部门
                String EQUPMNTDESC =  mbo.getString("EQUPMNTDESC");//任务单状态
                String POINTTOOLS =  mbo.getString("POINTTOOLS");//任务下载人编号
                String PERSONGROUP =  mbo.getString("PERSONGROUP");//任务执行组
                String ZXZTYPE =  mbo.getString("ZXZTYPE");//执行组类型
                //默认英文环境----------------------------------------------------------
                String EXEUSERID = POINTTOOLS;
                String EXEUSERIDDESC = "";//任务下载人员名称
                String DEPTNAME = "";//部门描述
                String ROUTE = "";//路线描述
                String PERSONGROUPDESC = "";//执行组名称
                String EQUPMNTDESC1 = "";//状态描述
                Integer ALNDOMAINID = null;
                if("EN".equalsIgnoreCase(LANGCODE) || "FR".equalsIgnoreCase(LANGCODE)){
                    if("EDIT".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Undownload";
                    }else if("Appr".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Download";
                    }else if("COMP".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Upload";
                    }
                }
                //查询路线的英文描述和表ID
                routesSet.setWhere("route='"+POINTROUTE+"' and orgid='"+ORGID+"' and SITEID='"+SITEID+"'");
                routesSet.reset();
                Integer ROUTESID = null;
                if(routesSet!=null && !routesSet.isEmpty()){
                    MboRemote routeMbo = routesSet.getMbo(0);
                    ROUTESID = routeMbo.getInt("ROUTESID");
                    ROUTE = routeMbo.getString("DESCRIPTION");
                }
                //查询部门的英文描述和表ID
                deptSet.setWhere("deptnum='"+DEPTNUM+"' and orgid='"+ORGID+"' and SITEID='"+SITEID+"'");
                deptSet.reset();
                Integer DEPTID = null;
                if(deptSet!=null && !deptSet.isEmpty()){
                    MboRemote routeMbo = deptSet.getMbo(0);
                    DEPTID = routeMbo.getInt("DEPTID");
                    DEPTNAME = routeMbo.getString("DESCRIPTION");
                }
                //查询人员名称
                personSet.setWhere("personid='"+POINTTOOLS+"'");
                personSet.reset();
                if(personSet!=null && !personSet.isEmpty()){
                    MboRemote mboDesc = personSet.getMbo(0);
                    EXEUSERIDDESC = mboDesc.getString("DISPLAYNAME");
                }
                //查询执行组名称
                persongroupSet.setWhere("PERSONGROUP='"+PERSONGROUP+"' and orgid='"+ORGID+"' and siteid='"+SITEID+"'");
                persongroupSet.reset();
                if(persongroupSet!=null && !persongroupSet.isEmpty()){
                    MboRemote mboDesc = persongroupSet.getMbo(0);
                    PERSONGROUPDESC = mboDesc.getString("DESCRIPTION");
                }
                //查询域表
                alndomainSet.setWhere("value='"+EQUPMNTDESC+"' and DOMAINID='SPOTSTATUS'");
                alndomainSet.reset();
                if(alndomainSet!=null && !alndomainSet.isEmpty()){
                    MboRemote mboDesc = alndomainSet.getMbo(0);
                    ALNDOMAINID = mboDesc.getInt("ALNDOMAINID");
                }
                //-非英文状态下，需要进行查询----------------------------------------------------------
                if(!"EN".equalsIgnoreCase(LANGCODE)){
                    //任务描述
                    spotRunLangSet.setWhere(" OWNERID="+SPOTRUNID+" and LANGCODE='"+LANGCODE+"'");
                    spotRunLangSet.reset();
                    if(spotRunLangSet!=null && !spotRunLangSet.isEmpty()){
                        MboRemote mboDesc = spotRunLangSet.getMbo(0);
                        DESCRIPTION = mboDesc.getString("DESCRIPTION");
                    }
                    //路线描述
                    routesLangSet.setWhere(" OWNERID="+ROUTESID+" and LANGCODE='"+LANGCODE+"'");
                    routesLangSet.reset();
                    if(routesLangSet!=null && !routesLangSet.isEmpty()){
                        MboRemote mboDesc = routesLangSet.getMbo(0);
                        ROUTE = mboDesc.getString("DESCRIPTION");
                    }
                    //部门描述
                    deptLangSet.setWhere(" OWNERID="+DEPTID+" and LANGCODE='"+LANGCODE+"'");
                    deptLangSet.reset();
                    if(deptLangSet!=null && !deptLangSet.isEmpty()){
                        MboRemote mboDesc = deptLangSet.getMbo(0);
                        DEPTNAME = mboDesc.getString("DESCRIPTION");
                    }
                    //状态描述
                    alndomainLangSet.setWhere(" OWNERID="+ALNDOMAINID+" and LANGCODE='"+LANGCODE+"'");
                    alndomainLangSet.reset();
                    if(alndomainLangSet!=null && !alndomainLangSet.isEmpty()){
                        MboRemote mboDesc = alndomainLangSet.getMbo(0);
                        EQUPMNTDESC1 = mboDesc.getString("DESCRIPTION");
                    }
                }
                //返回主表任务
                taskData.put("SPOTRUNID",SPOTRUNID);//主表ID
                taskData.put("SPOTRUNNUM",SPOTRUNNUM);//任务单号
                taskData.put("DESCRIPTION",DESCRIPTION);//任务描述
                taskData.put("POINTROUTE",POINTROUTE);//路线编号
                taskData.put("ROUTE",ROUTE);//路线名称
                taskData.put("DEPTNUM",DEPTNUM);//部门编号
                taskData.put("DEPTNAME",DEPTNAME);//部门描述
                taskData.put("EXEUSERID",EXEUSERID);//下载人
                taskData.put("EXEUSERIDDESC",EXEUSERIDDESC);//下载人名称
                taskData.put("EQUPMNTDESC",EQUPMNTDESC);//状态编号
                taskData.put("EQUPMNTDESC1",EQUPMNTDESC1);//状态描述
                taskData.put("PERSONGROUP",PERSONGROUP);//执行组编号
                taskData.put("PERSONGROUPDESC",PERSONGROUPDESC);//执行组描述
                //-循环子表任务------------------------------------------------------------------------------------------------------
                MboSetRemote spotrunlineSet = MXServer.getMXServer().getMboSet("SPOTRUNLINES",MXServer.getMXServer().getSystemUserInfo());
                spotrunlineSet.setWhere("parentid="+SPOTRUNID+"");
//                spotrunlineSet.setOrderBy("STOPSEQUENCE ASC,PROJECTNUM ASC");
                spotrunlineSet.reset();
                spotrunlineSet.setOrderBy("STOPSEQUENCE ASC,NUM ASC");
                if(spotrunlineSet!=null && !spotrunlineSet.isEmpty()){
                    JSONArray taskLineDataArr = new JSONArray();//放子表任务
                    for(int m=0;m<spotrunlineSet.count();m++){
                        JSONObject taskLineData = new JSONObject();//单个子表任务
                        MboRemote lineMbo = spotrunlineSet.getMbo(m);//每个子表对象
                        Integer SPOTRUNLINESID = lineMbo.getInt("SPOTRUNLINESID");//子表主键
                        Integer NUM = lineMbo.getInt("NUM");//点检项序号
                        Integer STOPSEQUENCE = lineMbo.getInt("STOPSEQUENCE");//设备序号
                        Integer FREQUENCY = lineMbo.getInt("FREQUENCY");//频率
                        String FREQUNIT = lineMbo.getString("FREQUNIT");//单位
                        String LINEDESCRIPTION = lineMbo.getString("DESCRIPTION");//任务描述-EN
                        String POSITION = lineMbo.getString("POSITION");//部位-EN
                        String ASSETNUM = lineMbo.getString("ASSETNUM");//设备编号
                        String POINTMETHOD = lineMbo.getString("POINTMETHOD");//点检方法-EN
                        String FWAY = lineMbo.getString("FWAY");//点检方式
                        Double UPPERACTION = lineMbo.getDouble("UPPERACTION");//上限值
                        Double LOWERACTION = lineMbo.getDouble("LOWERACTION");//下限值
                        //-英文状态下----------------------------------------------------------
                        Integer ASSETUID = null;
                        String ASSETDESC = "";//设备名称
                        String MEMORYCODE = "";//助记码
                        assetSet.setWhere("assetnum='"+ASSETNUM+"' and orgid='"+ORGID+"' and siteid='"+SITEID+"'");
                        assetSet.reset();
                        if(assetSet!=null && !assetSet.isEmpty()){
                            MboRemote mboDesc = assetSet.getMbo(0);
                            ASSETUID = mboDesc.getInt("ASSETUID");
                            ASSETDESC = mboDesc.getString("DESCRIPTION");
                            MEMORYCODE = mboDesc.getString("MEMORYCODE");
                        }
                        //-非英文状态下，需要进行查询----------------------------------------------------------
                        if(!"EN".equalsIgnoreCase(LANGCODE)){
                            //设备查询
                            assetLangSet.setWhere(" OWNERID="+ASSETUID+" and LANGCODE='"+LANGCODE+"'");
                            assetLangSet.reset();
                            if(assetLangSet!=null && !assetLangSet.isEmpty()){
                                MboRemote mboDesc = assetLangSet.getMbo(0);
                                ASSETDESC = mboDesc.getString("DESCRIPTION");//设备名称
                            }
                            //点检任务项的查询
                            spotrunlineLangSet.setWhere(" OWNERID="+SPOTRUNLINESID+" and LANGCODE='"+LANGCODE+"'");
                            spotrunlineLangSet.reset();
                            if(spotrunlineLangSet!=null && !spotrunlineLangSet.isEmpty()){
                                MboRemote mboDesc = spotrunlineLangSet.getMbo(0);
                                LINEDESCRIPTION = mboDesc.getString("DESCRIPTION");//任务描述
                                POINTMETHOD = mboDesc.getString("POINTMETHOD");//点检方法
                                POSITION = mboDesc.getString("POSITION");//部位
                            }
                        }
                        taskLineData.put("SPOTRUNID",SPOTRUNID);//主表id
                        taskLineData.put("SPOTRUNLINESID",SPOTRUNLINESID);//子表id
                        taskLineData.put("SPOTRUNNUM",SPOTRUNNUM);//--任务单号
                        taskLineData.put("ORGID",ORGID);//组织
                        taskLineData.put("SITEID",SITEID);//地点
                        taskLineData.put("STOPSEQUENCE",STOPSEQUENCE);//设备序号
                        taskLineData.put("NUM",NUM);//点检任务序号
                        taskLineData.put("FREQUENCY",FREQUENCY);
                        taskLineData.put("FREQUNIT",FREQUNIT);
                        taskLineData.put("LINEDESCRIPTION",LINEDESCRIPTION);//点检任务描述
                        taskLineData.put("POSITION",POSITION);//部位
                        taskLineData.put("POINTMETHOD",POINTMETHOD);//点检方法
                        taskLineData.put("ASSETNUM",ASSETNUM);//设备编号
                        taskLineData.put("ASSETDESC",ASSETDESC);//设备名称
                        taskLineData.put("MEMORYCODE",MEMORYCODE);//助记码
                        taskLineData.put("FWAY",FWAY);//点检方式
                        taskLineData.put("UPPERACTION",UPPERACTION);//上限
                        taskLineData.put("LOWERACTION",LOWERACTION);//下限
                        taskLineDataArr.add(taskLineData);
                    }
                    taskData.put("taskline",taskLineDataArr);//一个主表任务对应多个点检项目
                }
                taskDataArr.add(taskData);//主表任务加入数组中
                //下载后变更状态和执行人
                mbo.setValue("EQUPMNTDESC","Appr");//变为已下载
                mbo.setValue("POINTTOOLS",USERID);//下载人
                mbo.getThisMboSet().save();
                //----------------------------------------------------------------------------------------------------------
            }
            returnDate.put("errcode","200");
            returnDate.put("errmsg","success");
            returnDate.put("taskdata",taskDataArr);//返回任务
        }
        //-日志记录表------------------------------------------------------
        MboSetRemote appparamlogSet = MXServer.getMXServer().getMboSet("APPPARAMLOG",MXServer.getMXServer().getSystemUserInfo());
        if(null!=appparamlogSet){
            MboRemote appLogMbo=appparamlogSet.addAtEnd(2L);
            appLogMbo.setValue("DESCRIPTION", "taskDownload-"+dataArr.toString(), 2L);
            appLogMbo.setValue("USERID",USERID, 2L);
            appLogMbo.setValue("CURRENTDATE","beijingTime-"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"-"+ORGID+"-"+SITEID,2L);
            appLogMbo.setValue("LANGCODE",LANGCODE, 2L);
            if(returnDate.toString().getBytes(StandardCharsets.UTF_8).length<=4000){
                appLogMbo.setValue("PCRETRUN","all-"+returnDate.toString(), 2L);
            }else {
                appLogMbo.setValue("PCRETRUN","substring-"+returnDate.toString().substring(0, 3000), 2L);
            }
            appLogMbo.getThisMboSet().save();
            appLogMbo.getThisMboSet().close();
        }
        //-------------------------------------------------------
//        System.out.println("returndata="+returnDate.toString());
        return returnDate;
    }

    /**
     * 点检保养任务在线查看明细
     * @return
     */
    @POST
    @Path("/taskLines")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject taskLines(JSONObject jsonObject) throws RemoteException, MXException {
        JSONObject returnDate = new JSONObject();
        //接收参数---start--------------------------------------------------------
        String USERID = jsonObject.getString("USERID");//APP传过来的当前用户工号
        JSONArray dataArr = jsonObject.getJSONArray("SPOTRUNIDLIST");
        String LANGCODE = jsonObject.getString("LANGCODE");//登录环境
        String ORGID = jsonObject.getString("ORGID");//组织
        String SITEID = jsonObject.getString("SITEID");//地点
        //接收参数---end-------------------------------------------------------
        //验证
        if(USERID==null || "".equals(USERID)){
            returnDate.put("errcode","201");
            returnDate.put("errmsg","User ID Lost");
            return returnDate;
        }
        if(LANGCODE==null || "".equals(LANGCODE)){
            returnDate.put("errcode","202");
            returnDate.put("errmsg","Language Environment Lost");
            return returnDate;
        }
        if(ORGID==null || "".equals(ORGID)){
            returnDate.put("errcode","203");
            returnDate.put("errmsg","ORGID Lost");
            return returnDate;
        }
        if(SITEID==null || "".equals(SITEID)){
            returnDate.put("errcode","204");
            returnDate.put("errmsg","SITEID Lost");
            return returnDate;
        }
        String strID = "";
        if(dataArr!=null && !dataArr.isEmpty()){
            for(int i=0;i<dataArr.size();i++){
                strID +=dataArr.get(i) + ",";
            }
            strID = strID.trim();
            strID = strID.substring(0,strID.length()-1);
        } else {
            returnDate.put("errcode", "100");
            returnDate.put("errmsg", "No data downLoad");
            return returnDate;
        }
        //-验证---end--------------------------------
        //获取任务单
        MboSetRemote spotRunSet = MXServer.getMXServer().getMboSet("SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
        spotRunSet.setWhere("SPOTRUNID in("+strID+")");
        spotRunSet.reset();
        if(spotRunSet!=null && !spotRunSet.isEmpty()){
            //任务描述的多语言查询
            MboSetRemote spotRunLangSet = MXServer.getMXServer().getMboSet("L_SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
            //路线多语言查询
            MboSetRemote routesSet = MXServer.getMXServer().getMboSet("ROUTES",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote routesLangSet = MXServer.getMXServer().getMboSet("L_ROUTES",MXServer.getMXServer().getSystemUserInfo());
            //部门多语言查询
            MboSetRemote deptSet = MXServer.getMXServer().getMboSet("DEPT",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote deptLangSet = MXServer.getMXServer().getMboSet("L_DEPT",MXServer.getMXServer().getSystemUserInfo());
            //人员名称-没有多语言
            MboSetRemote personSet = MXServer.getMXServer().getMboSet("PERSON",MXServer.getMXServer().getSystemUserInfo());
            //任务执行组-没有多语言表
            MboSetRemote persongroupSet = MXServer.getMXServer().getMboSet("PERSONGROUP",MXServer.getMXServer().getSystemUserInfo());
            //任务状态多语言查询
            MboSetRemote alndomainSet = MXServer.getMXServer().getMboSet("ALNDOMAIN",MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote alndomainLangSet = MXServer.getMXServer().getMboSet("L_ALNDOMAIN",MXServer.getMXServer().getSystemUserInfo());
            //-子表相关查询------------------------------------------------------------------------------------------------------
            MboSetRemote spotrunlineLangSet = MXServer.getMXServer().getMboSet("L_SPOTRUNLINES",MXServer.getMXServer().getSystemUserInfo());//点检保养子表多于言表
            MboSetRemote assetSet = MXServer.getMXServer().getMboSet("ASSET",MXServer.getMXServer().getSystemUserInfo());//设备表
            MboSetRemote assetLangSet = MXServer.getMXServer().getMboSet("L_ASSET",MXServer.getMXServer().getSystemUserInfo());//设备多语言表
            //-----------------------------------------
            //主表任务循环
            JSONArray taskDataArr = new JSONArray();//放主表任务
            for(int i=0;i<spotRunSet.count();i++){
                JSONObject taskData = new JSONObject();//单个主表任务
                MboRemote mbo = spotRunSet.getMbo(i);
                Integer SPOTRUNID = mbo.getInt("SPOTRUNID");//主表ID
                String SPOTRUNNUM = mbo.getString("SPOTRUNNUM");//任务单号
                String DESCRIPTION = mbo.getString("DESCRIPTION");//任务描述
                String POINTROUTE = mbo.getString("POINTROUTE");//路线编号
                String DEPTNUM =  mbo.getString("DEPTNUM");//部门
                String EQUPMNTDESC =  mbo.getString("EQUPMNTDESC");//任务单状态
                String POINTTOOLS =  mbo.getString("POINTTOOLS");//任务下载人编号
                String PERSONGROUP =  mbo.getString("PERSONGROUP");//任务执行组
                String ZXZTYPE =  mbo.getString("ZXZTYPE");//执行组类型
                //默认英文环境----------------------------------------------------------
                String EXEUSERID = POINTTOOLS;
                String EXEUSERIDDESC = "";//任务下载人员名称
                String DEPTNAME = "";//部门描述
                String ROUTE = "";//路线描述
                String PERSONGROUPDESC = "";//执行组名称
                String EQUPMNTDESC1 = "";//状态描述
                Integer ALNDOMAINID = null;
                if("EN".equalsIgnoreCase(LANGCODE) || "FR".equalsIgnoreCase(LANGCODE)){
                    if("EDIT".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Undownload";
                    }else if("Appr".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Download";
                    }else if("COMP".equalsIgnoreCase(EQUPMNTDESC)){
                        EQUPMNTDESC1 = "Upload";
                    }
                }
                //查询路线的英文描述和表ID
                routesSet.setWhere("route='"+POINTROUTE+"' and orgid='"+ORGID+"' and SITEID='"+SITEID+"'");
                routesSet.reset();
                Integer ROUTESID = null;
                if(routesSet!=null && !routesSet.isEmpty()){
                    MboRemote routeMbo = routesSet.getMbo(0);
                    ROUTESID = routeMbo.getInt("ROUTESID");
                    ROUTE = routeMbo.getString("DESCRIPTION");
                }
                //查询部门的英文描述和表ID
                deptSet.setWhere("deptnum='"+DEPTNUM+"' and orgid='"+ORGID+"' and SITEID='"+SITEID+"'");
                deptSet.reset();
                Integer DEPTID = null;
                if(deptSet!=null && !deptSet.isEmpty()){
                    MboRemote routeMbo = deptSet.getMbo(0);
                    DEPTID = routeMbo.getInt("DEPTID");
                    DEPTNAME = routeMbo.getString("DESCRIPTION");
                }
                //查询人员名称
                personSet.setWhere("personid='"+POINTTOOLS+"'");
                personSet.reset();
                if(personSet!=null && !personSet.isEmpty()){
                    MboRemote mboDesc = personSet.getMbo(0);
                    EXEUSERIDDESC = mboDesc.getString("DISPLAYNAME");
                }
                //查询执行组名称
                persongroupSet.setWhere("PERSONGROUP='"+PERSONGROUP+"' and orgid='"+ORGID+"' and siteid='"+SITEID+"'");
                persongroupSet.reset();
                if(persongroupSet!=null && !persongroupSet.isEmpty()){
                    MboRemote mboDesc = persongroupSet.getMbo(0);
                    PERSONGROUPDESC = mboDesc.getString("DESCRIPTION");
                }
                //查询域表
                alndomainSet.setWhere("value='"+EQUPMNTDESC+"' and DOMAINID='SPOTSTATUS'");
                alndomainSet.reset();
                if(alndomainSet!=null && !alndomainSet.isEmpty()){
                    MboRemote mboDesc = alndomainSet.getMbo(0);
                    ALNDOMAINID = mboDesc.getInt("ALNDOMAINID");
                }
                //-非英文状态下，需要进行查询----------------------------------------------------------
                if(!"EN".equalsIgnoreCase(LANGCODE)){
                    //任务描述
                    spotRunLangSet.setWhere(" OWNERID="+SPOTRUNID+" and LANGCODE='"+LANGCODE+"'");
                    spotRunLangSet.reset();
                    if(spotRunLangSet!=null && !spotRunLangSet.isEmpty()){
                        MboRemote mboDesc = spotRunLangSet.getMbo(0);
                        DESCRIPTION = mboDesc.getString("DESCRIPTION");
                    }
                    //路线描述
                    routesLangSet.setWhere(" OWNERID="+ROUTESID+" and LANGCODE='"+LANGCODE+"'");
                    routesLangSet.reset();
                    if(routesLangSet!=null && !routesLangSet.isEmpty()){
                        MboRemote mboDesc = routesLangSet.getMbo(0);
                        ROUTE = mboDesc.getString("DESCRIPTION");
                    }
                    //部门描述
                    deptLangSet.setWhere(" OWNERID="+DEPTID+" and LANGCODE='"+LANGCODE+"'");
                    deptLangSet.reset();
                    if(deptLangSet!=null && !deptLangSet.isEmpty()){
                        MboRemote mboDesc = deptLangSet.getMbo(0);
                        DEPTNAME = mboDesc.getString("DESCRIPTION");
                    }
                    //状态描述
                    alndomainLangSet.setWhere(" OWNERID="+ALNDOMAINID+" and LANGCODE='"+LANGCODE+"'");
                    alndomainLangSet.reset();
                    if(alndomainLangSet!=null && !alndomainLangSet.isEmpty()){
                        MboRemote mboDesc = alndomainLangSet.getMbo(0);
                        EQUPMNTDESC1 = mboDesc.getString("DESCRIPTION");
                    }
                }
                //返回主表任务
                taskData.put("SPOTRUNID",SPOTRUNID);//主表ID
                taskData.put("SPOTRUNNUM",SPOTRUNNUM);//任务单号
                taskData.put("DESCRIPTION",DESCRIPTION);//任务描述
                taskData.put("POINTROUTE",POINTROUTE);//路线编号
                taskData.put("ROUTE",ROUTE);//路线名称
                taskData.put("DEPTNUM",DEPTNUM);//部门编号
                taskData.put("DEPTNAME",DEPTNAME);//部门描述
                taskData.put("EXEUSERID",EXEUSERID);//下载人
                taskData.put("EXEUSERIDDESC",EXEUSERIDDESC);//下载人名称
                taskData.put("EQUPMNTDESC",EQUPMNTDESC);//状态编号
                taskData.put("EQUPMNTDESC1",EQUPMNTDESC1);//状态描述
                taskData.put("PERSONGROUP",PERSONGROUP);//执行组编号
                taskData.put("PERSONGROUPDESC",PERSONGROUPDESC);//执行组描述
                //-循环子表任务------------------------------------------------------------------------------------------------------
                MboSetRemote spotrunlineSet = MXServer.getMXServer().getMboSet("SPOTRUNLINES",MXServer.getMXServer().getSystemUserInfo());
                spotrunlineSet.setWhere("parentid="+SPOTRUNID+"");
//                spotrunlineSet.setOrderBy("STOPSEQUENCE ASC,PROJECTNUM ASC");
                spotrunlineSet.reset();
                spotrunlineSet.setOrderBy("STOPSEQUENCE ASC,NUM ASC");//STOPSEQUENCE ASC,NUM ASC
                if(spotrunlineSet!=null && !spotrunlineSet.isEmpty()){
                    JSONArray taskLineDataArr = new JSONArray();//放子表任务
                    for(int m=0;m<spotrunlineSet.count();m++){
                        JSONObject taskLineData = new JSONObject();//单个子表任务
                        MboRemote lineMbo = spotrunlineSet.getMbo(m);//每个子表对象
                        Integer SPOTRUNLINESID = lineMbo.getInt("SPOTRUNLINESID");//子表主键
                        Integer NUM = lineMbo.getInt("NUM");//序号
                        String LINEDESCRIPTION = lineMbo.getString("DESCRIPTION");//任务描述-EN
                        String POSITION = lineMbo.getString("POSITION");//部位-EN
                        String ASSETNUM = lineMbo.getString("ASSETNUM");//设备编号
                        String POINTMETHOD = lineMbo.getString("POINTMETHOD");//点检方法-EN
                        String FWAY = lineMbo.getString("FWAY");//点检方式
                        Double UPPERACTION = lineMbo.getDouble("UPPERACTION");//上限值
                        Double LOWERACTION = lineMbo.getDouble("LOWERACTION");//下限值
                        //-英文状态下----------------------------------------------------------
                        Integer ASSETUID = null;
                        String ASSETDESC = "";//设备名称
                        String MEMORYCODE = "";//助记码
                        assetSet.setWhere("assetnum='"+ASSETNUM+"' and orgid='"+ORGID+"' and siteid='"+SITEID+"'");
                        assetSet.reset();
                        if(assetSet!=null && !assetSet.isEmpty()){
                            MboRemote mboDesc = assetSet.getMbo(0);
                            ASSETUID = mboDesc.getInt("ASSETUID");
                            ASSETDESC = mboDesc.getString("DESCRIPTION");
                            MEMORYCODE = mboDesc.getString("MEMORYCODE");
                        }
                        //-非英文状态下，需要进行查询----------------------------------------------------------
                        if(!"EN".equalsIgnoreCase(LANGCODE)){
                            //设备查询
                            assetLangSet.setWhere(" OWNERID="+ASSETUID+" and LANGCODE='"+LANGCODE+"'");
                            assetLangSet.reset();
                            if(assetLangSet!=null && !assetLangSet.isEmpty()){
                                MboRemote mboDesc = assetLangSet.getMbo(0);
                                ASSETDESC = mboDesc.getString("DESCRIPTION");//设备名称
                            }
                            //点检任务项的查询
                            spotrunlineLangSet.setWhere(" OWNERID="+SPOTRUNLINESID+" and LANGCODE='"+LANGCODE+"'");
                            spotrunlineLangSet.reset();
                            if(spotrunlineLangSet!=null && !spotrunlineLangSet.isEmpty()){
                                MboRemote mboDesc = spotrunlineLangSet.getMbo(0);
                                LINEDESCRIPTION = mboDesc.getString("DESCRIPTION");//任务描述
                                POINTMETHOD = mboDesc.getString("POINTMETHOD");//点检方法
                                POSITION = mboDesc.getString("POSITION");//部位
                            }
                        }
                        taskLineData.put("SPOTRUNID",SPOTRUNID);//主表id
                        taskLineData.put("SPOTRUNLINESID",SPOTRUNLINESID);//子表id
                        taskLineData.put("SPOTRUNNUM",SPOTRUNNUM);//--任务单号
                        taskLineData.put("ORGID",ORGID);//组织
                        taskLineData.put("SITEID",SITEID);//地点
                        taskLineData.put("NUM",NUM);//点检任务序号
                        taskLineData.put("LINEDESCRIPTION",LINEDESCRIPTION);//点检任务描述
                        taskLineData.put("POSITION",POSITION);//部位
                        taskLineData.put("POINTMETHOD",POINTMETHOD);//点检方法
                        taskLineData.put("ASSETNUM",ASSETNUM);//设备编号
                        taskLineData.put("ASSETDESC",ASSETDESC);//设备名称
                        taskLineData.put("MEMORYCODE",MEMORYCODE);//助记码
                        taskLineData.put("FWAY",FWAY);//点检方式
                        taskLineData.put("UPPERACTION",UPPERACTION);//上限
                        taskLineData.put("LOWERACTION",LOWERACTION);//下限
                        taskLineDataArr.add(taskLineData);
                    }
                    taskData.put("taskline",taskLineDataArr);//一个主表任务对应多个点检项目
                }
                taskDataArr.add(taskData);//主表任务加入数组中
                //----------------------------------------------------------------------------------------------------------
            }
            returnDate.put("errcode","200");
            returnDate.put("errmsg","success");
            returnDate.put("taskdata",taskDataArr);//返回任务
        }
        //------------------------
        System.out.println("returndata="+returnDate.toString());
        return returnDate;
    }



    /**
     * 任务上传
     * @param jsonArray
     */
    @POST
    @Path("/taskUpload")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject SaveData(JSONArray jsonArray) {
        //定义返回对象
        JSONObject returnDate = new JSONObject();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            //接收app数据
            if(jsonArray!=null && jsonArray.size()>0){
                //点检保养任务主表
                System.out.println("array="+jsonArray.toString());
                MboSetRemote mainSet = MXServer.getMXServer().getMboSet("SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
                //点检保养任务明细表
                MboSetRemote lineSet = MXServer.getMXServer().getMboSet("SPOTRUNLINES",MXServer.getMXServer().getSystemUserInfo());
                List<Integer> mainList = new ArrayList<Integer>();
                for(int i=0;i<jsonArray.size();i++){
                    JSONObject obj = jsonArray.getJSONObject(i);
                    //-------------------
                    Integer SPOTRUNID = obj.getInteger("SPOTRUNID");//主表字
                    Integer SPOTRUNLINESID = obj.getInteger("SPOTRUNLINESID");//子表iD
                    String USERID = obj.getString("USERID");//实际执行人--登录人
                    String EXCEPTIONSTATUS = obj.getString("EXCEPTIONSTATUS");//子表-是否异常
                    if(EXCEPTIONSTATUS==null || "".equals(EXCEPTIONSTATUS) || "null".equals(EXCEPTIONSTATUS) || "undefined".equalsIgnoreCase(EXCEPTIONSTATUS)){
                        EXCEPTIONSTATUS = "UNEXC"; //正常
                    }
                    String VALUENUMBER = obj.getString("VALUENUMBER");//子表-数值记录
                    String RECORDDESC = obj.getString("RECORDDESC");//子表-记录说明
                    String SCANRESULT = obj.getString("SCANRESULT");//子表-扫码记录
                    String ACTDATEStr = obj.getString("ACTDATE");//实际执行时间
                    if(ACTDATEStr==null || "".equals(ACTDATEStr) || "null".equals(ACTDATEStr) || "undefined".equalsIgnoreCase(ACTDATEStr)){
                        ACTDATEStr = sdf.format(new Date());
                    }
                    Date ACTDATE = sdf.parse(ACTDATEStr);
                    //------------------
                    if(!mainList.contains(SPOTRUNID)){
                        mainList.add(SPOTRUNID);
                    }
                    //子表
                    lineSet.setWhere("SPOTRUNLINESID="+SPOTRUNLINESID+"");
                    lineSet.reset();
                    if(lineSet!=null && !lineSet.isEmpty()){
                        MboRemote lineMbo = lineSet.getMbo(0);
                        lineMbo.setValue("PERACTUAL",USERID,11L);
                        lineMbo.setValue("ACTDATE",ACTDATE,11L);
                        lineMbo.setValue("EXCEPTIONSTATUS",EXCEPTIONSTATUS,11L);
                        lineMbo.setValue("VALUENUMBER",VALUENUMBER,11L);
                        lineMbo.setValue("RECORDDESC",RECORDDESC,11L);
                        lineMbo.setValue("SCANRESULT",SCANRESULT,11L);
                        lineMbo.getThisMboSet().save();
                        //主表保存
                        mainSet.setWhere("SPOTRUNID="+SPOTRUNID+"");
                        mainSet.reset();
                        if(mainSet!=null && !mainSet.isEmpty()){
                            MboRemote mainMbo =  mainSet.getMbo(0);
                            mainMbo.setValue("EQUPMNTDESC","COMP",11L);
                            mainMbo.getThisMboSet().save();
                        }
                    }
                }
                //更新任务耗时--------------
                if(mainList!=null && mainList.size()>0) {
                    for (int i = 0; i < mainList.size(); i++) {
                        Integer SPOTRUNID = mainList.get(i);//主表ID
                        //POINTEQUP 作为任务耗时记录
                        lineSet.setWhere("PARENTID="+SPOTRUNID+" and ACTDATE is not null");
                        lineSet.setOrderBy(" ACTDATE ASC");
                        lineSet.reset();
                        MboRemote minMbo = lineSet.getMbo(0);
                        Date minACTDATE = null;
                        if(minMbo!=null){
                            minACTDATE =  minMbo.getDate("ACTDATE");
                        }
                        lineSet.clear();
                        lineSet.setOrderBy(" ACTDATE DESC");
                        lineSet.reset();
                        MboRemote maxMbo = lineSet.getMbo(0);
                        Date maxACTDATE = null;
                        if(maxMbo!=null){
                            maxACTDATE =  maxMbo.getDate("ACTDATE");
                        }
                        long totalMinutes= 0;
                        if(maxACTDATE!=null && minACTDATE!=null){
                            long timeDifferenceMillis = maxACTDATE.getTime() - minACTDATE.getTime();//比较差值
                            totalMinutes = timeDifferenceMillis / (1000 * 60);//转成分钟
                        }
                        String totalMinutesStr = String.valueOf(totalMinutes);
//                        System.out.println("minutes="+totalMinutes);
                        mainSet.setWhere("SPOTRUNID="+SPOTRUNID+"");
                        mainSet.reset();
                        if(mainSet!=null && !mainSet.isEmpty()){
                            MboRemote mainMbo =  mainSet.getMbo(0);
                            mainMbo.setValue("POINTEQUP",totalMinutesStr,11L);//任务耗时
                            mainMbo.setValue("EQUPMNTDESC","COMP",11L);//任务状态
                            mainMbo.getThisMboSet().save();
                        }
                    }
                }
                //------------------------
            }
            returnDate.put("errcode","200");
            returnDate.put("errmsg","save success");
        }catch (Exception e){
            System.out.println("------faileMessage----->"+e.getMessage());
            returnDate.put("errcode","500");
            returnDate.put("errmsg","save failure");
        }finally {
            return returnDate;
        }
    }

    /**
     * app端清理内存
     */
    @POST
    @Path("/clearMemory")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject clearMemory(JSONObject jsonObject) throws Exception {
        JSONObject returnDate = new JSONObject();
        //接收参数----------------------
        Integer SPOTRUNID = jsonObject.getInteger("SPOTRUNID");//主表ID
        //接收参数---------------------
        if(SPOTRUNID!=null){
            MboSetRemote mainSet = MXServer.getMXServer().getMboSet("SPOTRUN",MXServer.getMXServer().getSystemUserInfo());
            mainSet.setWhere("SPOTRUNID="+SPOTRUNID+"");
            mainSet.reset();
            if(mainSet!=null && !mainSet.isEmpty()){
                MboRemote mbo = mainSet.getMbo(0);
                mbo.setValue("EQUPMNTDESC","EDIT",11L);
                mbo.setValue("POINTTOOLS","",11L);//执行人置空
                mbo.getThisMboSet().save();
            }
            returnDate.put("errcode","200");
            returnDate.put("errmsg","success");
        }else{
            returnDate.put("errcode","201");
            returnDate.put("errmsg","SPOTRUNID Lost");
            return returnDate;
        }
        return returnDate;
    }
}
