czt
2024-07-13 b030109e665301e7edd6ad0fe5c832ee10fe39b4
调整出入库补单信息2
已添加46个文件
5693 ■■■■■ 文件已修改
igds-basic/src/main/java/com/ld/igds/timer/ScheduledBasic.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-basic/src/main/java/com/ld/igds/timer/WeatherTimerService.java 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5328ServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5332ServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-inout/src/main/java/com/ld/igds/inout/service/HSettleService.java 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/ServerRunner.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/RemoteGrainServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/analysis/AnalysisService.java 822 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/CommandBuild.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessage.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessageBuilder.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/BeiboClientEngine.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/ClientHandler.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/package-info.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1HeartbeatImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1MessageConsumer.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerEngine.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerUtils.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1SessionListener.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/util/BeiboGrainServerUtils.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/pom.xml 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/.rules 1178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-recir/.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-security/src/main/java/com/ld/igds/models/SecSnapConf.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-security/src/main/java/com/ld/igds/models/SecSnapDepot.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-security/src/main/java/com/ld/igds/sec/service/SecSnapDepotService.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepot.view.xml 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepotPR.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-security/src/main/java/com/ld/igds/timer/ScheduledSec.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-warn/src/main/java/com/ld/igds/warn/service/HSecureManagerService.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-warn/src/main/java/com/ld/igds/warn/view/SecureManager.view.xml 460 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-warn/src/main/java/com/ld/igds/warn/view/SecureManagerPR.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/css/bootstrap.min.css.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/images/img-fail.jpg 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/areation/5000/pfc_a.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/areation/5000/pfc_b.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5326/5326_001.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/templates/test/PrintIn5329.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/templates/test/PrintOut5329.html 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-basic/src/main/java/com/ld/igds/timer/ScheduledBasic.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ld.igds.timer;
import com.bstek.bdf2.core.model.DefaultCompany;
import com.ld.igds.common.CoreCommonService;
import com.ld.igds.view.manager.TempManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * åŸºç¡€æ¨¡å—标准定时器业务配置
 */
@Slf4j
@Component(ScheduledBasic.BEAN_ID)
public class ScheduledBasic {
    public static final String BEAN_ID = "basic.scheduled";
    @Resource
    private TempManager thManager;
    @Resource
    private CoreCommonService coreCommonService;
    @Resource
    private WeatherTimerService weatherTimerService;
    /**
     * æ¯é—´éš”30分钟执行一次
     */
    @Scheduled(cron = "0 0/30 * * * ?")
    public void scheduled30() {
        //定时获取分机的温湿度检测结果
        doExeTh();
        //定时获取气象信息
        weatherTimerService.doExe();
    }
    /**
     * å®šæ—¶èŽ·å–åˆ†æœºçš„æ¸©æ¹¿åº¦æ£€æµ‹ç»“æžœ
     */
    private void doExeTh() {
        List<DefaultCompany> list = coreCommonService.getCompanyList();
        if (null == list || list.isEmpty()) return;
        try {
            for (DefaultCompany company : list) {
                log.info("===================系统定时获取分机下的温湿度信息-{}=======================", company.getId());
                thManager.scheduledCheck(company.getId());
                Thread.sleep(500);
            }
        } catch (Exception e) {
            e.getStackTrace();
        }
    }
}
igds-basic/src/main/java/com/ld/igds/timer/WeatherTimerService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,354 @@
package com.ld.igds.timer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ld.igds.constant.Constant;
import com.ld.igds.constant.RedisConst;
import com.ld.igds.data.ConfigData;
import com.ld.igds.io.constant.ProtocolEnum;
import com.ld.igds.models.WeatherConf;
import com.ld.igds.models.WeatherInfo;
import com.ld.igds.timer.rk.RkData;
import com.ld.igds.timer.rk.RkDto;
import com.ld.igds.timer.rk.RkResult;
import com.ld.igds.util.HttpUtils;
import com.ld.igds.util.RedisUtil;
import com.ld.igds.weather.CoreWeatherService;
import com.ld.igds.weather.WeatherUtil;
import com.ld.igds.weather.notify.NotifyWeatherService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * @author: andy.jia
 * @description: æ°”象信息获取定时器
 * @version: <p>
 * <p>
 * é£Žæ­£è‡´è¿œè´­ä¹°å¤–网气象服务:
 * æ°”象服务:http://www.yiketianqi.com/
 *
 *
 * <p> å»ºå¤§ä»ç§‘çš„4G协议
 */
@Slf4j
@Component
public class WeatherTimerService {
    @Resource(name = NotifyWeatherService.BEAN_ID)
    private NotifyWeatherService notifyService;
    @Resource(name = CoreWeatherService.BEAN_ID)
    private CoreWeatherService weatherService;
    @Autowired
    private ConfigData configData;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private RestTemplate restTemplate;
    public static String DEFAULT_URL = "https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=49421971&appsecret=JmJE48Fv&cityid={cityid}";
    public static String DEFAULT_APP_ID = "49421971";
    public static String DEFAULT_APP_SECRET = "JmJE48Fv";
    /**
     * å»ºå¤§ä»ç§‘4G平台缓存key
     */
    public static String RK_WEATHER_V30_4G = "RK_WEATHER_V30_4G";
    /**
     * å®šæ—¶èŽ·å–æ°”è±¡ä¿¡æ¯ï¼Œè¯·æ³¨æ„ï¼Œç”±äºŽæ°”è±¡æ”¯æŒå¤–ç½‘å’Œè‡ªå®šä¹‰æ°”è±¡ç«™ï¼Œç³»ç»Ÿé»˜è®¤åªæ‰§è¡Œå…¶ä¸­ä¸€ç§æ–¹å¼
     */
    public void doExe() {
        log.info("===========================系统定时获获取气象信息======================");
        // èŽ·å–æ°”è±¡ä¿¡æ¯é…ç½®
        List<WeatherConf> list = weatherService.getConfData(null, null);
        if (null == list || list.isEmpty()) return;
        Date date = new Date();
        for (WeatherConf conf : list) {
            if (null == conf.getWanTag()) conf.setWanTag(Constant.YN_N);
            if (null == conf.getProtocol()) conf.setProtocol(ProtocolEnum.TCP_DEFAULT.getCode());
            //调用风正致远默认外网气象
            if (Constant.YN_Y.equals(conf.getWanTag())) {
                getWeatherByWeb(date, conf);
                continue;
            }
            //调用建大仁科的气象
            if (ProtocolEnum.RK_WEATHER_V30.getCode().equals(conf.getProtocol())) {
                getWeatherByRkV30(date, conf);
                continue;
            }
        }
    }
    /**
     * ç³»ç»Ÿè°ƒç”¨é£Žæ­£è‡´è¿œè´­ä¹°çš„外网天气气象协议
     *
     * @param date
     * @param conf
     * @return
     */
    public WeatherInfo getWeatherByWeb(Date date, WeatherConf conf) {
        if (StringUtils.isEmpty(conf.getCityId())) return null;
        try {
            if (null != configData.getWeatherPath()) {
                DEFAULT_URL = configData.getWeatherPath();
            }
            String url = DEFAULT_URL.replace("{cityid}", conf.getCityId())
                    .replace("{appid}", DEFAULT_APP_ID)
                    .replace("{appsecret}", DEFAULT_APP_SECRET);
            log.info("气象调用获取-url = {}", url);
            String result = HttpUtils.doGet(url);
            if (null == result) {
                log.error("当前外网获取气象信息失败……");
                return null;
            }
            WeatherWebDto dto = JSON.parseObject(result, WeatherWebDto.class);
            if (StringUtils.isNotEmpty(dto.getErrcode())) {
                log.error("当前外网获取气象信息异常:{}", dto.getErrmsg());
                return null;
            }
            log.info("气象返回结果={}", dto.toString());
            WeatherInfo info = new WeatherInfo();
            info.setId(WeatherUtil.buildWeatherId(conf.getDeptId(), date));
            info.setAirLevel(dto.getAir_level());
            info.setCompanyId(conf.getCompanyId());
            info.setDeptId(conf.getDeptId());
            info.setHumidity(dto.getHumidity());
            info.setPm25(dto.getAir_pm25());
            info.setPressure(dto.getPressure());
            info.setSource(WeatherUtil.SOURCE_02);
            info.setTemp(dto.getTem());
            info.setWeather(dto.getWea());
            info.setWindDirection(dto.getWin());
            info.setWindSpeed(dto.getWin_speed());
            info.setWindMeter(dto.getWin_meter());
            info.setCity(dto.getCity());
            info.setUpdateTime(date);
            notifyService.notify(info);
            return info;
        } catch (Exception e) {
            log.error("气象信息获取异常:{}", e.getMessage(), e);
        }
        return null;
    }
    /**
     * æ ¹æ®å»ºå¤§ä»ç§‘云V30协议获取气象信息
     *
     * @param date
     * @param conf
     */
    private void getWeatherByRkV30(Date date, WeatherConf conf) {
        //若用户、密码、IP地址有一为空则返回
        if (StringUtils.isEmpty(conf.getAccount())
                || StringUtils.isEmpty(conf.getPassword())
                || StringUtils.isEmpty(conf.getIp())) {
            return;
        }
        //获取身份认证token
        String token = getToken(conf);
        //设置请求头参数
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("authorization", token);
        String url = conf.getIp() + "/api/data/getRealTimeData";
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        HttpEntity<String> ans = restTemplate.exchange(url, HttpMethod.GET,
                new HttpEntity<>(null, httpHeaders), String.class);
        String body = ans.getBody();
        log.debug("-----当前建大仁科平台获取气象信息-----,返回数据={}", body);
        RkResult response = JSONObject.parseObject(body, RkResult.class);
        if (StringUtils.isEmpty(response.getCode()) || !"1000".equals(response.getCode())) {
            log.error("当前建大仁科平台获取气象信息失败......");
            return;
        }
        List<JSONObject> result = JSON.parseArray(JSONObject.toJSONString(response.getData()), JSONObject.class);
        JSONArray lists = (JSONArray) result.get(0).get("dataItem");
        List<RkDto> list = JSON.parseArray(JSONObject.toJSONString(lists), RkDto.class);
        if (null == list || list.isEmpty()) {
            return;
        }
        WeatherInfo info = new WeatherInfo();
        info.setId(WeatherUtil.buildWeatherId(conf.getDeptId(), date));
        info.setCompanyId(conf.getCompanyId());
        info.setDeptId(conf.getDeptId());
        info.setSource(WeatherUtil.SOURCE_01);
        List<RkData> dataList;
        List<RkData> weatherList = new ArrayList<>();
        //根据地址判断选项
        for (RkDto rkDto : list) {
            //温湿度
            if ("11".equals(rkDto.getNodeId())) {
                dataList = rkDto.getRegisterItem();
                for (RkData rkData : dataList) {
                    //温度
                    if ("1".equals(rkData.getRegisterId())) {
                        info.setTemp(rkData.getData());
                    }
                    //湿度
                    if ("2".equals(rkData.getRegisterId())) {
                        info.setHumidity(rkData.getData());
                    }
                }
            }
            //风力风速
            if ("1".equals(rkDto.getNodeId())) {
                dataList = rkDto.getRegisterItem();
                for (RkData rkData : dataList) {
                    //风力
                    if ("1".equals(rkData.getRegisterId())) {
                        info.setWindSpeed(rkData.getData() + "级");
                    }
                    //风速
                    if ("2".equals(rkData.getRegisterId())) {
                        info.setWindMeter(rkData.getData());
                    }
                }
            }
            //风向
            if ("2".equals(rkDto.getNodeId())) {
                dataList = rkDto.getRegisterItem();
                for (RkData rkData : dataList) {
                    //风向
                    if ("1".equals(rkData.getRegisterId())) {
                        info.setWindDirection(rkData.getData());
                    }
                }
            }
            //大气压
            if ("14".equals(rkDto.getNodeId())) {
                dataList = rkDto.getRegisterItem();
                for (RkData rkData : dataList) {
                    //大气压
                    if ("2".equals(rkData.getRegisterId())) {
                        info.setPressure(rkData.getData());
                    }
                }
            }
            //雨量
            if ("21".equals(rkDto.getNodeId())) {
                dataList = rkDto.getRegisterItem();
                for (RkData rkData : dataList) {
//                    //瞬时雨量
//                    if("1".equals(rkData.getRegisterId())){
//                        info.setRainfall(rkData.getData());
//                    }
                    //当前雨量
                    if ("2".equals(rkData.getRegisterId())) {
                        info.setRainfall(rkData.getData());
                    }
                }
            }
            //有无雨雪
            if ("16".equals(rkDto.getNodeId())) {
                weatherList = rkDto.getRegisterItem();
            }
        }
        for (RkData rkData : weatherList) {
            //天气
            if ("1".equals(rkData.getRegisterId())) {
                info.setWeather(rkData.getData());
                //有雨雪时判断当前雨量
                if ("有雨雪".equals(rkData.getData())) {
                    Double rainfall = Double.valueOf(info.getRainfall());
                    if (rainfall <= 10) {
                        info.setWeather("小雨");
                    }
                    if (rainfall > 10 && rainfall <= 25) {
                        info.setWeather("中雨");
                    }
                    if (rainfall > 25 && rainfall <= 50) {
                        info.setWeather("大雨");
                    }
                    if (rainfall > 50) {
                        info.setWeather("暴雨");
                    }
                }
            }
        }
        info.setUpdateTime(date);
        info.setCity(conf.getCity());
        notifyService.notify(info);
    }
    /**
     * èŽ·å–èº«ä»½è®¤è¯çš„æŽˆæƒaccessToken
     *
     * @param conf
     * @return
     */
    private String getToken(WeatherConf conf) {
        //默认先从缓存获取
        String key = RedisConst.buildKey(conf.getCompanyId(), RK_WEATHER_V30_4G, conf.getAccount());
        String token = (String) redisUtil.get(key);
        //若缓存获取为空,则通过接口获取token
        if (null == token) {
            String url = conf.getIp() + "/api/getToken?loginName=" + conf.getAccount() + "&password=" + conf.getPassword();
            RkResult response = restTemplate.getForObject(url, RkResult.class);
            if (null == response) {
                log.error("当前建大仁科平台获取身份认证信息失败...");
                return null;
            }
            log.info("获取的身份认证信息={}", response);
            if (StringUtils.isEmpty(response.getCode()) || !"1000".equals(response.getCode())) {
                log.error("当前建大仁科平台获取身份认证信息失败......");
                return null;
            }
            JSONObject result = JSON.parseObject(JSONObject.toJSONString(response.getData()));
            if (null == result) {
                return null;
            }
            token = (String) result.get("token");
            //将token存入缓存,
            redisUtil.set(key, token, 2 * 60 * 60);
        }
        return token;
    }
}
igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5328ServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ld.igds.timer.zcl.service.impl;
import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
import com.ld.igds.models.InteGrain5328;
import com.ld.igds.timer.zcl.dto.InteGrainDto;
import com.ld.igds.timer.zcl.service.InteGrainService;
import org.hibernate.Session;
import org.springframework.stereotype.Component;
/**
 * @Desc: 5328 æŽ¥å£
 * @author: czt
 * @update-time: 2023/10/19
 */
@Component
public class InteGrain5328ServiceImpl extends HibernateDao implements InteGrainService {
    @Override
    public String getCompanyId() {
        return "5328";
    }
    @Override
    public void toSaveGrain(InteGrainDto dto) {
        Session session = this.getSessionFactory().openSession();
        try {
            InteGrain5328 data = new InteGrain5328();
            data.setUuid(dto.getUuid());
            data.setBatchId(dto.getBatchId());
            data.setCompanyId(dto.getCompanyId());
            data.setDepotId(dto.getDepotId());
            data.setDepotName(dto.getDepotName());
            data.setHumidityIn(dto.getHumidityIn());
            data.setHumidityOut(dto.getHumidityOut());
            data.setTempIn(dto.getTempIn());
            data.setTempOut(dto.getTempOut());
            data.setReceiveDate(dto.getReceiveDate());
            data.setTempList(dto.getTempList());
            data.setCheckUser(dto.getCheckUser());
            data.setCable(dto.getCable());
            data.setCableCir(dto.getCableCir());
            data.setRemark(dto.getRemark());
            data.setWeather(dto.getWeather());
            session.saveOrUpdate(data);
        } finally {
            session.flush();
            session.close();
        }
    }
}
igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5332ServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ld.igds.timer.zcl.service.impl;
import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
import com.ld.igds.models.InteGrain5332;
import com.ld.igds.timer.zcl.dto.InteGrainDto;
import com.ld.igds.timer.zcl.service.InteGrainService;
import org.hibernate.Session;
import org.springframework.stereotype.Component;
/**
 * @Desc: 5332 æŽ¥å£
 * @author: czt
 * @update-time: 2023/10/19
 */
