igds-basic/src/main/java/com/ld/igds/timer/ScheduledBasic.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ package com.ld.igds.timer; import com.bstek.bdf2.core.model.DefaultCompany; import com.ld.igds.common.CoreCommonService; import com.ld.igds.view.manager.TempManager; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; /** * åºç¡æ¨¡åæ å宿¶å¨ä¸å¡é ç½® */ @Slf4j @Component(ScheduledBasic.BEAN_ID) public class ScheduledBasic { public static final String BEAN_ID = "basic.scheduled"; @Resource private TempManager thManager; @Resource private CoreCommonService coreCommonService; @Resource private WeatherTimerService weatherTimerService; /** * æ¯é´é30åéæ§è¡ä¸æ¬¡ */ @Scheduled(cron = "0 0/30 * * * ?") public void scheduled30() { //宿¶è·ååæºçæ¸©æ¹¿åº¦æ£æµç»æ doExeTh(); //宿¶è·åæ°è±¡ä¿¡æ¯ weatherTimerService.doExe(); } /** * 宿¶è·ååæºçæ¸©æ¹¿åº¦æ£æµç»æ */ private void doExeTh() { List<DefaultCompany> list = coreCommonService.getCompanyList(); if (null == list || list.isEmpty()) return; try { for (DefaultCompany company : list) { log.info("===================ç³»ç»å®æ¶è·ååæºä¸ç温湿度信æ¯-{}=======================", company.getId()); thManager.scheduledCheck(company.getId()); Thread.sleep(500); } } catch (Exception e) { e.getStackTrace(); } } } igds-basic/src/main/java/com/ld/igds/timer/ThScheduled.java
ÎļþÒÑɾ³ý igds-basic/src/main/java/com/ld/igds/timer/WeatherTimerService.java
ÎļþÃû´Ó igds-basic/src/main/java/com/ld/igds/timer/WeatherScheduled.java ÐÞ¸Ä @@ -24,9 +24,9 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -46,7 +46,7 @@ */ @Slf4j @Component public class WeatherScheduled { public class WeatherTimerService { @Resource(name = NotifyWeatherService.BEAN_ID) private NotifyWeatherService notifyService; @@ -74,8 +74,7 @@ /** * 宿¶è·åæ°è±¡ä¿¡æ¯ï¼è¯·æ³¨æï¼ç±äºæ°è±¡æ¯æå¤ç½åèªå®ä¹æ°è±¡ç«ï¼ç³»ç»é»è®¤åªæ§è¡å ¶ä¸ä¸ç§æ¹å¼ */ @Scheduled(cron = "0 0/30 * * * ?") public void scheduled() { public void doExe() { log.info("===========================ç³»ç»å®æ¶è·è·åæ°è±¡ä¿¡æ¯======================"); @@ -316,6 +315,7 @@ /** * è·å身份认è¯çææaccessToken * * @param conf * @return */ @@ -350,4 +350,5 @@ return token; } } igds-core/src/main/java/com/ld/igds/camera/data/ApiCameraResp.java
@@ -13,6 +13,8 @@ private String msg; private String fileName; /** * ææ¾å°å */ igds-core/src/main/java/com/ld/igds/data/ConfigData.java
@@ -36,4 +36,10 @@ @Value("${igds.weather-path}") private String weatherPath; /** * æææ¶é´é ç½® */ @Value("${igds.snap-time}") private int snapTime = -1; } igds-core/src/main/java/com/ld/igds/file/CoreFileService.java
@@ -39,6 +39,16 @@ */ public String getInoutFilePath(Date date); /** * æ ¹æ®æ¶é´è·åç³»ç»é ç½®çä»å è§é¢ææè·¯å¾ * ç³»ç»éä»¶è·¯å¾ä»¥yyyyMM为ç®å½è¿è¡åå * * @param date * @return */ public String getSnapFilePath(Date date); /** * æ ¹æ®æ¶é´è·åç³»ç»é ç½®çéä»¶è·¯å¾å°å * ç³»ç»éä»¶è·¯å¾ä»¥yyyyMM为ç®å½è¿è¡åå igds-core/src/main/java/com/ld/igds/file/impl/CoreFileServiceImpl.java
@@ -39,6 +39,17 @@ } @Override public String getSnapFilePath(Date date) { if (null == date) date = new Date(); String basePath = configData.getFilePath() + "SNAP/" + DateFormatUtils.format(date, "yyyyMM") + "/"; File file = new File(basePath); if (!file.exists()) { file.mkdirs(); } return basePath; } @Override public String getCommonFilePath(Date date) { if (null == date) date = new Date(); igds-inout/src/main/java/com/ld/igds/inout/manager/InoutEventControlManager.java
@@ -126,27 +126,7 @@ } /** * @param param * @return */ // public String noticeWeightDone(ApiInoutData param) { // //è·åç§°é主æ§å¨é ç½® // InoutConf conf = getWeightGateway(param.getCompanyId(), param.getDeptId(), param.getSort()); // // if (null == conf) { // return "ç§°éä¸»æ§æªé ç½®ï¼æ¯æå¤±è´¥"; // } // // ApiInoutData apiData = new ApiInoutData(conf); // apiData.setPlateNum(param.getPlateNum()); // apiData.setTime(new Date()); // // ApiInoutService inoutApiService = apiInoutManager.getApiService(conf.getProtocol()); // // // return inoutApiService.noticeWeightDone(apiData); TODO // return null; // } /** * åºå ¥åºææ igds-security/src/main/java/com/ld/igds/models/SecSnapConf.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ 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 = "UPDATE_TIME_", length = 1) @PropertyDef(label = "æ´æ°æ¶é´") private Date updateTime; } igds-security/src/main/java/com/ld/igds/models/SecSnapDepot.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,63 @@ 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_", length = 1) @PropertyDef(label = "æææ¶é´") private Date updateTime; @Column(name = "FILE_SUFFIX_", length = 6) @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; } igds-security/src/main/java/com/ld/igds/sec/controller/FireController.java
@@ -8,7 +8,6 @@ import com.ld.igds.sec.dto.SecurityParam; import com.ld.igds.sec.manager.SecManager; import com.ld.igds.util.ContextUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -17,7 +16,6 @@ /** * å®é²--æ¶é²ç®¡çæ§å¶å± */ @Slf4j @RestController @RequestMapping("basic/security") public class FireController { igds-security/src/main/java/com/ld/igds/sec/controller/PatrolController.java
@@ -2,7 +2,6 @@ import com.ld.igds.sec.dto.SecPatrolRecordDto; import com.ld.igds.sec.manager.SecManager; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -11,7 +10,6 @@ /** * å®é²--çµåå·¡æ´ç®¡çæ§å¶å± */ @Slf4j @RestController @RequestMapping("basic/security") public class PatrolController { igds-security/src/main/java/com/ld/igds/sec/service/SecSnapService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ package com.ld.igds.sec.service; import com.bstek.bdf2.core.orm.hibernate.HibernateDao; import com.ld.igds.models.SecSnapConf; import com.ld.igds.models.SecSnapDepot; import com.ld.igds.util.ContextUtil; import org.apache.commons.lang3.StringUtils; 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; @Component public class SecSnapService extends HibernateDao { /** * æ ¹æ®æ¡ä»¶è·åé ç½®ç±»å« * * @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.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(); } } } igds-security/src/main/java/com/ld/igds/sec/service/SecurityService.java
@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -19,7 +20,7 @@ @Component public class SecurityService extends HibernateDao { @Autowired @Resource private CoreSecCameraService coreSecCameraService; public List<SecCamera> listCamera(Map<String, Object> param) { igds-security/src/main/java/com/ld/igds/sec/service/impl/CoreSecFireServiceImpl.java
@@ -16,8 +16,6 @@ @Autowired private SecFireServiceMapper serviceMapper; @Autowired private RedisUtil redisUtil; @Override public List<SecFireDto> getAllFire(String companyId) { igds-security/src/main/java/com/ld/igds/sec/view/SecSnapDepot.view.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,149 @@ <?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> </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="zpsj"> <Property name="dataType">Date</Property> <Property name="label">æææ¶é´</Property> </PropertyDef> <PropertyDef name="txwjhzm"> <Property></Property> <Property name="label">å¾åæä»¶åç¼å</Property> </PropertyDef> <PropertyDef name="wjmc"> <Property></Property> <Property name="label">æä»¶åç§°</Property> </PropertyDef> <PropertyDef name="yzwbh"> <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="depotId"> <Property></Property> <Property name="label">æå±ä»åº</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> </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> </DataSet> <DataSet id="dsConf"> <Property name="dataType">[dtConf]</Property> </DataSet> <ToolBar> <ToolBarLabel> <Property name="text">èåæ ï¼</Property> </ToolBarLabel> <Fill/> <ToolBarButton> <ClientEvent name="onClick">view.get("#dialogConf").show();
 </ClientEvent> <Property name="caption">ææé ç½®</Property> </ToolBarButton> </ToolBar> <Container layout="regionPadding:10" layoutConstraint="center"> <Property name="exClassName">bg-color</Property> <DataGrid layoutConstraint="center padding:5px"> <Property name="dataSet">dsMain</Property> <Property name="readOnly">true</Property> <RowNumColumn> <Property name="width">50</Property> </RowNumColumn> <DataColumn name="depotId"> <Property name="property">depotId</Property> </DataColumn> <DataColumn name="updateTime"> <Property name="property">updateTime</Property> </DataColumn> <DataColumn name="zpsj"> <Property name="property">zpsj</Property> </DataColumn> <DataColumn name="txwjhzm"> <Property name="property">txwjhzm</Property> </DataColumn> <DataColumn name="wjmc"> <Property name="property">wjmc</Property> </DataColumn> <DataColumn name="yzwbh"> <Property name="property">yzwbh</Property> </DataColumn> </DataGrid> </Container> <Dialog id="dialogConf"> <Buttons/> <Children> <ToolBar> <ToolBarButton> <Property name="caption">æ°å¢</Property> </ToolBarButton> </ToolBar> <DataGrid> <Property name="dataSet">dsConf</Property> <DataColumn name="depotId"> <Property name="property">depotId</Property> </DataColumn> <DataColumn name="cameraId"> <Property name="property">cameraId</Property> </DataColumn> <DataColumn name="updateTime"> <Property name="property">updateTime</Property> </DataColumn> </DataGrid> </Children> <Tools/> </Dialog> </View> </ViewConfig> igds-security/src/main/java/com/ld/igds/timer/JobLampService.java
@@ -15,6 +15,8 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -28,9 +30,9 @@ @Service(Constant.JOB_BEAN_LAMP) public class JobLampService implements Job { @Autowired @Resource private LampManager lampManager; @Autowired @Resource private CoreDeviceService coreDeviceService; @Override igds-security/src/main/java/com/ld/igds/timer/ScheduledSec.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,145 @@ package com.ld.igds.timer; import com.bstek.bdf2.core.model.DefaultCompany; 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.common.CoreCommonService; 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.SecSnapDepot; import com.ld.igds.models.SnapSer; import com.ld.igds.sec.service.CoreSecCameraService; import com.ld.igds.sec.service.SecSnapService; import com.ld.igds.sec.service.SecurityService; import com.ld.igds.util.ContextUtil; import com.ld.igds.util.DateUtil; import com.ld.igds.view.manager.TempManager; import com.ld.igds.view.service.SnapSerService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateUtils; 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 SecSnapService secSnapService; @Resource private CoreSecCameraService coreSecCameraService; @Resource private SnapSerService snapSerService; @Resource private CoreFileService fileService; @Resource private ApiCameraManager apiCameraManager; /** * æ¯é´é30åéæ§è¡ä¸æ¬¡ */ @Scheduled(cron = "0 0/30 * * * ?") public void scheduled30() { //æ§è¡ææå¤æ doExeSnap(new Date()); } /** * 宿¶æ§è¡ææ */ private void doExeSnap(Date date) { if (configData.getSnapTime() < 0) return; //è·åå½åç³»ç»æ¶é´ int curHour = DateUtil.getHour(date); if (curHour != configData.getSnapTime()) return; log.info("===================ç³»ç»æ§è¡å®æ¶ä»å è§é¢ææ=================="); try { List<SecSnapConf> list = secSnapService.listSnapConf(configData.getDefaultCompanyId(), null); if (null == list || list.isEmpty()) return; SecCamera secCamera; Map<String, SnapSer> snapSerMap = new HashMap<>(); SnapSer snapSer; for (SecSnapConf snapConf : list) { if (null == snapConf.getDepotId()) continue; secCamera = coreSecCameraService.getCameraById(snapConf.getCompanyId(), snapConf.getCameraId()); if (null == secCamera) continue; snapSer = snapSerMap.get(snapConf.getDeptId()); if (null == snapSer) { snapSer = snapSerService.getCacheByDeptId(snapConf.getDeptId()); snapSerMap.put(snapConf.getDeptId(), snapSer); } if (null == snapSer) { log.error("------------ææä¸ºé ç½®ææåæº----------"); continue; } doExeSnapToData(secCamera, snapSer, snapConf); Thread.sleep(500); } } catch (Exception e) { log.error("----------ææåå°åºé---------{}", e); } } private void doExeSnapToData(SecCamera secCamera, SnapSer snapSer, SecSnapConf snapConf) { ApiSnapReq req = new ApiSnapReq(); req.setCompanyId(secCamera.getCompanyId()); req.setDeptId(secCamera.getDeptId()); req.setSn(secCamera.getSn()); req.setSnapType(secCamera.getSnapType()); req.setPlayType(secCamera.getPlayType()); req.setSerSn(snapSer.getSn()); req.setCameraName(secCamera.getName()); req.setBizId(null); req.setMediaAddr(CameraUtil.updateMediaAddr(secCamera.getMediaAddr(), secCamera.getLoginId(), secCamera.getPwd(), secCamera.getIpIn(), secCamera.getPortInC(), secCamera.getChanNum())); String filePath = fileService.getSnapFilePath(new Date()); req.setFilePath(filePath); //è°æ´éä»¶åç§°ï¼é¿å åºç°ä¸æ String fileName = snapConf.getDepotId() + "_" + ContextUtil.getTimeId(1000) + ".jpg"; req.setFileName(fileName); //æ§è¡ææ ApiCameraResp resp = apiCameraManager.getApiCameraService(secCamera.getPlayType()).snapImg(req); resp.setFileName(fileName); //æ§è¡è®°å½ä¿å secSnapService.addData(snapConf, fileName, resp.getCode()); } } igds-web/src/main/java/com/ld/igds/TestAction.java
@@ -11,7 +11,7 @@ import com.ld.igds.grain.service.CoreGrainService; import com.ld.igds.models.WeatherConf; import com.ld.igds.models.WeatherInfo; import com.ld.igds.timer.WeatherScheduled; import com.ld.igds.timer.WeatherTimerService; import com.ld.igds.util.RedisUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -37,7 +37,7 @@ @Autowired private RedisUtil redisUtil; @Autowired private WeatherScheduled weatherScheduled; private WeatherTimerService weatherTimerService; @Override public String getUrl() { @@ -137,7 +137,7 @@ } if (t.equals("weather11")) { weatherScheduled.scheduled(); weatherTimerService.doExe(); } } @@ -168,7 +168,7 @@ log.info("-----æµè¯è°ç¨æ°è±¡----deptId={},cityId={}", deptId, cityId); Date date = new Date(); WeatherInfo info = weatherScheduled.getWeatherByWeb(date, conf); WeatherInfo info = weatherTimerService.getWeatherByWeb(date, conf); if (null == info) { response.getWriter().print("MSG:ERROR"); } else { igds-web/src/main/resources/application.yml
@@ -1,7 +1,7 @@ ########################## Server ########################## 丹棱åå ³çç²®é£å¨å¤åº spring: profiles: active: linux active: dev application: name: igds main: @@ -47,6 +47,8 @@ phone: 400-627-1116 website: http://www.fzzygf.com address: éå·å¸é«æ°åºé¿æ¤¿è·¯11å·æ²³åçå½å®¶å¤§å¦ç§æååµå1å·æ¥¼ ##ä»å è§é¢æææ¶é´é ç½®0-24 snap-time: 12 file-path: D:/IGDS/FILE/ ## æ¨é微信平å°çå°å warn-path: http://124.71.162.207:8299/igds-wx/gateway