From b030109e665301e7edd6ad0fe5c832ee10fe39b4 Mon Sep 17 00:00:00 2001 From: czt <czt18638530771@163.com> Date: 星期六, 13 七月 2024 16:48:14 +0800 Subject: [PATCH] 调整出入库补单信息2 --- igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/util/BeiboGrainServerUtils.java | 17 igds-web/src/main/resources/templates/test/PrintOut5329.html | 99 + igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/ServerRunner.java | 39 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/analysis/AnalysisService.java | 822 ++++++++ igds-web/src/main/resources/templates/test/PrintIn5329.html | 1 igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepot.view.xml | 345 +++ igds-web/src/main/resources/static/img/areation/5000/pfc_a.png | 0 igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5328ServiceImpl.java | 55 igds-web/src/main/resources/static/images/img-fail.jpg | 0 igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java | 57 igds-recir/.gitignore | 1 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerUtils.java | 65 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1HeartbeatImpl.java | 41 igds-inout/src/main/java/com/ld/igds/inout/service/HSettleService.java | 169 + igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessage.java | 42 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/ClientHandler.java | 62 igds-security/src/main/java/com/ld/igds/models/SecSnapDepot.java | 86 igds-basic/src/main/java/com/ld/igds/timer/WeatherTimerService.java | 354 +++ igds-security/src/main/java/com/ld/igds/sec/service/SecSnapDepotService.java | 151 + igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepotPR.java | 140 + igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java | 7 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessageBuilder.java | 58 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1MessageConsumer.java | 50 igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java | 88 igds-basic/src/main/java/com/ld/igds/timer/ScheduledBasic.java | 62 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1SessionListener.java | 61 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/BeiboClientEngine.java | 121 + igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/RemoteGrainServiceImpl.java | 60 igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java | 73 igds-web/src/main/resources/static/css/bootstrap.min.css.map | 1 igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java | 62 igds-security/src/main/java/com/ld/igds/timer/ScheduledSec.java | 174 + igds-protocol-zldz/.rules | 1178 ++++++++++++ igds-protocol-es/pom.xml | 56 igds-warn/src/main/java/com/ld/igds/warn/view/SecureManager.view.xml | 460 ++++ igds-security/src/main/java/com/ld/igds/models/SecSnapConf.java | 55 igds-warn/src/main/java/com/ld/igds/warn/service/HSecureManagerService.java | 105 + igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5332ServiceImpl.java | 55 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/CommandBuild.java | 55 igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/package-info.java | 6 igds-web/src/main/resources/static/img/areation/5000/pfc_b.png | 0 igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java | 99 + igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java | 98 + igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerEngine.java | 110 + igds-warn/src/main/java/com/ld/igds/warn/view/SecureManagerPR.java | 53 igds-web/src/main/resources/static/img/gas/5326/5326_001.png | 0 46 files changed, 5,693 insertions(+), 0 deletions(-) diff --git a/igds-basic/src/main/java/com/ld/igds/timer/ScheduledBasic.java b/igds-basic/src/main/java/com/ld/igds/timer/ScheduledBasic.java new file mode 100644 index 0000000..7b36a45 --- /dev/null +++ b/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(); + } + } +} diff --git a/igds-basic/src/main/java/com/ld/igds/timer/WeatherTimerService.java b/igds-basic/src/main/java/com/ld/igds/timer/WeatherTimerService.java new file mode 100644 index 0000000..44b2ce3 --- /dev/null +++ b/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> + * 椋庢鑷磋繙璐拱澶栫綉姘旇薄鏈嶅姟锛� + * 姘旇薄鏈嶅姟锛歨ttp://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; + } + + /** + * 鏍规嵁寤哄ぇ浠佺浜慥30鍗忚鑾峰彇姘旇薄淇℃伅 + * + * @param date + * @param conf + */ + private void getWeatherByRkV30(Date date, WeatherConf conf) { + + //鑻ョ敤鎴枫�佸瘑鐮併�両P鍦板潃鏈変竴涓虹┖鍒欒繑鍥� + 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); + } + + /** + * 鑾峰彇韬唤璁よ瘉鐨勬巿鏉僡ccessToken + * + * @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"); + + //灏唗oken瀛樺叆缂撳瓨, + redisUtil.set(key, token, 2 * 60 * 60); + } + return token; + } + + +} diff --git a/igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5328ServiceImpl.java b/igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5328ServiceImpl.java new file mode 100644 index 0000000..9653816 --- /dev/null +++ b/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(); + } + } +} diff --git a/igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5332ServiceImpl.java b/igds-basic/src/main/java/com/ld/igds/timer/zcl/service/impl/InteGrain5332ServiceImpl.java new file mode 100644 index 0000000..e39f8b2 --- /dev/null +++ b/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(); + } + } +} diff --git a/igds-inout/src/main/java/com/ld/igds/inout/service/HSettleService.java b/igds-inout/src/main/java/com/ld/igds/inout/service/HSettleService.java new file mode 100644 index 0000000..cb0d6e3 --- /dev/null +++ b/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); + } +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/ServerRunner.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/ServerRunner.java new file mode 100644 index 0000000..49ffe2a --- /dev/null +++ b/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); + } + } +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/RemoteGrainServiceImpl.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/RemoteGrainServiceImpl.java new file mode 100644 index 0000000..f2269d8 --- /dev/null +++ b/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()); + } + } +} \ No newline at end of file diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/analysis/AnalysisService.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/analysis/AnalysisService.java new file mode 100644 index 0000000..9124cae --- /dev/null +++ b/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.*; + +/** + * 鍗忚瑙f瀽 + * + * @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("鍒嗘満------->>骞冲彴锛岃В鏋愮伯鎯呭け璐ワ細鎶ユ枃璧峰绗�={}閿欒锛屼笉瑙f瀽", 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 = "绮儏瑙f瀽澶辫触:鍒嗘満=" + 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 = "绮儏瑙f瀽澶辫触:鍒嗘満=" + ser.getName() + "娌℃湁鑾峰彇鍘嗗彶鍛戒护銆�"; + log.error("璐濆崥鍒嗘満------>>>骞冲彴锛�" + info); + return; + } + + DepotConf depotConf = commonService.getCacheDepotConf(exeRequest.getCompanyId(), exeRequest.getDepotId()); + if (null == depotConf) { + String info = "绮儏瑙f瀽澶辫触:鍒嗘満=" + 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); + } + } + } + + /** + * 鍦嗙瓛浠撶殑绮儏瑙f瀽 + * + * @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("鍒嗘満------>>>骞冲彴锛氬綋鍓嶄粨搴擄細{}-{}锛屾病鏈夋病鏈夐厤缃竷绾胯鍒欙紝鏃犳硶瑙f瀽绮儏淇℃伅鈥︹��", + ser.getCompanyId(), depotConf.getDepotName()); + return; + } + + String[] cableRuleAtt = depotConf.getCableRule().split("-"); + String[] cableCirAtt = depotConf.getCableCir().split("-"); + + if (cableRuleAtt.length != cableCirAtt.length) { + log.error("鍒嗘満------>>>骞冲彴锛氬綋鍓嶄粨搴擄細{}-{}锛屽竷绾胯鍒欎笉姝g‘锛屾棤娉曡В鏋愮伯鎯呬俊鎭�︹��", 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 鍏卞灏戞牴鐢电紗锛沜ableZ 灞傜殑鏈�澶у�硷紝閿ュ舰浠撹ˉ榻愭渶澶у眰 + + 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; //鏍囪瑙f瀽鐨勫眰鏁� + 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; + } + + /** + * 骞虫柟浠撶殑瑙f瀽锛岃В鏋愰渶瑕佽�冭檻褰撳墠鏄惁鍚敤鐨勪竴鍒嗘満澶氫粨 + * + * @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); + } + + // 璇存槑瑙f瀽鐨勬暟鎹湁闂 + 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); + } + + /** + * 骞虫埧浠擄紝瑙f瀽绗簩姝ワ紝瑙f瀽鍒板潗鏍囨暟鎹� + * + * @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 = ""; + + //瑙f瀽浠撳唴娓╀粨鍐呮箍 + 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("绮俯姝e父"); + + // 鑾峰彇缂撳瓨涓殑鍛戒护淇℃伅 + 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 = ""; + + //瑙f瀽浠撳唴娓╀粨鍐呮箍 + 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("绮俯姝e父"); + 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; + } + + /** + * 涓婇敟褰㈣ˉ鐐�(鐐逛綅浣嶇疆姝g‘锛岄渶瑕佽ˉ鐐逛负-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, ","); + } + + /** + * 涓嬮敟褰㈣ˉ鐐�(鐐逛綅浣嶇疆姝g‘锛岄渶瑕佽ˉ鐐逛负-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, ","); + } +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/CommandBuild.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/CommandBuild.java new file mode 100644 index 0000000..7002fcf --- /dev/null +++ b/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鎴栬�匜F + sb.append("00"); + + //缁撳熬绗� + sb.append(BeiboGrainServerUtils.MSG_END); + + return sb.toString(); + } +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessage.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessage.java new file mode 100644 index 0000000..1d6821a --- /dev/null +++ b/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;// 褰撳墠鍛戒护杞崲涓哄瓧绗︿覆鐨勪俊鎭� +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessageBuilder.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/builder/ReMessageBuilder.java new file mode 100644 index 0000000..98613dc --- /dev/null +++ b/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; + } +} + diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/BeiboClientEngine.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/BeiboClientEngine.java new file mode 100644 index 0000000..de79179 --- /dev/null +++ b/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()); + } + }); + + // 鍙戣捣寮傛杩炴帴璇锋眰锛岀粦瀹氳繛鎺ョ鍙e拰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; + } + +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/ClientHandler.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/client/ClientHandler.java new file mode 100644 index 0000000..4d97ce2 --- /dev/null +++ b/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("鍒嗘満鎴愬姛杩炴帴锛孖P={},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("鍒嗘満鏂紑杩炴帴锛孖P={},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(); + + //瑙f瀽 + if (null == analysisService) { + analysisService = (AnalysisService) SpringUtil.getBean(AnalysisService.BEAN_ID); + } +// analysisService.analysis(result); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + ctx.close(); + } + +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/package-info.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/package-info.java new file mode 100644 index 0000000..e752e77 --- /dev/null +++ b/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; + + diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1HeartbeatImpl.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1HeartbeatImpl.java new file mode 100644 index 0000000..5827efb --- /dev/null +++ b/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; + } +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1MessageConsumer.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1MessageConsumer.java new file mode 100644 index 0000000..b3df71c --- /dev/null +++ b/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); + } + } +} \ No newline at end of file diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerEngine.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerEngine.java new file mode 100644 index 0000000..8b14e90 --- /dev/null +++ b/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锛欱EIBO_GRAIN,PORT={}]", PORT); + log.info("* "); + log.info("* ========================"); + log.info("* "); + + System.out.println("* ========================"); + System.out.println("* "); + System.out.println("* [GRAIN-SERVER锛欱EIBO_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); + } + + /** + * 鐩存帴浣跨敤鍐呭瓨鐨凷ession鎵ц + */ + 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); + } + +} \ No newline at end of file diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerUtils.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1ServerUtils.java new file mode 100644 index 0000000..a7b5f73 --- /dev/null +++ b/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 = 杩炴帴鐨凨YE锛宒ata =褰撳墠鏃堕棿鎴� + */ + public static Map<String, Long> contextMapHeart = new HashMap<>(); + + public static Map<String, IoSession> contextIoSession = new HashMap<>(); + + + public static int HEART_BEAT_TIME = 30;//蹇冭烦闂撮殧鏃堕棿 + + /** + * 閽堝鏃犵嚎绮儏涓绘満鐨勯粯璁D閰嶇疆 + */ + public static String DEFAULT_MAC_ID = "6550"; + + /** + * 鐢熸垚TCP杩炴帴鐨凨EY + * + * @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); + } +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1SessionListener.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/server/BeiboGrainV1SessionListener.java new file mode 100644 index 0000000..6a759cb --- /dev/null +++ b/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; + /** + * 璁惧鍒涘缓鍦ㄧ嚎锛岄渶瑕佹敞鎰忓綋鍓嶄娇鐢ㄤ富鏈烘ā寮忥紝涓绘満涓婄嚎榛樿鎵�鏈夌浉鍚孲N閰嶇疆鐨勫垎鏈哄叏閮ㄤ笂绾� + * + * @param session + */ + @Override + public void onCreate(IoSession session) { + + //娣诲姞鍒板唴瀛� + BeiboGrainV1ServerUtils.addSession(session); + + log.info("++++鏂板缓杩炴帴++++-IP={}锛孭ORT={}", session.getAddress(), session.getPort()); + + // 娣诲姞鑷畾涔変笟鍔D + 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()); + } + + /** + * 娉ㄦ剰锛屽綋鍓嶉噰鐢ㄤ富鏈烘ā寮忥紝涓绘満绂荤嚎鎵�鏈夌浉鍚孲N閰嶇疆鐨勫垎鏈哄叏閮ㄧ绾� + * + * @param session + */ + @Override + public void onDestroy(IoSession session) { + log.info("----杩炴帴鏂紑-----IP={}锛孭ORT={}", session.getAddress(), session.getPort()); + + //椤圭洰閲囩敤鏃犵嚎涓绘満妯″紡锛岀洿鎺ヨ幏鍙栭粯璁よ澶� + DeviceSer deviceSer = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), BeiboGrainV1ServerUtils.DEFAULT_MAC_ID); + + if (null == deviceSer) return; + + } +} diff --git a/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/util/BeiboGrainServerUtils.java b/igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/util/BeiboGrainServerUtils.java new file mode 100644 index 0000000..281c048 --- /dev/null +++ b/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; //缁撳熬绗� + + +} diff --git a/igds-protocol-es/pom.xml b/igds-protocol-es/pom.xml new file mode 100644 index 0000000..849b1f4 --- /dev/null +++ b/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> \ No newline at end of file diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java new file mode 100644 index 0000000..99754d1 --- /dev/null +++ b/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澶氬姛鑳界數琛ㄥ垎鏈哄紑濮嬫娴嬶紝鍒嗘満{}鐨処P={},绔彛={}",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()); + } + } +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java new file mode 100644 index 0000000..be01020 --- /dev/null +++ b/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鐢佃〃鍗忚瑙f瀽 + * + * @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; + } + + //瑙f瀽鎬昏兘鑰楁暟鎹� + 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); + } + } +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java new file mode 100644 index 0000000..de915b6 --- /dev/null +++ b/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(); + } +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java new file mode 100644 index 0000000..673ae52 --- /dev/null +++ b/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("鐢佃〃鏈嶅姟鍣ㄦ柇寮�杩炴帴锛孖P={},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(); + + //瑙f瀽 + //璋冪敤瑙f瀽鎺ュ彛寮�濮嬭В鏋� + if (null == analysisService) { + analysisService = (AnalysisService) SpringUtil.getBean(AnalysisService.BEAN_ID); + } + analysisService.analysis(result); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + ctx.close(); + } + +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java new file mode 100644 index 0000000..ae11036 --- /dev/null +++ b/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()); + } + }); + + // 鍙戣捣寮傛杩炴帴璇锋眰锛岀粦瀹氳繛鎺ョ鍙e拰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={}锛孭ORT={}", host, port); + } else { + log.info("-----杩炴帴鐢佃〃鏈嶅姟鍣ㄥけ璐ワ紝IP={}锛孭ORT={}", 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; + } + +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java new file mode 100644 index 0000000..9fc7e9a --- /dev/null +++ b/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; \ No newline at end of file diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java new file mode 100644 index 0000000..fa404a8 --- /dev/null +++ b/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杩涘埗鐨凢F + */ + int mod = total % 256; + String hex = Integer.toHexString(mod); + len = hex.length(); + // 濡傛灉涓嶅鏍¢獙浣嶇殑闀垮害锛岃ˉ0,杩欓噷鐢ㄧ殑鏄袱浣嶆牎楠� + if (len < 2) { + hex = "0" + hex; + } + return hex.toUpperCase(); + } + + /** + * 灏哠tring绫诲瀷杞崲鎴恇yte鏁扮粍 + */ + 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; + } + + /** + * 瑙f瀽杩斿洖鐨勫叿浣撴暟鎹� + */ + 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; + } + +} diff --git a/igds-protocol-zldz/.rules b/igds-protocol-zldz/.rules new file mode 100644 index 0000000..f40ff34 --- /dev/null +++ b/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,|<,<,>,>|,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=">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=">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> \ No newline at end of file diff --git a/igds-recir/.gitignore b/igds-recir/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/igds-recir/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/igds-security/src/main/java/com/ld/igds/models/SecSnapConf.java b/igds-security/src/main/java/com/ld/igds/models/SecSnapConf.java new file mode 100644 index 0000000..1432f61 --- /dev/null +++ b/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; +} diff --git a/igds-security/src/main/java/com/ld/igds/models/SecSnapDepot.java b/igds-security/src/main/java/com/ld/igds/models/SecSnapDepot.java new file mode 100644 index 0000000..5e528d0 --- /dev/null +++ b/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(); + } + } +} diff --git a/igds-security/src/main/java/com/ld/igds/sec/service/SecSnapDepotService.java b/igds-security/src/main/java/com/ld/igds/sec/service/SecSnapDepotService.java new file mode 100644 index 0000000..84d83de --- /dev/null +++ b/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(); + } + } +} diff --git a/igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepot.view.xml b/igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepot.view.xml new file mode 100644 index 0000000..b1a6b4a --- /dev/null +++ b/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("depotPR#getAllCache").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("depotPR#getAllCache").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("securityPR#listCamera").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("depotPR#getAllCache").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("#dsQuery.data:#");
 +view.get("#dsMain").set("parameter",entity).flushAsync(function(){
 + $notify("鏌ヨ鎴愬姛锛�");
 +});</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("#dsQuery").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("#dialogConf").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("id");
 +var time = arg.data.get("updateTime").formatDate("Y-m-d H:i");
 +var timeStr = arg.data.get("updateTime").formatDate("Ymd");
 +var depotId = arg.data.getText("depotId");
 +var imgSrc = "../../basic/file/get-snap-depot?fileName="+arg.data.get("fileName")+"&timeStr="+timeStr;
 +var htm = "<div><img src='./static/images/img-fail.jpg' style='height:250px; width:100%;'><div><span style='padding-left:10px;'>浠撳簱锛氭湭鏌ヨ鍒版暟鎹�</span><span style='float:right;padding-right:10px;'>鏃堕棿锛�"+time+"</span></div></div>";
 +if("TEST" != id){
 + htm = "<div><img src='"+imgSrc+"' style='height:250px; width:100%;'><div><span style='padding-left:10px;'>浠撳簱锛�"+depotId+"</span><span style='float:right;padding-right:10px;'>鏃堕棿锛�"+time+"</span></div></div>";
 +}
 +arg.dom.innerHTML = htm;
 +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("#dsConf").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("#dsParam.data");
 +view.get("#ajaxSnapTime").set("parameter",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> diff --git a/igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepotPR.java b/igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepotPR.java new file mode 100644 index 0000000..be43a40 --- /dev/null +++ b/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); + + } +} diff --git a/igds-security/src/main/java/com/ld/igds/timer/ScheduledSec.java b/igds-security/src/main/java/com/ld/igds/timer/ScheduledSec.java new file mode 100644 index 0000000..36f12ad --- /dev/null +++ b/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()); + } +} diff --git a/igds-warn/src/main/java/com/ld/igds/warn/service/HSecureManagerService.java b/igds-warn/src/main/java/com/ld/igds/warn/service/HSecureManagerService.java new file mode 100644 index 0000000..d923703 --- /dev/null +++ b/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(); + } + } + +} diff --git a/igds-warn/src/main/java/com/ld/igds/warn/view/SecureManager.view.xml b/igds-warn/src/main/java/com/ld/igds/warn/view/SecureManager.view.xml new file mode 100644 index 0000000..5c33d99 --- /dev/null +++ b/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("deptPR#loadParents").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">璐d换鍗曚綅</Property> + </PropertyDef> + <PropertyDef name="zrr"> + <Property></Property> + <Property name="label">璐d换浜�</Property> + </PropertyDef> + <PropertyDef name="zgysxx"> + <Property></Property> + <Property name="label">鏁存敼楠屾敹淇℃伅</Property> + </PropertyDef> + <PropertyDef name="fxgzjgzrr"> + <Property name="label">椋庨櫓璺熻釜鐩戠璐d换浜�</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({})
 +</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("#dsMain").insert();
 +view.get("#dialogMain").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("#dsMain.data:#");
 +if(dialog){
 + view.get("#dialogMain").show();
 +}else{
 + $alert("璇烽�変腑闇�瑕佷慨鏀圭殑鏁版嵁")
 +}</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("#dsMain.data:#");
 +if(!cur) return;
 +view.get("#ajaxDel").set("parameter",cur).execute(function(result){
 + if(result){
 + $alert(result);
 + return;
 + }else{
 + cur.remove();
 + }
 +});</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("#dsParam.data:#");
 +view.get("#dsMain").set("parameter",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("#dsParam").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("#dialogMain").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("#dsMain.data:#");
 +view.get("#uaAction").execute(function(result){
 + if(result){
 + $alert(result);
 + }else{
 + self.get("parent").hide();
 + }
 +});</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("#dsMain.data:#").cancel();
 +self.get("parent").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;
 +if(date<10){
 + arg.selectedValue="0"+date
 +}else if(date>=10){
 + arg.selectedValue=date
 +}
 +</ClientEvent> + </MonthDropDown> + </View> +</ViewConfig> diff --git a/igds-warn/src/main/java/com/ld/igds/warn/view/SecureManagerPR.java b/igds-warn/src/main/java/com/ld/igds/warn/view/SecureManagerPR.java new file mode 100644 index 0000000..88889d4 --- /dev/null +++ b/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); + } + +} diff --git a/igds-web/src/main/resources/static/css/bootstrap.min.css.map b/igds-web/src/main/resources/static/css/bootstrap.min.css.map new file mode 100644 index 0000000..5f49bb3 --- /dev/null +++ b/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,KmBhtGV,4BnBqtGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBnrGA,sCCjCM,sCnBqtGN,sCmB/sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpBiwGD,YoB9vGC,MAAA,KnB0wGA,iBAAkB,QmBxwGhB,aAAA,QpBkwGH,kBoBhwGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBiwGH,kBoB9vGC,MAAA,KnB0wGA,iBAAkB,QAClB,aAAc,QmBtwGR,mBADJ,mBpBiwGH,kCoB9vGG,MAAA,KnB0wGF,iBAAkB,QAClB,aAAc,QmBtwGN,yBnB4wGV,yBAHA,yBmB1wGM,yBnB4wGN,yBAHA,yBDFC,wCoBxwGK,wCnB4wGN,wCmBvwGE,MAAA,KnB+wGA,iBAAkB,QAClB,aAAc,QmBxwGZ,mBpBgwGH,mBoBhwGG,kCnB6wGF,iBAAkB,KmBzwGV,2BnB8wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBxuGA,qCCrCM,qCnB8wGN,qCmBxwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnBkuGD,UmB/tGC,YAAA,IlB2uGA,MAAO,QACP,cAAe,EAEjB,UG5wGE,iBemCE,iBflCM,oBJqwGT,6BmBhuGC,iBAAA,YlB4uGA,mBAAoB,KACZ,WAAY,KkBzuGlB,UAEF,iBAAA,gBnBguGD,gBmB9tGG,aAAA,YnBouGH,gBmBluGG,gBAIA,MAAA,QlB0uGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBnuGK,0BAUN,mCATM,mClB8uGJ,MAAO,KmB7yGP,gBAAA,KAGA,mBADA,QpBsyGD,QAAA,KAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,UmBpzGb,cAAA,IAGA,mBADA,QpB6yGD,QAAA,IAAA,KmB/tGC,UAAW,KlB2uGX,YAAa,ImB3zGb,cAAA,IAGA,mBADA,QpBozGD,QAAA,IAAA,ImB9tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB8tGD,MAAA,KCYD,sBACE,WAAY,IqB53GZ,6BADF,4BtBq3GC,6BIhsGC,MAAA,KAEQ,MJosGT,QAAA,EsBx3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtB03GH,WAAA,QAAA,KAAA,OsBr3GC,StBw3GD,QAAA,EsBt3Ga,UtBy3Gb,QAAA,KsBx3Ga,atB23Gb,QAAA,MsB13Ga,etB63Gb,QAAA,UsBz3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ8sGT,oBAAA,KuBx5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvB05GD,WAAA,IAAA,OuBt5GC,WAAY,IAAI,QtBq6GhB,aAAc,IAAI,MAAM,YsBn6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBu5GC,SAAA,SuBj5GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtBk6GA,OsBl6GA,IAAA,MAAA,KvBq5GD,OAAA,IAAA,MAAA,gBuBh5GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBu8GD,OAAA,IuBj7GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvBi5GH,YAAA,IuB34GC,YAAA,WtB25GA,MAAO,KsBz5GL,YAAA,OvB+4GH,0BuB74GG,0BAMF,MAAA,QtBu5GA,gBAAiB,KACjB,iBAAkB,QsBp5GhB,yBAEA,+BADA,+BvB04GH,MAAA,KuBh4GC,gBAAA,KtBg5GA,iBAAkB,QAClB,QAAS,EDZV,2BuB93GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvBg4GH,OAAA,YuB33GC,iBAAkB,YAGhB,iBAAA,KvB23GH,OAAA,0DuBt3GG,qBvBy3GH,QAAA,MuBh3GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvB22GD,UAAA,KuBv2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBy2GD,MAAA,EuBr2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB+2GE,MAAO,EsB32GL,KAAA,KAEA,eACA,sCvB+1GH,QAAA,GuBt2GC,WAAY,EtBs3GZ,cAAe,IAAI,OsB32GjB,cAAA,IAAA,QAEA,uBvB+1GH,8CuB10GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB85GC,yBuB11GD,6BA1DA,MAAA,EACA,KAAA,KvBw5GD,kC0BviHG,MAAO,KzBujHP,KAAM,GyBnjHR,W1ByiHD,oB0B7iHC,SAAU,SzB6jHV,QAAS,ayBvjHP,eAAA,OAGA,yB1ByiHH,gBCgBC,SAAU,SACV,MAAO,KyBhjHT,gC1ByiHC,gCCYD,+BAFA,+ByBnjHA,uBANM,uBzB0jHN,sBAFA,sBAQE,QAAS,EyBrjHP,qB1B0iHH,2B0BriHD,2BACE,iC1BuiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B7iHD,wBAAA,0BzB8jHE,MAAO,KDZR,kB0BliHD,wBACE,0B1BoiHD,YAAA,I0B/hHC,yE1BkiHD,cAAA,E2BnlHC,4BACG,YAAA,EDsDL,mEzBgjHE,wBAAyB,E0B/lHzB,2BAAA,E3BolHD,6C0B/hHD,8CACE,uBAAA,E1BiiHD,0BAAA,E0B9hHC,sB1BiiHD,MAAA,KCgBD,8D0BlnHE,cAAA,E3BumHD,mE0B9hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB6iHE,uBAAwB,EyB3iHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1B0gHD,WAAA,K0BtgHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BwgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB7gHlB,yBACA,+BACA,oC1BkgHH,QAAA,M0BzgHC,MAAO,KAcH,MAAA,K1B8/GL,UAAA,KCgBD,oCACE,MAAO,KyBvgHL,8BACA,oC1B4/GH,oC0Bv/GC,0CACE,WAAA,K1By/GH,YAAA,E2BlqHC,4DACC,cAAA,EAQA,sD3B+pHF,uBAAA,I0Bz/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BqqHF,uBAAA,E0B1/GC,wBAAyB,EACzB,2BAAA,I1B4/GD,0BAAA,ICgBD,uE0BzrHE,cAAA,E3B8qHD,4E0Bz/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bu/GD,QAAA,M0B3/GC,MAAO,KzB2gHP,aAAc,MyBpgHZ,gBAAA,SAEA,0B1Bw/GH,gC0BjgHC,QAAS,WAYP,MAAA,K1Bw/GH,MAAA,G0Bp/GG,qC1Bu/GH,MAAA,KCgBD,+CACE,KAAM,KyBh/GF,gDAFA,6C1By+GL,2D0Bx+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BotHD,a4BhtHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BmtHH,0B4B3tHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5B0sHH,QAAA,E4BxsHG,MAAA,KACE,MAAA,K5B0sHL,cAAA,ECgBD,iCACE,QAAS,EiBtrHT,8BACA,mCACA,sCACA,OAAA,KlB2qHD,QAAA,KAAA,KkBzqHC,UAAA,KjByrHA,YAAa,UACb,cAAe,IiBxrHb,oClB6qHH,yCkB1qHC,4CjB0rHA,OAAQ,KACR,YAAa,KDTd,8C4BltHD,mDAAA,sD3B6tHA,sCACA,2CiB5rHI,8CjBisHF,OAAQ,KiB7sHR,8BACA,mCACA,sCACA,OAAA,KlBksHD,QAAA,IAAA,KkBhsHC,UAAA,KjBgtHA,YAAa,IACb,cAAe,IiB/sHb,oClBosHH,yCkBjsHC,4CjBitHA,OAAQ,KACR,YAAa,KDTd,8C4BhuHD,mDAAA,sD3B2uHA,sCACA,2CiBntHI,8CjBwtHF,OAAQ,K2B5uHR,2B5BguHD,mB4BhuHC,iB3BivHA,QAAS,W2B5uHX,8D5BguHC,sD4BhuHD,oDAEE,cAAA,EAEA,mB5BkuHD,iB4B7tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B+tHD,WAAA,O4B5tHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B+tHH,4B4B5tHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B+tHH,4B4BlvHC,QAAS,KAAK,K3BkwHd,UAAW,K2BxuHT,cAAA,IAKJ,wCAAA,qC3BwuHE,WAAY,EAEd,uCACA,+BACA,kC0Bh1HE,6CACG,8CC4GL,6D5BwtHC,wE4BvtHC,wBAAA,E5B0tHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BnuHA,+D5BytHC,oDCWD,iC0Br1HE,4CACG,6CCiHH,uBAAA,E5B2tHD,0BAAA,E4BrtHC,8BAGA,YAAA,E5ButHD,iB4B3tHC,SAAU,SAUR,UAAA,E5BotHH,YAAA,O4BltHK,sB5BqtHL,SAAA,SCgBD,2BACE,YAAa,K2B3tHb,6BAAA,4B5B+sHD,4B4B5sHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B+sHL,iC6B72HD,uCACE,QAAA,EACA,YAAA,K7Bg3HD,K6Bl3HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B+2HL,U6B72HK,SAAA,S5B63HJ,QAAS,M4B33HH,QAAA,KAAA,KAMJ,gB7B02HH,gB6Bz2HK,gBAAA,K7B42HL,iBAAA,KCgBD,mB4Bx3HQ,MAAA,KAGA,yBADA,yB7B62HP,MAAA,K6Br2HG,gBAAA,K5Bq3HF,OAAQ,YACR,iBAAkB,Y4Bl3Hd,aAzCN,mB7Bg5HC,mBwBn5HC,iBAAA,KACA,aAAA,QAEA,kBxBs5HD,OAAA,I6Bt5HC,OAAQ,IAAI,EA0DV,SAAA,O7B+1HH,iBAAA,Q6Br1HC,c7Bw1HD,UAAA,K6Bt1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bu1HL,aAAA,I6Bt1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bw1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B/1HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bo1HP,OAAA,Q6B/0HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B8xHH,cAAA,E6B5xHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B6xHH,yB6B5tHD,2BA9DM,QAAA,W7B6xHL,MAAA,G6Bt2HD,6BAuFE,cAAA,GAvFF,6B5B23HA,aAAc,EACd,cAAe,IDZhB,kC6BzuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7BkxHH,yB6B9uHD,6B5B8vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6Bj3HD,wC7Bk3HD,wC6Bh3HG,oBAAA,MAIE,c7Bk3HL,MAAA,K6B/2HK,gB7Bk3HL,cAAA,ICgBD,iBACE,YAAa,I4B13HP,uBAQR,6B7Bu2HC,6B6Br2HG,MAAA,K7Bw2HH,iBAAA,Q6Bt2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B+1HD,YAAA,E6B51HG,e7B+1HH,MAAA,K6B71HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B81HH,yB6B7xHD,kBA9DM,QAAA,W7B81HL,MAAA,G6Br1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B62HE,aAAc,EACd,cAAe,IDZhB,8B6B7yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bs1HH,yB6BlzHD,yB5Bk0HE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6B30HD,oC7B40HD,oC6B10HG,oBAAA,MAGA,uB7B60HH,QAAA,K6Bl0HC,qBF3OA,QAAA,M3BkjID,yB8B3iIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B6iID,SAAA,S8BriIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9B4iIH,yB8B5hIC,QAgnBE,cAAe,K9Bi7GlB,yB8BphIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BqhID,2BAAA,M8BnhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BqhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8B57GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BqhID,MAAA,K8BnhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BqhIH,QAAA,gB8BlhIC,OAAA,eACE,eAAA,E9BohIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8BlhIK,mC9BihIH,oC8B5gIC,cAAe,E7B+hIf,aAAc,G6Bp+GlB,sCAnjBE,mC7B4hIA,WAAY,MDdX,4D8BtgID,sC9BugID,mCCkBG,WAAY,O6B9gId,kCANE,gC9BygIH,4B8B1gIG,0BAuiBF,aAAc,M7Bs/Gd,YAAa,MAEf,yBDZC,kC8B9gIK,gC9B6gIH,4B8B9gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BqgIH,yB8BhgIC,mB7BkhIE,cAAe,G6B7gIjB,qBADA,kB9BmgID,SAAA,M8B5/HC,MAAO,EAggBP,KAAM,E7B+gHN,QAAS,KDdR,yB8BhgID,qB9BigID,kB8BhgIC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BogID,qB8B7/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B+/HD,OAAA,K8B7/HC,QAAA,KAAA,K7B+gIA,UAAW,K6B7gIT,YAAA,KAIA,oBAbJ,oB9B2gIC,gBAAA,K8B1/HG,kB7B6gIF,QAAS,MDdR,yBACF,iC8Bn/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bs/HD,iBAAA,Y8Bl/HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bo/HH,cAAA,I8B/+HG,qBACA,QAAA,EAEA,yB9Bk/HH,QAAA,M8BxgIC,MAAO,KAyBL,OAAA,I9Bk/HH,cAAA,I8BvjHD,mCAvbI,WAAA,I9Bm/HH,yB8Bz+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9B4+HH,iB8B/8HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9By+HH,iBAAA,Y8B9kHC,OAAQ,E7BimHR,mBAAoB,K6Bz/HhB,WAAA,KAGA,kDAqZN,sC9BqlHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6B1/HQ,YAAA,KAmBR,4C9By9HD,4C8B1lHG,iBAAkB,M9B+lHnB,yB8B/lHD,YAtYI,MAAA,K9Bw+HH,OAAA,E8Bt+HK,eACA,MAAA,K9B0+HP,iB8B99HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B+vID,WAAA,IAAA,MAAA,YiBzuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjB2yHH,yBiBvqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjB0yHH,2BiB5qHC,QAAS,aAxHP,MAAA,KjBuyHH,eAAA,OiBnyHG,kCACA,QAAA,aAmHJ,0BhBssHE,QAAS,aACT,eAAgB,OgB/yHd,wCjBgyHH,6CiBxrHD,2CjB2rHC,MAAA,KiB/xHG,wCACA,MAAA,KAmGJ,4BhBktHE,cAAe,EgB9yHb,eAAA,OAGA,uBADA,oBjBgyHH,QAAA,aiBtsHC,WAAY,EhBytHZ,cAAe,EgB/yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB+sHC,sCiB1xHG,SAAA,SjB6xHH,YAAA,E8BtgID,kDAmWE,IAAK,GAvWH,yBACE,yB9BihIL,cAAA,I8B//HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJswIP,YAAA,EACF,OAAA,E8BtgIG,mBAAoB,KACtB,WAAA,M9B0gID,8B8BtgIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3B40IF,uBAAA,I8BlgIC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9BkgID,aACF,MAAA,K8Br+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9B0/HH,aAAA,M8Bh/HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bm/HH,aAAA,QCmBD,8B6BngIM,MAAA,KARN,oC9B6/HC,oC8B/+HG,MAAA,Q9Bk/HH,iBAAA,Y8B7+HK,6B9Bg/HL,MAAA,KCmBD,iC6B//HQ,MAAA,KAKF,uC9B4+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6B5/HZ,sCAIF,4C9B0+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6B1/HZ,wCAxCR,8C9BohIC,8C8Bt+HG,MAAA,K9By+HH,iBAAA,YCmBD,+B6Bz/HM,aAAA,KAGA,qCApDN,qC9B8hIC,iBAAA,KCmBD,yC6Bv/HI,iBAAA,KAOE,iCAAA,6B7Bq/HJ,aAAc,Q6Bj/HR,oCAiCN,0C9Bk8HD,0C8B9xHC,MAAO,KA7LC,iBAAA,QACA,yB7Bi/HR,sD6B/+HU,MAAA,KAKF,4D9B49HP,4DCmBC,MAAO,KACP,iBAAkB,Y6B5+HV,2DAIF,iE9B09HP,iECmBC,MAAO,KACP,iBAAkB,Q6B1+HV,6D9B69HX,mEADE,mE8B7jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bo9HL,MAAA,K8B/8HG,mC9Bk9HH,MAAA,KCmBD,0B6Bl+HM,MAAA,KAIA,gCAAA,gC7Bm+HJ,MAAO,K6Bz9HT,0CARQ,0CASN,mD9B08HD,mD8Bz8HC,MAAA,KAFF,gBAKI,iBAAA,K9B68HH,aAAA,QCmBD,8B6B79HM,MAAA,QARN,oC9Bu9HC,oC8Bz8HG,MAAA,K9B48HH,iBAAA,Y8Bv8HK,6B9B08HL,MAAA,QCmBD,iC6Bz9HQ,MAAA,QAKF,uC9Bs8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bt9HZ,sCAIF,4C9Bo8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bp9HZ,wCAxCR,8C9B8+HC,8C8B/7HG,MAAA,K9Bk8HH,iBAAA,YCmBD,+B6Bl9HM,aAAA,KAGA,qCArDN,qC9Bw/HC,iBAAA,KCmBD,yC6Bh9HI,iBAAA,KAME,iCAAA,6B7B+8HJ,aAAc,Q6B38HR,oCAuCN,0C9Bs5HD,0C8B93HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9By7HP,aAAA,Q8Bt7HO,0D9By7HP,iBAAA,QCmBD,sD6Bz8HU,MAAA,QAKF,4D9Bs7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bt8HV,2DAIF,iE9Bo7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bp8HV,6D9Bu7HX,mEADE,mE8B7hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bm7HL,MAAA,Q8B96HG,mC9Bi7HH,MAAA,KCmBD,0B6Bj8HM,MAAA,QAIA,gCAAA,gC7Bk8HJ,MAAO,KgC1kJT,0CH0oBQ,0CGzoBN,mDjC2jJD,mDiC1jJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC8jJD,cAAA,KiCnkJC,WAAY,KAQV,iBAAA,QjC8jJH,cAAA,IiC3jJK,eACA,QAAA,ajC+jJL,yBiC3kJC,QAAS,EAAE,IAkBT,MAAA,KjC4jJH,QAAA,SkC/kJC,oBACA,MAAA,KAEA,YlCklJD,QAAA,akCtlJC,aAAc,EAOZ,OAAA,KAAA,ElCklJH,cAAA,ICmBD,eiClmJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCmlJL,MAAA,QkCjlJG,gBAAA,KjComJF,iBAAkB,KiCjmJZ,OAAA,IAAA,MAAA,KPVH,6B3B8lJJ,gCkChlJG,YAAA,EjCmmJF,uBAAwB,I0B1nJxB,0BAAA,I3B4mJD,4BkC3kJG,+BjC8lJF,wBAAyB,IACzB,2BAA4B,IiC3lJxB,uBAFA,uBAGA,0BAFA,0BlCilJL,QAAA,EkCzkJG,MAAA,QjC4lJF,iBAAkB,KAClB,aAAc,KAEhB,sBiC1lJM,4BAFA,4BjC6lJN,yBiC1lJM,+BAFA,+BAGA,QAAA,ElC8kJL,MAAA,KkCroJC,OAAQ,QjCwpJR,iBAAkB,QAClB,aAAc,QiCtlJV,wBAEA,8BADA,8BjCulJN,2BiCzlJM,iCjC0lJN,iCDZC,MAAA,KkClkJC,OAAQ,YjCqlJR,iBAAkB,KkChqJd,aAAA,KAEA,oBnCipJL,uBmC/oJG,QAAA,KAAA,KlCkqJF,UAAW,K0B7pJX,YAAA,U3B+oJD,gCmC9oJG,mClCiqJF,uBAAwB,I0B1qJxB,0BAAA,I3B4pJD,+BkC7kJD,kCjCgmJE,wBAAyB,IkChrJrB,2BAAA,IAEA,oBnCiqJL,uBmC/pJG,QAAA,IAAA,KlCkrJF,UAAW,K0B7qJX,YAAA,I3B+pJD,gCmC9pJG,mClCirJF,uBAAwB,I0B1rJxB,0BAAA,I3B4qJD,+BoC9qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpCgrJD,aAAA,EoCprJC,OAAQ,KAAK,EAOX,WAAA,OpCgrJH,WAAA,KCmBD,UmChsJM,QAAA,OAEA,YACA,eACA,QAAA,apCirJL,QAAA,IAAA,KoC/rJC,iBAAkB,KnCktJlB,OAAQ,IAAI,MAAM,KmC/rJd,cAAA,KAnBN,kBpCosJC,kBCmBC,gBAAiB,KmC5rJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnCguJE,MAAO,KmCrrJH,mBAEA,yBADA,yBpCwqJL,sBqCrtJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCutJD,WAAA,OqCntJG,YAAA,OpCsuJF,eAAgB,SoCpuJZ,cAAA,MrCutJL,cqCrtJK,cAKJ,MAAA,KACE,gBAAA,KrCktJH,OAAA,QqC7sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StCkvJD,IAAA,KCmBD,eqChwJM,iBAAA,KALJ,2BD0CF,2BrC+sJC,iBAAA,QCmBD,eqCvwJM,iBAAA,QALJ,2BD8CF,2BrCktJC,iBAAA,QCmBD,eqC9wJM,iBAAA,QALJ,2BDkDF,2BrCqtJC,iBAAA,QCmBD,YqCrxJM,iBAAA,QALJ,wBDsDF,wBrCwtJC,iBAAA,QCmBD,eqC5xJM,iBAAA,QALJ,2BD0DF,2BrC2tJC,iBAAA,QCmBD,cqCnyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCwxJD,YAAA,OuCrxJC,eAAA,OACE,iBAAA,KvCuxJH,cAAA,KuClxJG,aACA,QAAA,KAGF,YtCqyJA,SAAU,SsCnyJR,IAAA,KAMA,0BvC+wJH,eCmBC,IAAK,EsChyJD,QAAA,IAAA,IvCmxJL,cuCjxJK,cAKJ,MAAA,KtC+xJA,gBAAiB,KsC7xJf,OAAA,QvC+wJH,+BuC3wJC,4BACE,MAAA,QvC6wJH,iBAAA,KuCzwJG,wBvC4wJH,MAAA,MuCxwJG,+BvC2wJH,aAAA,IwCp0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCu0JD,eAAA,KwC50JC,cAAe,KvC+1Jf,MAAO,QuCt1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCu0JH,awCr1JC,cAAe,KAmBb,UAAA,KxCq0JH,YAAA,ICmBD,cuCn1JI,iBAAA,QAEA,sBxCo0JH,4BwC91JC,cAAe,KA8Bb,aAAA,KxCm0JH,cAAA,IwChzJD,sBAfI,UAAA,KxCo0JD,oCwCj0JC,WvCo1JA,YAAa,KuCl1JX,eAAA,KxCo0JH,sBwC1zJD,4BvC60JE,cAAe,KuCj1Jb,aAAA,KC5CJ,ezC+2JD,cyC92JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJisJT,cAAA,IyC33JC,mBAAoB,OAAO,IAAI,YxC84J1B,cAAe,OAAO,IAAI,YwCj4J7B,WAAA,OAAA,IAAA,YAKF,iBzC82JD,eCmBC,aAAc,KACd,YAAa,KwC13JX,mBA1BJ,kBzCq4JC,kByC12JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cy4JD,QAAA,K0C74JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Cq4JH,MAAA,QCmBD,mByCl5JI,YAAA,IArBJ,SAyBI,U1Ck4JH,cAAA,ECmBD,WyC34JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1C43JH,SAAA,S0Cp3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C+6JD,e0Cz3JC,MAAO,QClDL,iBAAA,Q3C86JH,aAAA,Q2C36JG,kB3C86JH,iBAAA,Q2Ct7JC,2BACA,MAAA,Q3C07JD,Y0Ch4JC,MAAO,QCtDL,iBAAA,Q3Cy7JH,aAAA,Q2Ct7JG,e3Cy7JH,iBAAA,Q2Cj8JC,wBACA,MAAA,Q3Cq8JD,e0Cv4JC,MAAO,QC1DL,iBAAA,Q3Co8JH,aAAA,Q2Cj8JG,kB3Co8JH,iBAAA,Q2C58JC,2BACA,MAAA,Q3Cg9JD,c0C94JC,MAAO,QC9DL,iBAAA,Q3C+8JH,aAAA,Q2C58JG,iB3C+8JH,iBAAA,Q4Ch9JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cs9JP,oBAAA,KAAA,E4Cl9JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cw9JP,oBAAA,KAAA,E4C19JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cw9JP,oBAAA,KAAA,E4Ch9JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ86JT,iBAAA,Q4Ch9JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJk0JT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C78JC,mBAAoB,MAAM,IAAI,K3Cw+JzB,cAAe,MAAM,IAAI,K4Cv+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5Ci9JD,iBAAA,oK4C18JC,iBAAiB,iK3Cs+JjB,wBAAyB,KAAK,KGlhK9B,gBAAA,KAAA,KJ4/JD,qBI1/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C+gKD,UAAA,qBAAA,GAAA,OAAA,S6C59JG,sBACA,iBAAA,Q7Cg+JH,wC4C38JC,iBAAkB,yKEzElB,iBAAA,oK9CuhKD,iBAAA,iK6Cp+JG,mBACA,iBAAA,Q7Cw+JH,qC4C/8JC,iBAAkB,yKE7ElB,iBAAA,oK9C+hKD,iBAAA,iK6C5+JG,sBACA,iBAAA,Q7Cg/JH,wC4Cn9JC,iBAAkB,yKEjFlB,iBAAA,oK9CuiKD,iBAAA,iK6Cp/JG,qBACA,iBAAA,Q7Cw/JH,uC+C/iKC,iBAAkB,yKAElB,iBAAA,oK/CgjKD,iBAAA,iK+C7iKG,O/CgjKH,WAAA,KC4BD,mB8CtkKE,WAAA,E/C+iKD,O+C3iKD,YACE,SAAA,O/C6iKD,KAAA,E+CziKC,Y/C4iKD,MAAA,Q+CxiKG,c/C2iKH,QAAA,MC4BD,4B8CjkKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9CkkKE,cAAe,K8C3jKjB,YAHE,Y/CuiKD,a+CniKC,QAAA,W/CsiKD,eAAA,I+CliKC,c/CqiKD,eAAA,O+ChiKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhDglKD,QAAA,KAAA,KgD7kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BymKD,4BgDvkKC,cAAe,E/CmmKf,2BAA4B,I+CjmK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CmmKA,MAAO,K+C/lKL,wBAFA,wBhD4kKH,6BgD3kKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C+lKA,MAAO,KACP,WAAY,K+C5lKV,0BhDskKH,gCgDrkKG,gCALF,MAAA,K/CsmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD/kKC,yDAAA,yD/C4mKA,MAAO,QDxBR,gDgDnkKC,sDAAA,sD/CgmKA,MAAO,K+C5lKL,wBAEA,8BADA,8BhDskKH,QAAA,EgD3kKC,MAAA,K/CumKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+C5mKE,8DAYI,6D/C+lKN,uD+C3mKE,8D/C8mKF,6DAKE,MAAO,QDxBR,8CiD7qKG,oDADF,oDAEE,MAAA,QAEA,yBhD0sKF,MAAO,QgDxsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhD2sKJ,MAAO,QDtBR,gCiDnrKO,gCAGF,qCAFE,qChD8sKN,MAAO,QACP,iBAAkB,QAEpB,iCgD1sKQ,uCAFA,uChD6sKR,sCDtBC,4CiDtrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDuuKF,MAAO,QgDruKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDwuKJ,MAAO,QDtBR,6BiDhtKO,6BAGF,kCAFE,kChD2uKN,MAAO,QACP,iBAAkB,QAEpB,8BgDvuKQ,oCAFA,oChD0uKR,mCDtBC,yCiDntKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDowKF,MAAO,QgDlwKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDqwKJ,MAAO,QDtBR,gCiD7uKO,gCAGF,qCAFE,qChDwwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDpwKQ,uCAFA,uChDuwKR,sCDtBC,4CiDhvKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhDiyKF,MAAO,QgD/xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhDkyKJ,MAAO,QDtBR,+BiD1wKO,+BAGF,oCAFE,oChDqyKN,MAAO,QACP,iBAAkB,QAEpB,gCgDjyKQ,sCAFA,sChDoyKR,qCDtBC,2CiD7wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJgvKT,OAAA,IAAA,MAAA,YkDtyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDwyKD,WAAA,EAAA,IAAA,IAAA,gBkDlyKC,YACA,QAAA,KvBnBC,e3B0zKF,QAAA,KAAA,KkDzyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDsyKH,wBAAA,IkDhyKC,0CACA,MAAA,QAEA,alDmyKD,WAAA,EkDvyKC,cAAe,EjDm0Kf,UAAW,KACX,MAAO,QDtBR,oBkD7xKC,sBjDqzKF,eiD3zKI,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,8CjDk0KV,8CiDh5KA,8CjDk5KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiDj5KA,gEjDm5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD95KA,+CjD45KA,+CiDr0KU,+CjDw0KV,iEiD/5KA,iEjD65KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDt0KU,8CjDw0KV,8CiDx6KA,8CjDu6KA,gEDtBC,gECwBD,gEiDn0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDsyKD,OAAA,EkDlyKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDqyKL,cAAA,IkDhyKG,2BlDmyKH,WAAA,IC4BD,4BiD3zKM,cAAA,EAKF,wDAvBJ,wDlDwzKC,WAAA,IAAA,MAAA,KkD/xKK,2BlDkyKL,WAAA,EmDrhLC,uDnDwhLD,cAAA,IAAA,MAAA,KmDrhLG,eACA,aAAA,KnDyhLH,8BmD3hLC,MAAA,KAMI,iBAAA,QnDwhLL,aAAA,KmDrhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDshLL,iBAAA,KmDviLC,yDnD0iLD,oBAAA,KmDviLG,eACA,aAAA,QnD2iLH,8BmD7iLC,MAAA,KAMI,iBAAA,QnD0iLL,aAAA,QmDviLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDwiLL,iBAAA,KmDzjLC,yDnD4jLD,oBAAA,QmDzjLG,eACA,aAAA,QnD6jLH,8BmD/jLC,MAAA,QAMI,iBAAA,QnD4jLL,aAAA,QmDzjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD0jLL,iBAAA,QmD3kLC,yDnD8kLD,oBAAA,QmD3kLG,YACA,aAAA,QnD+kLH,2BmDjlLC,MAAA,QAMI,iBAAA,QnD8kLL,aAAA,QmD3kLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnD4kLL,iBAAA,QmD7lLC,sDnDgmLD,oBAAA,QmD7lLG,eACA,aAAA,QnDimLH,8BmDnmLC,MAAA,QAMI,iBAAA,QnDgmLL,aAAA,QmD7lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD8lLL,iBAAA,QmD/mLC,yDnDknLD,oBAAA,QmD/mLG,cACA,aAAA,QnDmnLH,6BmDrnLC,MAAA,QAMI,iBAAA,QnDknLL,aAAA,QmD/mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnDgnLL,iBAAA,QoD/nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpDkoLD,QAAA,MoDvoLC,OAAQ,EnDmqLR,QAAS,EACT,SAAU,OAEZ,yCmDzpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpDkoLH,KAAA,EoD7nLC,MAAO,KACP,OAAA,KpD+nLD,OAAA,EoD1nLC,wBpD6nLD,eAAA,OqDvpLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJmmLT,OAAA,IAAA,MAAA,QqDlqLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBwrLD,MAAA,KsDhrLC,YAAA,EAAA,IAAA,EAAA,KrD4sLA,OAAQ,kBqD1sLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrBgsLD,gBAAA,KsD5qLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD8qLH,QAAA,EuDnsLC,OAAQ,QACR,WAAA,IvDqsLD,OAAA,EuDhsLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvDgsLD,QAAA,KuD7rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJghLT,kBAAA,kBuDnsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJ2lLT,kBAAA,euDvsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDwsLD,cuDnsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD+tLA,OsD/tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDqsLD,cAAA,IuDjsLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDmsLD,OAAA,EuDjsLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDmsLD,cAAA,IAAA,MAAA,QuD9rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD6rLD,cuD/rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDyrLH,YAAA,IuDrrLG,mCvDwrLH,YAAA,KuDlrLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDqrLD,IAAA,QuDnqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDmrLD,yBuDhrLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evDkrLX,WAAA,EAAA,IAAA,KAAA,euD5qLD,UAFA,MAAA,OvDorLD,yBwDl0LC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBy1LD,YAAA,OwD90LC,OAAA,iBnCdA,QAAA,ErBg2LD,WAAA,KwDj1LY,YAAmB,OAAA,kBxDq1L/B,QAAA,GwDp1LY,aAAmB,QAAA,IAAA,ExDw1L/B,WAAA,KwDv1LY,eAAmB,QAAA,EAAA,IxD21L/B,YAAA,IwD11LY,gBAAmB,QAAA,IAAA,ExD81L/B,WAAA,IwDz1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxD41LD,QAAA,IAAA,IwDx1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exD01LD,SAAA,SwDt1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDw1LH,OAAA,EwDt1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDw1LH,MAAA,IwDt1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDw1LH,OAAA,EwDt1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDw1LH,IAAA,IwDt1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDw1LH,IAAA,IwDt1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDw1LH,IAAA,EwDt1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDw1LH,IAAA,EwDt1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDw1LH,IAAA,E0Dr7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJq5LT,OAAA,IAAA,MAAA,e0Dh8LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dm8Lb,WAAA,EAAA,IAAA,KAAA,e0Dl8La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dw8LD,QAAA,IAAA,K0Dr8LC,OAAQ,EACR,UAAA,K1Du8LD,iBAAA,Q0D/7LC,cAAA,IAAA,MAAA,QzD49LA,cAAe,IAAI,IAAI,EAAE,EyDz9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1Di8LH,SAAA,S0D97LC,QAAS,MACT,MAAA,E1Dg8LD,OAAA,E0D97LC,aAAc,YACd,aAAA,M1Di8LD,gB0D57LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D87LH,OAAA,M0D77LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1Dg8LL,0B0D57LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D87LH,IAAA,I0D77LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1Dg8LL,4B0D57LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D87LH,IAAA,M0D77LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1Dg8LL,6B0D37LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D67LH,IAAA,I0D57LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D+7LL,2B2DvjMC,MAAO,IACP,OAAA,M3DyjMD,QAAA,I2DtjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DwjMD,SAAA,S2DrjMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ64LN,sB2DlkMC,SAAU,S1D+lMV,QAAS,K0DjlML,mBAAA,IAAA,YAAA,K3DwjML,cAAA,IAAA,YAAA,K2D9hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJi7LP,cAAA,aAAA,IAAA,Y2D5jMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D+jML,YAAA,OI/8LD,mCHy+LA,2BGx+LQ,KAAA,EuD5GF,kBAAA,sB3DgkML,UAAA,sBC2BD,kCADA,2BG/+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DumMD,gC2DvmMC,iC1DkoME,KAAM,E0DrlMN,kBAAA,mB3D+jMH,UAAA,oBAGA,wB2D/mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D6jMH,KAAA,E2DzjMG,sB3D4jMH,sB2DxnMC,SAAU,SA+DR,IAAA,E3D4jMH,MAAA,KC0BD,sB0DllMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3D2jMH,KAAA,E2DljMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DsjMD,UAAA,K2DjjMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CwpMH,uB2DrjMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7CgqMH,KAAA,K2DvjMC,iBAAA,sE1DmlMA,iBAAiB,iE0DjlMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DylMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0DhlMN,QAAA,EACA,QAAA,G3D2jMH,0C2DnmMD,2CA2CI,6BADA,6B1DqlMF,SAAU,S0DhlMR,IAAA,IACA,QAAA,E3DwjMH,QAAA,a2DxmMC,WAAY,MAqDV,0CADA,6B3DyjMH,KAAA,I2D7mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DsjMH,MAAA,K2DjjMG,OAAA,KACE,YAAA,M3DmjML,YAAA,E2DxiMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3D2iMD,KAAA,I2DpjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3DiiMH,OAAA,I2DhkMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3DiiMH,cAAA,K2DzhMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3D4hMD,KAAA,I2D3hMC,QAAA,GACE,YAAA,K3D6hMH,eAAA,K2Dp/LC,MAAO,KAhCP,WAAA,O1DijMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D9iMM,YAAA,KAEA,oCACA,0C3DshMH,2C2D9hMD,6BAAA,6BAYI,MAAA,K3DshMH,OAAA,K2DliMD,WAAA,M1D8jME,UAAW,KDxBZ,0C2DjhMD,6BACE,YAAA,MAEA,2C3DmhMD,6B2D/gMD,aAAA,M3DkhMC,kBACF,MAAA,I4DhxMC,KAAA,I3D4yME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DvzME,oBAAA,qBAAA,oBAAA,qB3D8zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2Dl0MI,a3Dw0MJ,cDvBC,kB4DhzMG,mB3DwzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6Dl1MC,oB5Dq2MF,W+B/1MA,uBhCu0MC,qB4D/zMG,cChBF,aACA,kB5Dk2MF,W+Bx1ME,MAAO,KhC40MR,cgCz0MC,QAAS,MACT,aAAA,KhC20MD,YAAA,KgCl0MC,YhCq0MD,MAAA,gBgCl0MC,WhCq0MD,MAAA,egCl0MC,MhCq0MD,QAAA,e8D51MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCm0MD,MAAA,YgC5zMC,YAAa,KACb,iBAAA,YhC8zMD,OAAA,E+D91MC,Q/Di2MD,QAAA,eC4BD,OACE,SAAU,M+Dt4MV,chE+2MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dv5MT,kBhEy4MC,mBgEx4MD,yBhEo4MD,kB+Dr1MD,mBA6IA,yB9D+tMA,kBACA,mB8Dp3ME,yB9Dg3MF,kBACA,mBACA,yB+D15MY,QAAA,eACV,yBAAU,YhE64MT,QAAA,gBC4BD,iB+Dv6MU,QAAA,gBhEg5MX,c+D/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"} \ No newline at end of file diff --git a/igds-web/src/main/resources/static/images/img-fail.jpg b/igds-web/src/main/resources/static/images/img-fail.jpg new file mode 100644 index 0000000..b642daf --- /dev/null +++ b/igds-web/src/main/resources/static/images/img-fail.jpg Binary files differ diff --git a/igds-web/src/main/resources/static/img/areation/5000/pfc_a.png b/igds-web/src/main/resources/static/img/areation/5000/pfc_a.png new file mode 100644 index 0000000..fddcfa0 --- /dev/null +++ b/igds-web/src/main/resources/static/img/areation/5000/pfc_a.png Binary files differ diff --git a/igds-web/src/main/resources/static/img/areation/5000/pfc_b.png b/igds-web/src/main/resources/static/img/areation/5000/pfc_b.png new file mode 100644 index 0000000..e6f62ac --- /dev/null +++ b/igds-web/src/main/resources/static/img/areation/5000/pfc_b.png Binary files differ diff --git a/igds-web/src/main/resources/static/img/gas/5326/5326_001.png b/igds-web/src/main/resources/static/img/gas/5326/5326_001.png new file mode 100644 index 0000000..6f8c7aa --- /dev/null +++ b/igds-web/src/main/resources/static/img/gas/5326/5326_001.png Binary files differ diff --git a/igds-web/src/main/resources/templates/test/PrintIn5329.html b/igds-web/src/main/resources/templates/test/PrintIn5329.html new file mode 100644 index 0000000..e557695 --- /dev/null +++ b/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'>鍗曞彿锛歴erId</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>鍖呰鎵i噸(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.鍏ュ簱閲嶉噺=鍑�閲�-鎵i噸锛涚粨绠楅噸閲�=鍏ュ簱閲嶉噺+璐ㄦ澧為噸锛�</span></div><div style="text-align: left;font-size: 12px"><span>3.鐧借仈锛堝瓨鏍癸級锛岀孩鑱旓紙璁拌处锛夛紝榛勮仈锛堝鎴蜂繚鐣欙級</span></div></body></html> diff --git a/igds-web/src/main/resources/templates/test/PrintOut5329.html b/igds-web/src/main/resources/templates/test/PrintOut5329.html new file mode 100644 index 0000000..1fe868a --- /dev/null +++ b/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'>鐧昏鏃堕棿锛歳egisterTime</span><span class='sp1'>鍑哄簱鍗曞彿锛歴erId</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>鍏朵粬鎵i噸(KG)</td> + <td>deOther</td> + <td>鍊间粨鎵i噸(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> -- Gitblit v1.9.3