@Component
public class InteGrain5332ServiceImpl extends HibernateDao implements InteGrainService {
    @Override
    public String getCompanyId() {
        return "5332";
    }
    @Override
    public void toSaveGrain(InteGrainDto dto) {
        Session session = this.getSessionFactory().openSession();
        try {
            InteGrain5332 data = new InteGrain5332();
            data.setUuid(dto.getUuid());
            data.setBatchId(dto.getBatchId());
            data.setCompanyId(dto.getCompanyId());
            data.setDepotId(dto.getDepotId());
            data.setDepotName(dto.getDepotName());
            data.setHumidityIn(dto.getHumidityIn());
            data.setHumidityOut(dto.getHumidityOut());
            data.setTempIn(dto.getTempIn());
            data.setTempOut(dto.getTempOut());
            data.setReceiveDate(dto.getReceiveDate());
            data.setTempList(dto.getTempList());
            data.setCheckUser(dto.getCheckUser());
            data.setCable(dto.getCable());
            data.setCableCir(dto.getCableCir());
            data.setRemark(dto.getRemark());
            data.setWeather(dto.getWeather());
            session.saveOrUpdate(data);
        } finally {
            session.flush();
            session.close();
        }
    }
}
igds-inout/src/main/java/com/ld/igds/inout/service/HSettleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
package com.ld.igds.inout.service;
import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
import com.bstek.dorado.data.provider.Page;
import com.ld.igds.check.dto.CheckItemData;
import com.ld.igds.constant.RedisConst;
import com.ld.igds.m.InoutManageUtil;
import com.ld.igds.models.*;
import com.ld.igds.models.InoutSettle;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.DateUtil;
import com.ld.igds.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class HSettleService extends HibernateDao {
    public static final String BEAN_ID = "hSettleServiceImpl";
    public static final String CACHE_SETTLE_ID = "SETTLE_ID";
    @Autowired
    private RedisUtil redisUtil;
    public void pageList(Page<InoutSettle> page, Map<String, Object> param)
            throws Exception {
        String hql = " from " + InoutSettle.class.getName()
                + " where companyId =:companyId and deptId =:deptId";
        Map<String, Object> args = new HashMap<String, Object>();
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("deptId", ContextUtil.subDeptId(null));
        if (null != param) {
            String str = (String) param.get("depotId");
            if (StringUtils.isNotEmpty(str)) {
                hql += " and depotId=:depotId ";
                args.put("depotId", str);
            }
            str = (String) param.get("contractId");
            if (StringUtils.isNotEmpty(str)) {
                hql += " and contractId=:contractId ";
                args.put("contractId", str);
            }
            str = (String) param.get("bizType");
            if (StringUtils.isNotEmpty(str)) {
                hql += " and bizType=:bizType ";
                args.put("bizType", str);
            }
            Date date = (Date) param.get("start");
            if (null != date) {
                hql += " and payTime >= :start ";
                args.put("start", DateUtil.getCurZero(date));
            }
            date = (Date) param.get("end");
            if (null != date) {
                hql += " and payTime <= :end ";
                args.put("end", DateUtil.getNextZero(date));
            }
        }
        String countHql = "select count(*) " + hql;
        hql += " order by id desc ";
        this.pagingQuery(page, hql, countHql, args);
    }
    public void saveData(InoutSettle data) {
        Session session = this.getSessionFactory().openSession();
        if (StringUtils.isEmpty(data.getCompanyId())) {
            data.setCompanyId(ContextUtil.getCompanyId());
        }
        if (StringUtils.isEmpty(data.getDeptId())) {
            data.setDeptId(ContextUtil.subDeptId(null));
        }
        if (null == data.getPayTime()) {
            data.setPayTime(new Date());
        }
        try {
            data.setUpdateTime(new Date());
            if (StringUtils.isEmpty(data.getId())) {
                String id = createId(data.getPayTime(), data.getCompanyId());
                data.setId(id);
                session.save(data);
            } else {
                session.update(data);
            }
        } finally {
            session.flush();
            session.close();
        }
    }
    public void delData(InoutSettle data) {
        Session session = this.getSessionFactory().openSession();
        try {
            if (null != data.getId()) {
                session.delete(data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
    public String createId(Date date, String companyId) {
        // æ—¶é—´æˆ³æ ‡ç­¾
        String timeKey = DateFormatUtils.format(date, "yyyyMMdd");
        // ä»Žç¼“存中获取已有的组织编码
        String cacheKey = RedisConst.buildKey(companyId, this.CACHE_SETTLE_ID);
        String cacheId = (String) redisUtil.get(cacheKey);
        if (null != cacheId && cacheId.indexOf(timeKey) >= 0) {
            String temp = cacheId.substring(cacheId.length() - 4);
            Integer i = Integer.valueOf(temp);
            i++;
            cacheId = timeKey + String.format("%04d", i);
        } else {
            Map<String, Object> args = new HashMap<>();
            args.put("timeKey", timeKey + "%");
            List<InoutSettle> result = getMaxId(args);
            if (null == result || result.size() == 0) {
                cacheId = timeKey + "0001";
            } else {
                String temp = result.get(0).getId();
                String tempNum = temp.substring(temp.length() - 4);
                Integer i = Integer.valueOf(tempNum);
                cacheId = timeKey + String.format("%04d", ++i);
            }
        }
        // æ›´æ–°ç¼“å­˜
        redisUtil.set(cacheKey, cacheId);
        return cacheId;
    }
    public List<InoutSettle> getMaxId(Map<String, Object> param) {
        String hql = "from " + InoutSettle.class.getName() + " where 1 = 1 ";
        Map<String, Object> args = new HashMap<String, Object>();
        if (null != param) {
            String str = (String) param.get("timeKey");
            if (StringUtils.isNotEmpty(str)) {
                hql += " and id like :timeKey";
                args.put("timeKey", str);
            }
        }
        hql += " order by  id desc ";
        return this.query(hql, args);
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/ServerRunner.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ld.igds.protocol.beibo;
import com.ld.igds.data.ConfigData;
import com.ld.igds.protocol.beibo.grainv1.server.BeiboGrainV1ServerEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
 * é…ç½®éšç³»ç»Ÿè‡ªåŠ¨å¯åŠ¨æœåŠ¡ -- æ‰§è¡Œé¡ºåº20-29
 */
@Component(ServerRunner.BEAN_ID)
@Order(value = 25)
public class ServerRunner implements CommandLineRunner {
    public static final String BEAN_ID = "beibo.serverRunnerV1";
    @Autowired
    private ConfigData configData;
    @Autowired
    private BeiboGrainV1ServerEngine beiboGrainV1ServerEngine;
    @Override
    public void run(String... strings) throws Exception {
        if (configData.getActive().indexOf("pro") >= 0) {
            beiboGrainV1ServerEngine.start(BeiboGrainV1ServerEngine.PORT);
        }
        if (configData.getActive().indexOf("dev") >= 0) {
            beiboGrainV1ServerEngine.start(BeiboGrainV1ServerEngine.PORT);
        }
        if (configData.getActive().indexOf("uat") >= 0) {
            beiboGrainV1ServerEngine.start(BeiboGrainV1ServerEngine.PORT);
        }
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/RemoteGrainServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ld.igds.protocol.beibo.grainv1;
import com.ld.igds.io.RemoteGrainService;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.constant.ProtocolEnum;
import com.ld.igds.io.request.CheckGrainRequest;
import com.ld.igds.io.response.GrainResponse;
import com.ld.igds.protocol.beibo.grainv1.builder.CommandBuild;
import com.ld.igds.protocol.beibo.grainv1.server.BeiboGrainV1ServerEngine;
import com.ld.io.api.InvokeResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * è´åšç²®æƒ…分机协议
 *
 * @author czt
 */
@Slf4j
@Component(RemoteGrainServiceImpl.BEAN_ID)
public class RemoteGrainServiceImpl implements RemoteGrainService {
    public static final String BEAN_ID = "beiboGrain.remoteGrainService";
    @Autowired
    private BeiboGrainV1ServerEngine beiboGrainV1ServerEngine;
    @Override
    public String getProtocol() {
        return ProtocolEnum.TCP_BEIBO_GRAIN_V1.getCode();
    }
    @Override
    public GrainResponse checkGrain(CheckGrainRequest request) {
        try {
            //生成粮情命令
            String hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId());
            // å‘送命令
            InvokeResult result = beiboGrainV1ServerEngine.pushByMin(hexStr);
            log.error("平台------>>>>分机:粮情检测-{}", hexStr);
            // å°è£…返回信息
            if (InvokeResult.SUCCESS == result) {
                return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
                        "粮情采集命令发送成功!");
            } else {
                log.error("平台------>>>>分机:粮情检测-失败{}", result.getMessage());
                return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                        "命令发送异常:" + result.getMessage());
            }
        } catch (Exception e) {
            log.error("粮情检测异常:{}", e);
            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后端异常:" + e.getMessage());
        }
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/analysis/AnalysisService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,822 @@
package com.ld.igds.protocol.beibo.grainv1.analysis;
import com.ld.igds.common.CoreCommonService;
import com.ld.igds.common.CoreSerService;
import com.ld.igds.constant.BizType;
import com.ld.igds.constant.Constant;
import com.ld.igds.constant.DepotType;
import com.ld.igds.grain.GrainUtil;
import com.ld.igds.grain.dto.GrainItemInfo;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.notify.NotifyGrainInvoker;
import com.ld.igds.models.DepotConf;
import com.ld.igds.models.DeviceSer;
import com.ld.igds.models.DicSysConf;
import com.ld.igds.models.Grain;
import com.ld.igds.order.ExeOrderService;
import com.ld.igds.order.data.ExeRequest;
import com.ld.igds.protocol.beibo.grainv1.builder.ReMessage;
import com.ld.igds.protocol.beibo.grainv1.builder.ReMessageBuilder;
import com.ld.igds.protocol.beibo.grainv1.util.BeiboGrainServerUtils;
import com.ld.igds.util.BytesUtil;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.NumberUtil;
import com.ld.igds.warn.WarnUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
/**
 * åè®®è§£æž
 *
 * @author czt
 */
@Slf4j
@Component(AnalysisService.BEAN_ID)
public class AnalysisService {
    public static final String BEAN_ID = "beiboGrain.analysisService";
    @Autowired
    private CoreSerService coreSerService;
    @Autowired
    private CoreCommonService commonService;
    @Autowired
    private NotifyGrainInvoker notifyGrainInvoker;
    @Autowired
    private GrainUtil grainUtil;
    @Autowired
    private WarnUtils warnUtils;
    @Autowired
    private ExeOrderService exeOrderService;
    public static String result = "";
    public static double ERROR_CHECK_TAG = -100.0;
    public static double FAULT_CHECK_TAG = 85.0;
    public static double ERROR_CHECK_TAG2 = 50;
    public static String ERROR_HEX = "FFFF";
    public static double MAX_TEMP = -50.0;
    public static double MIN_TEMP = 50.0;
    /*
    * 00000000FFEB90FEAA41D821DD21DB21DE21DE21DA21DD21DE21DC21DC21DC21DC21DB21D821D721CE21D121DD21DC21DF21DE21DE21DD21DA21DD21D921DD21DC21DA21D921D921D721D521D321DD21DE21DF21DC21DF21DC21DA21DD21DD21DD21DC21DC21DC21DB21D821D721D121DC21DF21DF21DD21DD21DA21DE21DD21DC21DE21DB21D821DA21DB21D821D721D321DE21E021DD21DF21DF21DE21DB21DC21DF21DF21DD21DF21DB21DC21DB21FFFFFFFFDA21DC21D721DB21DB21DA21DB21D421DB21D921DC21D821D921D621D321FFFFFFFFDF21E021DE21DE21DB21DD21DC21E021DF21DD21DD21DC21DC21DC21DA21FFFFFFFFD921DD21DD21DE21DB21DD21DA21DB21DF21DD21DC21DB21DB21DB21D921FFFFFFFFDD21DC21DE21DD21DE21DC21DB21DC21DE21DE21DC21DC21DB21D921D921FFFFFFFFE021DD21DB21E021DF21DB21DB21D821DE21DE21DD21DD21DB21DB21DB21FFFFFFFFE021E021E021E221DC21DE21DF21DD21DD21DF21DF21DB21DC21DD21DC21FFFFFFFFE221E321E321E521E421DF21E321E321E321E521E321E121D921DE21FFFFFFFFFFFFE321E421E321E621E521E321E621E021E521E321E221E321DF21DE21FFFFFFFFFFFFE421E621E521E521E621E321E521E121E621E121E321E421E121DE21FFFFFFFFFFFFE621E421E521E521E521E321E521E421E121E321E521E321DF21E021FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40013D10101039014110101010101010101000000000000000E5113500031A4C
    *
    * 00000000FFEB90FEAA
    * 41
    * D821DD21DB21DE21DE21DA21DD21DE21DC21DC21DC21DC21DB21D821D721CE21D121
    * DD21DC21DF21DE21DE21DD21DA21DD21D921DD21DC21DA21D921D921D721D521D321
    * DD21DE21DF21DC21DF21DC21DA21DD21DD21DD21DC21DC21DC21DB21D821D721D121
    * DC21DF21DF21DD21DD21DA21DE21DD21DC21DE21DB21D821DA21DB21D821D721D321
    * DE21E021DD21DF21DF21DE21DB21DC21DF21DF21DD21DF21DB21DC21DB21FFFFFFFF
    * DA21DC21D721DB21DB21DA21DB21D421DB21D921DC21D821D921D621D321FFFFFFFF
    * DF21E021DE21DE21DB21DD21DC21E021DF21DD21DD21DC21DC21DC21DA21FFFFFFFF
    * D921DD21DD21DE21DB21DD21DA21DB21DF21DD21DC21DB21DB21DB21D921FFFFFFFF
    * DD21DC21DE21DD21DE21DC21DB21DC21DE21DE21DC21DC21DB21D921D921FFFFFFFF
    * E021DD21DB21E021DF21DB21DB21D821DE21DE21DD21DD21DB21DB21DB21FFFFFFFF
    * E021E021E021E221DC21DE21DF21DD21DD21DF21DF21DB21DC21DD21DC21FFFFFFFF
    *
    * E221E321E321E521E421DF21E321E321E321E521E321E121D921DE21FFFFFFFFFFFF
    * E321E421E321E621E521E321E621E021E521E321E221E321DF21DE21FFFFFFFFFFFF
    * E421E621E521E521E621E321E521E121E621E121E321E421E121DE21FFFFFFFFFFFF
    * E621E421E521E521E521E321E521E421E121E321E521E321DF21E021FFFFFFFFFFFF
    * FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    * 40013D 101010 390141 101010101010101010
    * 00000000000000E51135
    * 00031A4C
    *
    *
    *
    *
    *
    * */
    /**
     *
     *
     * @param hexStr
     */
    public void analysis(String ip, int port, String hexStr) {
        result += hexStr;
        if (result.length() < 1066 * 2) {
            log.info("分机------->>平台,报文长度不够,等待下一包数据");
            return;
        }
        try {
            //封装数据
            ReMessage reMessage = ReMessageBuilder.getInstance().buildMessage(result);
            reMessage.setIp(ip);
            reMessage.setPort(port);
            log.info("分机------->>平台:粮情完整报文信息={}", reMessage);
            result = "";
            if (!BeiboGrainServerUtils.MSG_START.startsWith(reMessage.getStartStr())) {
                log.error("分机------->>平台,解析粮情失败:报文起始符={}错误,不解析", reMessage.getStartStr());
                return;
            }
            //根据分机地址获取分机信息
            DeviceSer ser = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), reMessage.getSerId());
            if (ser == null) {
                log.error("分机-------->>平台,解析粮情失败,未获取到系统粮情主机配置:" + reMessage.getSerId());
                return;
            }
            List<ExeRequest> list = exeOrderService.getInProgressOrderBySerId(BizType.GRAIN.getCode(), ser.getId());
            if (null == list || list.isEmpty()) {
                String info = "粮情解析失败:分机=" + ser.getName() + "没有获取到所属仓库信息。";
                log.error("分机------>>>平台:" + info);
                notifyGrainInvoker.notifyWeb(ser.getCompanyId(), OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
                return;
            }
            ExeRequest exeRequest = list.get(0);
            log.info("获取粮情命令信息={}", exeRequest);
            if (null == exeRequest) {
                String info = "粮情解析失败:分机=" + ser.getName() + "没有获取历史命令。";
                log.error("贝博分机------>>>平台:" + info);
                return;
            }
            DepotConf depotConf = commonService.getCacheDepotConf(exeRequest.getCompanyId(), exeRequest.getDepotId());
            if (null == depotConf) {
                String info = "粮情解析失败:分机=" + ser.getName() + "没有获取到粮情参数配置信息。";
                log.error("分机------>>>平台:" + info);
                notifyGrainInvoker.notifyWeb(ser.getCompanyId(),
                        OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
                return;
            }
            // é¦–先获取到系统参数,判断是否需要批次自动优化
            DicSysConf sysConf = commonService.getCacheSysConf(ser.getCompanyId());
            reMessage.setCompanyId(ser.getCompanyId());
            analysisGrain(depotConf, reMessage, ser, exeRequest, sysConf);
        } catch (Exception e) {
            result = "";
            log.error("分机------->>平台,解析粮情异常:原因={}", e.toString());
        }
    }
    private void analysisGrain(DepotConf depotConf, ReMessage reMessage, DeviceSer ser, ExeRequest exeRequest, DicSysConf sysConf) {
        // ç²®æƒ…的批次号重新根据频率调整
        reMessage.setBatchId(ContextUtil.getBatchIdByFireq(depotConf.getGrainFreq()));
        String grainStr = reMessage.getGrainStr();
        log.debug("{}-{}=收到的粮情信息={}", ser.getCompanyId(), ser.getName(), grainStr);
        analysisStep0(depotConf, reMessage, ser, exeRequest, sysConf);
        log.info("分机------>>>平台:命令类型=8817--粮情全部收到,开始解析-{}-{}",
                ser.getCompanyId(), ser.getName());
    }
    private void analysisStep0(DepotConf depotConf, ReMessage reMessage,
                               DeviceSer ser, ExeRequest exeRequest, DicSysConf sysConf) {
        List<DepotConf> depotConfs = null;
        // ä¸€åˆ†æœºå¤šä»“,把起始列放到最大进行采集
        if (Constant.YN_Y.equals(sysConf.getGrainMoreTag())) {
            depotConfs = commonService.getCacheDepotConfBySerId2(
                    depotConf.getCompanyId(), ser.getId());
        }
        if (null == depotConfs) {// ä¸€ä¸ªåˆ†æœº1个仓
            if (DepotType.TYPE_02.getCode().equals(depotConf.getDepotType())) {
                analysisStep2(depotConf, ser, exeRequest, reMessage, sysConf);
            } else if (DepotType.TYPE_04.getCode().equals(depotConf.getDepotType())) {
                analysisStep2(depotConf, ser, exeRequest, reMessage, sysConf);
            } else {
                analysisStep1(depotConf, ser, exeRequest, reMessage, sysConf);
            }
            return;
        }
        // ä¸€åˆ†å‡ å¤šä»“情况,考虑单仓采集和多仓采集
        // æ‰¹é‡é‡‡é›†æ‰€æœ‰å…³è”一起采集,遍历执行
        for (DepotConf depotConfTemp : depotConfs) {
            if (DepotType.TYPE_02.getCode().equals(depotConfTemp.getDepotType())) {
                analysisStep2(depotConfTemp, ser, exeRequest, reMessage, sysConf);
            } else if (DepotType.TYPE_04.getCode().equals(depotConfTemp.getDepotType())) {
                analysisStep2(depotConfTemp, ser, exeRequest, reMessage, sysConf);
            } else {
                analysisStep1(depotConfTemp, ser, exeRequest, reMessage, sysConf);
            }
        }
    }
    /**
     * åœ†ç­’仓的粮情解析
     *
     * @param depotConf
     * @param ser
     * @param exeRequest
     * @param reMessage
     */
    private void analysisStep2(DepotConf depotConf,
                               DeviceSer ser, ExeRequest exeRequest,
                               ReMessage reMessage, DicSysConf sysConf) {
        if (StringUtils.isEmpty(depotConf.getCableRule())
                || StringUtils.isEmpty(depotConf.getCableCir())) {
            log.error("分机------>>>平台:当前仓库:{}-{},没有没有配置布线规则,无法解析粮情信息……",
                    ser.getCompanyId(), depotConf.getDepotName());
            return;
        }
        String[] cableRuleAtt = depotConf.getCableRule().split("-");
        String[] cableCirAtt = depotConf.getCableCir().split("-");
        if (cableRuleAtt.length != cableCirAtt.length) {
            log.error("分机------>>>平台:当前仓库:{}-{},布线规则不正确,无法解析粮情信息……", ser.getCompanyId(), depotConf.getDepotName());
            return;
        }
        //避免空指针
        if (null == depotConf.getCableCone()) depotConf.setCableCone(Constant.CABLE_CONE_0);
        // èŽ·å–æœ€å¤§çš„å±‚é…ç½®--默认每一圈都一样
        int layMax = Integer.valueOf(cableCirAtt[0]);
        for (int i = 0; i < cableCirAtt.length; i++) {
            if (Integer.valueOf(cableCirAtt[i]) >= layMax) layMax = Integer.valueOf(cableCirAtt[i]);
        }
        //粮情信息
        String strPoints = reMessage.getGrainStr();
        log.info("------筒仓粮情报文={}------", strPoints);
        int sumNum = 0, cableZ = 1;  // sumNum å…±å¤šå°‘根电缆;cableZ å±‚的最大值,锥形仓补齐最大层
        for (int i = 0; i < cableCirAtt.length; i++) {
            if (Integer.valueOf(cableCirAtt[i]) > cableZ) {
                cableZ = Integer.valueOf(cableCirAtt[i]);
            }
            sumNum += Integer.valueOf(cableRuleAtt[i]);
        }
        int cableZTemp = 1;// å½“前仓的最大层
        cableZTemp = cableZ;
        //判断最大层跟分机的层数是否一致
        if(cableZ < ser.getCableZ()){
            cableZ = ser.getCableZ();
        }
        // æ ¹æ®å±‚行列获取指定长度
        int start = 4 * (depotConf.getCableStart() - ser.getCableStart()) * cableZ;
        int len = 4 * cableZ * sumNum;
        strPoints = strPoints.substring(start, start + len);
        log.info("分机------>>>平台:返回粮情完整信息,所属组织={},分机={}", ser.getCompanyId(), ser.getName());
        // å°†ç²®æƒ…解析成数组
        List<Double> temps = new ArrayList<>();
        double tempValue;
        String temp;
        int symbol = 0; //符号位
        int num = 0; //标记解析的层数
        for (int i = 0; i < strPoints.length() / 4; i++) {
            if(num == cableZ){
                num = 0;
            }
            if(num < cableZTemp){
                temp = strPoints.substring(i * 4, i * 4 + 4);
                if (temp == null) {
                    temp = "0000";
                }
                //高低位转换后转为16位二进制字符串
                temp = BytesUtil.tran_LH(temp);
                if(ERROR_HEX.equals(temp)){
                    tempValue = Constant.ERROR_TEMP;
                }else {
                    //10进制转16位的2进制
                    temp = BytesUtil.hexString2binaryString(temp, 16);
                    //符号位
                    symbol = Integer.valueOf(temp.substring(0, 1));
                    //获取温度值
                    tempValue = BytesUtil.biannary2Decimal(temp.substring(6)) * 0.0625;
                    //若为负,则补码:取反加1
                    if (symbol == 1) {
                        tempValue = ((~BytesUtil.biannary2Decimal(temp.substring(6))) + 1) * 0.0625;
                    }
                    tempValue = NumberUtil.keepPrecision(tempValue, 1);
                }
                //非正常值
                if (tempValue > ERROR_CHECK_TAG2) {
                    tempValue = Constant.ERROR_TEMP;
                }
                // æ•…障值处理
                if (tempValue >= FAULT_CHECK_TAG) {
                    tempValue = Constant.FAULT_TEMP;
                }
                temps.add(tempValue);
            }
            num ++;
        }
        log.debug("-------CheckGrainRequest--={}", exeRequest.toString());
        // å°†é›†åˆè§£æžæˆåæ ‡æ•°æ®
        addPoint2(temps, reMessage, depotConf, exeRequest, sysConf);
    }
    /**
     * èŽ·å–å½“å‰è·Ÿæ‰€åœ¨åœˆ
     *
     * @param curRoot
     * @param cableRuleAtt
     * @return
     */
    private int getCurCir(int curRoot, String[] cableRuleAtt) {
        int sum = 0;
        for (int i = 0; i < cableRuleAtt.length; i++) {
            sum += Integer.valueOf(cableRuleAtt[i]);
            if (curRoot <= sum) return i + 1;
        }
        return 1;
    }
    /**
     * å¹³æ–¹ä»“的解析,解析需要考虑当前是否启用的一分机多仓
     *
     * @param depotConf
     * @param ser
     * @param exeRequest
     * @param reMessage
     */
    private void analysisStep1(DepotConf depotConf, DeviceSer ser,
                               ExeRequest exeRequest, ReMessage reMessage, DicSysConf sysConf) {
        // ç²®æƒ…信息
        String strPoints = reMessage.getGrainStr();
        String[] attCable = depotConf.getCableRule().split("-");
        int cableZ = Integer.valueOf(attCable[0]);
        int cableY = Integer.valueOf(attCable[1]);
        int cableX = Integer.valueOf(attCable[2]);
        // æ ¹æ®å±‚行列获取指定长度
        int start = 4 * (depotConf.getCableStart() - ser.getCableStart())
                * cableZ * cableY;
        int len = 4 * cableZ * cableY * cableX;
        log.info("分机------>>>平台:返回粮情完整信息,所属组织={},分机={}", ser.getCompanyId(), ser.getName());
        strPoints = strPoints.substring(start, start + len);
        // å°†ç²®æƒ…解析成数组
        List<Double> temps = new ArrayList<>();
        double tempValue;
        String temp;
        int symbol = 0;
        for (int i = 0; i < strPoints.length() / 4; i++) {
            temp = strPoints.substring(i * 4, i * 4 + 4);
            //高低位转换后转为16位二进制字符串
            temp = BytesUtil.tran_LH(temp);
            if (temp == null) {
                temp = "0000";
            }
            if(ERROR_HEX.equals(temp)){
                tempValue = Constant.ERROR_TEMP;
            }else {
                //10进制转16位的2进制
                temp = BytesUtil.hexString2binaryString(temp, 16);
                //符号位
                symbol = Integer.valueOf(temp.substring(0, 1));
                //获取温度值
                tempValue = BytesUtil.biannary2Decimal(temp.substring(6)) * 0.0625;
                //若为负,则补码:取反加1
                if (symbol == 1) {
                    tempValue = ((~BytesUtil.biannary2Decimal(temp.substring(6))) + 1) * 0.0625;
                }
                tempValue = NumberUtil.keepPrecision(tempValue, 1);
            }
            // è¯´æ˜Žè§£æžçš„æ•°æ®æœ‰é—®é¢˜
            if (tempValue == ERROR_CHECK_TAG || tempValue == ERROR_CHECK_TAG2) {
                tempValue = Constant.ERROR_TEMP;
            }
            // æ•…障值处理
            if (tempValue >= FAULT_CHECK_TAG) {
                tempValue = Constant.FAULT_TEMP;
            }
            temps.add(tempValue);
        }
        log.debug("-------CheckGrainRequest--={}", exeRequest.toString());
        // å°†é›†åˆè§£æžæˆåæ ‡æ•°æ®
        addPoint1(temps, reMessage, depotConf, ser, exeRequest, sysConf);
    }
    /**
     * å¹³æˆ¿ä»“,解析第二步,解析到坐标数据
     *
     * @param temps
     * @throws Exception
     */
    private void addPoint1(List<Double> temps, ReMessage msg,
                           DepotConf depotConf, DeviceSer ser, ExeRequest exeRequest,
                           DicSysConf sysConf) {
        //根据电缆起始方位和布线方向,对粮情数据进行调整
        if (null != depotConf.getStartOrientation()) {
            temps = reversalGrainPoint(temps, depotConf);
        }
        //若起点点位为底部,则将粮情数据进行翻转
        if (null != depotConf.getStartPoint()
                && Constant.GRAIN_START_POINT_BELOW.equals(depotConf.getStartPoint())) {
            temps = grainUtil.reversalUpAndDown(temps, depotConf.getCableRule());
        }
        //若配置层行转换,则将粮情数据进行层行转换
        if (StringUtils.isNotEmpty(depotConf.getStartConvert())) {
            temps = convertGrainPoint(temps, depotConf);
            String[] cableRule = depotConf.getCableRule().split("-");
            //转换层行列配置
            if (Constant.GRAIN_CONVERT_CLOCKWISE.equals(depotConf.getStartConvert())
                    || Constant.GRAIN_CONVERT_ANTICLOCKWISE.equals(depotConf.getStartConvert())) {
                depotConf.setCableRule(Integer.valueOf(cableRule[1]) + "-" + Integer.valueOf(cableRule[0]) + "-" + Integer.valueOf(cableRule[2]));
            }
        }
        String[] attCable = depotConf.getCableRule().split("-");
        int cableZ = Integer.valueOf(attCable[0]);
        int cableY = Integer.valueOf(attCable[1]);
        int cableX = Integer.valueOf(attCable[2]);
        Grain grain = new Grain();
        grain.setDepotId(depotConf.getDepotId());
        grain.setCompanyId(depotConf.getCompanyId());
        grain.setCable(depotConf.getCableRule());
        grain.setBatchId(msg.getBatchId());
        int humidity = -100;
        int tem = -100;
        String substring = "";
        //解析仓内温仓内湿
        int thConf = Integer.valueOf(depotConf.getThConf());
        int start = 0, end = 6;
        if(thConf > 1){
            start += 6*thConf; //12-18
            end += start;
        }
        String thStr = msg.getThStr().substring(start, end);
        humidity = BytesUtil.hexToInt(thStr.substring(0, 2));
        grain.setHumidityIn(humidity * 1.0);
        substring = thStr.substring(2);
        tem = BytesUtil.hexToInt(substring);
        grain.setTempIn(tem * 0.1);
        if(substring.startsWith("1")){
            grain.setTempIn(tem * -0.1);
        }
        grain.setReceiveDate(new Date());
        grain.setRemark("粮温正常");
        // èŽ·å–ç¼“å­˜ä¸­çš„å‘½ä»¤ä¿¡æ¯
        grain.setCheckUser(exeRequest.getExeUser());
        double max = MAX_TEMP, min = MIN_TEMP, sumT = 0.0, sumNum = cableX
                * cableY * cableZ;
        // æ ¡éªŒå’Œå®žçŽ°ç»Ÿè®¡ï¼Œç”Ÿæˆé‡‡é›†ç‚¹ä¿¡æ¯
        List<GrainItemInfo> listGrainItems = new ArrayList<>();
        int i = 1;
        for (Double temp : temps) {
            if (temp == Constant.ERROR_TEMP || temp == Constant.FAULT_TEMP || temp == Constant.ADD_TEMP) {
                sumNum--;
            } else {
                sumT += temp;
                if (temp > max) {
                    max = temp;
                }
                if (temp < min) {
                    min = temp;
                }
            }
            listGrainItems.add(new GrainItemInfo(i, temp));
            i++;
        }
        if (sumNum == 0) {
            sumNum = 1;
            grain.setRemark("当前粮情采集异常");
        }
        //过滤比较用的最大最小值
        if (max == MAX_TEMP) {
            max = 0.0;
        }
        if (min == MIN_TEMP) {
            min = 0.0;
        }
        if (null != depotConf.getTempMax() && max > depotConf.getTempMax()) {
            grain.setRemark("仓库配置高温警告值:" + depotConf.getTempMax() + ",当前检测高温值:"
                    + max);
            warnUtils.addGrainWarn(depotConf, grain);
        }
        grain.setTempAve(sumT / sumNum);
        grain.setTempMax(max);
        grain.setTempMin(min);
        grain.setPoints(StringUtils.join(temps, ","));
        String depotIds = exeRequest.getDepotIds();
        boolean notifyWeb = true;
        if (null != depotIds && depotIds.indexOf(depotConf.getDepotId()) == -1) {
            notifyWeb = false;
        }
        // ç”¨æˆ·å°è£…好数据即可
        notifyGrainInvoker.analysisSuccess(grain, listGrainItems, depotConf,
                sysConf, notifyWeb, exeRequest);
    }
    /**
     * åœ†ç­’仓解析步骤
     *
     * @param temps
     * @param msg
     * @param depotConf
     * @param exeRequest
     */
    private void addPoint2(List<Double> temps, ReMessage msg,
                           DepotConf depotConf, ExeRequest exeRequest,
                           DicSysConf sysConf) {
        Grain grain = new Grain();
        grain.setDepotId(depotConf.getDepotId());
        grain.setCompanyId(depotConf.getCompanyId());
        grain.setCable(depotConf.getCableRule());
        grain.setCableCir(depotConf.getCableCir());
        grain.setBatchId(msg.getBatchId());
        int humidity = -100;
        int tem = -100;
        String substring = "";
        //解析仓内温仓内湿
        int thConf = Integer.valueOf(depotConf.getThConf());
        int start = 0, end = 6;
        if(thConf > 1){
            start += 6*thConf; //12-18
            end += start;
        }
        String thStr = msg.getThStr().substring(start, end);
        humidity = BytesUtil.hexToInt(thStr.substring(0, 2));
        grain.setHumidityIn(humidity * 1.0);
        substring = thStr.substring(2);
        tem = BytesUtil.hexToInt(substring);
        grain.setTempIn(tem * 0.1);
        if(substring.startsWith("1")){
            grain.setTempIn(tem * -0.1);
        }
        grain.setReceiveDate(new Date());
        grain.setRemark("粮温正常");
        grain.setCheckUser(exeRequest.getExeUser());
        double max = MAX_TEMP, min = MIN_TEMP, sumT = 0.0;
        int sumNum = temps.size();
        List<GrainItemInfo> listGrainItems = new ArrayList<>();
        int i = 1;
        for (Double temp : temps) {
            if (temp == Constant.ERROR_TEMP || temp == Constant.FAULT_TEMP || temp == Constant.ADD_TEMP) {
                sumNum--;
            } else {
                sumT += temp;
                if (temp > max) {
                    max = temp;
                }
                if (temp < min) {
                    min = temp;
                }
            }
            listGrainItems.add(new GrainItemInfo(i, temp));
            i++;
        }
        if (sumNum == 0) {
            sumNum = 1;
            grain.setRemark("当前粮情采集异常");
        }
        //过滤比较用的最大最小值
        if (max == MAX_TEMP) {
            max = 0.0;
        }
        if (min == MIN_TEMP) {
            min = 0.0;
        }
        if (null != depotConf.getTempMax() && max > depotConf.getTempMax()) {
            grain.setRemark("仓库配置高温警告值:" + depotConf.getTempMax() + ",当前检测高温值:"
                    + max);
            warnUtils.addGrainWarn(depotConf, grain);
        }
        grain.setTempAve(sumT / sumNum);
        grain.setTempMax(max);
        grain.setTempMin(min);
        grain.setPoints(StringUtils.join(temps, ","));
        //判断是否是锥形仓,是的话进行锥形仓补点
        if(StringUtils.isNotEmpty(depotConf.getCableCone())){
            //上锥形补点
            if(Constant.CABLE_CONE_1.equals(depotConf.getCableCone())){
                grain.setPoints(upConePoints(depotConf, grain.getPoints()));
            }
            //下锥形补点
            if(Constant.CABLE_CONE_2.equals(depotConf.getCableCone())){
                grain.setPoints(downConePoints(depotConf, grain.getPoints()));
            }
        }
        String depotIds = exeRequest.getDepotIds();
        boolean notifyWeb = true;
        if (null != depotIds && depotIds.indexOf(depotConf.getDepotId()) == -1) {
            notifyWeb = false;
        }
        // ç”¨æˆ·å°è£…好数据即可
        notifyGrainInvoker.analysisSuccess(grain, listGrainItems, depotConf,
                sysConf, notifyWeb, exeRequest);
    }
    private List<Double> convertGrainPoint(List<Double> temps, DepotConf conf) {
        if (Constant.GRAIN_CONVERT_DEFAULT.equals(conf.getStartConvert())) {
            //若层行转换为默认,则直接返回
            return temps;
        }
        //顺时针转换
        if (Constant.GRAIN_CONVERT_CLOCKWISE.equals(conf.getStartConvert())) {
            return grainUtil.convertRight(temps, conf.getCableRule());
        }
        //逆时针转换
        if (Constant.GRAIN_CONVERT_ANTICLOCKWISE.equals(conf.getStartConvert())) {
            return grainUtil.convertLeft(temps, conf.getCableRule());
        }
        return temps;
    }
    private List<Double> reversalGrainPoint(List<Double> temps, DepotConf conf) {
        if (StringUtils.isEmpty(conf.getStartOrientation())) {
            //若起始方位为空,则默认起始方位和方向,直接返回
            return temps;
        }
        //起始方位为右边时
        if (Constant.GRAIN_START_ORIENTATION_RIGHT.equals(conf.getStartOrientation())) {
            if (StringUtils.isEmpty(conf.getStartDirection())) {
                //右边起始,默认纵向布线,直接返回
                return temps;
            }
            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
                //右边起始,横向布线
                return grainUtil.reversalRight1(temps, conf.getCableRule());
            }
            //右边起始,默认纵向布线,直接返回
            return temps;
        }
        //起始方位为右上时
        if (Constant.GRAIN_START_ORIENTATION_RIGHT_UP.equals(conf.getStartOrientation())) {
            if (StringUtils.isEmpty(conf.getStartDirection())) {
                //右上起始,默认纵向布线
                return grainUtil.reversalRightUp2(temps, conf.getCableRule());
            }
            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
                //右上起始,横向布线
                return grainUtil.reversalRightUp1(temps, conf.getCableRule());
            }
            //右上起始,默认纵向布线
            return grainUtil.reversalRightUp2(temps, conf.getCableRule());
        }
        //起始方位为左边时
        if (Constant.GRAIN_START_ORIENTATION_LEFT.equals(conf.getStartOrientation())) {
            if (StringUtils.isEmpty(conf.getStartDirection())) {
                //左边起始,默认纵向布线
                return grainUtil.reversalLeft2(temps, conf.getCableRule());
            }
            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
                //左边起始,横向布线
                return grainUtil.reversalLeft1(temps, conf.getCableRule());
            }
            //左边起始,默认纵向布线
            return grainUtil.reversalLeft2(temps, conf.getCableRule());
        }
        //起始方位为左上时
        if (Constant.GRAIN_START_ORIENTATION_LEFT_UP.equals(conf.getStartOrientation())) {
            if (StringUtils.isEmpty(conf.getStartDirection())) {
                //左上起始,默认纵向布线
                return grainUtil.reversalLeftUp2(temps, conf.getCableRule());
            }
            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
                //左上起始,横向布线
                return grainUtil.reversalLeftUp1(temps, conf.getCableRule());
            }
            //左上起始,默认纵向布线
            return grainUtil.reversalLeftUp2(temps, conf.getCableRule());
        }
        return temps;
    }
    /**
     * ä¸Šé”¥å½¢è¡¥ç‚¹(点位位置正确,需要补点为-102)
     *
     * @param depotConf
     * @param points
     * @return
     */
    private String upConePoints(DepotConf depotConf, String points){
        String[] cableRuleAtt = depotConf.getCableRule().split("-");
        String[] cableCirAtt = depotConf.getCableCir().split("-");
        //获取最大的层配置
        int layMax = Integer.valueOf(cableCirAtt[0]);
        for (int i = 0; i < cableCirAtt.length; i++) {
            if (Integer.valueOf(cableCirAtt[i]) >= layMax) {
                layMax = Integer.valueOf(cableCirAtt[i]);
            }
        }
        //所在层从1开始
        int curLay = 1;
        //所在根
        int curRoot = 1;
        //所在圈
        int curCir = 1;
        //当前圈的层
        int cirLay = 1;
        String[] array = points.split(",");
        for (int i = 0; i < array.length; i++) {
            curLay = (i % layMax) + 1;
            curRoot = (i / layMax) + 1;
            curCir = getCurCir(curRoot, cableRuleAtt);
            cirLay = Integer.valueOf(cableCirAtt[curCir - 1]);
            //比如配置了5层但是当前是6层,说明当前点为补偿点
            if (curLay <= (layMax - cirLay)) {
                array[i] = String.valueOf(Constant.ADD_TEMP);
            }
        }
        return StringUtils.join(array, ",");
    }
    /**
     * ä¸‹é”¥å½¢è¡¥ç‚¹(点位位置正确,需要补点为-102)
     *
     * @param depotConf
     * @param points
     * @return
     */
    private String downConePoints(DepotConf depotConf, String points){
        String[] cableRuleAtt = depotConf.getCableRule().split("-");
        String[] cableCirAtt = depotConf.getCableCir().split("-");
        //获取最大的层配置
        int layMax = Integer.valueOf(cableCirAtt[0]);
        for (int i = 0; i < cableCirAtt.length; i++) {
            if (Integer.valueOf(cableCirAtt[i]) >= layMax) {
                layMax = Integer.valueOf(cableCirAtt[i]);
            }
        }
        //所在层从1开始
        int curLay = 1;
        //所在根
        int curRoot = 1;
        //所在圈
        int curCir = 1;
        //当前圈的层
        int cirLay = 1;
        String[] array = points.split(",");
        for (int i = 0; i < array.length; i++) {
            curLay = (i % layMax) + 1;
            curRoot = (i / layMax) + 1;
            curCir = getCurCir(curRoot, cableRuleAtt);
            cirLay = Integer.valueOf(cableCirAtt[curCir - 1]);
            //比如配置了5层但是当前是6层,说明当前点为补偿点
            if (curLay > cirLay) {
                array[i] = String.valueOf(Constant.ADD_TEMP);
            }
        }
        return StringUtils.join(array, ",");
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/CommandBuild.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ld.igds.protocol.beibo.grainv1.builder;
import com.ld.igds.protocol.beibo.grainv1.util.BeiboGrainServerUtils;
import com.ld.igds.util.BytesUtil;
/**
 * å‘½ä»¤ç”Ÿæˆ
 *
 * @author czt
 */
public class CommandBuild {
    private final static CommandBuild instance = new CommandBuild();
    private CommandBuild() {
    }
    public static CommandBuild getInstance() {
        return instance;
    }
    /**
     * ç²®æƒ…采集命令
     *
     * @param grainAddr ç²®æƒ…分机地址
     * @return
     */
    public static String getMsgCheck(String grainAddr) {
        StringBuffer sb = new StringBuffer();
        //起始符
        sb.append(BeiboGrainServerUtils.MSG_START);
        //实际分机地址
        int addr = Integer.parseInt(grainAddr);
        //粮情分机地址=拨码开关地址+40H
        addr += BeiboGrainServerUtils.BM;
        sb.append(BytesUtil.intToHexStr1(addr));
        //控制命令
        sb.append("82");
        //分机地址
        sb.append(BytesUtil.intToHexStr1(addr));
        //测温电缆层数,不知道电缆采集层数时,默认00或者FF
        sb.append("00");
        //结尾符
        sb.append(BeiboGrainServerUtils.MSG_END);
        return sb.toString();
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ld.igds.protocol.beibo.grainv1.builder;
import lombok.Data;
import java.util.Date;
/**
 * è¿”回消息封装
 *
 * @author czt
 *
 */
@Data
public class ReMessage {
    private String ip;
    private int port;
    private String startStr; //起始符
    private String serId;     //分机地址
    private String grainStr;  //粮温数据
    private String thStr;     //温湿度数据
    private String expand;    //扩充数据
    private String hexCrc16;  //检验码
    private String batchId;
    private String companyId;
    private Date receiveDate;
    // å¼‚常信息
    private String error;
    private String strMsg;// å½“前命令转换为字符串的信息
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessageBuilder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ld.igds.protocol.beibo.grainv1.builder;
import com.ld.igds.protocol.beibo.grainv1.util.BeiboGrainServerUtils;
import com.ld.igds.util.BytesUtil;
/**
 * æ ¹æ®æŽ¥æ”¶åˆ°çš„信息进行封装
 *
 * @author czt
 */
public class ReMessageBuilder {
    private final static ReMessageBuilder instance = new ReMessageBuilder();
    private ReMessageBuilder() {
    }
    public static ReMessageBuilder getInstance() {
        return instance;
    }
    /**
     * @param strMsg
     * @return
     */
    public ReMessage buildMessage(String strMsg) {
        ReMessage message = new ReMessage();
        message.setStrMsg(strMsg);
        //设置起始符
        message.setStartStr(strMsg.substring(0, 9*2));
        //设置粮情分机地址
        String str = strMsg.substring(9*2, 10*2);
        int i = BytesUtil.hexToInt(str);
        str = String.valueOf(i - BeiboGrainServerUtils.BM);
        message.setSerId(str);
        //粮情数据
        str = strMsg.substring(10*2, 1034*2);
        message.setGrainStr(str);
        //温度数据
        str = strMsg.substring(1034*2, 1052*2);
        message.setThStr(str);
        //扩充数据
        str = strMsg.substring(1052*2, 1062*2);
        message.setExpand(str);
        //检验码
        str = strMsg.substring(1062*2);
        message.setHexCrc16(str);
        return message;
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/BeiboClientEngine.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
package com.ld.igds.protocol.beibo.grainv1.client;
import com.ld.igds.util.BytesUtil;
import com.ld.io.api.InvokeResult;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.oio.OioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.oio.OioSocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
/**
 * è´åšç²®æƒ…协议,分机为服务端,平台为客户端主动连接
 *
 * @author czt
 */
public class BeiboClientEngine implements Runnable {
    private final InternalLogger log = InternalLoggerFactory.getInstance(this.getClass());
    private String host;
    private int port;
    // public ChannelFuture channelFuture;
    public Channel channel;
    public BeiboClientEngine(String host, int port) {
        this.host = host;
        this.port = port;
    }
    public void start() {
        Thread thread = new Thread(this);
        thread.start();
    }
    @Override
    public void run() {
        try {
            startRun();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void startRun() throws Exception {
        EventLoopGroup group = new OioEventLoopGroup();
        Bootstrap b = new Bootstrap();
//        b.option(ChannelOption.SO_KEEPALIVE, true);
        b.group(group).channel(OioSocketChannel.class)
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch)
                            throws Exception {
                        ChannelPipeline p = ch.pipeline();
                        // å­—符串解码和编码
                        p.addLast("decoder", new ByteArrayDecoder());
                        p.addLast("encoder", new ByteArrayEncoder());
                        // è‡ªå·±çš„逻辑Handler
                        p.addLast("handler", new ClientHandler());
                    }
                });
        // å‘起异步连接请求,绑定连接端口和host信息
        ChannelFuture channelFuture = b.connect(host, port);
        this.channel = channelFuture.channel();
//         channelFuture.channel().closeFuture().sync();
        channelFuture.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture arg0) throws Exception {
                if (channelFuture.isSuccess()) {
                    log.info("连接服务器成功");
                } else {
                    log.info("连接服务器失败");
                    channelFuture.cause().printStackTrace();
                    group.shutdownGracefully(); // å…³é—­çº¿ç¨‹ç»„
                }
            }
        });
    }
    public InvokeResult send(byte[] array) throws InterruptedException {
        if (null == channel) {
            return InvokeResult.SOCKET_NOT_CREATE;
        }
        if (!channel.isActive()) {
            return InvokeResult.CHANNEL_CLOSED;
        }
        channel.writeAndFlush(Unpooled.copiedBuffer(array)).sync();
        return InvokeResult.SUCCESS;
    }
    public static void main(String[] args) {
        try {
            String msg = "000000000006010600070012";
            BeiboClientEngine test = new BeiboClientEngine(
                    "192.168.1.95", 9999);
            test.start();
            msg = "BB BB BB BB";
            // Thread.sleep(3000L);
            test.send(BytesUtil.hexStrToBytes(msg));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public Channel getChannel() {
        return channel;
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/ClientHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ld.igds.protocol.beibo.grainv1.client;
import com.ld.igds.protocol.beibo.grainv1.analysis.AnalysisService;
import com.ld.igds.util.BytesUtil;
import com.ld.igds.util.SpringUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
import java.net.InetSocketAddress;
/**
 * Handles a client-side channel.
 */
public class ClientHandler extends SimpleChannelInboundHandler<Object> {
    private AnalysisService analysisService;
    private final InternalLogger log = InternalLoggerFactory.getInstance(this.getClass());
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        InetSocketAddress insocket = (InetSocketAddress) ctx.channel()
                .remoteAddress();
        log.info("分机成功连接,IP={},port={}", insocket.getAddress()
                .getHostAddress(), insocket.getPort());
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
        InetSocketAddress insocket = (InetSocketAddress) ctx.channel()
                .remoteAddress();
        log.info("分机断开连接,IP={},port={}", insocket.getAddress(),insocket.getPort());
    }
    @Override
    public void channelRead0(ChannelHandlerContext ctx, Object msg)
            throws Exception {
        byte[] bytes = (byte[]) msg;
        String result = BytesUtil.bytesToString(bytes);
        log.info("分机返回信息=" + result);
//        InetSocketAddress insocket = (InetSocketAddress) ctx.channel().remoteAddress();
        //解析
        if (null == analysisService) {
            analysisService = (AnalysisService) SpringUtil.getBean(AnalysisService.BEAN_ID);
        }
//        analysisService.analysis(result);
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        ctx.close();
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/package-info.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
/**
 * è´åšç²®æƒ…协议-分机为服务端
 */
package com.ld.igds.protocol.beibo.grainv1;
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1HeartbeatImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ld.igds.protocol.beibo.grainv1.server;
import com.ld.io.api.HeartbeatProvider;
import com.ld.io.api.IoSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
 * æä¾›å¿ƒè·³ä¿¡æ¯
 *
 * @author czt
 */
@Slf4j
@Service
public class BeiboGrainV1HeartbeatImpl implements HeartbeatProvider {
    @Override
    public byte[] provide(IoSession session) {
        //直接根据主机SESSIOn判断
        IoSession session1 = BeiboGrainV1ServerUtils.getSession();
        Long lastBeatTime = BeiboGrainV1ServerUtils.getHearBeat(session1);
        if (null == lastBeatTime) {
            return null;
        }
        //如果最后一次终端心跳时间距离当前时间大于 ç»ˆç«¯å¿ƒè·³æ—¶é—´çš„3次,则判断为离线
        long deTime = System.currentTimeMillis() - lastBeatTime;
        if (deTime > (BeiboGrainV1ServerUtils.HEART_BEAT_TIME * 3 * 1000)) {
            log.info("-----------超过{}秒未获取到心跳信息,判定终端离线,踢出连接------------{}-{}", deTime, session.getAddress(), session.getPort());
            session.destroy();
        }
        return null;
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1MessageConsumer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ld.igds.protocol.beibo.grainv1.server;
import com.ld.igds.protocol.beibo.grainv1.analysis.AnalysisService;
import com.ld.igds.util.BytesUtil;
import com.ld.io.api.IoMsgConsumer;
import com.ld.io.api.IoSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 *
 */
@Slf4j
@Service
public class BeiboGrainV1MessageConsumer implements IoMsgConsumer {
    @Autowired
    private AnalysisService analysisService;
    /**
     * å¤„理消息
     *
     * @param ioSession
     * @param bytes
     */
    @Override
    public void consume(IoSession ioSession, byte[] bytes) {
        if (null == bytes) {
            log.error("Reply bytes is null");
            return;
        }
        //添加信息心跳标记
        BeiboGrainV1ServerUtils.addHeartBeat(ioSession);
        //默认设置主通讯服务
        BeiboGrainV1ServerUtils.addSession(ioSession);
        try {
            String hexStr = BytesUtil.bytesToString(bytes);
            log.info("主机返回报文------->>平台:" + hexStr);
            analysisService.analysis(ioSession.getAddress(), ioSession.getPort(), hexStr);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerEngine.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package com.ld.igds.protocol.beibo.grainv1.server;
import com.ld.igds.util.BytesUtil;
import com.ld.io.api.*;
import com.ld.io.netty.NettyServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @Desc: è´åšç²®æƒ…协议-串口服务器客户端
 * @author: czt
 * @update-time: 2023/09/27
 */
@Slf4j
@Service
public class BeiboGrainV1ServerEngine {
    public static final Integer PORT = 9311;
    @Autowired
    private BeiboGrainV1MessageConsumer defaultMessageConsumer;
    @Autowired
    private BeiboGrainV1SessionListener defaultSessionListener;
    // å¿ƒè·³æä¾›
    private static HeartbeatProvider heartbeatProvider = new BeiboGrainV1HeartbeatImpl();
    private IoSessionQuery sessionQuery;
    public void start(Integer port) {
        IoServerOption ioServerOption = new IoServerOption();
        if (null != port) {
            ioServerOption.setPort(port);
        } else {
            ioServerOption.setPort(PORT);
        }
        ioServerOption.setSplitDecoderType(SplitByteDecoderType.NO_LIMIT);
//        //确认结尾标志
//        ioServerOption.setDelimiter();
        // é…ç½®ç³»ç»Ÿå¿ƒè·³é—´éš”
        ioServerOption.setReaderIdleTime(5 * 60);
        NettyServer ioServer = new NettyServer(ioServerOption, defaultMessageConsumer, defaultSessionListener, heartbeatProvider);
        ioServer.startup();
        sessionQuery = ioServer.getSessionQuery();
        log.info("* ");
        log.info("* ========================");
        log.info("* ");
        log.info("* [GRAIN-SERVER:BEIBO_GRAIN,PORT={}]", PORT);
        log.info("* ");
        log.info("* ========================");
        log.info("* ");
        System.out.println("* ========================");
        System.out.println("* ");
        System.out.println("* [GRAIN-SERVER:BEIBO_GRAIN,PORT={}]" + port);
        System.out.println("* ");
        System.out.println("* ========================");
    }
    public IoSessionQuery getSessionQuery() {
        return sessionQuery;
    }
    /**
     * å‘送信息
     *
     * @param ip
     * @param port
     * @param msg
     * @return
     */
    public InvokeResult push(String ip, int port, byte[] msg) {
        IoSessionQuery sessionFactory = getSessionQuery();
        List<IoSession> sessions = sessionFactory.getAllSession();
        IoSession session = null;
        for (IoSession ioSession : sessions) {
            if (BeiboGrainV1ServerUtils.getServerKey(ip, port).equals(ioSession.getBusinessKey())) {
                session = ioSession;
                break;
            }
        }
        if (null == session) {
            return InvokeResult.CHANNEL_CLOSED;
        }
        return session.invoke(msg);
    }
    /**
     * ç›´æŽ¥ä½¿ç”¨å†…存的Session执行
     */
    public InvokeResult pushByMin(String hexStr) {
        IoSession session = BeiboGrainV1ServerUtils.getSession();
        if (null == session) {
            return InvokeResult.CHANNEL_CLOSED;
        }
        byte[] msg = BytesUtil.hexStrToBytes(hexStr);
        return session.invoke(msg);
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ld.igds.protocol.beibo.grainv1.server;
import com.ld.igds.util.BytesUtil;
import com.ld.io.api.IoSession;
import java.util.HashMap;
import java.util.Map;
/**
 * å·¥å…·ç±»
 *
 * @author vince
 */
public class BeiboGrainV1ServerUtils {
    /**
     * è®°å½•每个连接的最后一次信息时间 key = è¿žæŽ¥çš„KYE,data =当前时间戳
     */
    public static Map<String, Long> contextMapHeart = new HashMap<>();
    public static Map<String, IoSession> contextIoSession = new HashMap<>();
    public static int HEART_BEAT_TIME = 30;//心跳间隔时间
    /**
     * é’ˆå¯¹æ— çº¿ç²®æƒ…主机的默认ID配置
     */
    public static String DEFAULT_MAC_ID = "6550";
    /**
     * ç”ŸæˆTCP连接的KEY
     *
     * @param ip
     * @param port
     * @return
     */
    public static String getServerKey(String ip, Integer port) {
        return ip + ":" + port;
    }
    /**
     * æ·»åŠ æœ€æ–°å¿ƒè·³æ—¶é—´æˆ³
     *
     * @param session
     */
    public static void addHeartBeat(IoSession session) {
        contextMapHeart.put(getServerKey(session.getAddress(), session.getPort()), System.currentTimeMillis());
    }
    public static Long getHearBeat(IoSession session) {
        return contextMapHeart.get(getServerKey(session.getAddress(), session.getPort()));
    }
    public static void addSession(IoSession session) {
        contextIoSession.put(DEFAULT_MAC_ID, session);
    }
    public static IoSession getSession() {
        return contextIoSession.get(DEFAULT_MAC_ID);
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1SessionListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ld.igds.protocol.beibo.grainv1.server;
import com.ld.igds.common.CoreSerService;
import com.ld.igds.constant.Constant;
import com.ld.igds.models.DeviceSer;
import com.ld.igds.util.ContextUtil;
import com.ld.io.api.IoSession;
import com.ld.io.api.IoSessionListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 *
 */
@Slf4j
@Service
public class BeiboGrainV1SessionListener implements IoSessionListener {
    @Autowired
    private CoreSerService coreSerService;
    /**
     * è®¾å¤‡åˆ›å»ºåœ¨çº¿ï¼Œéœ€è¦æ³¨æ„å½“前使用主机模式,主机上线默认所有相同SN配置的分机全部上线
     *
     * @param session
     */
    @Override
    public void onCreate(IoSession session) {
        //添加到内存
        BeiboGrainV1ServerUtils.addSession(session);
        log.info("++++新建连接++++-IP={},PORT={}", session.getAddress(), session.getPort());
        // æ·»åŠ è‡ªå®šä¹‰ä¸šåŠ¡ID
        session.setBusinessKey(BeiboGrainV1ServerUtils.getServerKey(session.getAddress(), session.getPort()));
        //项目采用无线主机模式,直接获取默认设备
        DeviceSer deviceSer = coreSerService.getCacheSerBySn(ContextUtil.getDefaultCompanyId(), BeiboGrainV1ServerUtils.DEFAULT_MAC_ID);
        if (null == deviceSer) return;
        coreSerService.onlineBySn(session.getAddress(), session.getPort(), deviceSer.getSn(), Constant.YN_Y);
        //更新缓存
        coreSerService.refreshCache(deviceSer.getCompanyId());
    }
    /**
     * æ³¨æ„ï¼Œå½“前采用主机模式,主机离线所有相同SN配置的分机全部离线
     *
     * @param session
     */
    @Override
    public void onDestroy(IoSession session) {
        log.info("----连接断开-----IP={},PORT={}", session.getAddress(), session.getPort());
        //项目采用无线主机模式,直接获取默认设备
        DeviceSer deviceSer = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), BeiboGrainV1ServerUtils.DEFAULT_MAC_ID);
        if (null == deviceSer) return;
    }
}
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/util/BeiboGrainServerUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ld.igds.protocol.beibo.grainv1.util;
/**
 * å·¥å…·ç±»
 *
 * @author czt
 */
public class BeiboGrainServerUtils {
    public static String MSG_START = "00000000FFEB90FEAA"; //起始符
    public static String MSG_END = "00000000000000000000000000"; //结尾符
    public static int BM = 64; //结尾符
}
igds-protocol-es/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ld.igds</groupId>
    <artifactId>igds-protocol-es</artifactId>
    <version>4.0.0-RELEASE</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <igds.version>4.0.0-RELEASE</igds.version>
    </properties>
    <dependencies>
        <!-- å¼•入义务核心包 -->
        <dependency>
            <groupId>com.ld.igds</groupId>
            <artifactId>igds-core</artifactId>
            <version>${igds.version}</version>
        </dependency>
        <!-- å¼•入能耗包 -->
        <dependency>
            <groupId>com.ld.igds</groupId>
            <artifactId>igds-es</artifactId>
            <version>${igds.version}</version>
        </dependency>
        <!-- å¼•å…¥IO包 -->
        <dependency>
            <groupId>com.ld.base.io</groupId>
            <artifactId>base-io-netty</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArguments>
                        <extdirs>src\main\webapp\WEB-INF\lib</extdirs>
                    </compilerArguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ld.igds.protocol.es.dlt645;
import com.ld.igds.constant.RedisConst;
import com.ld.igds.io.RemoteEsService;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.constant.ProtocolEnum;
import com.ld.igds.io.request.BaseRequest;
import com.ld.igds.io.response.BaseResponse;
import com.ld.igds.io.response.GrainResponse;
import com.ld.igds.protocol.es.dlt645.builder.CommandBuild;
import com.ld.igds.protocol.es.dlt645.client.Dlt645ClientEngine;
import com.ld.igds.util.BytesUtil;
import com.ld.igds.util.RedisUtil;
import com.ld.io.api.InvokeResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * å½“前协议实现,能耗协议
 *
 * @author czt
 */
@Slf4j
@Component(RemoteEsServiceImpl.BEAN_ID)
public class RemoteEsServiceImpl implements RemoteEsService {
    public static final String BEAN_ID = "dlt645.remoteEsServiceImpl";
    @Autowired
    private RedisUtil redisUtil;
    @Override
    public String getProtocol() {
        return ProtocolEnum.TCP_ES_DLT645_V1.getCode();
    }
    @Override
    public BaseResponse checkEs(BaseRequest request) {
        try {
            log.info("DL/T645多功能电表分机开始检测,分机{}的IP={},端口={}",request.getSerId(),request.getIp(),request.getPort());
            Dlt645ClientEngine clientEngine = new Dlt645ClientEngine(request.getIp(), request.getPort());
            clientEngine.start();
            Thread.sleep(1000);
            //采集命令存入缓存,解析时分辨是哪个仓的能耗,时效5分钟
            String key = RedisConst.buildKey(request.getCompanyId(), "ES-DLT645", request.getSerId());
            redisUtil.set(key, request.getDepotId(), 60*5);
            //生成命令-查询总电能的命令
            String hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId());
            InvokeResult result = clientEngine.send(BytesUtil.hexStrToBytes(hexStr));
            log.info("result=" +result.getMessage());
            // å°è£…返回信息
            if (InvokeResult.SUCCESS == result) {
                return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
                        "能耗命令发送成功!");
            } else {
                log.error("平台------>>>>能耗分机:能耗检测-失败{}", result.getMessage());
                return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                        "命令发送异常:" + result.getMessage());
            }
        } catch (Exception e) {
            log.error("能耗检测异常:{}", e);
            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后端异常:" + e.getMessage());
        }
    }
}
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.ld.igds.protocol.es.dlt645.analysis;
import com.ld.igds.common.CoreSerService;
import com.ld.igds.constant.RedisConst;
import com.ld.igds.es.dto.EsData;
import com.ld.igds.es.service.CoreEsService;
import com.ld.igds.models.DeviceSer;
import com.ld.igds.protocol.es.dlt645.util.Dlt645Utils;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
 * DLT645电表协议解析
 *
 * @author czt
 */
@Slf4j
@Component(AnalysisService.BEAN_ID)
public class AnalysisService {
    public static final String BEAN_ID = "dlt645.analysisService";
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private CoreSerService coreSerService;
    @Autowired
    private CoreEsService esService;
    /**
     *
     * @param result
     */
    public void analysis(String result){
        log.info("能耗分机------->>平台:信息报文={}", result);
        if(!result.startsWith(Dlt645Utils.MSG_START)){
            log.error("能耗分机------->>平台,解析能耗失败:报文起始符错误,不解析");
            return;
        }
        //去除起始符
        result = result.substring(8);
        //获取校验位
        String oldCheck = result.substring(result.length() - 4, result.length() - 2);
        String check = Dlt645Utils.makeCheck(result.substring(0, result.length() - 4));
        if(!check.equals(oldCheck)){
            log.error("能耗分机------->>平台,解析能耗失败:校验位不对,不解析");
            return;
        }
        analysisGrain(result);
    }
    private void analysisGrain(String result) {
        try {
            //获取能耗分机地址
            String serId = Dlt645Utils.addrToString(result.substring(2, 14));
            //根据分机地址获取分机信息
            DeviceSer ser = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), serId);
            if (ser == null) {
                log.error("能耗分机-------->>平台,解析能耗失败,未获取到系统能耗主机配置:" + serId);
                return;
            }
            String key = RedisConst.buildKey(ser.getCompanyId(), "ES-DLT645", ser.getId());
            String depotId = (String) redisUtil.get(key);
            if(null == depotId){
                log.error("能耗分机-------->>平台,解析能耗失败,未获取到仓库信息:" + depotId);
                return;
            }
            //解析总能耗数据
            String dataStr = result.substring(28, 36);
            Double esNum = Dlt645Utils.parseData(dataStr);
            EsData esData = new EsData();
            esData.setDeviceName("电表");
            esData.setCompanyId(ser.getCompanyId());
            esData.setDepotId(depotId);
            esData.setUpdateTime(new Date());
            esData.setEp(esNum);
            esData.setEs(esNum);
            log.info("DLT645电表----->>>平台:能耗数据解析完成-仓库={}", esData.getDepotId());
            esService.saveAndUpdateInc(esData);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }
}
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ld.igds.protocol.es.dlt645.builder;
import com.ld.igds.protocol.es.dlt645.util.Dlt645Utils;
/**
 * ç”µè¡¨å‘½ä»¤ç”Ÿæˆ
 *
 * @author czt
 */
public class CommandBuild {
    private final static CommandBuild instance = new CommandBuild();
    private CommandBuild() {
    }
    public static CommandBuild getInstance() {
        return instance;
    }
    /**
     * èƒ½è€—采集命令
     *
     * @param esAddr ç”µè¡¨åœ°å€
     * @return
     */
    public static String getMsgCheck(String esAddr) {
        //获取命令
        StringBuffer sb = new StringBuffer();
        //帧起始符
        sb.append("68");
        //地域域,反向拼接
        sb.append(Dlt645Utils.addrToString(esAddr));
        //帧起始符
        sb.append("68");
        //控制码及
        sb.append("11");
        //数据域长度
        sb.append("04");
        //数据域
        sb.append("33333433");
        //校验码
        String checkNum = Dlt645Utils.makeCheck(sb.toString());
        sb.append(checkNum);
        StringBuffer sb0 = new StringBuffer();
        //起始符
        sb0.append(Dlt645Utils.MSG_START);
        sb0.append(sb);
        //结尾符
        sb0.append(Dlt645Utils.MSG_END);
        return sb0.toString();
    }
}
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ld.igds.protocol.es.dlt645.client;
import com.ld.igds.protocol.es.dlt645.analysis.AnalysisService;
import com.ld.igds.util.BytesUtil;
import com.ld.igds.util.SpringUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
import java.net.InetSocketAddress;
/**
 * Handles a client-side channel.
 */
public class ClientHandler extends SimpleChannelInboundHandler<Object> {
    private AnalysisService analysisService;
    private final InternalLogger log = InternalLoggerFactory.getInstance(this.getClass());
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        InetSocketAddress insocket = (InetSocketAddress) ctx.channel()
                .remoteAddress();
        log.info("电表服务器成功连接,IP={},port={}", insocket.getAddress()
                .getHostAddress(), insocket.getPort());
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
        InetSocketAddress insocket = (InetSocketAddress) ctx.channel()
                .remoteAddress();
        log.info("电表服务器断开连接,IP={},port={}", insocket.getAddress(),insocket.getPort());
    }
    @Override
    public void channelRead0(ChannelHandlerContext ctx, Object msg)
            throws Exception {
        byte[] bytes = (byte[]) msg;
        String result = BytesUtil.bytesToString(bytes);
        log.info("电表服务器分机返回信息=" + result);
//        InetSocketAddress insocket = (InetSocketAddress) ctx.channel().remoteAddress();
        //解析
        //调用解析接口开始解析
        if (null == analysisService) {
            analysisService = (AnalysisService) SpringUtil.getBean(AnalysisService.BEAN_ID);
        }
        analysisService.analysis(result);
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        ctx.close();
    }
}
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.ld.igds.protocol.es.dlt645.client;
import com.ld.io.api.InvokeResult;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.oio.OioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.oio.OioSocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import lombok.extern.slf4j.Slf4j;
/**
 * DL/T 645-2007多功能电表
 *
 * @author czt
 */
@Slf4j
public class Dlt645ClientEngine implements Runnable {
    private String host;
    private int port;
    public Channel channel;
    public Dlt645ClientEngine(String host, int port) {
        this.host = host;
        this.port = port;
    }
    public void start() {
        Thread thread = new Thread(this);
        thread.start();
    }
    @Override
    public void run() {
        try {
            startRun();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void startRun() throws Exception {
        EventLoopGroup group = new OioEventLoopGroup();
        Bootstrap b = new Bootstrap();
        // b.option(ChannelOption.SO_KEEPALIVE, true);
        b.group(group).channel(OioSocketChannel.class)
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch)
                            throws Exception {
                        ChannelPipeline p = ch.pipeline();
                        // å­—符串解码 å’Œ ç¼–码
                        p.addLast("decoder", new ByteArrayDecoder());
                        p.addLast("encoder", new ByteArrayEncoder());
                        // è‡ªå·±çš„逻辑Handler
                        p.addLast("handler", new ClientHandler());
                    }
                });
        // å‘起异步连接请求,绑定连接端口和host信息
        ChannelFuture channelFuture = b.connect(host, port);
        this.channel = channelFuture.channel();
        // channelFuture.channel().closeFuture().sync();
        channelFuture.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture arg0) throws Exception {
                if (channelFuture.isSuccess()) {
                    log.info("-----连接电表服务器成功,IP={},PORT={}", host, port);
                } else {
                    log.info("-----连接电表服务器失败,IP={},PORT={}", host, port);
                    channelFuture.cause().printStackTrace();
                    group.shutdownGracefully(); // å…³é—­çº¿ç¨‹ç»„
                }
            }
        });
    }
    public InvokeResult send(byte[] array) throws InterruptedException {
        if (null == channel) {
            return InvokeResult.SOCKET_NOT_CREATE;
        }
        if (!channel.isActive()) {
            return InvokeResult.CHANNEL_CLOSED;
        }
        channel.writeAndFlush(Unpooled.copiedBuffer(array)).sync();
        return InvokeResult.SUCCESS;
    }
    public Channel getChannel() {
        return channel;
    }
}
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
/**
 * @Desc: DL/T 645多功能电表
 * @author: czt
 */
package com.ld.igds.protocol.bhzn;
igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ld.igds.protocol.es.dlt645.util;
/**
 * å·¥å…·ç±»
 *
 * @author czt
 */
public class Dlt645Utils {
    public static String MSG_START = "FEFEFEFE"; //起始符
    public static String MSG_END = "16"; //结尾符
    public static void main(String[] args) {
        String s = makeCheck("6857141222000068110433333433");
        System.out.println(s);
    }
    /**
     * å°†6个字节的地址域,每字节2位 BCD码,转换为12位10进制数
     */
    public static String addrToString(String str) {
        byte[] bytes = stringToBytes(str);
        return String.format("%02x%02x%02x%02x%02x%02x", bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]);
    }
    /**
     * DLT645校验码
     */
    public static String makeCheck(String data) {
        if (data == null || data.equals("")) {
            return "";
        }
        int total = 0;
        int len = data.length();
        int num = 0;
        while (num < len) {
            String s = data.substring(num, num + 2);
            total += Integer.parseInt(s, 16);
            num = num + 2;
        }
        /**
         * ç”¨256求余最大是255,即16进制的FF
         */
        int mod = total % 256;
        String hex = Integer.toHexString(mod);
        len = hex.length();
        // å¦‚果不够校验位的长度,补0,这里用的是两位校验
        if (len < 2) {
            hex = "0" + hex;
        }
        return hex.toUpperCase();
    }
    /**
     * å°†String类型转换成byte数组
     */
    public static byte[] stringToBytes(String str) {
        if (str == null || str.equals("")) {
            return null;
        }
        byte[] bytes = new byte[str.length() / 2];
        for (int i = 0; i < bytes.length; i++) {
            String subStr = str.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(subStr, 16);
        }
        return bytes;
    }
    /**
     * è§£æžè¿”回的具体数据
     */
    public static Double parseData(String dataStr) {
        byte[] data = stringToBytes(dataStr);
        // æ¯ä¸ªå­—节-33H处理
        for (int i = 0; i < data.length; i++) {
            data[i] = (byte) (data[i] - 0x33);
        }
        StringBuilder str = new StringBuilder();
        // BCD码转换成10进制
        for (byte b : data) {
            str.insert(0, String.format("%02x", b));
        }
        return Double.parseDouble(str.toString()) * 0.01;
    }
}
igds-protocol-zldz/.rules
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1178 @@
<?xml version="1.0" encoding="UTF-8"?>
<RuleSet version="1.1"><PackageInfos>
<PackageInfo name="dorado-core" version="7.6.0.2.190128.1750"/>
<PackageInfo name="bdf2-orm" version="2.1.0"/>
<PackageInfo name="bdf2-core" version="2.0.9"/>
<PackageInfo name="dorado-uploader" version="1.0.20-SNAPSHOT"/>
<PackageInfo name="bdf2-job" version="2.0.5-SNAPSHOT"/>
<PackageInfo name="dorado-intro" version="0.2.1.140715.2255"/>
<PackageInfo name="bdf2-swfviewer" version="2.0.6-SNAPSHOT"/>
<PackageInfo name="bdf2-export" version="2.0.8"/>
<PackageInfo name="dorado-vidor"/></PackageInfos><Rule name="Auxiliary"><Children><Child rule="Import" name="Import"></Child><Child rule="GroupStart" name="GroupStart"></Child><Child rule="GroupEnd" name="GroupEnd"></Child><Child rule="PlaceHolder" name="PlaceHolder"></Child><Child rule="PlaceHolderStart" name="PlaceHolderStart"></Child><Child rule="PlaceHolderEnd" name="PlaceHolderEnd"></Child></Children></Rule><Rule name="Import" scope="public" sortFactor="9001" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/Import.png"><PrimitiveProps>
<Prop name="id"/>
<Prop name="src"/></PrimitiveProps></Rule><Rule name="GroupStart" scope="public" sortFactor="9002" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/GroupStart.png"><PrimitiveProps>
<Prop name="id"/></PrimitiveProps></Rule><Rule name="GroupEnd" scope="public" sortFactor="9003" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/GroupEnd.png"></Rule><Rule name="PlaceHolder" scope="public" sortFactor="9004" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/PlaceHolder.png"><PrimitiveProps>
<Prop name="id"/></PrimitiveProps></Rule><Rule name="PlaceHolderStart" parents="PlaceHolder" scope="public" sortFactor="9005" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/PlaceHolderStart.png"></Rule><Rule name="PlaceHolderEnd" scope="public" sortFactor="9006" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/PlaceHolderEnd.png"></Rule><Rule name="Model" icon="/com/bstek/dorado/view/manager/Model.png"><Children><Child rule="AbstractDataType" name="DataType" aggregated="true"></Child><Child rule="AbstractDataProvider" name="DataProvider" aggregated="true"></Child><Child rule="AbstractDataResolver" name="DataResolver" aggregated="true"></Child></Children></Rule><Rule name="AbstractDataType" abstract="true" nodeName="DataType" type="com.bstek.dorado.data.type.AbstractDataType"><PrimitiveProps>
<Prop name="name"/></PrimitiveProps><Props>
<Prop name="creationType" type="java.lang.Class"/>
<Prop name="matchType" type="java.lang.Class"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="tags"/></Props></Rule><Rule name="AbstractDataProvider" abstract="true" nodeName="DataProvider" type="com.bstek.dorado.data.provider.AbstractDataProvider"><PrimitiveProps>
<Prop name="impl"/>
<Prop name="parent"/>
<Prop name="scope" enumValues="instant,thread,singleton,session,request"/>
<Prop name="listener"/>
<Prop name="overwrite" type="boolean"/>
<Prop name="name"/></PrimitiveProps><Props>
<Prop name="interceptor"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="parameter" editor="pojo" type="java.lang.Object"/></Props></Rule><Rule name="AbstractDataResolver" abstract="true" nodeName="DataResolver" type="com.bstek.dorado.data.resolver.AbstractDataResolver"><PrimitiveProps>
<Prop name="impl"/>
<Prop name="parent"/>
<Prop name="scope" enumValues="instant,thread,singleton,session,request"/>
<Prop name="listener"/>
<Prop name="overwrite" type="boolean"/>
<Prop name="name"/></PrimitiveProps><Props>
<Prop name="interceptor"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="parameter" type="java.lang.Object"/></Props></Rule><Rule name="ViewConfig" label="ViewConfig" type="com.bstek.dorado.view.manager.ViewConfig" icon="/com/bstek/dorado/view/manager/ViewConfig.png"><PrimitiveProps>
<Prop name="listener"/>
<Prop name="template"/></PrimitiveProps><Props><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="scope" defaultValue="thread" enumValues="instant,thread,singleton,session,request"/></Props><Children><Child name="Arguments"><Rule name="Arguments" nodeName="Arguments" icon="/com/bstek/dorado/view/manager/Arguments.png"><Children><Child name="Argument" aggregated="true"><Rule name="Argument" nodeName="Argument" icon="/com/bstek/dorado/view/manager/Argument.png"><PrimitiveProps>
<Prop name="name"/></PrimitiveProps><Props>
<Prop name="value" type="java.lang.Object"/></Props></Rule></Child></Children></Rule></Child><Child name="Context"><Rule name="Context" nodeName="Context" icon="/com/bstek/dorado/view/manager/ViewContext.png"><Children><Child name="Attribute" aggregated="true"><Rule name="Attribute" nodeName="Attribute" icon="/com/bstek/dorado/view/manager/Attribute.png"><PrimitiveProps>
<Prop name="name"/></PrimitiveProps><Props>
<Prop name="value" type="java.lang.Object"/></Props></Rule></Child></Children></Rule></Child><Child rule="Model" name="Model"></Child><Child rule="View" name="View"></Child></Children></Rule><Rule name="LayoutHolder"><Children><Child rule="AnchorLayout" name="anchor"></Child><Child rule="DockLayout" name="dock"></Child><Child rule="HboxLayout" name="hbox"></Child><Child rule="VboxLayout" name="vbox"></Child><Child rule="FormLayout" name="form"></Child><Child rule="NativeLayout" name="native"></Child></Children></Rule><Rule name="View" parents="Container" abstract="true" type="com.bstek.dorado.view.View" scope="private" clientTypes="desktop"><PrimitiveProps>
<Prop name="listener"/></PrimitiveProps><Props><Prop name="cache" type="com.bstek.dorado.view.ViewCache" compositeType="Fixed">
<Prop name="maxAge" type="long"/>
<Prop name="mode" enumValues="none,clientSide"/></Prop>
<Prop name="javaScriptFile"/>
<Prop name="packages"/>
<Prop name="pageTemplate"/>
<Prop name="pageUri"/>
<Prop name="renderMode" defaultValue="onCreate" enumValues="onCreate,onDataLoaded,manual"/>
<Prop name="skin"/>
<Prop name="styleSheetFile"/>
<Prop name="title" highlight="1"/></Props><ClientEvents>
<ClientEvent name="onLoadData" parameters="self,arg"/>
<ClientEvent name="onComponentRegistered" parameters="self,arg"/>
<ClientEvent name="onComponentUnregistered" parameters="self,arg"/></ClientEvents><Children><Child rule="Component" name="Children" aggregated="true"></Child></Children></Rule><Rule name="DataType" parents="EntityDataTypeSupport" label="DataType" type="com.bstek.dorado.data.type.DefaultEntityDataType" scope="public" sortFactor="1" robots="datatype-reflection|自动创建PropertyDefs" icon="/com/bstek/dorado/data/type/DefaultEntityDataType.png" reserve="default"><Children><Child rule="Reference" name="Reference" aggregated="true"></Child><Child rule="BasePropertyDef" name="PropertyDef" aggregated="true"></Child></Children></Rule><Rule name="NonAggregationDataType" parents="AbstractDataType" abstract="true" type="com.bstek.dorado.data.type.NonAggregationDataType"></Rule><Rule name="EntityDataTypeSupport" parents="NonAggregationDataType" abstract="true" nodeName="DataType" type="com.bstek.dorado.data.type.EntityDataTypeSupport"><PrimitiveProps>
<Prop name="impl"/>
<Prop name="parent"/>
<Prop name="listener"/>
<Prop name="overwrite" type="boolean"/></PrimitiveProps><Props>
<Prop name="cachable" type="java.lang.Boolean"/>
<Prop name="acceptUnknownProperty" type="boolean"/>
<Prop name="acceptValidationState" defaultValue="ok" enumValues="info,ok,warn,error"/>
<Prop name="autoCreatePropertyDefs" type="boolean"/>
<Prop name="defaultDisplayProperty"/>
<Prop name="userData" editor="any" type="java.lang.Object"/></Props><ClientEvents>
<ClientEvent name="onEntityToText" parameters="self,arg"/>
<ClientEvent name="onAttributeChange" parameters="self,arg"/>
<ClientEvent name="beforeInsert" parameters="self,arg"/>
<ClientEvent name="beforeDataChange" parameters="self,arg"/>
<ClientEvent name="onDataChange" parameters="self,arg"/>
<ClientEvent name="beforeCurrentChange" parameters="self,arg"/>
<ClientEvent name="onCurrentChange" parameters="self,arg"/>
<ClientEvent name="beforeStateChange" parameters="self,arg"/>
<ClientEvent name="beforeRemove" parameters="self,arg"/>
<ClientEvent name="onMessageChange" parameters="self,arg"/>
<ClientEvent name="onStateChange" parameters="self,arg"/>
<ClientEvent name="onRemove" parameters="self,arg"/>
<ClientEvent name="onEntityLoad" parameters="self,arg"/>
<ClientEvent name="onInsert" parameters="self,arg"/></ClientEvents></Rule><Rule name="Reference" parents="LazyPropertyDef" label="Reference" type="com.bstek.dorado.data.type.property.Reference" scope="protected" icon="/com/bstek/dorado/data/type/property/Reference.png"><Props>
<Prop name="activeOnNewEntity" type="boolean"/>
<Prop name="dataProvider" highlight="1" type="com.bstek.dorado.data.provider.DataProvider"/>
<Prop name="pageSize" type="int"/>
<Prop name="parameter" highlight="1" editor="pojo" type="java.lang.Object"/></Props><ClientEvents>
<ClientEvent name="beforeLoadData" parameters="self,arg"/>
<ClientEvent name="onLoadData" parameters="self,arg"/></ClientEvents></Rule><Rule name="PropertyDef" abstract="true" type="com.bstek.dorado.data.type.property.PropertyDef"><PrimitiveProps>
<Prop name="name"/></PrimitiveProps><Props>
<Prop name="acceptUnknownMapKey" type="boolean"/>
<Prop name="dataType" highlight="1" type="com.bstek.dorado.data.type.DataType"/>
<Prop name="defaultValue" type="java.lang.Object"/>
<Prop name="displayFormat"/>
<Prop name="ignored" type="boolean"/>
<Prop name="label" highlight="1"/><Prop name="mapping" type="com.bstek.dorado.data.type.property.Mapping" compositeType="Fixed">
<Prop name="keyProperty"/>
<Prop name="mapValues" editor="collection[pojo]" type="java.lang.Object"/>
<Prop name="valueProperty"/></Prop><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="readOnly" type="boolean"/>
<Prop name="required" type="boolean"/>
<Prop name="submittable" defaultValue="true" type="boolean"/>
<Prop name="tags"/>
<Prop name="userData" editor="any" type="java.lang.Object"/>
<Prop name="visible" defaultValue="true" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onGet" parameters="self,arg"/>
<ClientEvent name="onSet" parameters="self,arg"/>
<ClientEvent name="onValidate" parameters="self,arg"/>
<ClientEvent name="onGetText" parameters="self,arg"/></ClientEvents><Children><Child rule="Validator" name="Validators" aggregated="true"></Child></Children></Rule><Rule name="Validator" abstract="true" nodeName="Validator" type="com.bstek.dorado.data.type.validator.Validator" icon="/com/bstek/dorado/view/type/property/validator/Validator.png"><PrimitiveProps>
<Prop name="name"/></PrimitiveProps></Rule><Rule name="BasePropertyDef" parents="PropertyDefSupport" label="PropertyDef" nodeName="PropertyDef" type="com.bstek.dorado.data.type.property.BasePropertyDef" icon="/com/bstek/dorado/data/type/property/BasePropertyDef.png"><Props>
<Prop name="propertyPath"/></Props></Rule><Rule name="PropertyDefSupport" parents="PropertyDef" abstract="true" type="com.bstek.dorado.data.type.property.PropertyDefSupport"></Rule><Rule name="com.bstek.dorado.data.type.property.PropertyDefSupport" parents="PropertyDef" abstract="true" type="com.bstek.dorado.data.type.property.PropertyDefSupport"></Rule><Rule name="LazyPropertyDef" parents="PropertyDefSupport" abstract="true" type="com.bstek.dorado.data.type.property.LazyPropertyDef"><Props>
<Prop name="activeAtClient" defaultValue="true" type="boolean"/>
<Prop name="cacheMode" enumValues="noCache,serverSide,clientSide,bothSides"/></Props></Rule><Rule name="DirectDataProvider" parents="AbstractDataProvider" label="DirectDataProvider" type="com.bstek.dorado.data.provider.DirectDataProvider" scope="public" sortFactor="2" icon="/com/bstek/dorado/data/provider/DirectDataProvider.png" reserve="direct"><PrimitiveProps>
<Prop name="type" defaultValue="direct" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="result" editor="pojo" type="java.lang.Object"/></Props></Rule><Rule name="DirectDataResolver" parents="AbstractDataResolver" label="DirectDataResolver" type="com.bstek.dorado.data.resolver.DirectDataResolver" scope="public" sortFactor="3" icon="/com/bstek/dorado/data/resolver/DirectDataResolver.png" reserve="direct"><PrimitiveProps>
<Prop name="type" defaultValue="direct" fixed="true" visible="false"/></PrimitiveProps></Rule><Rule name="AbstractValidator" parents="Validator" abstract="true" nodeName="Validator" type="com.bstek.dorado.view.type.property.validator.AbstractValidator" icon="/com/bstek/dorado/view/type/property/validator/Validator.png"><Props>
<Prop name="name"/>
<Prop name="defaultResultState" defaultValue="error" enumValues="info,ok,warn,error"/>
<Prop name="revalidateOldValue" defaultValue="true" type="boolean"/>
<Prop name="runAt" enumValues="server,client,both"/></Props></Rule><Rule name="RequiredValidator" parents="BaseValidator" label="RequiredValidator" type="com.bstek.dorado.view.type.property.validator.RequiredValidator" scope="public" sortFactor="4" reserve="required"><PrimitiveProps>
<Prop name="type" defaultValue="required" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="acceptZeroOrFalse" type="boolean"/>
<Prop name="trimBeforeValid" defaultValue="true" type="boolean"/></Props></Rule><Rule name="BaseValidator" parents="AbstractValidator" abstract="true" type="com.bstek.dorado.view.type.property.validator.BaseValidator"><Props>
<Prop name="resultMessage"/></Props></Rule><Rule name="LengthValidator" parents="BaseValidator" label="LengthValidator" type="com.bstek.dorado.view.type.property.validator.LengthValidator" scope="public" sortFactor="5" reserve="length"><PrimitiveProps>
<Prop name="type" defaultValue="length" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="maxLength" defaultValue="-1" type="int"/>
<Prop name="minLength" defaultValue="-1" type="int"/></Props></Rule><Rule name="CharLengthValidator" parents="BaseValidator" label="CharLengthValidator" type="com.bstek.dorado.view.type.property.validator.CharLengthValidator" scope="public" sortFactor="6" reserve="charLength"><PrimitiveProps>
<Prop name="type" defaultValue="charLength" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="maxLength" type="int"/>
<Prop name="minLength" type="int"/></Props></Rule><Rule name="RangeValidator" parents="BaseValidator" label="RangeValidator" type="com.bstek.dorado.view.type.property.validator.RangeValidator" scope="public" sortFactor="7" reserve="range"><PrimitiveProps>
<Prop name="type" defaultValue="range" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="maxValue" defaultValue="-1" type="double"/>
<Prop name="maxValueValidateMode" defaultValue="ignore" enumValues="allowEquals,notAllowEquals,ignore"/>
<Prop name="minValue" defaultValue="-1" type="double"/>
<Prop name="minValueValidateMode" defaultValue="ignore" enumValues="allowEquals,notAllowEquals,ignore"/></Props></Rule><Rule name="EnumValidator" parents="BaseValidator" label="EnumValidator" type="com.bstek.dorado.view.type.property.validator.EnumValidator" scope="public" sortFactor="8" reserve="enum"><PrimitiveProps>
<Prop name="type" defaultValue="enum" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="enumValues" highlight="1" editor="collection[value]" type="java.util.List"/></Props></Rule><Rule name="RegExpValidator" parents="BaseValidator" label="RegExpValidator" type="com.bstek.dorado.view.type.property.validator.RegExpValidator" scope="public" sortFactor="9" reserve="regExp"><PrimitiveProps>
<Prop name="type" defaultValue="regExp" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="blackRegExp"/>
<Prop name="validateMode" enumValues="whiteBlack,blackWhite"/>
<Prop name="whiteRegExp"/></Props></Rule><Rule name="AjaxValidator" parents="AbstractAjaxValidator" label="AjaxValidator" type="com.bstek.dorado.view.type.property.validator.AjaxValidator" scope="public" sortFactor="10" reserve="ajax"><PrimitiveProps>
<Prop name="type" defaultValue="ajax" fixed="true" visible="false"/></PrimitiveProps><Props>
<Prop name="ajaxAction" reference="AjaxAction:id"/>
<Prop name="service" highlight="1"/></Props><ClientEvents>
<ClientEvent name="beforeExecute" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractAjaxValidator" parents="AbstractValidator" abstract="true" type="com.bstek.dorado.view.type.property.validator.AbstractAjaxValidator"><Props>
<Prop name="async" defaultValue="true" type="boolean"/>
<Prop name="executingMessage"/></Props></Rule><Rule name="CustomValidator" parents="AbstractValidator" label="CustomValidator" type="com.bstek.dorado.view.type.property.validator.CustomValidator" scope="public" sortFactor="11" reserve="custom"><PrimitiveProps>
<Prop name="type" defaultValue="custom" fixed="true" visible="false"/></PrimitiveProps><ClientEvents>
<ClientEvent name="onValidate" parameters="self,arg"/></ClientEvents></Rule><Rule name="AnchorLayout" parents="Layout" label="AnchorLayout" nodeName="anchor" type="com.bstek.dorado.view.widget.layout.AnchorLayout" sortFactor="1001"></Rule><Rule name="Layout" abstract="true" type="com.bstek.dorado.view.widget.layout.Layout"><Props>
<Prop name="className"/>
<Prop name="padding" type="int"/></Props></Rule><Rule name="AnchorLayoutConstraint" parents="LayoutConstraintSupport" label="AnchorLayoutConstraint" type="com.bstek.dorado.view.widget.layout.AnchorLayoutConstraint"><Props>
<Prop name="anchorBottom" enumValues="auto,none,container,previous"/>
<Prop name="anchorLeft" enumValues="auto,none,container,previous"/>
<Prop name="anchorRight" enumValues="auto,none,container,previous"/>
<Prop name="anchorTop" enumValues="auto,none,container,previous"/>
<Prop name="bottom"/>
<Prop name="heightOffset" type="int"/>
<Prop name="left"/>
<Prop name="leftOffset" type="int"/>
<Prop name="right"/>
<Prop name="top"/>
<Prop name="topOffset" type="int"/>
<Prop name="widthOffset" type="int"/></Props></Rule><Rule name="LayoutConstraintSupport" abstract="true" type="com.bstek.dorado.view.widget.layout.LayoutConstraintSupport"><Props>
<Prop name="padding" type="int"/></Props></Rule><Rule name="DockLayout" parents="Layout" label="DockLayout" nodeName="dock" type="com.bstek.dorado.view.widget.layout.DockLayout" sortFactor="1002"><Props>
<Prop name="regionPadding" type="int"/></Props></Rule><Rule name="DockLayoutConstraint" parents="LayoutConstraintSupport" label="DockLayoutConstraint" type="com.bstek.dorado.view.widget.layout.DockLayoutConstraint"><Props>
<Prop name="type" highlight="1" enumValues="left,top,right,bottom,center"/></Props></Rule><Rule name="HboxLayout" parents="AbstractBoxLayout" label="HBoxLayout" nodeName="hbox" type="com.bstek.dorado.view.widget.layout.HBoxLayout" sortFactor="1003"><Props>
<Prop name="align" defaultValue="center" enumValues="top,center,bottom"/></Props></Rule><Rule name="AbstractBoxLayout" parents="Layout" abstract="true" type="com.bstek.dorado.view.widget.layout.AbstractBoxLayout"><Props>
<Prop name="pack" defaultValue="start" enumValues="start,center,end"/>
<Prop name="padding" defaultValue="2" type="int"/>
<Prop name="regionPadding" defaultValue="2" type="int"/>
<Prop name="stretch" defaultValue="true" type="boolean"/></Props></Rule><Rule name="HboxLayoutConstraint" parents="LayoutConstraintSupport" label="HBoxLayoutConstraintSupport" type="com.bstek.dorado.view.widget.layout.HBoxLayoutConstraintSupport"><Props>
<Prop name="align" defaultValue="center" enumValues="top,center,bottom"/></Props></Rule><Rule name="VboxLayout" parents="AbstractBoxLayout" label="VBoxLayout" nodeName="vbox" type="com.bstek.dorado.view.widget.layout.VBoxLayout" sortFactor="1004"><Props>
<Prop name="align" defaultValue="left" enumValues="left,center,right"/>
<Prop name="lazyRenderChild" type="boolean"/></Props></Rule><Rule name="VboxLayoutConstraint" parents="LayoutConstraintSupport" label="VBoxLayoutConstraintSupport" type="com.bstek.dorado.view.widget.layout.VBoxLayoutConstraintSupport"><Props>
<Prop name="align" defaultValue="left" enumValues="left,center,right"/></Props></Rule><Rule name="FormLayout" parents="Layout" label="FormLayout" nodeName="form" type="com.bstek.dorado.view.widget.layout.FormLayout" sortFactor="1005"><Props>
<Prop name="colPadding" defaultValue="6" type="int"/>
<Prop name="cols" highlight="1"/>
<Prop name="padding" defaultValue="8" type="int"/>
<Prop name="rowHeight" type="int"/>
<Prop name="rowPadding" defaultValue="6" type="int"/>
<Prop name="stretchWidth" type="boolean"/></Props></Rule><Rule name="FormLayoutConstraint" parents="LayoutConstraintSupport" label="FormLayoutConstraint" type="com.bstek.dorado.view.widget.layout.FormLayoutConstraint"><Props>
<Prop name="align" defaultValue="left" enumValues="left,center,right"/>
<Prop name="colSpan" type="int"/>
<Prop name="rowSpan" type="int"/>
<Prop name="vAlign" defaultValue="top" enumValues="top,center,bottom"/></Props></Rule><Rule name="NativeLayout" parents="Layout" label="NativeLayout" nodeName="native" type="com.bstek.dorado.view.widget.layout.NativeLayout" sortFactor="1006"><Props>
<Prop name="lazyRenderChild" type="boolean"/>
<Prop name="style"/></Props></Rule><Rule name="NativeLayoutConstraint" parents="HashMap" label="CommonLayoutConstraint" type="com.bstek.dorado.view.widget.layout.CommonLayoutConstraint"></Rule><Rule name="AbstractMap" abstract="true" type="java.util.AbstractMap"></Rule><Rule name="HashMap" parents="AbstractMap" label="HashMap" type="java.util.HashMap"></Rule><Rule name="DataSet" parents="Component" label="DataSet" nodeName="DataSet" type="com.bstek.dorado.view.widget.data.DataSet" sortFactor="2001" category="General" icon="/com/bstek/dorado/view/widget/data/DataSet.png" autoGenerateId="true" clientTypes="desktop,touch"><PrimitiveProps>
<Prop name="listener"/></PrimitiveProps><Props>
<Prop name="cacheable" type="boolean"/>
<Prop name="dataProvider" highlight="1" type="com.bstek.dorado.data.provider.DataProvider"/>
<Prop name="dataType" highlight="1" type="com.bstek.dorado.data.type.DataType"/>
<Prop name="loadMode" defaultValue="lazy" enumValues="preload,onCreate,onReady,lazy,manual"/>
<Prop name="pageSize" type="int"/>
<Prop name="parameter" highlight="1" editor="any" type="java.lang.Object"/>
<Prop name="readOnly" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onLoadData" parameters="self,arg"/>
<ClientEvent name="beforeLoadData" parameters="self,arg"/>
<ClientEvent name="onDataLoad" parameters="self,arg" deprecated="true"/></ClientEvents></Rule><Rule name="Control" parents="com.bstek.dorado.view.widget.Control" label="Control" nodeName="Control" type="com.bstek.dorado.view.widget.DefaultControl" sortFactor="2002" category="General" clientTypes="desktop,touch"></Rule><Rule name="Container" parents="com.bstek.dorado.view.widget.Control" label="Container" type="com.bstek.dorado.view.widget.Container" sortFactor="2003" category="General" icon="/com/bstek/dorado/view/widget/Container.png" clientTypes="desktop,touch"><PrimitiveProps>
<Prop name="listener"/></PrimitiveProps><Props>
<Prop name="containerUi" defaultValue="default" enumValues="default,optional1"/>
<Prop name="contentOverflow" enumValues="visible,hidden,scroll,auto"/>
<Prop name="contentOverflowX" enumValues="visible,hidden,scroll,auto"/>
<Prop name="contentOverflowY" enumValues="visible,hidden,scroll,auto"/>
<Prop name="layout" visible="false" type="com.bstek.dorado.view.widget.layout.Layout"/></Props><Children><Child rule="Component" name="Children" aggregated="true"></Child></Children></Rule><Rule name="HtmlContainer" parents="Container" label="HtmlContainer" type="com.bstek.dorado.view.widget.HtmlContainer" sortFactor="2004" category="General" icon="/com/bstek/dorado/view/widget/HtmlContainer.png" clientTypes="desktop,touch"><Props>
<Prop name="containerExpression"/>
<Prop name="content" editor="multiLines"/>
<Prop name="contentFile"/></Props></Rule><Rule name="SubViewHolder" parents="com.bstek.dorado.view.widget.Control" label="SubViewHolder" type="com.bstek.dorado.view.widget.SubViewHolder" sortFactor="2005" category="General" icon="/com/bstek/dorado/view/widget/SubViewHolder.png" clientTypes="desktop,touch"><Props><Prop name="context" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="loadMode" enumValues="preload,lazy,manual"/>
<Prop name="subView"/></Props><ClientEvents>
<ClientEvent name="beforeLoad" parameters="self,arg"/>
<ClientEvent name="onLoad" parameters="self,arg"/>
<ClientEvent name="onLoadFailure" parameters="self,arg"/></ClientEvents></Rule><Rule name="Action" parents="Component" label="Action" type="com.bstek.dorado.view.widget.action.Action" sortFactor="2006" category="Action" icon="/com/bstek/dorado/view/widget/action/Action.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="caption"/>
<Prop name="confirmMessage"/>
<Prop name="disabled" type="boolean"/>
<Prop name="hotkey" enumValues="f1,f2,ctrl+s,alt+s,shift+s,ctrl+alt+shift+s,return,space,backspace,left,right,up,down"/>
<Prop name="icon"/>
<Prop name="iconClass"/>
<Prop name="parameter" editor="any" type="java.lang.Object"/>
<Prop name="successMessage"/>
<Prop name="tip"/></Props><ClientEvents>
<ClientEvent name="onExecute" parameters="self,arg"/>
<ClientEvent name="beforeExecute" parameters="self,arg"/>
<ClientEvent name="onFailure" parameters="self,arg"/>
<ClientEvent name="onSuccess" parameters="self,arg"/></ClientEvents></Rule><Rule name="AjaxAction" parents="AsyncAction" label="AjaxAction" type="com.bstek.dorado.view.widget.action.AjaxAction" sortFactor="2007" category="Action" icon="/com/bstek/dorado/view/widget/action/AjaxAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="batchable" defaultValue="true" type="boolean"/>
<Prop name="service" highlight="1"/>
<Prop name="supportsEntity" defaultValue="true" type="boolean"/>
<Prop name="timeout" type="long"/></Props></Rule><Rule name="UpdateAction" parents="AsyncAction" label="UpdateAction" type="com.bstek.dorado.view.widget.action.UpdateAction" sortFactor="2008" category="Action" icon="/com/bstek/dorado/view/widget/action/UpdateAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="alwaysExecute" type="boolean"/>
<Prop name="dataResolver" highlight="1" type="com.bstek.dorado.data.resolver.DataResolver"/>
<Prop name="executingMessage"/></Props><ClientEvents>
<ClientEvent name="onGetUpdateData" parameters="self,arg"/></ClientEvents><Children><Child rule="UpdateItem" name="UpdateItems" aggregated="true"></Child></Children></Rule><Rule name="FormSubmitAction" parents="Action" label="FormSubmitAction" type="com.bstek.dorado.view.widget.action.FormSubmitAction" sortFactor="2009" category="Action" icon="/com/bstek/dorado/view/widget/action/FormSubmitAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="action"/>
<Prop name="method" defaultValue="post" enumValues="post,get"/>
<Prop name="target"/></Props></Rule><Rule name="LongTask" parents="Action" label="LongTask" type="com.bstek.dorado.view.widget.action.LongTask" sortFactor="2010" category="Action" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="appearence" defaultValue="daemonTask" enumValues="none,daemonTask,mainTask"/>
<Prop name="disableOnActive" defaultValue="true" type="boolean"/>
<Prop name="taskName" highlight="1"/></Props><ClientEvents>
<ClientEvent name="onTaskScheduled" parameters="self,arg"/>
<ClientEvent name="onTaskEnd" parameters="self,arg"/>
<ClientEvent name="onLog" parameters="self,arg"/>
<ClientEvent name="onStateChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="Button" parents="AbstractButton" label="Button" type="com.bstek.dorado.view.widget.base.Button" sortFactor="2011" category="General" icon="/com/bstek/dorado/view/widget/base/Button.png" clientTypes="desktop"><Props>
<Prop name="caption" highlight="1"/>
<Prop name="height" visible="false"/>
<Prop name="icon"/>
<Prop name="iconClass"/>
<Prop name="showTrigger" type="boolean"/>
<Prop name="splitButton" type="boolean"/>
<Prop name="triggerToggled" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onTriggerClick" parameters="self,arg"/></ClientEvents></Rule><Rule name="SimpleButton" parents="AbstractButton" label="SimpleButton" type="com.bstek.dorado.view.widget.base.SimpleButton" sortFactor="2012" category="General" icon="/com/bstek/dorado/view/widget/base/SimpleButton.png" clientTypes="desktop,touch"><Props>
<Prop name="disabledClassName"/>
<Prop name="hoverClassName"/>
<Prop name="mouseDownClassName"/>
<Prop name="toggledClassName"/></Props></Rule><Rule name="SimpleIconButton" parents="SimpleButton" label="SimpleIconButton" type="com.bstek.dorado.view.widget.base.SimpleIconButton" sortFactor="2013" category="General" icon="/com/bstek/dorado/view/widget/base/SimpleIconButton.png" clientTypes="desktop,touch"><Props>
<Prop name="icon" highlight="1"/>
<Prop name="iconClass"/>
<Prop name="showTrigger" type="boolean"/></Props></Rule><Rule name="Panel" parents="AbstractPanel" label="Panel" type="com.bstek.dorado.view.widget.base.Panel" sortFactor="2014" category="General" icon="/com/bstek/dorado/view/widget/base/Panel.png" clientTypes="desktop"><Props>
<Prop name="background"/>
<Prop name="border" defaultValue="normal" enumValues="none,normal,curve" deprecated="true"/>
<Prop name="closeAction" defaultValue="hide" enumValues="hide,close"/>
<Prop name="closeable" type="boolean"/>
<Prop name="collapseable" defaultValue="false" type="boolean"/>
<Prop name="icon"/>
<Prop name="iconClass"/>
<Prop name="maximizeable" type="boolean"/>
<Prop name="maximized" type="boolean"/>
<Prop name="showCaptionBar" type="java.lang.Boolean"/></Props><ClientEvents>
<ClientEvent name="onMaximize" parameters="self,arg"/>
<ClientEvent name="beforeMaximize" parameters="self,arg"/></ClientEvents><Children><Child name="Tools" fixed="true"><Rule name="Wrapper.Tools" label="Tools" nodeName="Tools" icon="/com/bstek/dorado/view/widget/base/Tools.png"><Children><Child rule="SimpleIconButton" name="Tools" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="GroupBox" parents="AbstractPanel" label="GroupBox" type="com.bstek.dorado.view.widget.base.GroupBox" sortFactor="2015" category="General" icon="/com/bstek/dorado/view/widget/base/GroupBox.png" clientTypes="desktop"></Rule><Rule name="FieldSet" parents="AbstractPanel" label="FieldSet" type="com.bstek.dorado.view.widget.base.FieldSet" sortFactor="2016" category="General" icon="/com/bstek/dorado/view/widget/base/FieldSet.png" clientTypes="desktop"></Rule><Rule name="IFrame" parents="com.bstek.dorado.view.widget.Control" label="IFrame" type="com.bstek.dorado.view.widget.base.IFrame" sortFactor="2017" category="General" icon="/com/bstek/dorado/view/widget/base/IFrame.png" clientTypes="desktop,touch"><Props>
<Prop name="name"/>
<Prop name="path"/></Props><ClientEvents>
<ClientEvent name="onLoad" parameters="self,arg"/></ClientEvents></Rule><Rule name="CardBook" parents="com.bstek.dorado.view.widget.Control" label="CardBook" type="com.bstek.dorado.view.widget.base.CardBook" sortFactor="2018" category="General" icon="/com/bstek/dorado/view/widget/base/CardBook.png" clientTypes="desktop,touch"><Props>
<Prop name="currentControl" deprecated="true" visible="false" type="int"/>
<Prop name="currentIndex" type="int"/>
<Prop name="dynaHeight" defaultValue="false" type="boolean"/></Props><ClientEvents>
<ClientEvent name="beforeCurrentChange" parameters="self,arg"/>
<ClientEvent name="onCurrentChange" parameters="self,arg"/></ClientEvents><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Controls" aggregated="true"></Child></Children></Rule><Rule name="TabControl" parents="TabBar" label="TabControl" type="com.bstek.dorado.view.widget.base.tab.TabControl" sortFactor="2019" category="General" icon="/com/bstek/dorado/view/widget/base/tab/TabControl.png" clientTypes="desktop"><Props>
<Prop name="dynaHeight" defaultValue="false" type="boolean"/></Props><Children><Child rule="IFrameTab" name="IFrameTab" aggregated="true"></Child><Child rule="ControlTab" name="ControlTab" aggregated="true"></Child></Children></Rule><Rule name="VerticalTabControl" parents="TabColumn" label="VerticalTabControl" type="com.bstek.dorado.view.widget.base.tab.VerticalTabControl" sortFactor="2020" category="General" icon="/com/bstek/dorado/view/widget/base/tab/VerticalTabControl.png" clientTypes="desktop"><Props>
<Prop name="tabColumnWidth" defaultValue="200" type="int"/></Props><Children><Child rule="IFrameTab" name="IFrameTab" aggregated="true"></Child><Child rule="ControlTab" name="ControlTab" aggregated="true"></Child></Children></Rule><Rule name="TabBar" parents="AbstractTabControl" label="TabBar" type="com.bstek.dorado.view.widget.base.tab.TabBar" sortFactor="2021" category="General" icon="/com/bstek/dorado/view/widget/base/tab/TabBar.png" clientTypes="desktop"><Props>
<Prop name="showMenuButton" type="boolean"/>
<Prop name="tabMinWidth" type="int"/>
<Prop name="tabPlacement" defaultValue="top" enumValues="top,bottom"/></Props><Children><Child rule="Tab" name="Tab" aggregated="true" public="false"></Child></Children></Rule><Rule name="TabColumn" parents="AbstractTabControl" label="TabColumn" type="com.bstek.dorado.view.widget.base.tab.TabColumn" sortFactor="2022" category="General" icon="/com/bstek/dorado/view/widget/base/tab/TabColumn.png" clientTypes="desktop"><Props>
<Prop name="tabPlacement" defaultValue="left" enumValues="left,right"/>
<Prop name="verticalText" type="boolean"/></Props><Children><Child rule="Tab" name="Tab" aggregated="true" public="false"></Child></Children></Rule><Rule name="ToolBar" parents="com.bstek.dorado.view.widget.Control" label="ToolBar" type="com.bstek.dorado.view.widget.base.toolbar.ToolBar" sortFactor="2023" category="General" icon="/com/bstek/dorado/view/widget/base/toolbar/ToolBar.png" clientTypes="desktop"><Props>
<Prop name="fixRight" type="boolean"/>
<Prop name="height" visible="false"/>
<Prop name="showMenuOnHover" defaultValue="false" type="boolean"/></Props><Children><Child rule="MenuButton" name="MenuButton" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.base.toolbar.Label" name="ToolBarLabel" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.base.toolbar.Separator" name="Separator" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.base.toolbar.Button" name="ToolBarButton" aggregated="true"></Child><Child rule="Fill" name="Fill" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.Control" name="Items" aggregated="true"></Child></Children></Rule><Rule name="SplitPanel" parents="com.bstek.dorado.view.widget.Control" label="SplitPanel" type="com.bstek.dorado.view.widget.base.SplitPanel" sortFactor="2024" category="General" icon="/com/bstek/dorado/view/widget/base/SplitPanel.png" clientTypes="desktop"><Props>
<Prop name="animate" type="java.lang.Boolean"/>
<Prop name="collapseBothSide" defaultValue="false" type="boolean"/>
<Prop name="collapseable" defaultValue="true" type="boolean"/>
<Prop name="collapsed" type="boolean"/>
<Prop name="direction" defaultValue="left" highlight="1" enumValues="left,top,right,bottom"/>
<Prop name="maxPosition" type="int"/>
<Prop name="minPosition" type="int"/>
<Prop name="openPreviewOnHover" defaultValue="false" type="boolean"/>
<Prop name="position" defaultValue="100" highlight="1"/>
<Prop name="previewable" type="boolean"/>
<Prop name="resizeable" defaultValue="true" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onCollapsedChange" parameters="self,arg"/>
<ClientEvent name="beforeCollapsedChange" parameters="self,arg"/></ClientEvents><Children><Child name="MainControl" fixed="true"><Rule name="Wrapper.MainControl" label="MainControl" nodeName="MainControl" icon="/com/bstek/dorado/view/widget/base/MainControl.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="MainControl"></Child></Children></Rule></Child><Child name="SideControl" fixed="true"><Rule name="Wrapper.SideControl" label="SideControl" nodeName="SideControl" icon="/com/bstek/dorado/view/widget/base/SideControl.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="SideControl"></Child></Children></Rule></Child></Children></Rule><Rule name="Accordion" parents="com.bstek.dorado.view.widget.Control" label="Accordion" type="com.bstek.dorado.view.widget.base.accordion.Accordion" sortFactor="2025" category="General" icon="/com/bstek/dorado/view/widget/base/accordion/Accordion.png" clientTypes="desktop"><Props>
<Prop name="animate" type="java.lang.Boolean"/>
<Prop name="currentSection" type="int"/>
<Prop name="dynaHeight" defaultValue="false" type="boolean"/></Props><ClientEvents>
<ClientEvent name="beforeCurrentSectionChange" parameters="self,arg"/>
<ClientEvent name="onCurrentSectionChange" parameters="self,arg"/></ClientEvents><Children><Child rule="Section" name="Sections" aggregated="true"></Child></Children></Rule><Rule name="Slider" parents="com.bstek.dorado.view.widget.Control" label="Slider" type="com.bstek.dorado.view.widget.base.Slider" sortFactor="2026" category="General" icon="/com/bstek/dorado/view/widget/base/Slider.png" clientTypes="desktop"><Props>
<Prop name="maxValue" defaultValue="100" type="float"/>
<Prop name="minValue" type="float"/>
<Prop name="orientation" defaultValue="horizental" enumValues="horizontal,horizontal,vertical"/>
<Prop name="precision" type="int"/>
<Prop name="step" type="float"/>
<Prop name="value" type="float"/></Props><ClientEvents>
<ClientEvent name="onValueChange" parameters="self,arg"/>
<ClientEvent name="beforeValueChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="ProgressBar" parents="AbstractPropertyDataControl" label="ProgressBar" type="com.bstek.dorado.view.widget.base.ProgressBar" sortFactor="2027" category="General" icon="/com/bstek/dorado/view/widget/base/ProgressBar.png" clientTypes="desktop,touch"><Props>
<Prop name="effectEnable" type="boolean"/>
<Prop name="maxValue" defaultValue="100" type="float"/>
<Prop name="minValue" type="float"/>
<Prop name="showText" defaultValue="true" type="boolean"/>
<Prop name="textPattern" defaultValue="{percent}%"/>
<Prop name="value"/></Props></Rule><Rule name="Tip" parents="com.bstek.dorado.view.widget.Control,FloatControl" label="Tip" type="com.bstek.dorado.view.widget.base.Tip" sortFactor="2028" category="Floatable" icon="/com/bstek/dorado/view/widget/base/Tip.png" clientTypes="desktop,touch"><Props>
<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
<Prop name="anchorTarget" visible="false"/>
<Prop name="animateTarget" visible="false"/>
<Prop name="animateType" defaultValue="fade" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="arrowAlign" defaultValue="center" enumValues="center,top,right,bottom,left"/>
<Prop name="arrowDirection" defaultValue="none" enumValues="top,right,bottom,left,none"/>
<Prop name="arrowOffset" type="int"/>
<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
<Prop name="caption"/>
<Prop name="center" type="boolean"/>
<Prop name="closeable" type="boolean"/>
<Prop name="content" type="java.lang.Object"/>
<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
<Prop name="floating" defaultValue="true" type="boolean"/>
<Prop name="floatingClassName"/>
<Prop name="focusAfterShow" defaultValue="false" type="boolean"/>
<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="icon" enumValues="INFO,WARNING,ERROR,QUESTION"/>
<Prop name="left" type="int"/>
<Prop name="modal" type="boolean"/>
<Prop name="modalType" enumValues="dark,transparent"/>
<Prop name="offsetLeft" type="int"/>
<Prop name="offsetTop" type="int"/>
<Prop name="shadowMode" defaultValue="drop" enumValues="drop,sides,frame,none"/>
<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="showDuration" type="int"/>
<Prop name="text" editor="multilines"/>
<Prop name="top" type="int"/>
<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
<ClientEvent name="onClose" parameters="self,arg"/>
<ClientEvent name="onShow" parameters="self,arg"/>
<ClientEvent name="beforeHide" parameters="self,arg"/>
<ClientEvent name="beforeClose" parameters="self,arg"/>
<ClientEvent name="beforeShow" parameters="self,arg"/>
<ClientEvent name="onHide" parameters="self,arg"/></ClientEvents></Rule><Rule name="FloatContainer" parents="Container,FloatControl" label="FloatContainer" type="com.bstek.dorado.view.widget.base.FloatContainer" sortFactor="2029" category="Floatable" icon="/com/bstek/dorado/view/widget/base/FloatContainer.png" clientTypes="desktop,touch"><Props>
<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
<Prop name="anchorTarget" visible="false"/>
<Prop name="animateTarget" visible="false"/>
<Prop name="animateType" defaultValue="zoom" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
<Prop name="center" type="boolean"/>
<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
<Prop name="floating" defaultValue="true" type="boolean"/>
<Prop name="floatingClassName"/>
<Prop name="focusAfterShow" defaultValue="true" type="boolean"/>
<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="left" type="int"/>
<Prop name="modal" type="boolean"/>
<Prop name="modalType" enumValues="dark,transparent"/>
<Prop name="offsetLeft" type="int"/>
<Prop name="offsetTop" type="int"/>
<Prop name="shadowMode" defaultValue="sides" enumValues="drop,sides,frame,none"/>
<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="top" type="int"/>
<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
<ClientEvent name="onClose" parameters="self,arg"/>
<ClientEvent name="onShow" parameters="self,arg"/>
<ClientEvent name="beforeHide" parameters="self,arg"/>
<ClientEvent name="beforeClose" parameters="self,arg"/>
<ClientEvent name="beforeShow" parameters="self,arg"/>
<ClientEvent name="onHide" parameters="self,arg"/></ClientEvents></Rule><Rule name="FloatPanel" parents="Panel,FloatControl" label="FloatPanel" type="com.bstek.dorado.view.widget.base.FloatPanel" sortFactor="2030" category="Floatable" icon="/com/bstek/dorado/view/widget/base/FloatPanel.png" clientTypes="desktop"><Props>
<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
<Prop name="anchorTarget" visible="false"/>
<Prop name="animateTarget" visible="false"/>
<Prop name="animateType" defaultValue="zoom" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
<Prop name="center" highlight="1" type="boolean"/>
<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
<Prop name="floating" defaultValue="true" type="boolean"/>
<Prop name="floatingClassName"/>
<Prop name="focusAfterShow" defaultValue="true" type="boolean"/>
<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="left" type="int"/>
<Prop name="modal" highlight="1" type="boolean"/>
<Prop name="modalType" enumValues="dark,transparent"/>
<Prop name="offsetLeft" type="int"/>
<Prop name="offsetTop" type="int"/>
<Prop name="shadowMode" defaultValue="sides" enumValues="drop,sides,frame,none"/>
<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="top" type="int"/>
<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
<ClientEvent name="onClose" parameters="self,arg"/>
<ClientEvent name="onShow" parameters="self,arg"/>
<ClientEvent name="beforeHide" parameters="self,arg"/>
<ClientEvent name="beforeClose" parameters="self,arg"/>
<ClientEvent name="beforeShow" parameters="self,arg"/>
<ClientEvent name="onHide" parameters="self,arg"/></ClientEvents></Rule><Rule name="Dialog" parents="FloatPanel" label="Dialog" type="com.bstek.dorado.view.widget.base.Dialog" sortFactor="2031" category="Floatable" icon="/com/bstek/dorado/view/widget/base/Dialog.png" clientTypes="desktop"><Props>
<Prop name="center" defaultValue="true" type="boolean"/>
<Prop name="closeable" defaultValue="true" type="boolean"/>
<Prop name="dragOutside" type="boolean"/>
<Prop name="draggable" defaultValue="true" type="boolean"/>
<Prop name="maxHeight" type="int"/>
<Prop name="maxWidth" type="int"/>
<Prop name="minHeight" type="int"/>
<Prop name="minWidth" type="int"/>
<Prop name="minimizeable" type="boolean"/>
<Prop name="minimized" type="boolean"/>
<Prop name="modal" defaultValue="true" type="boolean"/>
<Prop name="resizeable" defaultValue="true" type="boolean"/>
<Prop name="shadowMode" defaultValue="frame" enumValues="drop,sides,frame,none"/></Props><ClientEvents>
<ClientEvent name="onMinimize" parameters="self,arg"/>
<ClientEvent name="beforeMinimize" parameters="self,arg"/></ClientEvents></Rule><Rule name="Menu" parents="com.bstek.dorado.view.widget.Control,FloatControl" label="Menu" type="com.bstek.dorado.view.widget.base.menu.Menu" sortFactor="2032" category="Floatable" icon="/com/bstek/dorado/view/widget/base/menu/Menu.png" autoGenerateId="true" clientTypes="desktop"><Props>
<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
<Prop name="anchorTarget" visible="false"/>
<Prop name="animateTarget" visible="false"/>
<Prop name="animateType" defaultValue="zoom" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
<Prop name="center" type="boolean"/>
<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
<Prop name="floating" defaultValue="true" type="boolean"/>
<Prop name="floatingClassName"/>
<Prop name="focusAfterShow" defaultValue="true" type="boolean"/>
<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
<Prop name="hideAnimateType" defaultValue="fade" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="iconPosition" defaultValue="left" enumValues="left,top"/>
<Prop name="left" type="int"/>
<Prop name="modal" type="boolean"/>
<Prop name="modalType" enumValues="dark,transparent"/>
<Prop name="offsetLeft" type="int"/>
<Prop name="offsetTop" type="int"/>
<Prop name="shadowMode" defaultValue="sides" enumValues="drop,sides,frame,none"/>
<Prop name="showAnimateType" defaultValue="slide" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="top" type="int"/>
<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
<ClientEvent name="onClose" parameters="self,arg"/>
<ClientEvent name="onShow" parameters="self,arg"/>
<ClientEvent name="beforeHide" parameters="self,arg"/>
<ClientEvent name="beforeClose" parameters="self,arg"/>
<ClientEvent name="beforeShow" parameters="self,arg"/>
<ClientEvent name="onHide" parameters="self,arg"/>
<ClientEvent name="onHideTopMenu" parameters="self,arg"/></ClientEvents><Children><Child rule="BaseMenuItem" name="Items" aggregated="true"></Child></Children></Rule><Rule name="DatePicker" parents="com.bstek.dorado.view.widget.Control" label="DatePicker" nodeName="DatePicker" type="com.bstek.dorado.view.widget.base.DatePicker" sortFactor="2033" category="General" icon="/com/bstek/dorado/view/widget/base/DatePicker.png" clientTypes="desktop"><Props>
<Prop name="date" type="java.util.Date"/>
<Prop name="selectionMode" defaultValue="singleDate" enumValues="singleDate,multiDate"/>
<Prop name="showClearButton" defaultValue="true" type="boolean"/>
<Prop name="showConfirmButton" defaultValue="true" type="boolean"/>
<Prop name="showTimeSpinner" defaultValue="false" type="boolean"/>
<Prop name="showTodayButton" defaultValue="true" type="boolean"/>
<Prop name="yearMonthFormat"/></Props><ClientEvents>
<ClientEvent name="onFilterDate" parameters="self,arg"/>
<ClientEvent name="onClear" parameters="self,arg"/>
<ClientEvent name="onCancel" parameters="self,arg"/>
<ClientEvent name="onConfirm" parameters="self,arg"/>
<ClientEvent name="onRefreshDateCell" parameters="self,arg"/>
<ClientEvent name="onPick" parameters="self,arg"/></ClientEvents></Rule><Rule name="YearMonthPicker" parents="com.bstek.dorado.view.widget.Control" label="YearMonthPicker" nodeName="YearMonthPicker" type="com.bstek.dorado.view.widget.base.YearMonthPicker" sortFactor="2034" category="General" icon="/com/bstek/dorado/view/widget/base/YearMonthPicker.png" clientTypes="desktop"><Props>
<Prop name="month" type="int"/>
<Prop name="year" type="int"/></Props><ClientEvents>
<ClientEvent name="onPick" parameters="self,arg"/>
<ClientEvent name="onCancel" parameters="self,arg"/></ClientEvents></Rule><Rule name="Label" parents="AbstractPropertyDataControl" label="Label" type="com.bstek.dorado.view.widget.form.Label" sortFactor="2035" category="Form" icon="/com/bstek/dorado/view/widget/form/Label.png" clientTypes="desktop,touch"><Props>
<Prop name="text" highlight="1"/>
<Prop name="ui" enumValues="default,bold,h1,h2,h3"/></Props></Rule><Rule name="DataLabel" parents="AbstractPropertyDataControl" label="DataLabel" type="com.bstek.dorado.view.widget.form.DataLabel" sortFactor="2036" category="Form" icon="/com/bstek/dorado/view/widget/form/DataLabel.png" clientTypes="desktop,touch" deprecated="true"></Rule><Rule name="Link" parents="Label" label="Link" type="com.bstek.dorado.view.widget.form.Link" sortFactor="2037" category="Form" icon="/com/bstek/dorado/view/widget/form/Link.png" clientTypes="desktop,touch"><Props>
<Prop name="href"/>
<Prop name="target"/></Props></Rule><Rule name="Image" parents="AbstractPropertyDataControl" label="Image" type="com.bstek.dorado.view.widget.form.Image" sortFactor="2038" category="Form" icon="/com/bstek/dorado/view/widget/form/Image.png" clientTypes="desktop,touch"><Props>
<Prop name="blankImage"/>
<Prop name="image" highlight="1"/>
<Prop name="packMode" defaultValue="center" enumValues="start,center,end"/>
<Prop name="stretchMode" defaultValue="keepRatio" enumValues="fitWidth,fitHeight,keepRatio,fill,stretch,none"/></Props></Rule><Rule name="TemplateField" parents="AbstractDataControl" label="TemplateField" type="com.bstek.dorado.view.widget.form.TemplateField" sortFactor="2039" category="Form" icon="/com/bstek/dorado/view/widget/form/TemplateField.png" clientTypes="desktop,touch"><Props>
<Prop name="template" highlight="1" editor="multiLines"/></Props></Rule><Rule name="TextEditor" parents="AbstractTextEditor" label="TextEditor" type="com.bstek.dorado.view.widget.form.TextEditor" sortFactor="2040" category="Form" icon="/com/bstek/dorado/view/widget/form/TextEditor.png" clientTypes="desktop,touch"><Props>
<Prop name="dataType" type="com.bstek.dorado.data.type.DataType"/>
<Prop name="displayFormat"/><Prop name="mapping" type="com.bstek.dorado.data.type.property.Mapping" compositeType="Fixed">
<Prop name="keyProperty"/>
<Prop name="mapValues" editor="collection[pojo]" type="java.lang.Object"/>
<Prop name="valueProperty"/></Prop>
<Prop name="password" visible="false" type="boolean"/>
<Prop name="typeFormat"/></Props></Rule><Rule name="PasswordEditor" parents="AbstractTextEditor" label="PasswordEditor" type="com.bstek.dorado.view.widget.form.PasswordEditor" sortFactor="2041" category="Form" icon="/com/bstek/dorado/view/widget/form/PasswordEditor.png" clientTypes="desktop,touch"></Rule><Rule name="TextArea" parents="AbstractTextEditor" label="TextArea" type="com.bstek.dorado.view.widget.form.TextArea" sortFactor="2042" category="Form" icon="/com/bstek/dorado/view/widget/form/TextArea.png" clientTypes="desktop,touch"><Props>
<Prop name="maxLength" type="int"/>
<Prop name="minLength" type="int"/>
<Prop name="required" type="boolean"/>
<Prop name="selectTextOnFocus" defaultValue="false" type="boolean"/>
<Prop name="text" editor="multiLines"/></Props></Rule><Rule name="CheckBox" parents="AbstractDataEditor" label="CheckBox" type="com.bstek.dorado.view.widget.form.CheckBox" sortFactor="2043" category="Form" icon="/com/bstek/dorado/view/widget/form/CheckBox.png" clientTypes="desktop,touch"><Props>
<Prop name="caption"/>
<Prop name="mixedValue" type="java.lang.Object"/>
<Prop name="offValue" defaultValue="false" type="java.lang.Object"/>
<Prop name="onValue" defaultValue="true" type="java.lang.Object"/>
<Prop name="triState" type="boolean"/>
<Prop name="value" defaultValue="false" type="java.lang.Object"/></Props><ClientEvents>
<ClientEvent name="onValueChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="RadioGroup" parents="AbstractDataEditor" label="RadioGroup" type="com.bstek.dorado.view.widget.form.RadioGroup" sortFactor="2044" category="Form" icon="/com/bstek/dorado/view/widget/form/RadioGroup.png" clientTypes="desktop,touch"><Props>
<Prop name="columnCount" defaultValue="3" type="int"/>
<Prop name="layout" defaultValue="flow" enumValues="vertical,flow,grid"/>
<Prop name="value" type="java.lang.Object"/></Props><ClientEvents>
<ClientEvent name="onValueChange" parameters="self,arg"/></ClientEvents><Children><Child rule="RadioButton" name="RadioButtons" aggregated="true"></Child></Children></Rule><Rule name="DataMessage" parents="AbstractPropertyDataControl" label="DataMessage" type="com.bstek.dorado.view.widget.form.DataMessage" sortFactor="2045" category="Form" icon="/com/bstek/dorado/view/widget/form/DataMessage.png" clientTypes="desktop,touch"><Props>
<Prop name="showIconOnly" type="boolean"/>
<Prop name="showMultiMessage" type="boolean"/></Props></Rule><Rule name="FormProfile" parents="Component" label="FormProfile" type="com.bstek.dorado.view.widget.form.FormProfile" sortFactor="2046" category="Form" icon="/com/bstek/dorado/view/widget/form/FormProfile.png" clientTypes="desktop,touch"><Props>
<Prop name="className"/>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="editorWidth" type="int"/>
<Prop name="exClassName"/>
<Prop name="height"/>
<Prop name="hintPosition" enumValues="right,bottom"/>
<Prop name="hintSpacing" type="int"/>
<Prop name="hintWidth" type="int"/>
<Prop name="labelAlign" defaultValue="left" enumValues="left,center,right"/>
<Prop name="labelPosition" defaultValue="left" enumValues="left,top"/>
<Prop name="labelSeparator"/>
<Prop name="labelSpacing" type="int"/>
<Prop name="labelWidth" type="int"/>
<Prop name="readOnly" type="boolean"/>
<Prop name="showHint" defaultValue="true" type="boolean"/>
<Prop name="showHintMessage" type="boolean"/>
<Prop name="showLabel" defaultValue="true" type="boolean"/>
<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/>
<Prop name="type" defaultValue="text" enumValues="text,password,textArea,checkBox,radioGroup"/>
<Prop name="ui"/>
<Prop name="width"/></Props></Rule><Rule name="FormElement" parents="com.bstek.dorado.view.widget.Control" label="FormElement" type="com.bstek.dorado.view.widget.form.FormElement" sortFactor="2047" category="Form" icon="/com/bstek/dorado/view/widget/form/FormElement.png" clientTypes="desktop,touch"><Props>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="editable" defaultValue="true" type="boolean"/>
<Prop name="editorType" highlight="1" enumValues="TextEditor,PasswordEditor,TextArea,CheckBox,RadioGroup,Label,NumberSpinner"/>
<Prop name="editorWidth" type="int"/>
<Prop name="formProfile" reference="FormProfile:id"/>
<Prop name="hint"/>
<Prop name="hintPosition" defaultValue="right" enumValues="right,bottom"/>
<Prop name="hintSpacing" type="int"/>
<Prop name="hintWidth" type="int"/>
<Prop name="label" highlight="1"/>
<Prop name="labelAlign" defaultValue="left" enumValues="left,center,right"/>
<Prop name="labelPosition" defaultValue="left" enumValues="left,top"/>
<Prop name="labelSeparator"/>
<Prop name="labelSpacing" type="int"/>
<Prop name="labelWidth" type="int"/>
<Prop name="property" highlight="1"/>
<Prop name="readOnly" type="boolean"/>
<Prop name="showHint" defaultValue="true" type="boolean"/>
<Prop name="showHintMessage" type="boolean"/>
<Prop name="showLabel" defaultValue="true" type="boolean"/>
<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,autoOpenMappingDropDown1,autoOpenMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/>
<Prop name="type" enumValues="text,password,textArea,checkBox,radioGroup" visible="false"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents><Children><Child name="Editor" fixed="true"><Rule name="Wrapper.Editor" label="Editor" nodeName="Editor" icon="/com/bstek/dorado/view/widget/form/Editor.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Editor"></Child></Children></Rule></Child></Children></Rule><Rule name="AutoForm" parents="com.bstek.dorado.view.widget.Control" label="AutoForm" type="com.bstek.dorado.view.widget.form.autoform.AutoForm" sortFactor="2048" category="Form" icon="/com/bstek/dorado/view/widget/form/autoform/AutoForm.png" clientTypes="desktop,touch"><Props>
<Prop name="autoCreateElements" type="boolean"/>
<Prop name="colPadding" type="int"/>
<Prop name="cols" highlight="1"/>
<Prop name="createOwnEntity" defaultValue="true" type="boolean"/>
<Prop name="createPrivateDataSet" type="boolean"/>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="dataType" type="com.bstek.dorado.data.type.EntityDataType"/>
<Prop name="editorWidth" type="int"/>
<Prop name="formProfile" reference="FormProfile:id"/>
<Prop name="hintPosition" enumValues="right,bottom"/>
<Prop name="hintSpacing" type="int"/>
<Prop name="hintWidth" type="int"/>
<Prop name="labelAlign" defaultValue="left" enumValues="left,center,right"/>
<Prop name="labelPosition" defaultValue="left" enumValues="left,top"/>
<Prop name="labelSeparator"/>
<Prop name="labelSpacing" type="int"/>
<Prop name="labelWidth" type="int"/>
<Prop name="padding" type="int"/>
<Prop name="readOnly" type="boolean"/>
<Prop name="rowHeight" type="int"/>
<Prop name="rowPadding" type="int"/>
<Prop name="showHint" defaultValue="true" type="boolean"/>
<Prop name="showHintMessage" type="boolean"/>
<Prop name="showLabel" defaultValue="true" type="boolean"/>
<Prop name="stretchWidth" type="boolean"/></Props><Children><Child rule="AutoFormElement" name="AutoFormElement" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.Control" name="Elements" aggregated="true"></Child></Children></Rule><Rule name="NumberSpinner" parents="Spinner" label="NumberSpinner" type="com.bstek.dorado.view.widget.form.NumberSpinner" sortFactor="2049" category="Form" icon="/com/bstek/dorado/view/widget/form/NumberSpinner.png" clientTypes="desktop,touch"><Props>
<Prop name="max" defaultValue="2147483647" type="int"/>
<Prop name="min" defaultValue="-2147483648" type="int"/>
<Prop name="selectTextOnFocus" defaultValue="true" type="boolean"/></Props></Rule><Rule name="DateTimeSpinner" parents="Spinner" label="DateTimeSpinner" type="com.bstek.dorado.view.widget.form.DateTimeSpinner" sortFactor="2050" category="Form" icon="/com/bstek/dorado/view/widget/form/DateTimeSpinner.png" clientTypes="desktop,touch"><Props>
<Prop name="date" type="int"/>
<Prop name="hours" type="int"/>
<Prop name="minutes" type="int"/>
<Prop name="month" type="int"/>
<Prop name="seconds" type="int"/>
<Prop name="type" defaultValue="time" enumValues="date,time,dateTime,hours,minutes,dateHours,dateMinutes"/>
<Prop name="year" type="int"/></Props></Rule><Rule name="CustomSpinner" parents="Spinner" label="CustomSpinner" type="com.bstek.dorado.view.widget.form.CustomSpinner" sortFactor="2051" category="Form" icon="/com/bstek/dorado/view/widget/form/CustomSpinner.png" clientTypes="desktop,touch"><Props>
<Prop name="pattern" highlight="1"/>
<Prop name="text" visible="false"/>
<Prop name="value"/></Props></Rule><Rule name="Trigger" parents="Component" label="Trigger" type="com.bstek.dorado.view.widget.form.trigger.Trigger" sortFactor="2052" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/Trigger.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="buttonVisible" defaultValue="true" type="boolean"/>
<Prop name="editable" defaultValue="true" type="boolean"/>
<Prop name="icon"/>
<Prop name="iconClass" enumValues="d-trigger-icon-drop,d-trigger-icon-search,d-trigger-icon-date,d-trigger-icon-custom"/></Props><ClientEvents>
<ClientEvent name="onExecute" parameters="self,arg"/>
<ClientEvent name="beforeExecute" parameters="self,arg"/></ClientEvents></Rule><Rule name="ListDropDown" parents="RowListDropDown" label="ListDropDown" type="com.bstek.dorado.view.widget.form.trigger.ListDropDown" sortFactor="2053" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/ListDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
<Prop name="items" highlight="1" editor="collection[any]" type="java.util.List"/></Props></Rule><Rule name="DataSetDropDown" parents="RowListDropDown" label="DataSetDropDown" type="com.bstek.dorado.view.widget.form.trigger.DataSetDropDown" sortFactor="2054" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/DataSetDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="filterMode" defaultValue="serverSide" enumValues="clientSide,serverSide"/>
<Prop name="filterOnTyping" defaultValue="false" type="boolean"/>
<Prop name="property" highlight="1"/>
<Prop name="reloadDataOnOpen" type="boolean"/>
<Prop name="useDataBinding" defaultValue="true" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onSetFilterParameter" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AutoMappingDropDown" parents="RowListDropDown" label="AutoMappingDropDown" type="com.bstek.dorado.view.widget.form.trigger.AutoMappingDropDown" sortFactor="2055" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/AutoMappingDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
<Prop name="dynaFilter" defaultValue="true" type="boolean"/>
<Prop name="property" defaultValue="value"/></Props></Rule><Rule name="DateDropDown" parents="DropDown" label="DateDropDown" type="com.bstek.dorado.view.widget.form.trigger.DateDropDown" sortFactor="2056" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/DateDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
<Prop name="selectionMode" defaultValue="singleDate" enumValues="singleDate,multiDate"/>
<Prop name="showConfirmButton" defaultValue="true" type="boolean"/>
<Prop name="showTimeSpinner" type="boolean"/>
<Prop name="showTodayButton" defaultValue="true" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onRefreshDateCell" parameters="self,arg"/>
<ClientEvent name="onFilterDate" parameters="self,arg"/></ClientEvents></Rule><Rule name="YearMonthDropDown" parents="DropDown" label="YearMonthDropDown" type="com.bstek.dorado.view.widget.form.trigger.YearMonthDropDown" sortFactor="2057" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/YearMonthDropDown.png" autoGenerateId="true" clientTypes="desktop"></Rule><Rule name="YearDropDown" parents="DropDown" label="YearDropDown" type="com.bstek.dorado.view.widget.form.trigger.YearDropDown" sortFactor="2058" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/YearDropDown.png" autoGenerateId="true" clientTypes="desktop"></Rule><Rule name="MonthDropDown" parents="DropDown" label="MonthDropDown" type="com.bstek.dorado.view.widget.form.trigger.MonthDropDown" sortFactor="2059" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/MonthDropDown.png" autoGenerateId="true" clientTypes="desktop"></Rule><Rule name="CustomDropDown" parents="DropDown" label="CustomDropDown" type="com.bstek.dorado.view.widget.form.trigger.CustomDropDown" sortFactor="2060" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/CustomDropDown.png" autoGenerateId="true" clientTypes="desktop"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Control"></Child></Children></Rule><Rule name="DataPilot" parents="AbstractDataControl" label="DataPilot" type="com.bstek.dorado.view.widget.datacontrol.DataPilot" sortFactor="2061" category="General" icon="/com/bstek/dorado/view/widget/datacontrol/DataPilot.png" clientTypes="desktop"><Props>
<Prop name="height" visible="false"/>
<Prop name="itemCodes" highlight="1" enumValues="pages,|&lt;,&lt;,&gt;,&gt;|,goto,pageSize,info,+,-,x,|"/></Props><ClientEvents>
<ClientEvent name="onSubControlAction" parameters="self,arg"/>
<ClientEvent name="onSubControlRefresh" parameters="self,arg"/></ClientEvents></Rule><Rule name="ListBox" parents="AbstractListBox" label="ListBox" type="com.bstek.dorado.view.widget.list.ListBox" sortFactor="2062" category="Collection" icon="/com/bstek/dorado/view/widget/list/ListBox.png" clientTypes="desktop"><Props>
<Prop name="items" highlight="1" editor="collection[any]" type="java.util.List"/></Props></Rule><Rule name="DataListBox" parents="AbstractListBox" label="DataListBox" type="com.bstek.dorado.view.widget.list.DataListBox" sortFactor="2063" category="Collection" icon="/com/bstek/dorado/view/widget/list/DataListBox.png" clientTypes="desktop"><Props>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="Grid" parents="AbstractGrid" label="Grid" type="com.bstek.dorado.view.widget.grid.Grid" sortFactor="2064" category="Collection" icon="/com/bstek/dorado/view/widget/grid/Grid.png" clientTypes="desktop"><Props>
<Prop name="items" highlight="1" editor="collection[pojo]" type="java.util.List"/></Props></Rule><Rule name="DataGrid" parents="AbstractGrid" label="DataGrid" type="com.bstek.dorado.view.widget.grid.DataGrid" sortFactor="2065" category="Collection" icon="/com/bstek/dorado/view/widget/grid/DataGrid.png" clientTypes="desktop"><Props>
<Prop name="appendOnLastEnter" type="boolean"/>
<Prop name="autoCreateColumns" type="java.lang.Boolean"/>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="dataType" deprecated="true" type="com.bstek.dorado.data.type.EntityDataType"/>
<Prop name="filterMode" defaultValue="clientSide" enumValues="clientSide,serverSide"/>
<Prop name="rowSelectionProperty"/>
<Prop name="sortMode" defaultValue="clientSide" enumValues="clientSide,serverSide"/>
<Prop name="supportsPaging" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="Tree" parents="AbstractTree" label="Tree" type="com.bstek.dorado.view.widget.tree.Tree" sortFactor="2066" category="Collection" icon="/com/bstek/dorado/view/widget/tree/Tree.png" clientTypes="desktop"><Children><Child rule="BaseNode" name="Nodes" aggregated="true"></Child></Children></Rule><Rule name="DataTree" parents="AbstractTree" label="DataTree" type="com.bstek.dorado.view.widget.tree.DataTree" sortFactor="2067" category="Collection" icon="/com/bstek/dorado/view/widget/tree/DataTree.png" clientTypes="desktop"><Props>
<Prop name="currentNodeDataPath"/>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
<ClientEvent name="onDataNodeCreate" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="beforeDataNodeCreate" parameters="self,arg"/></ClientEvents><Children><Child name="BindingConfigs" fixed="true"><Rule name="Wrapper.BindingConfigs" label="BindingConfigs" nodeName="BindingConfigs" icon="/com/bstek/dorado/view/widget/tree/BindingConfigs.png"><Children><Child rule="BindingConfig" name="BindingConfigs" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="BlockView" parents="AbstractBlockView" label="BlockView" type="com.bstek.dorado.view.widget.blockview.BlockView" sortFactor="2068" category="Collection" icon="/com/bstek/dorado/view/widget/blockview/BlockView.png" clientTypes="desktop,touch"><Props>
<Prop name="items" highlight="1" editor="collection[any]" type="java.util.List"/></Props></Rule><Rule name="DataBlockView" parents="AbstractBlockView" label="DataBlockView" type="com.bstek.dorado.view.widget.blockview.DataBlockView" sortFactor="2069" category="Collection" icon="/com/bstek/dorado/view/widget/blockview/DataBlockView.png" clientTypes="desktop,touch"><Props>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="TreeGrid" parents="AbstractTreeGrid" label="TreeGrid" type="com.bstek.dorado.view.widget.treegrid.TreeGrid" sortFactor="2070" category="Collection" icon="/com/bstek/dorado/view/widget/treegrid/TreeGrid.png" clientTypes="desktop"><Children><Child name="Nodes" fixed="true"><Rule name="Wrapper.Nodes" label="Nodes" nodeName="Nodes" icon="/com/bstek/dorado/view/widget/treegrid/Nodes.png"><Children><Child rule="BaseNode" name="Nodes" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="DataTreeGrid" parents="AbstractTreeGrid" label="DataTreeGrid" type="com.bstek.dorado.view.widget.treegrid.DataTreeGrid" sortFactor="2071" category="Collection" icon="/com/bstek/dorado/view/widget/treegrid/DataTreeGrid.png" clientTypes="desktop"><Props>
<Prop name="autoCreateColumns" type="java.lang.Boolean"/>
<Prop name="currentNodeDataPath"/>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="dataType" type="com.bstek.dorado.data.type.EntityDataType"/></Props><ClientEvents>
<ClientEvent name="onDataNodeCreate" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="beforeDataNodeCreate" parameters="self,arg"/></ClientEvents><Children><Child name="BindingConfigs" fixed="true"><Rule name="Wrapper.BindingConfigs" label="BindingConfigs" nodeName="BindingConfigs" icon="/com/bstek/dorado/view/widget/tree/BindingConfigs.png"><Children><Child rule="BindingConfig" name="BindingConfigs" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="TagEditor" parents="AbstractTextEditor" label="TagEditor" type="com.bstek.dorado.view.widget.advance.TagEditor" sortFactor="2072" category="Form" icon="/com/bstek/dorado/view/widget/advance/TagEditor.png" clientTypes="desktop"><Props>
<Prop name="acceptUnknownTag" defaultValue="true" type="boolean"/>
<Prop name="availableTags" highlight="1" type="[Ljava.lang.String;"/>
<Prop name="availableTagsDataPath" highlight="1"/>
<Prop name="availableTagsDataSet" highlight="1" reference="DataSet:id"/>
<Prop name="highlightRequiredTags" defaultValue="true" type="boolean"/>
<Prop name="requiredTags" highlight="1" type="[Ljava.lang.String;"/>
<Prop name="showAvailableTags" defaultValue="true" type="boolean"/>
<Prop name="textSeperator" defaultValue=","/></Props><ClientEvents>
<ClientEvent name="beforeTagAdd" parameters="self,arg"/>
<ClientEvent name="beforeUnknownTagAccept" parameters="self,arg"/>
<ClientEvent name="onUnknownTagAccept" parameters="self,arg"/>
<ClientEvent name="onTagAdd" parameters="self,arg"/>
<ClientEvent name="beforeTagRemove" parameters="self,arg"/>
<ClientEvent name="onTagRemove" parameters="self,arg"/></ClientEvents></Rule><Rule name="ColorPicker" parents="com.bstek.dorado.view.widget.Control" label="ColorPicker" type="com.bstek.dorado.view.widget.advance.ColorPicker" sortFactor="2073" category="Form" icon="/com/bstek/dorado/view/widget/advance/ColorPicker.png" clientTypes="desktop"><Props>
<Prop name="allowEmpty" type="boolean"/>
<Prop name="color"/>
<Prop name="disabled" type="boolean"/>
<Prop name="palette" enumValues="#sixteen,#websafe,#named" type="[Ljava.lang.String;"/>
<Prop name="preferredFormat" enumValues="none,hex,hex6,hsl,rgb,name"/>
<Prop name="showAlpha" type="boolean"/>
<Prop name="showButtons" defaultValue="true" type="boolean"/>
<Prop name="showInitial" type="boolean"/>
<Prop name="showInput" type="boolean"/>
<Prop name="showPalette" type="boolean"/>
<Prop name="showPaletteOnly" type="boolean"/></Props></Rule><Rule name="ColorEditor" parents="AbstractDataEditor" label="ColorEditor" type="com.bstek.dorado.view.widget.advance.ColorEditor" sortFactor="2074" category="Form" icon="/com/bstek/dorado/view/widget/advance/ColorEditor.png" clientTypes="desktop"><Props>
<Prop name="allowEmpty" type="boolean"/>
<Prop name="color"/>
<Prop name="disabled" type="boolean"/>
<Prop name="palette" enumValues="#sixteen,#websafe,#named" type="[Ljava.lang.String;"/>
<Prop name="preferredFormat" defaultValue="name" enumValues="none,hex,hex6,hsl,rgb,name"/>
<Prop name="showAlpha" type="boolean"/>
<Prop name="showButtons" defaultValue="true" type="boolean"/>
<Prop name="showInitial" type="boolean"/>
<Prop name="showInput" type="boolean"/>
<Prop name="showPalette" type="boolean"/>
<Prop name="showPaletteOnly" type="boolean"/></Props></Rule><Rule name="UploadAction" parents="Action" label="UploadAction" type="com.bstek.dorado.uploader.widget.UploadAction" sortFactor="2075" category="Action" icon="/com/bstek/dorado/uploader/widget/UploadAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="autoUpload" defaultValue="true" type="boolean"/>
<Prop name="confirmMessage" visible="false"/>
<Prop name="fileResolver" highlight="1"/>
<Prop name="headers" editor="pojo" type="java.util.Map"/>
<Prop name="hotkey" visible="false"/>
<Prop name="maxFileSize" defaultValue="100MB"/>
<Prop name="runtimes" defaultValue="html5,flash,silverlight,gears,browserplus,html4" visible="false"/>
<Prop name="selectionMode" defaultValue="singleFile" enumValues="singleFile,multiFiles"/>
<Prop name="url" defaultValue="&gt;dorado/uploader/fileupload" visible="false"/></Props><ClientEvents>
<ClientEvent name="beforeExecute" parameters="self,arg" deprecated="true"/>
<ClientEvent name="onStateChanged" parameters="self,arg"/>
<ClientEvent name="onError" parameters="self,arg"/>
<ClientEvent name="onRefresh" parameters="self,arg"/>
<ClientEvent name="onExecute" parameters="self,arg" deprecated="true"/>
<ClientEvent name="onChunkUploaded" parameters="self,arg"/>
<ClientEvent name="onFailure" parameters="self,arg" deprecated="true"/>
<ClientEvent name="beforeInit" parameters="self,arg"/>
<ClientEvent name="onFilesAdded" parameters="self,arg"/>
<ClientEvent name="onFilesRemoved" parameters="self,arg"/>
<ClientEvent name="onQueueChanged" parameters="self,arg"/>
<ClientEvent name="beforeFileUpload" parameters="self,arg"/>
<ClientEvent name="onInit" parameters="self,arg"/>
<ClientEvent name="beforeFileUploaded" parameters="self,arg"/>
<ClientEvent name="onUploadProgress" parameters="self,arg"/>
<ClientEvent name="onFileUploaded" parameters="self,arg"/>
<ClientEvent name="onUploadComplete" parameters="self,arg"/>
<ClientEvent name="onSuccess" parameters="self,arg" deprecated="true"/></ClientEvents><Children><Child name="Filters" fixed="true"><Rule name="Wrapper.Filters" label="Filters" nodeName="Filters"><Children><Child rule="Filter" name="Filters" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="DownloadAction" parents="FormSubmitAction" label="DownloadAction" type="com.bstek.dorado.uploader.widget.DownloadAction" sortFactor="2076" category="Action" icon="/com/bstek/dorado/uploader/widget/DownloadAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="action" defaultValue="&gt;dorado/uploader/filedownload" visible="false"/>
<Prop name="fileProvider" highlight="1"/>
<Prop name="inlineMode" defaultValue="off" enumValues="none,off,browser"/></Props></Rule><Rule name="Intro" parents="Component" label="Intro" type="com.bstek.dorado.intro.Intro" sortFactor="2077" category="Advance" icon="/com/bstek/dorado/intro/Intro.png" clientTypes="desktop,touch"><Props>
<Prop name="doneLabel"/>
<Prop name="exitOnEsc" defaultValue="true" type="boolean"/>
<Prop name="exitOnOverlayClick" defaultValue="true" type="boolean"/>
<Prop name="name"/>
<Prop name="nextLabel"/>
<Prop name="prevLabel"/>
<Prop name="showNextButton" defaultValue="true" type="boolean"/>
<Prop name="showPrevButton" defaultValue="true" type="boolean"/>
<Prop name="showSkipButton" defaultValue="true" type="boolean"/>
<Prop name="showStepNumbers" defaultValue="true" type="boolean"/>
<Prop name="skipLabel"/>
<Prop name="tooltipClass"/>
<Prop name="tooltipPosition" highlight="1" enumValues="left,top,right,bottom" deprecated="true"/></Props><ClientEvents>
<ClientEvent name="onStart" parameters="self,arg"/>
<ClientEvent name="onChange" parameters="self,arg"/>
<ClientEvent name="onExit" parameters="self,arg"/>
<ClientEvent name="onBeforeStart" parameters="self,arg"/>
<ClientEvent name="onComplete" parameters="self,arg"/>
<ClientEvent name="onBeforeChange" parameters="self,arg"/></ClientEvents><Children><Child rule="Step" name="Step" aggregated="true"></Child><Child rule="Step" name="Steps" aggregated="true"></Child></Children></Rule><Rule name="Step" label="Step" type="com.bstek.dorado.intro.Step" sortFactor="2078" icon="/com/bstek/dorado/intro/Step.png" clientTypes="desktop,touch"><Props>
<Prop name="arrowAlign" enumValues="left,top,center,right,bottom"/>
<Prop name="arrowDirection" enumValues="left,top,right,bottom"/>
<Prop name="element" highlight="1"/>
<Prop name="ignored" type="boolean"/>
<Prop name="intro" editor="multiLines"/>
<Prop name="name"/>
<Prop name="position" enumValues="left,top,right,bottom" deprecated="true"/>
<Prop name="tags"/><Prop name="tooltipPosition" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="userData" type="java.lang.Object"/></Props></Rule><Rule name="SwfViewer" parents="com.bstek.dorado.view.widget.Control" label="SwfViewer" type="com.bstek.bdf2.swfviewer.widget.SwfViewer" sortFactor="2079" category="BDF2" clientTypes="desktop"><Props>
<Prop name="attributes"/>
<Prop name="expressInstallSwfurl"/>
<Prop name="flashvars"/>
<Prop name="handlerName"/>
<Prop name="height" defaultValue="400"/>
<Prop name="parameter"/>
<Prop name="params"/>
<Prop name="printEnabled" defaultValue="true" type="boolean"/>
<Prop name="showType" defaultValue="complex" enumValues="simple,complex"/>
<Prop name="swfUrl" highlight="1"/>
<Prop name="version"/>
<Prop name="width" defaultValue="400"/></Props></Rule><Rule name="Export2ReportAction" parents="AjaxAction" label="Export2ReportAction" type="com.bstek.bdf2.export.view.Export2ReportAction" sortFactor="2080" category="BDF2" icon="/com/bstek/bdf2/export/view/Export2ReportAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
<Prop name="autoDownload" defaultValue="true" type="boolean"/>
<Prop name="batchable" defaultValue="true" type="boolean"/>
<Prop name="dataBgColor" defaultValue="#FFFFFF"/>
<Prop name="dataFontColor" defaultValue="#000000"/>
<Prop name="dataFontSize" defaultValue="10" type="int"/>
<Prop name="dataScope" defaultValue="currentPage" enumValues="currentPage,serverAll"/>
<Prop name="extension" defaultValue="xls" enumValues="xls,xlsx,pdf,csv"/>
<Prop name="fileName"/>
<Prop name="headerBgColor" defaultValue="#D8D8D8"/>
<Prop name="headerFontColor" defaultValue="#000000"/>
<Prop name="headerFontSize" defaultValue="10" type="int"/>
<Prop name="interceptorName"/>
<Prop name="maxSize" defaultValue="1000" type="int"/>
<Prop name="rowSpace" defaultValue="1" type="int"/>
<Prop name="showPageNumber" defaultValue="true" type="boolean"/>
<Prop name="showTitle" defaultValue="false" type="boolean"/>
<Prop name="template" highlight="1"/>
<Prop name="timeout" type="long"/>
<Prop name="titleBgColor" defaultValue="#FFFFFF"/>
<Prop name="titleFontColor" defaultValue="#000000"/>
<Prop name="titleFontSize" defaultValue="18" type="int"/>
<Prop name="titleName"/></Props><ClientEvents>
<ClientEvent name="onGetExportElement" parameters="self,arg"/>
<ClientEvent name="onGetExportData" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractViewElement" abstract="true" type="com.bstek.dorado.view.AbstractViewElement"><PrimitiveProps>
<Prop name="id" highlight="1"/></PrimitiveProps><Props>
<Prop name="ignored" type="boolean"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="tags"/>
<Prop name="userData" type="java.lang.Object"/></Props></Rule><Rule name="ClientEventSupportedElement" parents="AbstractViewElement" abstract="true" type="com.bstek.dorado.view.ClientEventSupportedElement"></Rule><Rule name="Component" parents="ClientEventSupportedElement" abstract="true" type="com.bstek.dorado.view.widget.Component" scope="protected"><PrimitiveProps>
<Prop name="listener"/></PrimitiveProps><Props>
<Prop name="userData" editor="any" type="java.lang.Object"/></Props><ClientEvents>
<ClientEvent name="onCreate" parameters="self,arg"/>
<ClientEvent name="onAttributeChange" parameters="self,arg"/>
<ClientEvent name="onDestroy" parameters="self,arg"/>
<ClientEvent name="onReady" parameters="self,arg"/></ClientEvents></Rule><Rule name="com.bstek.dorado.view.widget.Control" parents="Component" abstract="true" type="com.bstek.dorado.view.widget.Control" scope="protected" icon="/com/bstek/dorado/view/widget/Control.png" clientTypes="desktop"><PrimitiveProps>
<Prop name="listener"/></PrimitiveProps><Props>
<Prop name="className"/>
<Prop name="dragTags"/>
<Prop name="draggable" type="boolean"/>
<Prop name="droppable" type="boolean"/>
<Prop name="droppableTags"/>
<Prop name="exClassName"/>
<Prop name="height"/>
<Prop name="hideMode" defaultValue="visibility" enumValues="visibility,display"/>
<Prop name="layoutConstraint" type="java.lang.Object"/>
<Prop name="lazyInit" type="java.lang.Boolean"/>
<Prop name="renderOn"/>
<Prop name="renderTo"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="tip"/>
<Prop name="ui" defaultValue="default"/>
<Prop name="visible" type="java.lang.Boolean"/>
<Prop name="width"/></Props><ClientEvents>
<ClientEvent name="onKeyDown" parameters="self,arg"/>
<ClientEvent name="onClick" parameters="self,arg" clientTypes="desktop"/>
<ClientEvent name="onKeyPress" parameters="self,arg"/>
<ClientEvent name="beforeRefreshDom" parameters="self,arg"/>
<ClientEvent name="onRefreshDom" parameters="self,arg"/>
<ClientEvent name="onDragMove" parameters="self,arg"/>
<ClientEvent name="onSwipe" parameters="self,arg" clientTypes="touch"/>
<ClientEvent name="onDoubleClick" parameters="self,arg" clientTypes="desktop"/>
<ClientEvent name="onDraggingSourceOver" parameters="self,arg"/>
<ClientEvent name="onTap" parameters="self,arg" clientTypes="touch"/>
<ClientEvent name="onGetDraggingIndicator" parameters="self,arg"/>
<ClientEvent name="onDraggingSourceMove" parameters="self,arg"/>
<ClientEvent name="onCreateDom" parameters="self,arg"/>
<ClientEvent name="onDraggingSourceOut" parameters="self,arg"/>
<ClientEvent name="onDragStart" parameters="self,arg"/>
<ClientEvent name="onMouseDown" parameters="self,arg"/>
<ClientEvent name="onContextMenu" parameters="self,arg"/>
<ClientEvent name="beforeDraggingSourceDrop" parameters="self,arg"/>
<ClientEvent name="onTapHold" parameters="self,arg" clientTypes="touch"/>
<ClientEvent name="onDraggingSourceDrop" parameters="self,arg"/>
<ClientEvent name="onFocus" parameters="self,arg"/>
<ClientEvent name="onDoubleTap" parameters="self,arg" clientTypes="touch"/>
<ClientEvent name="onBlur" parameters="self,arg"/>
<ClientEvent name="onResize" parameters="self,arg"/>
<ClientEvent name="onDragStop" parameters="self,arg"/>
<ClientEvent name="onMouseUp" parameters="self,arg"/></ClientEvents></Rule><Rule name="AsyncAction" parents="Action" abstract="true" type="com.bstek.dorado.view.widget.action.AsyncAction" scope="protected"><Props>
<Prop name="async" defaultValue="true" type="boolean"/>
<Prop name="executingMessage"/>
<Prop name="modal" defaultValue="true" type="boolean"/></Props></Rule><Rule name="UpdateItem" label="UpdateItem" type="com.bstek.dorado.view.widget.action.UpdateItem" icon="/com/bstek/dorado/view/widget/action/UpdateItem.png"><Props>
<Prop name="alias"/>
<Prop name="autoResetEntityState" defaultValue="true" type="boolean"/>
<Prop name="dataPath" defaultValue="!DIRTY_TREE" enumValues="!DIRTY_TREE,!CASCADE_DIRTY,[#dirty],[#all],[#visible],[#current]"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="firstResultOnly" type="boolean"/>
<Prop name="refreshMode" defaultValue="value" enumValues="none,state,value,cascade"/>
<Prop name="submitDeletedEntity" type="java.lang.Boolean"/>
<Prop name="submitOldData" type="boolean"/>
<Prop name="submitSimplePropertyOnly" type="boolean"/>
<Prop name="validateData" defaultValue="true" type="boolean"/></Props></Rule><Rule name="AbstractButton" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.base.AbstractButton" scope="protected" clientTypes="desktop"><Props>
<Prop name="action" highlight="1" reference="Action:id"/>
<Prop name="disabled" type="boolean"/>
<Prop name="menu" reference="Menu:id"/>
<Prop name="toggleOnShowMenu" defaultValue="true" type="boolean"/>
<Prop name="toggleable" type="boolean"/>
<Prop name="toggled" type="boolean"/></Props></Rule><Rule name="AbstractPanel" parents="Container" abstract="true" type="com.bstek.dorado.view.widget.base.AbstractPanel" scope="protected" clientTypes="desktop"><Props>
<Prop name="buttonAlign" defaultValue="center" enumValues="left,center,right"/>
<Prop name="caption"/>
<Prop name="collapseable" defaultValue="true" type="boolean"/>
<Prop name="collapsed" defaultValue="false" type="boolean"/>
<Prop name="lazyInitChildren" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onCollapsedChange" parameters="self,arg"/>
<ClientEvent name="beforeCollapsedChange" parameters="self,arg"/></ClientEvents><Children><Child name="Buttons" fixed="true"><Rule name="Wrapper.Buttons" label="Buttons" nodeName="Buttons" icon="/com/bstek/dorado/view/widget/base/Buttons.png"><Children><Child rule="Button" name="Buttons" aggregated="true"></Child></Children></Rule></Child><Child name="Children" fixed="true"><Rule name="Wrapper.Children" label="Children" nodeName="Children" icon="/com/bstek/dorado/view/widget/base/Children.png"><Children><Child rule="Component" name="Children" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="IFrameTab" parents="Tab" label="IFrameTab" type="com.bstek.dorado.view.widget.base.tab.IFrameTab" scope="protected" icon="/com/bstek/dorado/view/widget/base/tab/IFrameTab.png"><Props>
<Prop name="iframeHeight" type="java.lang.Integer"/>
<Prop name="path" highlight="1"/></Props></Rule><Rule name="Tab" parents="ClientEventSupportedElement" label="Tab" type="com.bstek.dorado.view.widget.base.tab.Tab" scope="protected" icon="/com/bstek/dorado/view/widget/base/tab/Tab.png"><Props>
<Prop name="caption" highlight="1"/>
<Prop name="className"/>
<Prop name="closeable" type="boolean"/>
<Prop name="disabled" type="boolean"/>
<Prop name="exClassName" deprecated="true"/>
<Prop name="height"/>
<Prop name="icon"/>
<Prop name="iconClass"/>
<Prop name="name"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="tip"/>
<Prop name="visible" defaultValue="true" type="boolean"/>
<Prop name="width"/></Props><ClientEvents>
<ClientEvent name="onClose" parameters="self,arg"/>
<ClientEvent name="onClick" parameters="self,arg"/>
<ClientEvent name="beforeClose" parameters="self,arg"/></ClientEvents></Rule><Rule name="ControlTab" parents="Tab" label="ControlTab" type="com.bstek.dorado.view.widget.base.tab.ControlTab" scope="protected" icon="/com/bstek/dorado/view/widget/base/tab/ControlTab.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Control"></Child></Children></Rule><Rule name="AbstractTabControl" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.base.tab.AbstractTabControl" scope="protected" clientTypes="desktop"><Props>
<Prop name="alwaysShowNavButtons" type="boolean"/>
<Prop name="currentTab" type="int"/></Props><ClientEvents>
<ClientEvent name="onTabContextMenu" parameters="self,arg"/>
<ClientEvent name="onTabChange" parameters="self,arg"/>
<ClientEvent name="onTabRemove" parameters="self,arg"/>
<ClientEvent name="beforeTabChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="MenuButton" parents="Button" label="MenuButton" nodeName="MenuButton" type="com.bstek.dorado.view.widget.base.toolbar.MenuButton" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/MenuButton.png" clientTypes="desktop"><Props>
<Prop name="hideMenuOnMouseLeave" type="boolean"/>
<Prop name="hideMenuOnMouseLeaveDelay" defaultValue="300" type="int"/>
<Prop name="menu" deprecated="true" visible="false"/>
<Prop name="showMenuOnHover" defaultValue="false" type="boolean"/></Props><Children><Child rule="BaseMenuItem" name="Items" aggregated="true"></Child></Children></Rule><Rule name="BaseMenuItem" parents="ClientEventSupportedElement" abstract="true" type="com.bstek.dorado.view.widget.base.menu.BaseMenuItem"><Props>
<Prop name="className"/>
<Prop name="exClassName"/>
<Prop name="height"/>
<Prop name="name"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="tip"/>
<Prop name="visible" defaultValue="true" type="boolean"/>
<Prop name="width"/></Props></Rule><Rule name="MenuItem" parents="TextMenuItem" label="MenuItem" type="com.bstek.dorado.view.widget.base.menu.MenuItem" icon="/com/bstek/dorado/view/widget/base/menu/MenuItem.png" clientTypes="desktop"><Children><Child rule="BaseMenuItem" name="Items" aggregated="true"></Child></Children></Rule><Rule name="TextMenuItem" parents="BaseMenuItem" abstract="true" type="com.bstek.dorado.view.widget.base.menu.TextMenuItem"><Props>
<Prop name="action" reference="Action:id"/>
<Prop name="caption"/>
<Prop name="disabled" type="boolean"/>
<Prop name="hideOnClick" defaultValue="true" type="boolean"/>
<Prop name="icon"/>
<Prop name="iconClass"/></Props><ClientEvents>
<ClientEvent name="onClick" parameters="self,arg"/></ClientEvents></Rule><Rule name="Separator" parents="BaseMenuItem" label="Separator" type="com.bstek.dorado.view.widget.base.menu.Separator" icon="/com/bstek/dorado/view/widget/base/menu/Separator.png" clientTypes="desktop,touch"></Rule><Rule name="CheckableMenuItem" parents="MenuItem" label="CheckableMenuItem" type="com.bstek.dorado.view.widget.base.menu.CheckableMenuItem" icon="/com/bstek/dorado/view/widget/base/menu/CheckableMenuItem.png" clientTypes="desktop"><Props>
<Prop name="checked" type="boolean"/>
<Prop name="group"/></Props><ClientEvents>
<ClientEvent name="onCheckedChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="ControlMenuItem" parents="TextMenuItem" label="ControlMenuItem" type="com.bstek.dorado.view.widget.base.menu.ControlMenuItem" icon="/com/bstek/dorado/view/widget/base/menu/ControlMenuItem.png" clientTypes="desktop"><Children><Child rule="FloatControl" name="Control"></Child></Children></Rule><Rule name="FloatControl" abstract="true" type="com.bstek.dorado.view.widget.FloatControl"><Props>
<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
<Prop name="anchorTarget" visible="false"/>
<Prop name="animateTarget" visible="false"/>
<Prop name="animateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="autoAdjustPosition" type="boolean"/>
<Prop name="center" type="boolean"/>
<Prop name="continuedFocus" type="boolean"/>
<Prop name="floating" type="boolean"/>
<Prop name="floatingClassName"/>
<Prop name="focusAfterShow" type="boolean"/>
<Prop name="handleOverflow" visible="false" type="boolean"/>
<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="left" type="int"/>
<Prop name="modal" type="boolean"/>
<Prop name="modalType" enumValues="dark,transparent"/>
<Prop name="offsetLeft" type="int"/>
<Prop name="offsetTop" type="int"/>
<Prop name="shadowMode" enumValues="drop,sides,frame,none"/>
<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
<Prop name="top" type="int"/>
<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/></Props></Rule><Rule name="com.bstek.dorado.view.widget.base.toolbar.Label" parents="com.bstek.dorado.view.widget.Control" label="Label" nodeName="ToolBarLabel" type="com.bstek.dorado.view.widget.base.toolbar.Label" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Label.png" clientTypes="desktop"><Props>
<Prop name="text"/></Props></Rule><Rule name="com.bstek.dorado.view.widget.base.toolbar.Separator" parents="com.bstek.dorado.view.widget.Control" label="Separator" type="com.bstek.dorado.view.widget.base.toolbar.Separator" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Separator.png" clientTypes="desktop"></Rule><Rule name="com.bstek.dorado.view.widget.base.toolbar.Button" parents="Button" label="ToolBarButton" nodeName="ToolBarButton" type="com.bstek.dorado.view.widget.base.toolbar.Button" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Button.png" clientTypes="desktop"><Props>
<Prop name="hideMenuOnMouseLeave" type="boolean"/>
<Prop name="hideMenuOnMouseLeaveDelay" defaultValue="300" type="int"/>
<Prop name="showMenuOnHover" defaultValue="false" type="boolean"/></Props></Rule><Rule name="Fill" parents="com.bstek.dorado.view.widget.Control" label="Fill" type="com.bstek.dorado.view.widget.base.toolbar.Fill" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Fill.png" clientTypes="desktop"></Rule><Rule name="Section" parents="ClientEventSupportedElement" label="Section" type="com.bstek.dorado.view.widget.base.accordion.Section" icon="/com/bstek/dorado/view/widget/base/accordion/Section.png"><Props>
<Prop name="caption"/>
<Prop name="className"/>
<Prop name="disabled" type="boolean"/>
<Prop name="exClassName"/>
<Prop name="icon"/>
<Prop name="iconClass"/>
<Prop name="name"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
<Prop name="tip"/>
<Prop name="visible" defaultValue="true" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onCaptionClick" parameters="self,arg"/></ClientEvents><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Control"></Child></Children></Rule><Rule name="AbstractDataControl" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.datacontrol.AbstractDataControl" scope="protected" clientTypes="desktop"><Props>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractPropertyDataControl" parents="AbstractDataControl" abstract="true" type="com.bstek.dorado.view.widget.datacontrol.AbstractPropertyDataControl" scope="protected" clientTypes="desktop"><Props>
<Prop name="property" highlight="1"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractEditor" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractEditor" scope="protected" clientTypes="desktop"><Props>
<Prop name="readOnly" type="boolean"/>
<Prop name="supportsDirtyFlag" defaultValue="true" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onPost" parameters="self,arg"/>
<ClientEvent name="beforePost" parameters="self,arg"/>
<ClientEvent name="onPostFailed" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractDataEditor" parents="AbstractEditor" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractDataEditor" scope="protected" clientTypes="desktop"><Props>
<Prop name="dataPath" highlight="1"/>
<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
<Prop name="property" highlight="1"/></Props><ClientEvents>
<ClientEvent name="onGetBindingData" parameters="self,arg"/>
<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractTextBox" parents="AbstractDataEditor" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractTextBox" scope="protected" clientTypes="desktop"><Props>
<Prop name="text"/>
<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,autoOpenMappingDropDown1,autoOpenMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/></Props><ClientEvents>
<ClientEvent name="onValidationStateChange" parameters="self,arg"/>
<ClientEvent name="onTriggerClick" parameters="self,arg"/>
<ClientEvent name="onTextEdit" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractTextEditor" parents="AbstractTextBox" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractTextEditor" scope="protected" clientTypes="desktop"><Props>
<Prop name="blankText"/>
<Prop name="editable" defaultValue="true" type="boolean"/>
<Prop name="maxLength" type="int"/>
<Prop name="minLength" type="int"/>
<Prop name="required" type="boolean"/>
<Prop name="selectTextOnFocus" defaultValue="true" type="boolean"/></Props></Rule><Rule name="RadioButton" label="RadioButton" type="com.bstek.dorado.view.widget.form.RadioButton" icon="/com/bstek/dorado/view/widget/form/RadioButton.png"><Props>
<Prop name="readOnly" type="boolean"/>
<Prop name="text"/>
<Prop name="value" type="java.lang.Object"/></Props></Rule><Rule name="AutoFormElement" parents="FormElement" label="AutoFormElement" type="com.bstek.dorado.view.widget.form.autoform.AutoFormElement" scope="protected" category="AutoForm" icon="/com/bstek/dorado/view/widget/form/autoform/AutoFormElement.png" labelProperty="id,name,property" clientTypes="desktop,touch"><Props>
<Prop name="name"/></Props></Rule><Rule name="Spinner" parents="AbstractTextBox" abstract="true" type="com.bstek.dorado.view.widget.form.Spinner" scope="protected" clientTypes="desktop"><Props>
<Prop name="postValueOnSpin" defaultValue="true" type="boolean"/>
<Prop name="showSpinTrigger" defaultValue="true" type="boolean"/>
<Prop name="step" defaultValue="1" type="int"/></Props></Rule><Rule name="DropDown" parents="Trigger" abstract="true" type="com.bstek.dorado.view.widget.form.trigger.DropDown" scope="protected"><Props>
<Prop name="assignmentMap"/>
<Prop name="autoOpen" type="boolean"/>
<Prop name="height" type="int"/>
<Prop name="maxHeight" type="int"/>
<Prop name="maxWidth" type="int"/>
<Prop name="minHeight" type="int"/>
<Prop name="minWidth" type="int"/>
<Prop name="postValueOnSelect" defaultValue="true" type="boolean"/>
<Prop name="width" type="int"/></Props><ClientEvents>
<ClientEvent name="onValueSelect" parameters="self,arg"/>
<ClientEvent name="onClose" parameters="self,arg"/>
<ClientEvent name="onOpen" parameters="self,arg"/></ClientEvents></Rule><Rule name="RowListDropDown" parents="DropDown" abstract="true" type="com.bstek.dorado.view.widget.form.trigger.RowListDropDown" scope="protected"><Props>
<Prop name="displayProperty"/>
<Prop name="dynaFilter" type="boolean"/>
<Prop name="filterOnOpen" type="boolean"/>
<Prop name="filterOnTyping" defaultValue="true" type="boolean"/>
<Prop name="minFilterInterval" defaultValue="300" type="int"/>
<Prop name="property" highlight="1"/>
<Prop name="useEmptyItem" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onFilterItems" parameters="self,arg"/>
<ClientEvent name="onFilterItem" parameters="self,arg"/></ClientEvents><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule><Rule name="Column" parents="ClientEventSupportedElement" abstract="true" type="com.bstek.dorado.view.widget.grid.Column"><Props>
<Prop name="align" enumValues="left,center,right"/>
<Prop name="caption"/>
<Prop name="headerAlign" defaultValue="center" enumValues="left,center,right"/>
<Prop name="headerRenderer"/>
<Prop name="name"/>
<Prop name="supportsOptionMenu" defaultValue="true" type="boolean"/>
<Prop name="visible" defaultValue="true" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onGetCellEditor" parameters="self,arg"/>
<ClientEvent name="onHeaderClick" parameters="self,arg"/>
<ClientEvent name="onRenderHeaderCell" parameters="self,arg"/></ClientEvents></Rule><Rule name="RowSelectorColumn" parents="AbstractDataColumn" label="RowSelectorColumn" type="com.bstek.dorado.view.widget.grid.RowSelectorColumn" icon="/com/bstek/dorado/view/widget/grid/RowSelectorColumn.png"></Rule><Rule name="AbstractDataColumn" parents="Column" abstract="true" type="com.bstek.dorado.view.widget.grid.AbstractDataColumn"><Props>
<Prop name="filterBarRenderer"/>
<Prop name="footerRenderer"/>
<Prop name="renderer"/>
<Prop name="resizeable" defaultValue="true" type="boolean"/>
<Prop name="width"/></Props><ClientEvents>
<ClientEvent name="onRenderFooterCell" parameters="self,arg"/>
<ClientEvent name="onRenderCell" parameters="self,arg"/></ClientEvents></Rule><Rule name="IndicatorColumn" parents="AbstractDataColumn" label="IndicatorColumn" type="com.bstek.dorado.view.widget.grid.IndicatorColumn" icon="/com/bstek/dorado/view/widget/grid/IndicatorColumn.png"></Rule><Rule name="RowNumColumn" parents="AbstractDataColumn" label="RowNumColumn" type="com.bstek.dorado.view.widget.grid.RowNumColumn" icon="/com/bstek/dorado/view/widget/grid/RowNumColumn.png"></Rule><Rule name="DataColumn" parents="AbstractDataColumn" label="DataColumn" type="com.bstek.dorado.view.widget.grid.DataColumn" icon="/com/bstek/dorado/view/widget/grid/DataColumn.png" labelProperty="name,property"><Props>
<Prop name="align" enumValues="left,center,right"/>
<Prop name="dataType" type="com.bstek.dorado.data.type.DataType"/>
<Prop name="defaultFilterOperator"/>
<Prop name="displayFormat"/>
<Prop name="editable" defaultValue="true" type="boolean"/>
<Prop name="editorType" defaultValue="TextEditor" highlight="1" enumValues="None,TextEditor,PasswordEditor,TextArea,CheckBox,RadioGroup,NumberSpinner"/>
<Prop name="filterable" defaultValue="true" type="boolean"/>
<Prop name="property" highlight="1"/>
<Prop name="readOnly" type="boolean"/>
<Prop name="required" type="boolean"/>
<Prop name="sortState" defaultValue="none" enumValues="none,asc,desc"/>
<Prop name="summaryType" enumValues="sum,average,count,max,min"/>
<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,autoOpenMappingDropDown1,autoOpenMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/>
<Prop name="typeFormat"/>
<Prop name="wrappable" type="boolean"/></Props><Children><Child name="Editor" fixed="true"><Rule name="Wrapper.Editor" label="Editor" nodeName="Editor" icon="/com/bstek/dorado/view/widget/grid/Editor.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Editor"></Child></Children></Rule></Child></Children></Rule><Rule name="ColumnGroup" parents="Column" label="ColumnGroup" type="com.bstek.dorado.view.widget.grid.ColumnGroup" icon="/com/bstek/dorado/view/widget/grid/ColumnGroup.png"><Props>
<Prop name="align" enumValues="left,center,right" visible="false"/></Props><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule><Rule name="AbstractList" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.list.AbstractList" scope="protected" clientTypes="desktop"><Props>
<Prop name="allowNoCurrent" type="boolean"/>
<Prop name="dragMode" defaultValue="item" enumValues="item,control,itemOrControl"/>
<Prop name="dropMode" defaultValue="insertItems" enumValues="onControl,onItem,insertItems,onOrInsertItems,onAnyWhere"/>
<Prop name="scrollMode" defaultValue="lazyRender" enumValues="simple,lazyRender,viewport"/>
<Prop name="selectionMode" defaultValue="none" enumValues="none,singleRow,multiRows"/>
<Prop name="useNativeScrollbars" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onCompareItems" parameters="self,arg"/>
<ClientEvent name="onCurrentChange" parameters="self,arg"/>
<ClientEvent name="onFilterItem" parameters="self,arg"/>
<ClientEvent name="onSelectionChange" parameters="self,arg"/>
<ClientEvent name="beforeSelectionChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="RowList" parents="AbstractList" abstract="true" type="com.bstek.dorado.view.widget.list.RowList" scope="protected" clientTypes="desktop"><Props>
<Prop name="highlightCurrentRow" defaultValue="true" type="boolean"/>
<Prop name="highlightHoverRow" defaultValue="true" type="boolean"/>
<Prop name="highlightSelectedRow" defaultValue="true" type="boolean"/>
<Prop name="rowHeight" type="int"/></Props><ClientEvents>
<ClientEvent name="onDataRowClick" parameters="self,arg"/>
<ClientEvent name="onDataRowDoubleClick" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractListBox" parents="RowList" abstract="true" type="com.bstek.dorado.view.widget.list.AbstractListBox" scope="protected" clientTypes="desktop"><Props>
<Prop name="property"/>
<Prop name="renderer"/></Props><ClientEvents>
<ClientEvent name="onRenderRow" parameters="self,arg"/></ClientEvents></Rule><Rule name="GridSupport" parents="RowList" abstract="true" type="com.bstek.dorado.view.widget.grid.GridSupport" scope="protected" clientTypes="desktop"><Props>
<Prop name="cellRenderer"/>
<Prop name="dynaRowHeight" type="boolean"/>
<Prop name="fixedColumnCount" type="int"/>
<Prop name="footerRenderer"/>
<Prop name="footerRowHeight" type="int"/>
<Prop name="headerRenderer"/>
<Prop name="headerRowHeight" type="int"/>
<Prop name="readOnly" type="boolean"/>
<Prop name="rowRenderer"/>
<Prop name="showFooter" type="boolean"/>
<Prop name="showHeader" defaultValue="true" type="boolean"/>
<Prop name="stretchColumnsMode" defaultValue="auto" enumValues="auto,off,stretchableColumns,lastColumn,allColumns,allResizeableColumns"/></Props><ClientEvents>
<ClientEvent name="beforeCellValueEdit" parameters="self,arg"/>
<ClientEvent name="onGetCellEditor" parameters="self,arg"/>
<ClientEvent name="onRenderRow" parameters="self,arg"/>
<ClientEvent name="onRenderFooterCell" parameters="self,arg"/>
<ClientEvent name="onCellValueEdit" parameters="self,arg"/>
<ClientEvent name="onRenderCell" parameters="self,arg"/>
<ClientEvent name="onHeaderClick" parameters="self,arg"/>
<ClientEvent name="onRenderHeaderCell" parameters="self,arg"/></ClientEvents><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule><Rule name="AbstractGrid" parents="GridSupport" abstract="true" type="com.bstek.dorado.view.widget.grid.AbstractGrid" scope="protected" clientTypes="desktop"><Props>
<Prop name="filterBarRenderer"/>
<Prop name="groupFooterRenderer"/>
<Prop name="groupHeaderRenderer"/>
<Prop name="groupOnSort" defaultValue="true" type="boolean"/>
<Prop name="groupProperty"/>
<Prop name="showFilterBar" type="boolean"/>
<Prop name="showGroupFooter" type="boolean"/></Props></Rule><Rule name="AbstractTree" parents="RowList" abstract="true" type="com.bstek.dorado.view.widget.tree.AbstractTree" scope="protected" clientTypes="desktop"><Props>
<Prop name="defaultExpandedIcon"/>
<Prop name="defaultExpandedIconClass"/>
<Prop name="defaultIcon"/>
<Prop name="defaultIconClass"/>
<Prop name="dropMode" defaultValue="onItem" enumValues="onControl,onItem,insertItems,onOrInsertItems,onAnyWhere"/>
<Prop name="expandingAnimated" defaultValue="true" type="boolean"/>
<Prop name="expandingMode" defaultValue="async" enumValues="async,sync"/>
<Prop name="indent" type="int"/>
<Prop name="renderer"/>
<Prop name="scrollMode" enumValues="simple,lazyRender,viewport"/>
<Prop name="showLines" type="boolean"/></Props><ClientEvents>
<ClientEvent name="onRenderNode" parameters="self,arg"/>
<ClientEvent name="onCollapse" parameters="self,arg"/>
<ClientEvent name="onNodeAttached" parameters="self,arg"/>
<ClientEvent name="beforeNodeCheckedChange" parameters="self,arg"/>
<ClientEvent name="onExpand" parameters="self,arg"/>
<ClientEvent name="beforeCollapse" parameters="self,arg"/>
<ClientEvent name="beforeCurrentChange" parameters="self,arg"/>
<ClientEvent name="beforeExpand" parameters="self,arg"/>
<ClientEvent name="onNodeDetached" parameters="self,arg"/>
<ClientEvent name="onNodeCheckedChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="BaseNode" abstract="true" type="com.bstek.dorado.view.widget.tree.BaseNode"><Props>
<Prop name="autoCheckChildren" defaultValue="true" type="boolean"/>
<Prop name="checkable" type="boolean"/>
<Prop name="checked" type="boolean"/>
<Prop name="data" type="java.lang.Object"/>
<Prop name="expanded" type="boolean"/>
<Prop name="expandedIcon"/>
<Prop name="expandedIconClass"/>
<Prop name="hasChild" type="boolean"/>
<Prop name="icon"/>
<Prop name="iconClass"/>
<Prop name="ignored" type="boolean"/>
<Prop name="label"/>
<Prop name="tags"/>
<Prop name="tip"/>
<Prop name="userData" type="java.lang.Object"/></Props><Children><Child rule="BaseNode" name="Nodes" aggregated="true"></Child></Children></Rule><Rule name="Node" parents="BaseNode" label="Node" type="com.bstek.dorado.view.widget.tree.Node" icon="/com/bstek/dorado/view/widget/tree/Node.png"><PrimitiveProps>
<Prop name="id" highlight="1"/></PrimitiveProps><Props><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop></Props></Rule><Rule name="BindingConfig" label="BindingConfig" type="com.bstek.dorado.view.widget.tree.BindingConfig" icon="/com/bstek/dorado/view/widget/tree/BindingConfig.png"><Props>
<Prop name="autoCheckChildren" defaultValue="true" type="boolean"/>
<Prop name="checkable" type="boolean"/>
<Prop name="checkedProperty"/>
<Prop name="childrenProperty"/>
<Prop name="expandLevel" type="int"/>
<Prop name="expandedIcon"/>
<Prop name="expandedIconClass"/>
<Prop name="expandedIconProperty"/>
<Prop name="hasChild" type="java.lang.Boolean"/>
<Prop name="hasChildProperty"/>
<Prop name="icon"/>
<Prop name="iconClass"/>
<Prop name="iconProperty"/>
<Prop name="ignored" type="boolean"/>
<Prop name="labelProperty"/>
<Prop name="name"/>
<Prop name="recursive" type="boolean"/>
<Prop name="tags"/>
<Prop name="tipProperty"/></Props><Children><Child rule="BindingConfig" name="ChildBindingConfigs" aggregated="true"></Child></Children></Rule><Rule name="AbstractBlockView" parents="AbstractList" abstract="true" type="com.bstek.dorado.view.widget.blockview.AbstractBlockView" scope="protected" clientTypes="desktop"><Props>
<Prop name="blockDecoratorSize" defaultValue="4" type="int"/>
<Prop name="blockHeight" defaultValue="80" type="int"/>
<Prop name="blockLayout" defaultValue="vertical" enumValues="vertical,horizontal"/>
<Prop name="blockWidth" defaultValue="80" type="int"/>
<Prop name="fillLine" type="boolean"/>
<Prop name="horiPadding" defaultValue="8" type="int"/>
<Prop name="horiSpacing" defaultValue="8" type="int"/>
<Prop name="lineSize" type="int"/>
<Prop name="renderer"/>
<Prop name="vertPadding" defaultValue="8" type="int"/>
<Prop name="vertSpacing" defaultValue="8" type="int"/></Props><ClientEvents>
<ClientEvent name="onBlockClick" parameters="self,arg" clientTypes="desktop"/>
<ClientEvent name="onBlockDoubleClick" parameters="self,arg" clientTypes="desktop"/>
<ClientEvent name="onRenderBlock" parameters="self,arg"/>
<ClientEvent name="onBlockTap" parameters="self,arg" clientTypes="touch"/>
<ClientEvent name="onBlockMouseDown" parameters="self,arg"/>
<ClientEvent name="onBlockMouseUp" parameters="self,arg"/>
<ClientEvent name="onBlockTapHold" parameters="self,arg" clientTypes="touch"/></ClientEvents></Rule><Rule name="AbstractTreeGrid" parents="GridSupport" abstract="true" type="com.bstek.dorado.view.widget.treegrid.AbstractTreeGrid" scope="protected" clientTypes="desktop"><Props>
<Prop name="defaultExpandedIcon"/>
<Prop name="defaultExpandedIconClass"/>
<Prop name="defaultIcon"/>
<Prop name="defaultIconClass"/>
<Prop name="dropMode" defaultValue="onItem" enumValues="onControl,onItem,insertItems,onOrInsertItems,onAnyWhere"/>
<Prop name="expandingAnimated" defaultValue="true" type="boolean"/>
<Prop name="expandingMode" defaultValue="async" enumValues="async,sync"/>
<Prop name="indent" type="int"/>
<Prop name="showLines" type="boolean"/>
<Prop name="treeColumn" highlight="1"/></Props><ClientEvents>
<ClientEvent name="onRenderNode" parameters="self,arg"/>
<ClientEvent name="onCollapse" parameters="self,arg"/>
<ClientEvent name="onNodeAttached" parameters="self,arg"/>
<ClientEvent name="beforeNodeCheckedChange" parameters="self,arg"/>
<ClientEvent name="onExpand" parameters="self,arg"/>
<ClientEvent name="beforeCollapse" parameters="self,arg"/>
<ClientEvent name="beforeExpand" parameters="self,arg"/>
<ClientEvent name="onNodeDetached" parameters="self,arg"/>
<ClientEvent name="onNodeCheckedChange" parameters="self,arg"/></ClientEvents><Children><Child name="Columns" fixed="true"><Rule name="Wrapper.Columns" label="Columns" nodeName="Columns" icon="/com/bstek/dorado/view/widget/treegrid/Columns.png"><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="Filter" label="Filter" type="com.bstek.dorado.uploader.widget.Filter" labelProperty="title"><Props>
<Prop name="extensions"/>
<Prop name="title"/></Props></Rule><Rule name="DefaultView" parents="View" label="View" nodeName="View" type="com.bstek.dorado.view.DefaultView" category="General" icon="/com/bstek/dorado/view/DefaultView.png" clientTypes="desktop"></Rule></RuleSet>
igds-recir/.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
/target/
igds-security/src/main/java/com/ld/igds/models/SecSnapConf.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ld.igds.models;
import com.bstek.dorado.annotation.PropertyDef;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
 * ä»“内视频抓拍配置
 */
@Data
@Entity
@Table(name = "D_SEC_SNAP_CONF")
public class SecSnapConf {
    @Id
    @Column(name = "ID_", length = 40)
    @PropertyDef(label = "主键")
    private String id;
    @Column(name = "COMPANY_ID_", length = 10)
    @PropertyDef(label = "组织编码")
    private String companyId;
    @Column(name = "DEPT_ID_", length = 30)
    @PropertyDef(label = "所属分库")
    private String deptId;
    @Column(name = "DEPOT_ID_", length = 50)
    @PropertyDef(label = "所属仓库")
    private String depotId;
    @Column(name = "CAMERA_ID_", length = 50)
    @PropertyDef(label = "关联摄像头")
    private String cameraId;
    @Column(name = "ACT_HOUR1_")
    @PropertyDef(label = "执行时间1")
    private int actHour1;
    @Column(name = "ACT_HOUR2_")
    @PropertyDef(label = "执行时间2")
    private int actHour2;
    @Column(name = "ACT_HOUR3_")
    @PropertyDef(label = "执行时间3")
    private int actHour3;
    @Column(name = "UPDATE_TIME_")
    @PropertyDef(label = "更新时间")
    private Date updateTime;
}
igds-security/src/main/java/com/ld/igds/models/SecSnapDepot.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ld.igds.models;
import com.alibaba.fastjson.annotation.JSONField;
import com.bstek.dorado.annotation.PropertyDef;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
 * ä»“内视频图像数据表
 */
@Data
@Entity
@Table(name = "D_SEC_SNAP_DEPOT")
public class SecSnapDepot {
    @Id
    @Column(name = "ID_", length = 40)
    @PropertyDef(label = "主键")
    private String id;
    @Column(name = "COMPANY_ID_", length = 10)
    @PropertyDef(label = "组织编码")
    private String companyId;
    @Column(name = "DEPT_ID_", length = 30)
    @PropertyDef(label = "所属分库")
    private String deptId;
    @Column(name = "DEPOT_ID_", length = 50)
    @PropertyDef(label = "所属仓库")
    private String depotId;
    @Column(name = "CAMERA_ID_", length = 50)
    @PropertyDef(label = "关联摄像头")
    private String cameraId;
    @Column(name = "RESULT_", length = 30)
    @PropertyDef(label = "抓拍结果")
    private String result = "SUCCESS";
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "UPDATE_TIME_")
    @PropertyDef(label = "抓拍时间")
    private Date updateTime;
    @Column(name = "FILE_SUFFIX_", length = 4)
    @PropertyDef(label = "图像文件后缀名")
    private String fileSuffix = "jpg";
    @Column(name = "FILE_NAME_", length = 100)
    @PropertyDef(label = "文件名称")
    private String fileName;
    @Column(name = "PRESET_ ", length = 4)
    @PropertyDef(label = "预置位编号")
    private String preset;
    public SecSnapDepot() {
    }
    public SecSnapDepot(String id, String companyId, String deptId, String depotId, String cameraId, String result, Date updateTime, String fileSuffix, String fileName, String preset) {
        this.id = id;
        this.companyId = companyId;
        this.deptId = deptId;
        this.depotId = depotId;
        this.cameraId = cameraId;
        this.result = result;
        this.updateTime = updateTime;
        this.fileSuffix = fileSuffix;
        this.fileName = fileName;
        this.preset = preset;
    }
    public SecSnapDepot(String tag) {
        if ("TEST".equals(tag)) {
            this.id = "TEST";
            this.fileName = "./static/images/img-fail.jpg";
            this.updateTime = new Date();
        }
    }
}
igds-security/src/main/java/com/ld/igds/sec/service/SecSnapDepotService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,151 @@
package com.ld.igds.sec.service;
import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
import com.bstek.dorado.data.provider.Page;
import com.ld.igds.models.SecSnapConf;
import com.ld.igds.models.SecSnapDepot;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Repository
public class SecSnapDepotService extends HibernateDao {
    public void pageSnapDepot(Page<SecSnapDepot> page, Map<String, Object> param) throws Exception {
        String hql = " from " + SecSnapDepot.class.getName()
                + " where companyId=:companyId and deptId=:deptId";
        Map<String, Object> args = new HashMap<>();
        args.put("companyId", param.get("companyId"));
        args.put("deptId", param.get("deptId"));
        String str = (String) param.get("depotId");
        if (StringUtils.isNotEmpty(str)) {
            hql += " and depotId =:depotId";
            args.put("depotId", str);
        }
        Date date = (Date) param.get("start");
        if (null != date) {
            hql += " and updateTime >=:start";
            args.put("start", DateUtil.getCurZero(date));
        }
        date = (Date) param.get("end");
        if (null != date) {
            hql += " and updateTime <:end";
            args.put("end", DateUtil.getNextZero(date));
        }
        String countHql = "select count(1) " + hql;
        hql += " order by updateTime desc";
        this.pagingQuery(page, hql, countHql, args);
    }
    /**
     * æ ¹æ®æ¡ä»¶èŽ·å–é…ç½®ç±»åˆ«
     *
     * @param companyId ç»„织编码,不可为空
     * @param deptId    æ‰€å±žåˆ†åº“,可为空
     * @return æŸ¥è¯¢ç»“æžœ
     */
    public List<SecSnapConf> listSnapConf(String companyId, String deptId) {
        String hql = " from " + SecSnapConf.class.getName()
                + " where companyId=:companyId";
        Map<String, Object> args = new HashMap<>();
        args.put("companyId", companyId);
        if (StringUtils.isNotEmpty(deptId)) {
            hql += " and deptId =:deptId";
            args.put("deptId", deptId);
        }
        return this.query(hql, args);
    }
    public void addData(SecSnapConf snapConf, String fileName, String result) {
        Session session = this.getSessionFactory().openSession();
        try {
            SecSnapDepot data = new SecSnapDepot();
            data.setId(ContextUtil.getUUID());
            data.setCompanyId(snapConf.getCompanyId());
            data.setDeptId(snapConf.getDeptId());
            data.setDepotId(snapConf.getDepotId());
            data.setCameraId(snapConf.getCameraId());
            data.setResult(result);
            data.setUpdateTime(new Date());
            data.setFileSuffix("jpg");
            data.setFileName(fileName);
            session.save(data);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
    public void addConf(SecSnapConf conf) {
        Session session = this.getSessionFactory().openSession();
        try {
            conf.setId(ContextUtil.getUUID());
            conf.setUpdateTime(new Date());
            session.save(conf);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
    public void updateConf(SecSnapConf conf) {
        Session session = this.getSessionFactory().openSession();
        try {
            conf.setUpdateTime(new Date());
            session.update(conf);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
    public void updateActHour(SecSnapConf conf) {
        String hql = " update "+SecSnapConf.class.getName()+" set actHour1=:actHour1,actHour2=:actHour2,actHour3=:actHour3 where companyId=:companyId and deptId=:deptId";
        Session session = this.getSessionFactory().openSession();
        try {
            Query q = session.createQuery(hql);
            q.setInteger("actHour1", conf.getActHour1());
            q.setInteger("actHour2", conf.getActHour2());
            q.setInteger("actHour3", conf.getActHour3());
            q.setString("companyId", conf.getCompanyId());
            q.setString("deptId", conf.getDeptId());
            q.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
}
igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepot.view.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,345 @@
<?xml version="1.0" encoding="UTF-8"?>
<ViewConfig>
  <Arguments/>
  <Context/>
  <Model>
    <DataType name="dtMain">
      <Property name="creationType">com.ld.igds.models.SecSnapDepot</Property>
      <PropertyDef name="id">
        <Property></Property>
        <Property name="label">主键</Property>
      </PropertyDef>
      <PropertyDef name="companyId">
        <Property></Property>
        <Property name="label">组织编码</Property>
      </PropertyDef>
      <PropertyDef name="deptId">
        <Property></Property>
        <Property name="label">所属分库</Property>
      </PropertyDef>
      <PropertyDef name="depotId">
        <Property></Property>
        <Property name="label">所属仓库</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#getAllCache&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">name</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="cameraId">
        <Property></Property>
        <Property name="label">关联摄像头</Property>
      </PropertyDef>
      <PropertyDef name="updateTime">
        <Property name="dataType">Date</Property>
        <Property name="label">更新时间</Property>
      </PropertyDef>
      <PropertyDef name="result">
        <Property></Property>
        <Property name="label">抓拍结果</Property>
      </PropertyDef>
      <PropertyDef name="fileSuffix">
        <Property></Property>
        <Property name="label">图像文件后缀名</Property>
      </PropertyDef>
      <PropertyDef name="fileName">
        <Property></Property>
        <Property name="label">文件名称</Property>
      </PropertyDef>
      <PropertyDef name="preset">
        <Property></Property>
        <Property name="label">预置位编号</Property>
      </PropertyDef>
    </DataType>
    <DataType name="dtConf">
      <Property name="creationType">com.ld.igds.models.SecSnapConf</Property>
      <PropertyDef name="id">
        <Property></Property>
        <Property name="label">主键</Property>
      </PropertyDef>
      <PropertyDef name="companyId">
        <Property></Property>
        <Property name="label">组织编码</Property>
      </PropertyDef>
      <PropertyDef name="deptId">
        <Property></Property>
        <Property name="label">所属分库</Property>
      </PropertyDef>
      <PropertyDef name="updateTime">
        <Property name="dataType">Date</Property>
        <Property name="label">更新时间</Property>
      </PropertyDef>
      <PropertyDef name="depotId">
        <Property></Property>
        <Property name="label">所属仓库</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#getAllCache&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">name</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="cameraId">
        <Property></Property>
        <Property name="label">关联摄像头</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;securityPR#listCamera&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">name</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="actHour1">
        <Property name="dataType">int</Property>
        <Property name="label">第一次</Property>
        <Property name="displayFormat"># ç‚¹</Property>
      </PropertyDef>
      <PropertyDef name="actHour2">
        <Property name="dataType">int</Property>
        <Property name="label">第二次</Property>
        <Property name="displayFormat"># ç‚¹</Property>
      </PropertyDef>
      <PropertyDef name="actHour3">
        <Property name="dataType">int</Property>
        <Property name="label">第三次</Property>
        <Property name="displayFormat"># ç‚¹</Property>
      </PropertyDef>
    </DataType>
    <DataType name="dtQuery">
      <PropertyDef name="depotId">
        <Property></Property>
        <Property name="label">所属仓库</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#getAllCache&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">name</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="start">
        <Property name="label">起始日期</Property>
        <Property name="dataType">Date</Property>
      </PropertyDef>
      <PropertyDef name="end">
        <Property name="label">截止日期</Property>
        <Property name="dataType">Date</Property>
      </PropertyDef>
      <PropertyDef name="actHour1">
        <Property name="dataType">int</Property>
        <Property name="label">第一次</Property>
      </PropertyDef>
      <PropertyDef name="actHour2">
        <Property name="dataType">int</Property>
        <Property name="label">第二次</Property>
      </PropertyDef>
      <PropertyDef name="actHour3">
        <Property name="dataType">int</Property>
        <Property name="label">第三次</Property>
      </PropertyDef>
    </DataType>
  </Model>
  <View layout="padding:5;regionPadding:5">
    <Property name="packages">font-awesome,css-common</Property>
    <DataSet id="dsMain">
      <Property name="loadMode">lazy</Property>
      <Property name="dataType">[dtMain]</Property>
      <Property name="dataProvider">secSnapDepotPR#pageSnapDepot</Property>
      <Property name="pageSize">12</Property>
    </DataSet>
    <DataSet id="dsConf">
      <Property name="dataType">[dtConf]</Property>
      <Property name="dataProvider">secSnapDepotPR#listConf</Property>
    </DataSet>
    <DataSet id="dsQuery">
      <ClientEvent name="onReady">self.insert({});</ClientEvent>
      <Property name="dataType">dtQuery</Property>
    </DataSet>
    <DataSet id="dsParam">
      <Property name="dataType">dtConf</Property>
      <Property name="dataProvider">secSnapDepotPR#getConfActHour</Property>
    </DataSet>
    <Panel layout="regionPadding:10">
      <Property name="caption">视频图像信息管理</Property>
      <Property name="iconClass">fa fa-bars</Property>
      <Buttons/>
      <Children>
        <Container>
          <Property name="contentOverflow">hidden</Property>
          <Property name="exClassName">bg-color</Property>
          <AutoForm>
            <Property name="cols">80,*,*,*,400</Property>
            <Property name="dataSet">dsQuery</Property>
            <Label>
              <Property name="text">查询条件:</Property>
            </Label>
            <AutoFormElement>
              <Property name="name">depotId</Property>
              <Property name="property">depotId</Property>
              <Editor/>
            </AutoFormElement>
            <AutoFormElement>
              <Property name="name">start</Property>
              <Property name="property">start</Property>
              <Editor/>
            </AutoFormElement>
            <AutoFormElement>
              <Property name="name">end</Property>
              <Property name="property">end</Property>
              <Editor/>
            </AutoFormElement>
            <Container layout="regionPadding:10">
              <Button layoutConstraint="left">
                <ClientEvent name="onClick">var entity = view.get(&quot;#dsQuery.data:#&quot;);&#xD;
view.get(&quot;#dsMain&quot;).set(&quot;parameter&quot;,entity).flushAsync(function(){&#xD;
    $notify(&quot;查询成功!&quot;);&#xD;
});</ClientEvent>
                <Property name="caption">查询</Property>
                <Property name="exClassName">btn-normal</Property>
                <Property name="iconClass">fa fa-search</Property>
              </Button>
              <Button layoutConstraint="left">
                <ClientEvent name="onClick">view.get(&quot;#dsQuery&quot;).setData({});</ClientEvent>
                <Property name="caption">重置</Property>
                <Property name="exClassName">btn-warn</Property>
                <Property name="iconClass">fa fa-refresh</Property>
                <Property name="ignored">true</Property>
              </Button>
              <Button layoutConstraint="left">
                <ClientEvent name="onClick">view.get(&quot;#dialogConf&quot;).show();</ClientEvent>
                <Property name="caption">抓拍配置</Property>
                <Property name="exClassName">btn-default</Property>
                <Property name="iconClass">fa fa-cogs</Property>
              </Button>
              <Button layoutConstraint="left">
                <Property name="caption">手动抓拍</Property>
                <Property name="exClassName">btn-warn</Property>
                <Property name="iconClass">fa fa-cogs</Property>
                <Property name="action">ajaxSnapHand</Property>
              </Button>
            </Container>
          </AutoForm>
        </Container>
        <Container layoutConstraint="center">
          <Property name="exClassName">bg-color</Property>
          <DataBlockView>
            <ClientEvent name="onRenderBlock">var id = arg.data.get(&quot;id&quot;);&#xD;
var time = arg.data.get(&quot;updateTime&quot;).formatDate(&quot;Y-m-d H:i&quot;);&#xD;
var timeStr = arg.data.get(&quot;updateTime&quot;).formatDate(&quot;Ymd&quot;);&#xD;
var depotId = arg.data.getText(&quot;depotId&quot;);&#xD;
var imgSrc = &quot;../../basic/file/get-snap-depot?fileName=&quot;+arg.data.get(&quot;fileName&quot;)+&quot;&amp;timeStr=&quot;+timeStr;&#xD;
var htm = &quot;&lt;div>&lt;img src='./static/images/img-fail.jpg' style='height:250px; width:100%;'>&lt;div>&lt;span style='padding-left:10px;'>仓库:未查询到数据&lt;/span>&lt;span style='float:right;padding-right:10px;'>时间:&quot;+time+&quot;&lt;/span>&lt;/div>&lt;/div>&quot;;&#xD;
if(&quot;TEST&quot; != id){&#xD;
    htm = &quot;&lt;div>&lt;img src='&quot;+imgSrc+&quot;' style='height:250px; width:100%;'>&lt;div>&lt;span style='padding-left:10px;'>仓库:&quot;+depotId+&quot;&lt;/span>&lt;span style='float:right;padding-right:10px;'>时间:&quot;+time+&quot;&lt;/span>&lt;/div>&lt;/div>&quot;;&#xD;
}&#xD;
arg.dom.innerHTML = htm;&#xD;
arg.progressDefault=false;</ClientEvent>
            <Property name="dataSet">dsMain</Property>
            <Property name="blockHeight">300</Property>
            <Property name="blockWidth">390</Property>
            <Property name="blockLayout">vertical</Property>
            <Property name="horiPadding">15</Property>
            <Property name="horiSpacing">15</Property>
            <Property name="vertPadding">15</Property>
            <Property name="vertSpacing">15</Property>
            <Property name="lineSize">4</Property>
          </DataBlockView>
        </Container>
        <ToolBar layoutConstraint="bottom">
          <Fill/>
          <DataPilot layoutConstraint="right">
            <Property name="dataSet">dsMain</Property>
            <Property name="itemCodes">pageSize,pages</Property>
          </DataPilot>
        </ToolBar>
      </Children>
      <Tools/>
    </Panel>
    <Dialog id="dialogConf">
      <Property name="width">750</Property>
      <Property name="caption">仓内抓拍配置</Property>
      <Buttons/>
      <Children>
        <FieldSet>
          <Property name="caption">抓拍摄像头配置</Property>
          <Buttons>
            <Button>
              <ClientEvent name="onClick">view.get(&quot;#dsConf&quot;).insert();</ClientEvent>
              <Property name="caption">新增配置</Property>
            </Button>
            <Button>
              <Property name="caption">保存配置</Property>
              <Property name="action">updateConf</Property>
            </Button>
          </Buttons>
          <Children>
            <DataGrid layoutConstraint="padding:10px">
              <Property name="dataSet">dsConf</Property>
              <Property name="height">400</Property>
              <RowNumColumn/>
              <DataColumn name="depotId">
                <Property name="property">depotId</Property>
              </DataColumn>
              <DataColumn name="cameraId">
                <Property name="property">cameraId</Property>
              </DataColumn>
            </DataGrid>
          </Children>
        </FieldSet>
        <FieldSet>
          <Property name="caption">抓拍时间配置</Property>
          <Property name="height">150</Property>
          <Buttons>
            <Button>
              <ClientEvent name="onClick">var data = view.get(&quot;#dsParam.data&quot;);&#xD;
view.get(&quot;#ajaxSnapTime&quot;).set(&quot;parameter&quot;,data).execute();</ClientEvent>
              <Property name="caption">保存抓时间</Property>
            </Button>
          </Buttons>
          <Children>
            <AutoForm>
              <Property name="dataSet">dsParam</Property>
              <Property name="cols">*,*,*</Property>
              <Property name="labelAlign">right</Property>
              <AutoFormElement>
                <Property name="name">actHour1</Property>
                <Property name="property">actHour1</Property>
                <Property name="trigger">listHour</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">actHour2</Property>
                <Property name="property">actHour2</Property>
                <Property name="trigger">listHour</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">actHour3</Property>
                <Property name="property">actHour3</Property>
                <Property name="trigger">listHour</Property>
                <Editor/>
              </AutoFormElement>
            </AutoForm>
          </Children>
        </FieldSet>
      </Children>
      <Tools/>
    </Dialog>
    <AjaxAction id="ajaxDel">
      <Property name="service">videoImgPR#delData</Property>
      <Property name="confirmMessage">当前数据删除后无法恢复,请确认要删除么?</Property>
    </AjaxAction>
    <UpdateAction id="updateConf">
      <Property name="dataResolver">secSnapDepotPR#updateConf</Property>
      <UpdateItem>
        <Property name="dataSet">dsConf</Property>
      </UpdateItem>
    </UpdateAction>
    <AjaxAction id="ajaxSnapTime">
      <Property name="service">secSnapDepotPR#updateActHour</Property>
    </AjaxAction>
    <ListDropDown id="listHour">
      <Property name="items">0,7,8,9,10,11,12,13,14,15,16,17,18</Property>
    </ListDropDown>
    <AjaxAction id="ajaxSnapHand">
      <Property name="service">sec.scheduled#exeByHand</Property>
      <Property name="confirmMessage">确定要执行么?</Property>
    </AjaxAction>
  </View>
</ViewConfig>
igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepotPR.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
package com.ld.igds.sec.view;
import com.bstek.dorado.annotation.DataProvider;
import com.bstek.dorado.annotation.DataResolver;
import com.bstek.dorado.annotation.Expose;
import com.bstek.dorado.data.provider.Page;
import com.ld.igds.models.SecSnapConf;
import com.ld.igds.models.SecSnapDepot;
import com.ld.igds.sec.service.SecSnapDepotService;
import com.ld.igds.util.ContextUtil;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author: andy.jia
 * @description: ä»“内抓拍信息获取管理
 * @version:
 */
@Component
public class SecSnapDepotPR {
    @Resource
    private SecSnapDepotService snapDepotService;
    /**
     * secSnapDepotPR#pageSnapDepot
     *
     * @param param
     * @throws Exception
     */
    @DataProvider
    public void pageSnapDepot(Page<SecSnapDepot> page, Map<String, Object> param)
            throws Exception {
        if (null == param) param = new HashMap<>();
        param.put("companyId", ContextUtil.getCompanyId());
        param.put("deptId", ContextUtil.subDeptId(null));
        snapDepotService.pageSnapDepot(page, param);
        //添加4条测试数据
        if (null == page.getEntities() || page.getEntities().isEmpty()) {
            Collection<SecSnapDepot> list = new ArrayList<>();
            list.add(new SecSnapDepot("TEST"));
            list.add(new SecSnapDepot("TEST"));
            list.add(new SecSnapDepot("TEST"));
            list.add(new SecSnapDepot("TEST"));
            page.setEntities(list);
        }
    }
    /**
     * secSnapDepotPR#getConfActHour
     *
     * é»˜è®¤èŽ·å–ç¬¬ä¸€æ¡æ•°æ®çš„é…ç½®ä¿¡æ¯ï¼Œå¦‚æžœæ²¡æœ‰å°±è¿”å›žä¸€ä¸ªç©ºçš„å¯¹è±¡
     * @param page
     * @param param
     * @return
     * @throws Exception
     */
    @DataProvider
    public SecSnapConf getConfActHour()throws Exception {
        List<SecSnapConf> list =   snapDepotService.listSnapConf(ContextUtil.getCompanyId(), ContextUtil.subDeptId(null));
        if(null == list || list.isEmpty()) return new SecSnapConf();
        return list.get(0);
    }
    /**
     * secSnapDepotPR#listConf
     *
     * é»˜è®¤èŽ·å–ç¬¬ä¸€æ¡æ•°æ®çš„é…ç½®ä¿¡æ¯ï¼Œå¦‚æžœæ²¡æœ‰å°±è¿”å›žä¸€ä¸ªç©ºçš„å¯¹è±¡
     * @param page
     * @param param
     * @return
     * @throws Exception
     */
    @DataProvider
    public List<SecSnapConf> listConf()throws Exception {
        return  snapDepotService.listSnapConf(ContextUtil.getCompanyId(), ContextUtil.subDeptId(null));
    }
    /**
     * secSnapDepotPR#updateConf
     * @param items
     * @throws Exception
     */
    @DataResolver
    public void updateConf(List<SecSnapConf> items)throws Exception {
        if(null ==items || items.isEmpty() ) return;
        for(SecSnapConf conf:items){
            if(null == conf.getId()){
                if(null == conf.getCompanyId()){
                    conf.setCompanyId(ContextUtil.getCompanyId());
                }
                if(null == conf.getDeptId()){
                    conf.setDeptId(ContextUtil.subDeptId(null));
                }
                snapDepotService.addConf(conf);
            }else{
                snapDepotService.updateConf(conf);
            }
        }
    }
    /**
     * secSnapDepotPR#updateActHour
     * @param items
     * @throws Exception
     */
    @Expose
    public void updateActHour(SecSnapConf conf)throws Exception {
        if(null == conf.getCompanyId()){
            conf.setCompanyId(ContextUtil.getCompanyId());
        }
        if(null == conf.getDeptId()){
            conf.setDeptId(ContextUtil.subDeptId(null));
        }
        //同步更新所有的执行时间一致
        snapDepotService.updateActHour(conf);
    }
}
igds-security/src/main/java/com/ld/igds/timer/ScheduledSec.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,174 @@
package com.ld.igds.timer;
import com.bstek.dorado.annotation.Expose;
import com.ld.igds.camera.ApiCameraManager;
import com.ld.igds.camera.CameraUtil;
import com.ld.igds.camera.data.ApiCameraResp;
import com.ld.igds.camera.data.ApiSnapReq;
import com.ld.igds.data.ConfigData;
import com.ld.igds.file.CoreFileService;
import com.ld.igds.models.SecCamera;
import com.ld.igds.models.SecSnapConf;
import com.ld.igds.models.SnapSer;
import com.ld.igds.sec.service.CoreSecCameraService;
import com.ld.igds.sec.service.SecSnapDepotService;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.DateUtil;
import com.ld.igds.view.service.SnapSerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * å®‰é˜²æ¨¡å—标定时器配置
 */
@Slf4j
@Component(ScheduledSec.BEAN_ID)
public class ScheduledSec {
    public static final String BEAN_ID = "sec.scheduled";
    @Resource
    private ConfigData configData;
    @Resource
    private SecSnapDepotService secSnapService;
    @Resource
    private CoreSecCameraService coreSecCameraService;
    @Resource
    private SnapSerService snapSerService;
    @Resource
    private CoreFileService fileService;
    @Resource
    private ApiCameraManager apiCameraManager;
    /**
     * ä»Ž6-18点开始执行
     */
    @Scheduled(cron = "0 0 6,7,8,9,10,11,12,13,14,15,16,17,18 * * ? ")
    public void scheduled30() {
        Date exeDate = new Date();
        // æ‰§è¡ŒæŠ“拍判断
        doExeSnap(exeDate,false);
    }
    /**
     * sec.scheduled#exeByHand
     * æ‰‹åŠ¨æ‰§è¡Œ
     */
    @Expose
    public void exeByHand(){
        Date exeDate = new Date();
        // æ‰§è¡ŒæŠ“拍判断
        doExeSnap(exeDate,true);
    }
    /**
     * å®šæ—¶æ‰§è¡ŒæŠ“拍
     */
    private void doExeSnap(Date date,boolean isByHand) {
        try {
            // èŽ·å–æ‰€æœ‰é…ç½®æŠ“æ‹æ‘„åƒå¤´
            List<SecSnapConf> list = secSnapService.listSnapConf(
                    configData.getDefaultCompanyId(), null);
            if (null == list || list.isEmpty()) {
                return;
            }
            SecSnapConf exeConf = list.get(0);
            // èŽ·å–æŠ“æ‹æ—¶é—´
            int exeHour1 = exeConf.getActHour1();
            int exeHour2 = exeConf.getActHour2();
            int exeHour3 = exeConf.getActHour3();
            if (exeHour1 == 0 && exeHour1 == 0 && exeHour1 == 0)
                return;
            // èŽ·å–å½“å‰ç³»ç»Ÿæ—¶é—´
            int curHour = DateUtil.getHour(date);
            if(isByHand){
                exeHour1 = curHour;
            }
            if(curHour != exeHour1 && curHour != exeHour2 && curHour !=exeHour3){
                return;
            }
            log.info("===================执行定时仓内视频抓拍==================");
            SecCamera secCamera;
            Map<String, SnapSer> snapSerMap = new HashMap<>();
            SnapSer snapSer;
            for (SecSnapConf snapConf : list) {
                secCamera = coreSecCameraService.getCameraById(
                        snapConf.getCompanyId(), snapConf.getCameraId());
                if (null == secCamera) continue;
                snapSer = snapSerMap.get(snapConf.getDeptId());
                if (null == snapSer) {
                    snapSer = snapSerService.getCacheByDeptId(snapConf.getDeptId());
                    snapSerMap.put(snapConf.getDeptId(), snapSer);
                }
                if (null == snapSer) {
                    log.error("------------抓拍为配置抓拍分机----------");
                    continue;
                }
                doExeSnapToData(secCamera, snapSer, snapConf);
                Thread.sleep(500);
            }
        } catch (Exception e) {
            log.error("----------抓拍后台出错---------{}", e);
        }
    }
    private void doExeSnapToData(SecCamera secCamera, SnapSer snapSer,SecSnapConf snapConf) {
        ApiSnapReq req = new ApiSnapReq();
        req.setCompanyId(secCamera.getCompanyId());
        req.setDeptId(secCamera.getDeptId());
        req.setSn(secCamera.getSn());
        req.setSnapType(secCamera.getSnapType());
        req.setPlayType(secCamera.getPlayType());
        req.setSerSn(snapSer.getSn());
        req.setCameraName(secCamera.getName());
        req.setBizId(null);
        req.setMediaAddr(CameraUtil.updateMediaAddr(secCamera.getMediaAddr(),
                secCamera.getLoginId(), secCamera.getPwd(),
                secCamera.getIpIn(), secCamera.getPortInC(),
                secCamera.getChanNum()));
        String filePath = fileService.getSnapFilePath(new Date());
        req.setFilePath(filePath);
        // è°ƒæ•´é™„件名称,避免出现中文
        String fileName = snapConf.getDepotId() + "_" + ContextUtil.getTimeId(1000) + ".jpg";
        req.setFileName(fileName);
        // æ‰§è¡ŒæŠ“拍
        ApiCameraResp resp = apiCameraManager.getApiCameraService(secCamera.getPlayType()).snapImg(req);
        resp.setFileName(fileName);
        // æ‰§è¡Œè®°å½•保存
        secSnapService.addData(snapConf, fileName, resp.getCode());
    }
}
igds-warn/src/main/java/com/ld/igds/warn/service/HSecureManagerService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.ld.igds.warn.service;
import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
import com.bstek.dorado.data.provider.Page;
import com.ld.igds.models.SecureManager;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.DateUtil;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.hibernate.Session;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author czt
 * @date 2023/10/30
 **/
@Component
public class HSecureManagerService extends HibernateDao {
    public void listData(Page<SecureManager> page, Map<String, Object> param) throws Exception {
        StringBuffer hql = new StringBuffer();
        hql.append(" from " + SecureManager.class.getName() + " where companyId =:companyId and deptId =:deptId ");
        Map<String, Object> args = new HashMap<>();
        args.put("companyId", ContextUtil.getCompanyId());
        args.put("deptId", ContextUtil.subDeptId(null));
        String count = "select count(*) " + hql.toString();
        hql.append(" order by updateTime desc");
        this.pagingQuery(page, hql.toString(), count, args);
    }
    public void saveData(SecureManager data) {
        data.setUpdateTime(new Date());
        data.setDeptId(ContextUtil.subDeptId(null));
        data.setCompanyId(ContextUtil.getCompanyId());
        Session session = this.getSessionFactory().openSession();
        try {
            if (null == data.getFxdbm()) {
                data.setFxdbm(DateFormatUtils.format(new Date(), "yyyyMMdd") + getIndex(data.getCompanyId()));
                session.save(data);
            } else {
                session.update(data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
    public String getIndex(String companyId) {
        List<SecureManager> list = getDataByTime(companyId);
        int index = 10000;
        if (list != null && list.size() > 0) {
            String id = list.get(0).getFxdbm().substring(8);
            int temp = Integer.valueOf(id) + 1;
            index += temp;
        }else {
            index ++;
        }
        return String.valueOf(index).substring(1);
    }
    private List<SecureManager> getDataByTime(String companyId) {
        String hql = " from " + SecureManager.class.getName()
                + " where companyId =:companyId ";
        Map<String, Object> args = new HashMap<String, Object>();
        args.put("companyId", companyId);
        hql += " and updateTime >:startTime";
        args.put("startTime", DateUtil.getCurZero(new Date()));
        hql += " and updateTime <:endTime";
        args.put("endTime", DateUtil.getNextZero(new Date()));
        hql += " order by id desc";
        return this.query(hql, args);
    }
    public void delData(SecureManager data) {
        Session session = this.getSessionFactory().openSession();
        try {
            if (null != data.getFxdbm()) {
                session.delete(data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
}
igds-warn/src/main/java/com/ld/igds/warn/view/SecureManager.view.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,460 @@
<?xml version="1.0" encoding="UTF-8"?>
<ViewConfig>
  <Arguments/>
  <Context/>
  <Model>
    <DataType name="dtMain">
      <Property name="creationType">com.ld.igds.models.SecureManager</Property>
      <PropertyDef name="fxdbm">
        <Property></Property>
        <Property name="label">风险点编码</Property>
        <Property name="readOnly">true</Property>
      </PropertyDef>
      <PropertyDef name="companyId">
        <Property></Property>
        <Property name="label">组织编码</Property>
      </PropertyDef>
      <PropertyDef name="deptId">
        <Property></Property>
        <Property name="label">所属分库</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#loadParents&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">name</Property>
        </Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="dd">
        <Property></Property>
        <Property name="label">地点</Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="sbr">
        <Property></Property>
        <Property name="label">识别人</Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="hjbw">
        <Property></Property>
        <Property name="label">环节/部位</Property>
      </PropertyDef>
      <PropertyDef name="fxxx">
        <Property></Property>
        <Property name="label">风险信息</Property>
      </PropertyDef>
      <PropertyDef name="fxlx">
        <Property name="label">风险类型</Property>
        <Property name="mapping">
          <Property name="keyProperty">key</Property>
          <Property name="valueProperty">value</Property>
          <Property name="mapValues">
            <Collection>
              <Entity>
                <Property name="key">1</Property>
                <Property name="value">1-基础设施</Property>
              </Entity>
              <Entity>
                <Property name="key">2</Property>
                <Property name="value">2-网络安全</Property>
              </Entity>
              <Entity>
                <Property name="key">3</Property>
                <Property name="value">3-消防安全</Property>
              </Entity>
              <Entity>
                <Property name="key">4</Property>
                <Property name="value">4-用电安全</Property>
              </Entity>
              <Entity>
                <Property name="key">5</Property>
                <Property name="value">5-作业安全</Property>
              </Entity>
              <Entity>
                <Property name="key">6</Property>
                <Property name="value">6-用药风险</Property>
              </Entity>
              <Entity>
                <Property name="key">7</Property>
                <Property name="value">7-管理风险</Property>
              </Entity>
              <Entity>
                <Property name="key">8</Property>
                <Property name="value">8-其他风险</Property>
              </Entity>
            </Collection>
          </Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="fxfj">
        <Property name="label">风险等级</Property>
        <Property name="mapping">
          <Property name="keyProperty">key</Property>
          <Property name="valueProperty">value</Property>
          <Property name="mapValues">
            <Collection>
              <Entity>
                <Property name="key">1</Property>
                <Property name="value">1-低风险</Property>
              </Entity>
              <Entity>
                <Property name="key">2</Property>
                <Property name="value">2-一般风险</Property>
              </Entity>
              <Entity>
                <Property name="key">3</Property>
                <Property name="value">3-较大风险</Property>
              </Entity>
              <Entity>
                <Property name="key">4</Property>
                <Property name="value">4-重大风险</Property>
              </Entity>
            </Collection>
          </Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="fxglcs">
        <Property></Property>
        <Property name="label">风险管控措施</Property>
      </PropertyDef>
      <PropertyDef name="yhxx">
        <Property></Property>
        <Property name="label">隐患信息</Property>
      </PropertyDef>
      <PropertyDef name="yhpcxx">
        <Property></Property>
        <Property name="label">隐患排查信息</Property>
      </PropertyDef>
      <PropertyDef name="yhzgxx">
        <Property></Property>
        <Property name="label">隐患整改信息</Property>
      </PropertyDef>
      <PropertyDef name="yhysxx">
        <Property></Property>
        <Property name="label">隐患整改验收信息</Property>
      </PropertyDef>
      <PropertyDef name="sgjbxx">
        <Property></Property>
        <Property name="label">事故基本信息</Property>
      </PropertyDef>
      <PropertyDef name="zgsx">
        <Property></Property>
        <Property name="label">整改时限</Property>
      </PropertyDef>
      <PropertyDef name="zrdw">
        <Property></Property>
        <Property name="label">责任单位</Property>
      </PropertyDef>
      <PropertyDef name="zrr">
        <Property></Property>
        <Property name="label">责任人</Property>
      </PropertyDef>
      <PropertyDef name="zgysxx">
        <Property></Property>
        <Property name="label">整改验收信息</Property>
      </PropertyDef>
      <PropertyDef name="fxgzjgzrr">
        <Property name="label">风险跟踪监管责任人</Property>
      </PropertyDef>
      <PropertyDef name="updateTime">
        <Property name="dataType">DateTime</Property>
        <Property name="label">最后更新时间</Property>
      </PropertyDef>
    </DataType>
    <DataType name="dtParam">
      <PropertyDef name="sbr">
        <Property name="label">识别人</Property>
      </PropertyDef>
      <PropertyDef name="dd">
        <Property name="label">地点</Property>
      </PropertyDef>
    </DataType>
  </Model>
  <View layout="padding:5;regionPadding:5">
    <Property name="packages">font-awesome,css-common</Property>
    <DataSet id="dsMain">
      <Property name="dataType">[dtMain]</Property>
      <Property name="dataProvider">secureManagerPR#pageList</Property>
      <Property name="pageSize">15</Property>
    </DataSet>
    <DataSet id="dsParam">
      <ClientEvent name="onReady">self.insert({})&#xD;
</ClientEvent>
      <Property name="dataType">[dtParam]</Property>
    </DataSet>
    <Container layout="regionPadding:10" layoutConstraint="top">
      <Property name="exClassName">bg-color</Property>
      <Property name="height">55</Property>
      <Label layoutConstraint="left">
        <Property name="text">菜单栏:</Property>
      </Label>
      <Button layoutConstraint="left">
        <ClientEvent name="onClick">view.get(&quot;#dsMain&quot;).insert();&#xD;
view.get(&quot;#dialogMain&quot;).show();</ClientEvent>
        <Property name="exClassName">btn-normal</Property>
        <Property name="iconClass">fa fa-plus</Property>
        <Property name="caption">新增</Property>
      </Button>
      <Button layoutConstraint="left">
        <ClientEvent name="onClick">var dialog= view.get(&quot;#dsMain.data:#&quot;);&#xD;
if(dialog){&#xD;
    view.get(&quot;#dialogMain&quot;).show();&#xD;
}else{&#xD;
    $alert(&quot;请选中需要修改的数据&quot;)&#xD;
}</ClientEvent>
        <Property name="caption">编辑</Property>
        <Property name="exClassName">btn-warm</Property>
        <Property name="iconClass">fa fa-pencil</Property>
      </Button>
      <Button>
        <ClientEvent name="onClick">var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
if(!cur) return;&#xD;
view.get(&quot;#ajaxDel&quot;).set(&quot;parameter&quot;,cur).execute(function(result){&#xD;
    if(result){&#xD;
        $alert(result);&#xD;
        return;&#xD;
    }else{&#xD;
        cur.remove();&#xD;
    }&#xD;
});</ClientEvent>
        <Property name="exClassName">btn-warn</Property>
        <Property name="iconClass">fa fa-pencil</Property>
        <Property name="caption">删除</Property>
      </Button>
    </Container>
    <Container>
      <AutoForm>
        <Property name="dataSet">dsParam</Property>
        <Property name="cols">*,*,*,*</Property>
        <AutoFormElement>
          <Property name="name">sbr</Property>
          <Property name="property">sbr</Property>
          <Editor/>
        </AutoFormElement>
        <AutoFormElement>
          <Property name="name">dd</Property>
          <Property name="property">dd</Property>
          <Editor/>
        </AutoFormElement>
        <Container layout="regionPadding:10">
          <Button layoutConstraint="left">
            <ClientEvent name="onClick">var param = view.get(&quot;#dsParam.data:#&quot;);&#xD;
view.get(&quot;#dsMain&quot;).set(&quot;parameter&quot;,param).flushAsync();</ClientEvent>
            <Property name="caption">查询</Property>
            <Property name="exClassName">btn-normal</Property>
            <Property name="iconClass">fa fa-search</Property>
          </Button>
          <Button layoutConstraint="left">
            <ClientEvent name="onClick">view.get(&quot;#dsParam&quot;).insert({})</ClientEvent>
            <Property name="caption">重置</Property>
            <Property name="iconClass">fa fa-refresh</Property>
            <Property name="exClassName">btn-default</Property>
          </Button>
        </Container>
      </AutoForm>
      <DataGrid id="dgMain">
        <ClientEvent name="onDataRowDoubleClick">view.get(&quot;#dialogMain&quot;).show();</ClientEvent>
        <Property name="dataSet">dsMain</Property>
        <Property name="readOnly">true</Property>
        <RowNumColumn/>
        <DataColumn name="fxdbm">
          <Property name="property">fxdbm</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="sbr">
          <Property name="property">sbr</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="dd">
          <Property name="property">dd</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="hjbw">
          <Property name="property">hjbw</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="fxxx">
          <Property name="property">fxxx</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="fxlx">
          <Property name="property">fxlx</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="updateTime">
          <Property name="property">updateTime</Property>
          <Property name="align">center</Property>
        </DataColumn>
      </DataGrid>
      <ToolBar layoutConstraint="bottom">
        <Fill/>
        <DataPilot>
          <Property name="dataSet">dsMain</Property>
          <Property name="itemCodes">pageSize,pages</Property>
        </DataPilot>
      </ToolBar>
    </Container>
    <Dialog id="dialogMain">
      <Property name="caption">基本信息</Property>
      <Property name="width">80%</Property>
      <Property name="closeable">false</Property>
      <Buttons>
        <Button>
          <ClientEvent name="onClick">var data = view.get(&quot;#dsMain.data:#&quot;);&#xD;
view.get(&quot;#uaAction&quot;).execute(function(result){&#xD;
    if(result){&#xD;
        $alert(result);&#xD;
    }else{&#xD;
        self.get(&quot;parent&quot;).hide();&#xD;
    }&#xD;
});</ClientEvent>
          <Property name="caption">保存</Property>
          <Property name="iconClass">fa fa-check</Property>
          <Property name="exClassName">btn-normal</Property>
        </Button>
        <Button>
          <ClientEvent name="onClick">view.get(&quot;#dsMain.data:#&quot;).cancel();&#xD;
self.get(&quot;parent&quot;).hide();</ClientEvent>
          <Property name="caption">取消</Property>
          <Property name="iconClass">fa fa-times</Property>
          <Property name="exClassName">btn-warn</Property>
        </Button>
      </Buttons>
      <Children>
        <AutoForm>
          <Property name="dataSet">dsMain</Property>
          <Property name="readOnly">false</Property>
          <Property name="labelSeparator"> : </Property>
          <Property name="labelAlign">right</Property>
          <Property name="cols">*,*</Property>
          <Property name="labelWidth">160</Property>
          <AutoFormElement>
            <Property name="name">fxdbm</Property>
            <Property name="property">fxdbm</Property>
            <Editor>
              <TextEditor>
                <Property name="blankText">--系统自动生成--</Property>
              </TextEditor>
            </Editor>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">deptId</Property>
            <Property name="property">deptId</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">dd</Property>
            <Property name="property">dd</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">sbr</Property>
            <Property name="property">sbr</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">hjbw</Property>
            <Property name="property">hjbw</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">fxxx</Property>
            <Property name="property">fxxx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">fxlx</Property>
            <Property name="property">fxlx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">fxfj</Property>
            <Property name="property">fxfj</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">fxglcs</Property>
            <Property name="property">fxglcs</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">yhxx</Property>
            <Property name="property">yhxx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">yhpcxx</Property>
            <Property name="property">yhpcxx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">yhzgxx</Property>
            <Property name="property">yhzgxx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">yhysxx</Property>
            <Property name="property">yhysxx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">sgjbxx</Property>
            <Property name="property">sgjbxx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">zgsx</Property>
            <Property name="property">zgsx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">zrdw</Property>
            <Property name="property">zrdw</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">zrr</Property>
            <Property name="property">zrr</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">zgysxx</Property>
            <Property name="property">zgysxx</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">fxgzjgzrr</Property>
            <Property name="property">fxgzjgzrr</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">updateTime</Property>
            <Property name="property">updateTime</Property>
            <Editor/>
          </AutoFormElement>
        </AutoForm>
      </Children>
      <Tools/>
    </Dialog>
    <UpdateAction id="uaAction">
      <Property name="successMessage">执行成功!</Property>
      <Property name="dataResolver">secureManagerPR#saveData</Property>
      <UpdateItem>
        <Property name="dataSet">dsMain</Property>
        <Property name="dataPath">[#current]</Property>
      </UpdateItem>
    </UpdateAction>
    <AjaxAction id="ajaxDel">
      <Property name="confirmMessage">确定要删除吗?</Property>
      <Property name="service">secureManagerPR#delData</Property>
    </AjaxAction>
    <MonthDropDown id="monthDropDown1">
      <ClientEvent name="onClose">var date = arg.selectedValue+1;&#xD;
if(date&lt;10){&#xD;
    arg.selectedValue=&quot;0&quot;+date&#xD;
}else if(date>=10){&#xD;
    arg.selectedValue=date&#xD;
}&#xD;
</ClientEvent>
    </MonthDropDown>
  </View>
</ViewConfig>
igds-warn/src/main/java/com/ld/igds/warn/view/SecureManagerPR.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.ld.igds.warn.view;
import com.bstek.dorado.annotation.DataProvider;
import com.bstek.dorado.annotation.DataResolver;
import com.bstek.dorado.annotation.Expose;
import com.bstek.dorado.data.provider.Page;
import com.ld.igds.models.SecureManager;
import com.ld.igds.warn.service.HSecureManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
 * @Author: czt
 **/
@Component
public class SecureManagerPR {
    @Autowired
    private HSecureManagerService secureManagerService;
    /**
     * secureManagerPR#pageList
     *
     * @param page
     * @param param
     * @throws Exception
     */
    @DataProvider
    public void pageList(Page<SecureManager> page, Map<String, Object> param) throws Exception {
        secureManagerService.listData(page, param);
    }
    /**
     * secureManagerPR#saveData
     *
     * @param data
     */
    @DataResolver
    public void saveData(SecureManager data) {
        secureManagerService.saveData(data);
    }
    /**
     * secureManagerPR#delData
     *
     * @param data
     */
    @Expose
    public void delData(SecureManager data) {
        secureManagerService.delData(data);
    }
}
igds-web/src/main/resources/static/css/bootstrap.min.css.map
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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DG,edkkDH,MAAA,aclkDG,edqkDH,MAAA,acrkDG,edwkDH,MAAA,IcxkDG,ed2kDH,MAAA,ac3kDG,ed8kDH,MAAA,ac9kDG,edilDH,MAAA,IcjlDG,edolDH,MAAA,ac/kDG,edklDH,MAAA,YcjmDG,edomDH,MAAA,KcpmDG,gBdumDH,KAAA,KcvmDG,gBd0mDH,KAAA,ac1mDG,gBd6mDH,KAAA,ac7mDG,edgnDH,KAAA,IchnDG,edmnDH,KAAA,acnnDG,edsnDH,KAAA,actnDG,edynDH,KAAA,IcznDG,ed4nDH,KAAA,ac5nDG,ed+nDH,KAAA,ac/nDG,edkoDH,KAAA,IcloDG,edqoDH,KAAA,achoDG,edmoDH,KAAA,YcpnDG,edunDH,KAAA,KcvnDG,kBd0nDH,YAAA,Kc1nDG,kBd6nDH,YAAA,ac7nDG,kBdgoDH,YAAA,achoDG,iBdmoDH,YAAA,IcnoDG,iBdsoDH,YAAA,actoDG,iBdyoDH,YAAA,aczoDG,iBd4oDH,YAAA,Ic5oDG,iBd+oDH,YAAA,ac/oDG,iBdkpDH,YAAA,aclpDG,iBdqpDH,YAAA,IcrpDG,iBdwpDH,YAAA,acxpDG,iBd2pDH,YAAA,Yc7rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud2rDD,MAAA,Kc3rDC,Wd8rDD,MAAA,Kc9rDC,WdisDD,MAAA,acjsDC,WdosDD,MAAA,acpsDC,UdusDD,MAAA,IcvsDC,Ud0sDD,MAAA,ac1sDC,Ud6sDD,MAAA,ac7sDC,UdgtDD,MAAA,IchtDC,UdmtDD,MAAA,acntDC,UdstDD,MAAA,acttDC,UdytDD,MAAA,IcztDC,Ud4tDD,MAAA,ac7sDC,UdgtDD,MAAA,YchtDC,gBdmtDD,MAAA,KcntDC,gBdstDD,MAAA,acttDC,gBdytDD,MAAA,acztDC,ed4tDD,MAAA,Ic5tDC,ed+tDD,MAAA,ac/tDC,edkuDD,MAAA,acluDC,edquDD,MAAA,IcruDC,edwuDD,MAAA,acxuDC,ed2uDD,MAAA,ac3uDC,ed8uDD,MAAA,Ic9uDC,edivDD,MAAA,ac5uDC,ed+uDD,MAAA,Yc9vDC,ediwDD,MAAA,KcjwDC,gBdowDD,KAAA,KcpwDC,gBduwDD,KAAA,acvwDC,gBd0wDD,KAAA,ac1wDC,ed6wDD,KAAA,Ic7wDC,edgxDD,KAAA,achxDC,edmxDD,KAAA,acnxDC,edsxDD,KAAA,IctxDC,edyxDD,KAAA,aczxDC,ed4xDD,KAAA,ac5xDC,ed+xDD,KAAA,Ic/xDC,edkyDD,KAAA,ac7xDC,edgyDD,KAAA,YcjxDC,edoxDD,KAAA,KcpxDC,kBduxDD,YAAA,KcvxDC,kBd0xDD,YAAA,ac1xDC,kBd6xDD,YAAA,ac7xDC,iBdgyDD,YAAA,IchyDC,iBdmyDD,YAAA,acnyDC,iBdsyDD,YAAA,actyDC,iBdyyDD,YAAA,IczyDC,iBd4yDD,YAAA,ac5yDC,iBd+yDD,YAAA,ac/yDC,iBdkzDD,YAAA,IclzDC,iBdqzDD,YAAA,acrzDC,iBdwzDD,YAAA,YY/yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udy1DD,MAAA,Kcz1DC,Wd41DD,MAAA,Kc51DC,Wd+1DD,MAAA,ac/1DC,Wdk2DD,MAAA,acl2DC,Udq2DD,MAAA,Icr2DC,Udw2DD,MAAA,acx2DC,Ud22DD,MAAA,ac32DC,Ud82DD,MAAA,Ic92DC,Udi3DD,MAAA,acj3DC,Udo3DD,MAAA,acp3DC,Udu3DD,MAAA,Icv3DC,Ud03DD,MAAA,ac32DC,Ud82DD,MAAA,Yc92DC,gBdi3DD,MAAA,Kcj3DC,gBdo3DD,MAAA,acp3DC,gBdu3DD,MAAA,acv3DC,ed03DD,MAAA,Ic13DC,ed63DD,MAAA,ac73DC,edg4DD,MAAA,ach4DC,edm4DD,MAAA,Icn4DC,eds4DD,MAAA,act4DC,edy4DD,MAAA,acz4DC,ed44DD,MAAA,Ic54DC,ed+4DD,MAAA,ac14DC,ed64DD,MAAA,Yc55DC,ed+5DD,MAAA,Kc/5DC,gBdk6DD,KAAA,Kcl6DC,gBdq6DD,KAAA,acr6DC,gBdw6DD,KAAA,acx6DC,ed26DD,KAAA,Ic36DC,ed86DD,KAAA,ac96DC,edi7DD,KAAA,acj7DC,edo7DD,KAAA,Icp7DC,edu7DD,KAAA,acv7DC,ed07DD,KAAA,ac17DC,ed67DD,KAAA,Ic77DC,edg8DD,KAAA,ac37DC,ed87DD,KAAA,Yc/6DC,edk7DD,KAAA,Kcl7DC,kBdq7DD,YAAA,Kcr7DC,kBdw7DD,YAAA,acx7DC,kBd27DD,YAAA,ac37DC,iBd87DD,YAAA,Ic97DC,iBdi8DD,YAAA,acj8DC,iBdo8DD,YAAA,acp8DC,iBdu8DD,YAAA,Icv8DC,iBd08DD,YAAA,ac18DC,iBd68DD,YAAA,ac78DC,iBdg9DD,YAAA,Ich9DC,iBdm9DD,YAAA,acn9DC,iBds9DD,YAAA,YY18DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udu/DD,MAAA,Kcv/DC,Wd0/DD,MAAA,Kc1/DC,Wd6/DD,MAAA,ac7/DC,WdggED,MAAA,achgEC,UdmgED,MAAA,IcngEC,UdsgED,MAAA,actgEC,UdygED,MAAA,aczgEC,Ud4gED,MAAA,Ic5gEC,Ud+gED,MAAA,ac/gEC,UdkhED,MAAA,aclhEC,UdqhED,MAAA,IcrhEC,UdwhED,MAAA,aczgEC,Ud4gED,MAAA,Yc5gEC,gBd+gED,MAAA,Kc/gEC,gBdkhED,MAAA,aclhEC,gBdqhED,MAAA,acrhEC,edwhED,MAAA,IcxhEC,ed2hED,MAAA,ac3hEC,ed8hED,MAAA,ac9hEC,ediiED,MAAA,IcjiEC,edoiED,MAAA,acpiEC,eduiED,MAAA,acviEC,ed0iED,MAAA,Ic1iEC,ed6iED,MAAA,acxiEC,ed2iED,MAAA,Yc1jEC,ed6jED,MAAA,Kc7jEC,gBdgkED,KAAA,KchkEC,gBdmkED,KAAA,acnkEC,gBdskED,KAAA,actkEC,edykED,KAAA,IczkEC,ed4kED,KAAA,ac5kEC,ed+kED,KAAA,ac/kEC,edklED,KAAA,IcllEC,edqlED,KAAA,acrlEC,edwlED,KAAA,acxlEC,ed2lED,KAAA,Ic3lEC,ed8lED,KAAA,aczlEC,ed4lED,KAAA,Yc7kEC,e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pC,cAGA,ejB8DA,wBACQ,OAAA,YJ65FT,OAAA,kBmB56FG,mBAAA,KlBw7FM,WAAY,KkBt7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBo+FD,aoBj+FC,MAAA,KnB6+FA,iBAAkB,KmB3+FhB,aAAA,KpBq+FH,mBoBn+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBo+FH,mBoBj+FC,MAAA,KnB6+FA,iBAAkB,QAClB,aAAc,QmBz+FR,oBADJ,oBpBo+FH,mCoBj+FG,MAAA,KnB6+FF,iBAAkB,QAClB,aAAc,QmBz+FN,0BnB++FV,0BAHA,0BmB7+FM,0BnB++FN,0BAHA,0BDFC,yCoB3+FK,yCnB++FN,yCmB1+FE,MAAA,KnBk/FA,iBAAkB,QAClB,aAAc,QmB3+FZ,oBpBm+FH,oBoBn+FG,mCnBg/FF,iBAAkB,KmB5+FV,4BnBi/FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB99FA,sCClBM,sCnBi/FN,sCmB3+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB6hGD,aoB1hGC,MAAA,KnBsiGA,iBAAkB,QmBpiGhB,aAAA,QpB8hGH,mBoB5hGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB6hGH,mBoB1hGC,MAAA,KnBsiGA,iBAAkB,QAClB,aAAc,QmBliGR,oBADJ,oBpB6hGH,mCoB1hGG,MAAA,KnBsiGF,iBAAkB,QAClB,aAAc,QmBliGN,0BnBwiGV,0BAHA,0BmBtiGM,0BnBwiGN,0BAHA,0BDFC,yCoBpiGK,yCnBwiGN,yCmBniGE,MAAA,KnB2iGA,iBAAkB,QAClB,aAAc,QmBpiGZ,oBpB4hGH,oBoB5hGG,mCnByiGF,iBAAkB,KmBriGV,4BnB0iGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBphGA,sCCrBM,sCnB0iGN,sCmBpiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBslGD,aoBnlGC,MAAA,KnB+lGA,iBAAkB,QmB7lGhB,aAAA,QpBulGH,mBoBrlGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBslGH,mBoBnlGC,MAAA,KnB+lGA,iBAAkB,QAClB,aAAc,QmB3lGR,oBADJ,oBpBslGH,mCoBnlGG,MAAA,KnB+lGF,iBAAkB,QAClB,aAAc,QmB3lGN,0BnBimGV,0BAHA,0BmB/lGM,0BnBimGN,0BAHA,0BDFC,yCoB7lGK,yCnBimGN,yCmB5lGE,MAAA,KnBomGA,iBAAkB,QAClB,aAAc,QmB7lGZ,oBpBqlGH,oBoBrlGG,mCnBkmGF,iBAAkB,KmB9lGV,4BnBmmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBzkGA,sCCzBM,sCnBmmGN,sCmB7lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB+oGD,UoB5oGC,MAAA,KnBwpGA,iBAAkB,QmBtpGhB,aAAA,QpBgpGH,gBoB9oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB+oGH,gBoB5oGC,MAAA,KnBwpGA,iBAAkB,QAClB,aAAc,QmBppGR,iBADJ,iBpB+oGH,gCoB5oGG,MAAA,KnBwpGF,iBAAkB,QAClB,aAAc,QmBppGN,uBnB0pGV,uBAHA,uBmBxpGM,uBnB0pGN,uBAHA,uBDFC,sCoBtpGK,sCnB0pGN,sCmBrpGE,MAAA,KnB6pGA,iBAAkB,QAClB,aAAc,QmBtpGZ,iBpB8oGH,iBoB9oGG,gCnB2pGF,iBAAkB,KmBvpGV,yBnB4pGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB9nGA,mCC7BM,mCnB4pGN,mCmBtpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBwsGD,aoBrsGC,MAAA,KnBitGA,iBAAkB,QmB/sGhB,aAAA,QpBysGH,mBoBvsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBwsGH,mBoBrsGC,MAAA,KnBitGA,iBAAkB,QAClB,aAAc,QmB7sGR,oBADJ,oBpBwsGH,mCoBrsGG,MAAA,KnBitGF,iBAAkB,QAClB,aAAc,QmB7sGN,0BnBmtGV,0BAHA,0BmBjtGM,0BnBmtGN,0BAHA,0BDFC,yCoB/sGK,yCnBmtGN,yCmB9sGE,MAAA,KnBstGA,iBAAkB,QAClB,aAAc,QmB/sGZ,oBpBusGH,oBoBvsGG,mCnBotGF,iBAAkB,KmBh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mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3By0KF,iBAAA,QkDxxKC,WAAY,IAAI,MAAM,KjDozKtB,2BAA4B,IiDjzK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElD2xKL,oCkDtxKG,oDjDkzKF,aAAc,IAAI,EiDhzKZ,cAAA,EvBtEL,4D3Bg2KF,4EkDpxKG,WAAA,EjDgzKF,uBAAwB,IiD9yKlB,wBAAA,IvBtEL,0D3B81KF,0EkD7yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElDixKH,wBAAA,EkD7wKC,wDlDgxKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDryKpB,8BlD6wKC,ckD7wKD,gCjD0yKE,cAAe,EiD1yKjB,sCAQM,sBlD2wKL,wCC4BC,cAAe,K0Bx5Kf,aAAA,KuByGF,wDlDwxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDrzK3B,yFAoBQ,yFlD2wKP,2DkD5wKO,2DjDwyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiDj0KA,wGjD+zKA,wGDtBC,wGCuBD,0EiDh0KA,0EjD8zKA,0EiDtyKU,0EjD8yKR,uBAAwB,IAK1B,uGiD30KA,uGjDy0KA,uGDtBC,uGCuBD,yEiD10KA,yEjDw0KA,yEiD5yKU,yEvB7HR,wBAAA,IuBiGF,sDlDwzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiD3yKrB,qFA1CR,qFAyCQ,wDlDsxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiDj2KA,oGjD81KA,uEiDhzKU,uEjDkzKV,uEiDh2KA,uEjDs2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiD32KA,mGjDw2KA,sEiDtzKU,sEjDwzKV,sEiD12KA,sEjDg3KE,2BAA4B,IiDrzK1B,0BlD8xKH,qCkDz1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD83KE,OAAQ,EiDpzKA,+CjDwzKV,+CiDl4KA,+CjDo4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDn4KA,iEjDq4KA,iEAEA,iEANA,iEAWE,YAAa,EiD9zKL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1MG,QAAS,oB/Dm2MV,c+Dr2MC,c/Ds2MH,QAAA,sB+Dj2MG,yB/Dq2MD,kBACF,QAAA,iB+Dj2MG,yB/Dq2MD,mBACF,QAAA,kBgEn6MC,yBhEu6MC,yBgEt6MD,QAAA,wBACA,+CAAU,YhE26MT,QAAA,gBC4BD,iB+Dr8MU,QAAA,gBhE86MX,c+Dx2MG,QAAS,oB/D42MV,c+D92MC,c/D+2MH,QAAA,sB+D12MG,+C/D82MD,kBACF,QAAA,iB+D12MG,+C/D82MD,mBACF,QAAA,kBgEj8MC,+ChEq8MC,yBgEp8MD,QAAA,wBACA,gDAAU,YhEy8MT,QAAA,gBC4BD,iB+Dn+MU,QAAA,gBhE48MX,c+Dj3MG,QAAS,oB/Dq3MV,c+Dv3MC,c/Dw3MH,QAAA,sB+Dn3MG,gD/Du3MD,kBACF,QAAA,iB+Dn3MG,gD/Du3MD,mBACF,QAAA,kBgE/9MC,gDhEm+MC,yBgEl+MD,QAAA,wBACA,0BAAU,YhEu+MT,QAAA,gBC4BD,iB+DjgNU,QAAA,gBhE0+MX,c+D13MG,QAAS,oB/D83MV,c+Dh4MC,c/Di4MH,QAAA,sB+D53MG,0B/Dg4MD,kBACF,QAAA,iB+D53MG,0B/Dg4MD,mBACF,QAAA,kBgEr/MC,0BhEy/MC,yBACF,QAAA,wBgE1/MC,yBhE8/MC,WACF,QAAA,gBgE//MC,+ChEmgNC,WACF,QAAA,gBgEpgNC,gDhEwgNC,WACF,QAAA,gBAGA,0B+Dn3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehE4hNT,QAAA,gBC4BD,oB+DtjNU,QAAA,gBhE+hNX,iB+Dj4MG,QAAS,oBAMX,iB/D83MD,iB+Dz2MG,QAAS,sB/D82MZ,qB+Dl4MC,QAAS,e/Dq4MV,a+D/3MC,qBAcE,QAAS,iB/Ds3MZ,sB+Dn4MC,QAAS,e/Ds4MV,a+Dh4MC,sBAOE,QAAS,kB/D83MZ,4B+D/3MC,QAAS,eCpLT,ahEujNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS"}
igds-web/src/main/resources/static/images/img-fail.jpg
igds-web/src/main/resources/static/img/areation/5000/pfc_a.png
igds-web/src/main/resources/static/img/areation/5000/pfc_b.png
igds-web/src/main/resources/static/img/gas/5326/5326_001.png
igds-web/src/main/resources/templates/test/PrintIn5329.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<!DOCTYPE html><html lang='zh-cn'><head><meta http-equiv='Content-Type' content='text/html;charset=UTF-8'><title>入库过磅单</title><style>body {text-align: center;padding: 10px}  .tit {margin: 10px;font-size: 24px;font-family: '宋体';padding-top: 15px}  .div-tit {padding-top: 10px}  table {width: 100%;border-right: 1px solid;border-bottom: 1px solid;font-size: 14px}  table td {border-left: 1px solid;border-top: 1px solid;height: 38px}  .sp1 {width: 50%;float: left;padding-bottom: 10px}  .sp2 {width: 50%;float: left;text-align: center}</style></head><body><h1 class='tit'>佛山市禅城区粮食产业园入库磅码单</h1><div id=\"print_main\" class='div-tit'><span class='sp1'>完成时间:<a>completeTime</a></span><span class='sp1'>单号:serId</span></div><table cellspacing='0' cellpadding='0'><tr><td width='12.5%'>发货单位</td><td colspan='3' width='37.5%'>customerName</td><td width='12.5%'>收货单位</td><td colspan='3' `width`='37.5%'>deptName</td></tr><tr><td width='12.5%'>承运人</td><td width='12.5%'>driverName</td><td width='12.5%'>粮食品种</td><td width='12.5%'>foodVariety</td><td width='12.5%'>装卸仓库</td><td width='12.5%'>depotName</td><td width='12.5%'>粮食产地</td><td width='12.5%'>foodLocation</td></tr><tr><td>承运车牌</td><td>plateNum</td><td>毛重(KG)</td><td>fullWeight</td><td>皮重(KG)</td><td>emptyWeight</td><td>净重(KG)</td><td>netWeight</td></tr><tr><td>质检结果</td><td>checkStatus</td><td>包装扣重(KG)</td><td>dePackage</td><td>入库重量(KG)</td><td>recordWeight</td><td>结算重量(KG)</td><td>settleWeight</td></tr><tr><td>登记时间</td><td colspan="3">registerTime</td><td>完成时间</td><td colspan="3">completeTime</td></tr><tr><td>备注</td><td colspan='7'>remark</td></tr></table><div class='div-tit'><span class='sp2'>司磅员:</span></span><span class='sp2'>承运人:</span></div></br><div style="padding-top: 10px"><span></span></div><div style="text-align: left;font-size: 12px"><span>注:</span></div><div style="text-align: left;font-size: 12px"><span>1.净重=毛重-皮重;质检增扣重根据质检详细填写;</span></div><div style="text-align: left;font-size: 12px"><span>2.入库重量=净重-扣重;结算重量=入库重量+质检增重;</span></div><div style="text-align: left;font-size: 12px"><span>3.白联(存根),红联(记账),黄联(客户保留)</span></div></body></html>
igds-web/src/main/resources/templates/test/PrintOut5329.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang='zh-cn'>
<head>
    <meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>
    <title>出库称重单</title>
    <style>body {
        text-align: center;
        padding: 10px
    }
    .tit {
        margin: 10px;
        font-size: 24px;
        font-family: '宋体';
        padding-top: 15px
    }
    .div-tit {
        padding-top: 10px
    }
    .sp1 {
        width: 50%;
        float: left;
        padding-bottom: 10px
    }
    .sp2 {
        width: 25%;
        float: left;
        text-align: center
    }
    table {
        width: 100%;
        border-right: 1px solid;
        border-bottom: 1px solid;
        font-size: 14px
    }
    table td {
        border-left: 1px solid;
        border-top: 1px solid;
        height: 38px
    }</style>
</head>
<body><h1 class='tit'>billTitle</h1>
<div class='div-tit'><span class='sp1'>登记时间:registerTime</span><span class='sp1'>出库单号:serId</span></div>
<table cellspacing='0' cellpadding='0'>
    <tr>
        <td width='12.5%'>发货单位</td>
        <td colspan='3' width='37.5%'>deptName</td>
        <td width='12.5%'>收货单位</td>
        <td colspan='3' width='37.5%'>customerName</td>
    </tr>
    <tr>
        <td width='12.5%'>承运人</td>
        <td width='12.5%'>driverName</td>
        <td width='12.5%'>粮食品种</td>
        <td width='12.5%'>foodVariety</td>
        <td width='12.5%'>出库仓库</td>
        <td width='12.5%'>depotName</td>
        <td width='12.5%'>粮食产地</td>
        <td width='12.5%'>foodLocation</td>
    </tr>
    <tr>
        <td>承运车牌</td>
        <td>plateNum</td>
        <td>毛重(KG)</td>
        <td>fullWeight</td>
        <td>皮重(KG)</td>
        <td>emptyWeight</td>
        <td>净重(KG)</td>
        <td>netWeight</td>
    </tr>
    <tr>
        <td>其他扣重(KG)</td>
        <td>deOther</td>
        <td>值仓扣重(KG)</td>
        <td>deHandle</td>
        <td>结算重量(KG)</td>
        <td>settleWeight</td>
        <td colspan="2"></td>
    </tr>
    <tr>
        <td>备注</td>
        <td colspan='7'>remark</td>
    </tr>
</table>
<div class='div-tit'><span class='sp2'>司磅员:</span><span class='sp2'>监磅员:</span><span
        class='sp2'>保管员:handleUser</span><span class='sp2'>承运人:driverName</span></div>
<br></body>
<div style="padding-top: 10px"><span></span></div>
<div style="text-align: left;font-size: 12px"><span>注:</span></div>
<div style="text-align: left;font-size: 12px"><span>1.净重=毛重-皮重;</span></div>
<div style="text-align: left;font-size: 12px"><span>2.出库重量=净重-总扣重;结算重量=净重-总扣重;</span></div>
<div style="text-align: left;font-size: 12px
"><span>3.白联(存根),红联(记账),黄联(客户保留)</span></div>
</html>