From b537495df3c9a98a45847d5573a41cb86c3354ab Mon Sep 17 00:00:00 2001
From: 陈杰 <504987307@qq.com>
Date: Wed, 27 Nov 2019 10:43:14 +0800
Subject: [PATCH] 微耕
---
cloud/weigeng/pom.xml | 82 +++++-----------------------------------------------------------------------------
cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java | 38 ++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java | 5 +++++
cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java | 40 ++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java | 39 +++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java | 27 +++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java | 32 ++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java | 509 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/vo/AttendanceTimeVo.java | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CardInfo.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CleanShiDuanVo.java | 44 ++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/vo/OpenDoorVo.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/java/com/sincere/weigeng/vo/SignalCardInfoVo.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cloud/weigeng/src/main/resources/application.yaml | 20 ++++++++++++++++++++
cloud/weigeng/src/main/resources/logback.xml | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
20 files changed, 1845 insertions(+), 77 deletions(-)
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/AttendanceTimeVo.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CardInfo.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CleanShiDuanVo.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/OpenDoorVo.java
create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/SignalCardInfoVo.java
create mode 100644 cloud/weigeng/src/main/resources/application.yaml
create mode 100644 cloud/weigeng/src/main/resources/logback.xml
diff --git a/cloud/weigeng/pom.xml b/cloud/weigeng/pom.xml
index cc3ccb3..74c6112 100644
--- a/cloud/weigeng/pom.xml
+++ b/cloud/weigeng/pom.xml
@@ -22,7 +22,7 @@
com.sincere
common
- 1.0.0
+ 0.0.1-SNAPSHOT
org.apache.mina
@@ -81,87 +81,15 @@
-
- weigeng
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.1
+ org.springframework.boot
+ spring-boot-maven-plugin
- 1.8
- 1.8
- UTF-8
+ true
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
-
-
-
- com.com.sincere.weigeng.WeigengApplication
- true
- lib/
-
-
- ./config/
-
-
-
- config/**
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- copy
- package
-
- copy-dependencies
-
-
-
- ${project.build.directory}/lib
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-resources-plugin
- 2.5
-
- UTF-8
-
-
-
-
- maven-source-plugin
- 2.2
-
- true
-
-
-
- compile
-
- jar
-
-
-
-
+
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java
new file mode 100644
index 0000000..03089f0
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java
@@ -0,0 +1,38 @@
+package com.sincere.weigeng;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@EnableSwagger2
+@Configuration //让Spring来加载该类配置
+public class Swagger2 {
+
+ @Bean
+ public Docket createRestApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .enableUrlTemplating(true)
+ .select()
+ // 扫描所有有注解的api,用这种方式更灵活
+ .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+ .paths(PathSelectors.any())
+ .build();
+
+ }
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("Spring Boot中使用Swagger2构建RESTful APIs")
+ .description("接口文档")
+ .termsOfServiceUrl("")
+ .version("1.0")
+ .build();
+ }
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java
index 1539ad5..d831577 100644
--- a/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java
@@ -1,5 +1,6 @@
package com.sincere.weigeng;
+import com.sincere.weigeng.utils.WatchServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@@ -10,8 +11,12 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
public class WeigengApplication {
+ private static String ip = "172.16.3.175";
+ private static int port = 1200;
+
public static void main(String[] args) {
SpringApplication.run(WeigengApplication.class, args);
+ //WatchServer.WatchingServerRunning(ip,port);
}
}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java
new file mode 100644
index 0000000..6386ddc
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java
@@ -0,0 +1,220 @@
+package com.sincere.weigeng.controller;
+
+import com.sincere.common.dto.smartCampus.SchoolDto;
+import com.sincere.common.dto.smartCampus.StudentCardDto;
+import com.sincere.common.dto.smartCampus.UpdateCardDto;
+import com.sincere.common.dto.smartCampus.UserDto;
+import com.sincere.common.dto.xiaoan.SendFailDto;
+import com.sincere.common.dto.xiaoan.SendMessageDto;
+import com.sincere.common.dto.xiaoan.SendSuccessDto;
+import com.sincere.weigeng.feign.SmFeign;
+import com.sincere.weigeng.feign.XaFeign;
+import com.sincere.weigeng.logs.LogName;
+import com.sincere.weigeng.logs.LoggerUtils;
+import com.sincere.weigeng.utils.WatchServer;
+import com.sincere.weigeng.vo.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/10/14 0014 9:12
+ */
+@RestController
+@Api(value = "微耕")
+public class WgController {
+
+ private static final Logger Log_orderSuccess = LoggerUtils.Logger(LogName.orderSuccess);
+ private static final Logger Log_orderFail = LoggerUtils.Logger(LogName.orderFail);
+
+ @Autowired
+ SmFeign smFeign;
+
+ @Autowired
+ XaFeign xaFeign;
+
+ private static String ip = "172.16.3.175";
+ private static int port = 1200;
+
+ @RequestMapping(value = "watching" , method = RequestMethod.GET)
+ public void watching(){
+ WatchServer.WatchingServerRunning(ip,port,smFeign,xaFeign);
+ }
+
+ @RequestMapping(value = "setTime" , method = RequestMethod.GET)
+ public void setTime(long sn){
+ WatchServer.setTime(xaFeign,sn,"48");
+ }
+
+ @ApiOperation("远程开门")
+ @RequestMapping(value = "openDoor" , method = RequestMethod.POST)
+ public boolean openDoor(@RequestBody OpenDoorVo openDoorVo) {
+ String functionId = smFeign.selectOutOrderId(openDoorVo.getType(),openDoorVo.getId());
+ long messageId = WatchServer.openDoor(xaFeign,openDoorVo.getSn(),functionId,openDoorVo.getDoorNo(),null);
+ SendMessageDto message = getResult(messageId);
+ if(message.getCorrect() == 1){
+ Log_orderSuccess.info("web端远程开门成功!");
+ }else {
+ Log_orderFail.info("远程开门失败");
+ }
+ return message.getCorrect() == 1 ;
+ }
+
+
+ @ApiOperation("设置考勤时段")
+ @RequestMapping(value = "setAttendanceTime" , method = RequestMethod.POST)
+ public boolean setAttendanceTime(@RequestBody AttendanceTimeVo attendanceTimeVo){
+ String functionId = smFeign.selectOutOrderId(attendanceTimeVo.getType(),attendanceTimeVo.getId());
+ List result = WatchServer.SetAttendanceTime(xaFeign,attendanceTimeVo.getSn(),functionId,attendanceTimeVo.getShiduan(),
+ attendanceTimeVo.getStart(),attendanceTimeVo.getEnd(),attendanceTimeVo.getIsMonday(),attendanceTimeVo.getIsTuesday(),
+ attendanceTimeVo.getIsWednesday(),attendanceTimeVo.getIsThursday(),attendanceTimeVo.getIsFriday(),
+ attendanceTimeVo.getIsSaturday(),attendanceTimeVo.getIsWeekend(),attendanceTimeVo.getShiqu());
+ boolean isSuccess = true ;
+ for(Long messageId : result){
+ SendMessageDto message = getResult(messageId);
+ if(message.getCorrect() == 1){
+ Log_orderSuccess.info("设备"+attendanceTimeVo.getSn()+"时段"+attendanceTimeVo.getShiduan()+"!!设置成功");
+ }else {
+ Log_orderFail.info("设备"+attendanceTimeVo.getSn()+"时段"+attendanceTimeVo.getShiduan()+"!!设置失败");
+ isSuccess = false ;
+ }
+ }
+ return isSuccess;
+ }
+
+
+ @ApiOperation("单个卡号的权限添加或修改")
+ @RequestMapping(value = "setSignalCardInfo" , method = RequestMethod.POST)
+ public boolean setSignalCardInfo(@RequestBody SignalCardInfoVo signalCardInfoVo){
+ String functionId = smFeign.selectOutOrderId(signalCardInfoVo.getType(),signalCardInfoVo.getId());
+ String cardNo = initCardNo(signalCardInfoVo.getCardNo());
+ long messageId = WatchServer.SetSignalCardInfo(xaFeign,signalCardInfoVo.getSn(),functionId,cardNo,
+ signalCardInfoVo.getShiduan(),signalCardInfoVo.getStartTime(),signalCardInfoVo.getEndTime());
+ SendMessageDto message = getResult(messageId);
+ UserDto user = smFeign.selectUserByCardNum(cardNo);
+ StudentCardDto studentCard = smFeign.selectStudentCard(cardNo);
+ SchoolDto school = smFeign.selectSchoolBySchoolId(user.getSchoolId());
+ UpdateCardDto updateCard = smFeign.selectUpdateCardByUpdateId(signalCardInfoVo.getUpdateId());
+ if(message.getCorrect() == 1){
+ Log_orderSuccess.info("设备"+signalCardInfoVo.getSn()+"时段"+signalCardInfoVo.getShiduan()+"卡号"+cardNo+"!!设置成功");
+ SendSuccessDto sendSuccess = new SendSuccessDto(user,school,studentCard,updateCard);
+ sendSuccess.setDeviceId(signalCardInfoVo.getSn()+"");
+ sendSuccess.setShiduan(signalCardInfoVo.getShiduan());
+ sendSuccess.setCardNum(cardNo);
+ sendSuccess.setUpdateId(signalCardInfoVo.getUpdateId());
+ sendSuccess.setOpenFlag(1);
+ sendSuccess.setStatus(1);
+ xaFeign.insertSendSuccess(sendSuccess);
+ }else {
+ Log_orderFail.info("设备"+signalCardInfoVo.getSn()+"时段"+signalCardInfoVo.getShiduan()+"卡号"+cardNo+"!!设置失败");
+ SendFailDto sendFail = new SendFailDto(user,school,studentCard,updateCard);
+ sendFail.setDeviceId(signalCardInfoVo.getSn()+"");
+ sendFail.setShiduan(signalCardInfoVo.getShiduan());
+ sendFail.setCardNum(cardNo);
+ sendFail.setUpdateId(signalCardInfoVo.getUpdateId());
+ sendFail.setOpenFlag(1);
+ sendFail.setStatus(1);
+ sendFail.setFailType(2);
+ sendFail.setFailContent("其他");
+ xaFeign.insertSendFail(sendFail);
+ }
+ return message.getCorrect() == 1;
+ }
+
+
+ @ApiOperation("清除单个卡号权限")
+ @RequestMapping(value = "clearSinglePower" , method = RequestMethod.POST)
+ public boolean clearSinglePower(@RequestBody CardInfo cardInfo){
+ String functionId = smFeign.selectOutOrderId(cardInfo.getType(),cardInfo.getId());
+ String cardNo = initCardNo(cardInfo.getCardNo());
+ long messageId = WatchServer.clearSinglePower(xaFeign,cardInfo.getSn(),functionId,cardNo);
+ SendMessageDto message = getResult(messageId);
+ if(message.getCorrect() == 1){
+ Log_orderSuccess.info("卡号"+cardNo+"清除权限成功");
+ SendSuccessDto sendSuccess = new SendSuccessDto();
+ sendSuccess.setCardNum(cardNo);
+ sendSuccess.setDeviceId(cardInfo.getSn()+"");
+ xaFeign.updateSendSuccess(sendSuccess);
+ }else {
+ Log_orderFail.info("卡号"+cardNo+"清除权限失败");
+ }
+ return message.getCorrect() == 1 ;
+ }
+
+ @ApiOperation("清除全部权限")
+ @RequestMapping(value = "clearAllPower" , method = RequestMethod.POST)
+ public boolean clearAllPower(@RequestBody CleanShiDuanVo cleanShiDuanVo){
+ String functionId = smFeign.selectOutOrderId(cleanShiDuanVo.getType(),cleanShiDuanVo.getId());
+ long messageId = WatchServer.clearAllPower(xaFeign,cleanShiDuanVo.getSn(),functionId);
+ SendMessageDto message = getResult(messageId);
+ if(message.getCorrect() == 1){
+ Log_orderSuccess.info("设备"+cleanShiDuanVo.getSn()+"清除权限成功");
+ SendSuccessDto sendSuccess = new SendSuccessDto();
+ sendSuccess.setDeviceId(cleanShiDuanVo.getSn()+"");
+ xaFeign.updateSendSuccess(sendSuccess);
+ }else {
+ Log_orderFail.info("设备"+cleanShiDuanVo.getSn()+"清除权限失败");
+ }
+ return message.getCorrect() == 1 ;
+ }
+
+
+ @ApiOperation("清除时段")
+ @RequestMapping(value = "clearShiDuan" , method = RequestMethod.POST)
+ public boolean clearShiDuan(@RequestBody CleanShiDuanVo cleanShiDuanVo){
+ String functionId = smFeign.selectOutOrderId(cleanShiDuanVo.getType(),cleanShiDuanVo.getId());
+ long messageId = WatchServer.clearShiDuan(xaFeign,cleanShiDuanVo.getSn(),functionId);
+ SendMessageDto sendMessage = getResult(messageId);
+ if(sendMessage.getCorrect() == 1){
+ Log_orderSuccess.info("设备"+cleanShiDuanVo.getSn()+"时段清除成功");
+ }else {
+ Log_orderFail.info("设备"+cleanShiDuanVo.getSn()+"时段清除失败");
+ }
+ return sendMessage.getCorrect() == 1;
+ }
+
+ @ApiOperation("查询单个卡号 权限")
+ @RequestMapping(value = "searchPower" , method = RequestMethod.POST)
+ public boolean searchPower(@RequestBody CardInfo cardInfo){
+ String functionId = smFeign.selectOutOrderId(cardInfo.getType(),cardInfo.getId());
+ String cardNo = initCardNo(cardInfo.getCardNo());
+ long messageId = WatchServer.searchPower(xaFeign,cardInfo.getSn(),functionId,cardNo);
+ SendMessageDto sendMessage = getResult(messageId);
+ if(sendMessage.getCorrect() == 1){
+ Log_orderSuccess.info("设备"+cardInfo.getSn()+"卡号"+cardNo+"查询权限成功");
+ }else {
+ Log_orderFail.info("设备"+cardInfo.getSn()+"卡号"+cardNo+"查询权限失败");
+ }
+ return sendMessage.getCorrect() == 1;
+ }
+
+ @RequestMapping(value = "watch" , method = RequestMethod.GET)
+ public int watch(){
+ return 1 ;
+ }
+
+ private SendMessageDto getResult(long messageId){
+ try{
+ Thread.sleep(300);
+ }catch (Exception e){
+
+ }
+ return xaFeign.selectById(messageId);
+ }
+
+ private String initCardNo(String cardNo){
+ while (cardNo.length() < 8){
+ cardNo = "0" + cardNo ;
+ }
+ return cardNo ;
+ }
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java
new file mode 100644
index 0000000..3bd6bb0
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java
@@ -0,0 +1,40 @@
+package com.sincere.weigeng.feign;
+
+import com.sincere.common.dto.smartCampus.SchoolDto;
+import com.sincere.common.dto.smartCampus.StudentCardDto;
+import com.sincere.common.dto.smartCampus.UpdateCardDto;
+import com.sincere.common.dto.smartCampus.UserDto;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/11/12 0012 11:08
+ */
+@FeignClient("smartCampusSearch")
+public interface SmFeign {
+
+ @RequestMapping(value = "/sm/wg/updateLinkTime",method = RequestMethod.GET)
+ int updateLinkTime(@RequestParam("sno") String sno);
+
+ @RequestMapping(value = "/sm/wg/selectOutOrderId",method = RequestMethod.GET)
+ String selectOutOrderId(@RequestParam("type") int type, @RequestParam("insideOrderId") int insideOrderId);
+
+ @RequestMapping(value = "/sm/wg/checkLeave",method = RequestMethod.GET)
+ String checkLeave(@RequestParam("cardNo") String cardNo);
+
+ @RequestMapping(value = "/sm/wg/selectSchoolBySchoolId",method = RequestMethod.GET)
+ SchoolDto selectSchoolBySchoolId(@RequestParam("schoolId") int schoolId);
+
+ @RequestMapping(value = "/sm/wg/selectUserByCardNum",method = RequestMethod.GET)
+ UserDto selectUserByCardNum(@RequestParam("cardNum") String cardNum);
+
+ @RequestMapping(value = "/sm/wg/selectUpdateCardByUpdateId",method = RequestMethod.GET)
+ UpdateCardDto selectUpdateCardByUpdateId(@RequestParam("updateId") int updateId);
+
+ @RequestMapping(value = "/sm/wg/selectStudentCard",method = RequestMethod.GET)
+ StudentCardDto selectStudentCard(@RequestParam("cardNum") String cardNum);
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java
new file mode 100644
index 0000000..eb9836c
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java
@@ -0,0 +1,47 @@
+package com.sincere.weigeng.feign;
+
+import com.sincere.common.dto.xiaoan.*;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/11/12 0012 11:12
+ */
+@FeignClient("xiaoanSearch")
+public interface XaFeign {
+
+ @RequestMapping(value = "/xa/wg/checkIn",method = RequestMethod.POST)
+ CheckOutDto checkIn(@RequestBody CheckInDto checkInDto);
+
+ @RequestMapping(value = "/xa/wg/insertMessage",method = RequestMethod.POST)
+ long insertMessage(@RequestBody SendMessageDto sendMessageDto);
+
+ @RequestMapping(value = "/xa/wg/selectById",method = RequestMethod.GET)
+ SendMessageDto selectById(@RequestParam("id") long id);
+
+ @RequestMapping(value = "/xa/wg/selectMessage",method = RequestMethod.GET)
+ SendMessageDto selectMessage(@RequestParam("deviceId") String deviceId, @RequestParam("index") long index,@RequestParam("functionId") String functionId);
+
+ @RequestMapping(value = "/xa/wg/updateMessage",method = RequestMethod.GET)
+ int updateMessage(@RequestParam("id") long id, @RequestParam("result") String result, @RequestParam("correct") int correct);
+
+ @RequestMapping(value = "/xa/wg/insertPassFail",method = RequestMethod.POST)
+ int insertPassFail(@RequestBody PassFailDto passFailDto);
+
+ @RequestMapping(value = "/xa/wg/insertSendSuccess",method = RequestMethod.POST)
+ int insertSendSuccess(@RequestBody SendSuccessDto sendSuccessDto);
+
+ @RequestMapping(value = "/xa/wg/insertSendFail",method = RequestMethod.POST)
+ int insertSendFail(@RequestBody SendFailDto sendFailDto);
+
+ @RequestMapping(value = "/xa/wg/deleteSendFail",method = RequestMethod.POST)
+ int deleteSendFail(@RequestBody SendFailDto sendFailDto);
+
+ @RequestMapping(value = "/xa/wg/deleteSendFail",method = RequestMethod.POST)
+ int updateSendSuccess(@RequestBody SendSuccessDto sendSuccessDto);
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java
new file mode 100644
index 0000000..a3d2a0b
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java
@@ -0,0 +1,39 @@
+package com.sincere.weigeng.logs;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/10/12 0012 16:18
+ */
+public enum LogName {
+ orderSuccess("orderSuccess"),
+ orderFail("orderFail"),
+ kaoInfo("kaoInfo"),
+ heartBeat("heartBeat"),
+ error("error");
+
+ private String logFileName;
+
+ LogName(String fileName) {
+ this.logFileName = fileName;
+ }
+
+ public String getLogFileName() {
+ return logFileName;
+ }
+
+ public void setLogFileName(String logFileName) {
+ this.logFileName = logFileName;
+ }
+
+ public static LogName getAwardTypeEnum(String value) {
+ LogName[] arr = values();
+ for (LogName item : arr) {
+ if (null != item && !item.logFileName.equals("")) {
+ return item;
+ }
+ }
+ return null;
+ }
+}
+
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java
new file mode 100644
index 0000000..4cc38fc
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java
@@ -0,0 +1,27 @@
+package com.sincere.weigeng.logs;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/10/12 0012 16:19
+ */
+public class LoggerUtils {
+
+ public static Logger Logger(Class clazz) {
+ return LoggerFactory.getLogger(clazz);
+ }
+
+ /**
+ * 打印到指定的文件下
+ *
+ * @param desc 日志文件名称
+ * @return
+ */
+ public static Logger Logger(LogName desc) {
+ return LoggerFactory.getLogger(desc.getLogFileName());
+ }
+
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java
new file mode 100644
index 0000000..10ce6b5
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java
@@ -0,0 +1,32 @@
+package com.sincere.weigeng.logs;
+
+import ch.qos.logback.core.joran.spi.NoAutoStart;
+import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/10/31 0031 13:42
+ */
+@NoAutoStart
+public class MyTimeBasedFileNamingAndTriggeringPolicy extends DefaultTimeBasedFileNamingAndTriggeringPolicy {
+
+ //这个用来指定时间间隔
+ private Integer multiple = 1;
+
+ @Override
+ protected void computeNextCheck() {
+ nextCheck = rc.getEndOfNextNthPeriod(dateInCurrentPeriod, multiple).getTime();
+ }
+
+ public Integer getMultiple() {
+ return multiple;
+ }
+
+ public void setMultiple(Integer multiple) {
+ if (multiple > 1) {
+ this.multiple = multiple;
+ }
+ }
+
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java
new file mode 100644
index 0000000..7202b66
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java
@@ -0,0 +1,133 @@
+package com.sincere.weigeng.utils;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/10/14 0014 11:03
+ */
+public class WGUtils {
+
+ //指令转换 message 10进制 要先转16 在转byte
+ public static Byte toFunctionHex(String message){
+ Integer i = Integer.valueOf(message) ;
+ if(i > 127){
+ i = i-256 ;
+ }
+ return Byte.valueOf(i+"");
+ }
+
+ //短报文 转化 message 16进制 要先转16 在转byte
+ public static Byte toHex(String message){
+ Integer i = Integer.valueOf(message,16) ;
+ if(i > 127){
+ i = i-256 ;
+ }
+ return Byte.valueOf(i+"");
+ }
+
+ public static String getCardNo(byte[] buff, int start, int len){
+ String cardNo = "" ;
+ for(int i = start ; i < start+len ; i++){
+ cardNo += byte2Hex(buff[i]);
+ }
+ return cardNo;
+ }
+
+ public static String byte2Hex(byte b){
+ int i = b ;
+ if( b < 0){
+ i = b + 256 ;
+ }
+ String result = Integer.toHexString(i).toUpperCase() ;
+ if(result.length() == 1){
+ result = "0"+result;
+ }
+ return result;
+ }
+
+ //4字节转成整型数(低位前, 高位后)
+ public static int byteToInt(byte[] buff, int start, int len) {
+ int val = 0;
+ for (int i = 0; i < len && i < 4; i++)
+ {
+ long lng = buff[i + start];
+ val += (lng << (8 * i));
+ }
+ return val;
+ }
+
+ //4字节转成整型数(低位前, 高位后)
+ public static long byteToLong(byte[] buff, int start, int len) {
+ long val = 0;
+ for (int i = 0; i < len && i < 4; i++)
+ {
+ long lng = buff[i + start];
+ val += (lng << (8 * i));
+ }
+ return val;
+ }
+
+ //获取Hex值, 主要用于日期时间格式
+ public static byte getHex(int val) {
+ return (byte)((val % 10) + (((val -(val % 10)) / 10)%10) *16);
+ }
+
+
+ public static String getReasonDetailChinese(int Reason){
+ if (Reason > 45) {
+ return "";
+ }
+ if (Reason <= 0) {
+ return "";
+ }
+ return RecordDetails[(Reason - 1) * 4 + 3]; //中文信息
+ }
+
+ public static String RecordDetails[] = {
+ "1","SwipePass","Swipe","刷卡开门",
+ "2","SwipePass","Swipe Close","刷卡关",
+ "3","SwipePass","Swipe Open","刷卡开",
+ "4","SwipePass","Swipe Limited Times","刷卡开门(带限次)",
+ "5","SwipeNOPass","Denied Access: PC Control","刷卡禁止通过: 电脑控制",
+ "6","SwipeNOPass","Denied Access: No PRIVILEGE","刷卡禁止通过: 没有权限",
+ "7","SwipeNOPass","Denied Access: Wrong PASSWORD","刷卡禁止通过: 密码不对",
+ "8","SwipeNOPass","Denied Access: AntiBack","刷卡禁止通过: 反潜回",
+ "9","SwipeNOPass","Denied Access: More Cards","刷卡禁止通过: 多卡",
+ "10","SwipeNOPass","Denied Access: First Card Open","刷卡禁止通过: 首卡",
+ "11","SwipeNOPass","Denied Access: Door Set NC","刷卡禁止通过: 门为常闭",
+ "12","SwipeNOPass","Denied Access: InterLock","刷卡禁止通过: 互锁",
+ "13","SwipeNOPass","Denied Access: Limited Times","刷卡禁止通过: 受刷卡次数限制",
+ "14","SwipeNOPass","Denied Access: Limited Person Indoor","刷卡禁止通过: 门内人数限制",
+ "15","SwipeNOPass","Denied Access: Invalid Timezone","刷卡禁止通过: 卡过期或不在有效时段",
+ "16","SwipeNOPass","Denied Access: In Order","刷卡禁止通过: 按顺序进出限制",
+ "17","SwipeNOPass","Denied Access: SWIPE GAP LIMIT","刷卡禁止通过: 刷卡间隔约束",
+ "18","SwipeNOPass","Denied Access","刷卡禁止通过: 原因不明",
+ "19","SwipeNOPass","Denied Access: Limited Times","刷卡禁止通过: 刷卡次数限制",
+ "20","ValidEvent","Push Button","按钮开门",
+ "21","ValidEvent","Push Button Open","按钮开",
+ "22","ValidEvent","Push Button Close","按钮关",
+ "23","ValidEvent","Door Open","门打开[门磁信号]",
+ "24","ValidEvent","Door Closed","门关闭[门磁信号]",
+ "25","ValidEvent","Super Password Open Door","超级密码开门",
+ "26","ValidEvent","Super Password Open","超级密码开",
+ "27","ValidEvent","Super Password Close","超级密码关",
+ "28","Warn","Controller Power On","控制器上电",
+ "29","Warn","Controller Reset","控制器复位",
+ "30","Warn","Push Button Invalid: Disable","按钮不开门: 按钮禁用",
+ "31","Warn","Push Button Invalid: Forced Lock","按钮不开门: 强制关门",
+ "32","Warn","Push Button Invalid: Not On Line","按钮不开门: 门不在线",
+ "33","Warn","Push Button Invalid: InterLock","按钮不开门: 互锁",
+ "34","Warn","Threat","胁迫报警",
+ "35","Warn","Threat Open","胁迫报警开",
+ "36","Warn","Threat Close","胁迫报警关",
+ "37","Warn","Open too long","门长时间未关报警[合法开门后]",
+ "38","Warn","Forced Open","强行闯入报警",
+ "39","Warn","Fire","火警",
+ "40","Warn","Forced Close","强制关门",
+ "41","Warn","Guard Against Theft","防盗报警",
+ "42","Warn","7*24Hour Zone","烟雾煤气温度报警",
+ "43","Warn","Emergency Call","紧急呼救报警",
+ "44","RemoteOpen","Remote Open Door","操作员远程开门",
+ "45","RemoteOpen","Remote Open Door By USB Reader","发卡器确定发出的远程开门"
+ };
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java
new file mode 100644
index 0000000..b358ad3
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java
@@ -0,0 +1,509 @@
+package com.sincere.weigeng.utils;
+
+
+import com.sincere.common.dto.smartCampus.UserDto;
+import com.sincere.common.dto.xiaoan.CheckInDto;
+import com.sincere.common.dto.xiaoan.CheckOutDto;
+import com.sincere.common.dto.xiaoan.PassFailDto;
+import com.sincere.common.dto.xiaoan.SendMessageDto;
+import com.sincere.common.util.DateUtils;
+import com.sincere.weigeng.feign.SmFeign;
+import com.sincere.weigeng.feign.XaFeign;
+import com.sincere.weigeng.logs.LogName;
+import com.sincere.weigeng.logs.LoggerUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.mina.core.session.IoSession;
+import org.apache.mina.transport.socket.DatagramSessionConfig;
+import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author chen
+ * @version 1.0
+ * @date 2019/10/12 0012 16:57
+ */
+public class WatchServer {
+
+ private static final Logger Log_orderSuccess = LoggerUtils.Logger(LogName.orderSuccess);
+ private static final Logger Log_orderFail = LoggerUtils.Logger(LogName.orderFail);
+ private static final Logger Log_kaoInfo = LoggerUtils.Logger(LogName.kaoInfo);
+ private static final Logger Log_heartBeat = LoggerUtils.Logger(LogName.heartBeat);
+ private static final Logger Log_error = LoggerUtils.Logger(LogName.error);
+
+ private static List snoList = new ArrayList<>();
+ private static List indexList = new ArrayList<>();
+ private static WatchingShortHandler watchingShortHandler ;
+ private static Queue queue = new LinkedList<>();
+ private static Map sessionMap = new ConcurrentHashMap<>();
+
+ // 进入服务器监控状态
+ public static int WatchingServerRunning(String watchServerIP,int watchServerPort,
+ SmFeign smFeign ,XaFeign xaFeign) {
+ watchingShortHandler = new WatchingShortHandler(queue,sessionMap);
+ // 创建UDP数据包NIO
+ NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
+ // NIO设置底层IOHandler
+ acceptor.setHandler(watchingShortHandler);
+
+ // 设置是否重用地址? 也就是每个发过来的udp信息都是一个地址?
+ DatagramSessionConfig dcfg = acceptor.getSessionConfig();
+ dcfg.setReuseAddress(false);
+ // 绑定端口地址
+ try {
+ acceptor.bind(new InetSocketAddress(watchServerIP, watchServerPort));
+ } catch (IOException e) {
+ Log_orderSuccess.info("绑定接收服务器失败....");
+ e.printStackTrace();
+ return 0;
+ }
+ Log_orderSuccess.info("绑定接收服务器成功....");
+ long recordIndex = 0;
+ while(true) {
+ if (!queue.isEmpty()) {
+ byte[] recvBuff;
+ synchronized (queue) {
+ recvBuff= queue.poll();
+ }
+ if (recvBuff[1]== 0x20) {
+ long sn = WgUdpCommShort.getLongByByte(recvBuff, 4, 4);
+ smFeign.updateLinkTime(sn+"");
+ Log_heartBeat.info("设备"+sn);
+ boolean isExist = true ;
+ long recordIndexGet = WgUdpCommShort.getLongByByte(recvBuff, 8, 4);
+ if(snoList.indexOf(sn) >= 0){
+ int number = snoList.indexOf(sn);
+ recordIndex = indexList.get(number);
+ indexList.set(number,recordIndexGet);
+ }else {
+ snoList.add(sn);
+ recordIndex = 0 ;
+ indexList.add(recordIndexGet);
+ System.out.println("设备"+sn+"上线");
+ isExist = false ;
+ }
+ if(isExist){
+ if (recordIndex < recordIndexGet || (recordIndexGet - recordIndex) < -5) {
+ watching(recvBuff,smFeign,xaFeign);
+ }
+ }
+ }else {
+ push(recvBuff,xaFeign);
+ }
+ } else {
+ long times = 100;
+ try {
+ Thread.sleep(times);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private static void watching(byte[] recv,SmFeign smFeign ,XaFeign xaFeign){
+ long res = 0;
+ //8-11 记录的索引号
+ //(=0表示没有记录) 4 0x00000000
+ int recordIndex = 0;
+ recordIndex = WGUtils.byteToInt(recv, 8, 4);
+ //12 记录类型**********************************************
+ //0=无记录
+ //1=刷卡记录
+ //2=门磁,按钮, 设备启动, 远程开门记录
+ //3=报警记录 1
+ //0xFF=表示指定索引位的记录已被覆盖掉了. 请使用索引0, 取回最早一条记录的索引值
+ int recordType = recv[12];
+
+ //13 有效性(0 表示不通过, 1表示通过) 1
+ int recordValid = recv[13];
+
+ //14 门号(1,2,3,4) 1 业务需要-->1出2进
+ int recordDoorNO = recv[14];
+
+ //15 进门/出门(1表示进门, 2表示出门) 1 0x01
+ //int recordInOrOut = recv[15];
+
+ //16-19 卡号(类型是刷卡记录时)
+ //或编号(其他类型记录) 4
+ String cardNo = WGUtils.getCardNo(recv, 16, 4);
+
+ //20-26 刷卡时间:
+ //年月日时分秒 (采用BCD码)见设置时间部分的说明
+ String recordTime = "2000-01-01 00:00:00";
+ recordTime = String.format("%02X%02X-%02X-%02X %02X:%02X:%02X",
+ recv[20], recv[21], recv[22], recv[23], recv[24], recv[25], recv[26]);
+ //2012.12.11 10:49:59 7
+ //27 记录原因代码(可以查 “刷卡记录说明.xls”文件的ReasonNO)
+ //处理复杂信息才用 1
+ int reason = recv[27];
+ if (recordType == 0) {
+ Log_orderSuccess.info(String.format("索引位={0} 无记录", recordIndex));
+ }else if (recordType == 0xff) {
+ Log_orderSuccess.info("指定索引位的记录已被覆盖掉了,请使用索引0, 取回最早一条记录的索引值");
+ } else if (recordType == 1) {
+ long sno = 0;
+ sno = WgUdpCommShort.getLongByByte(recv, 4, 4);//解析设备号
+ String msg = "索引位=" + recordIndex
+ + ",卡号=" + cardNo
+ +"进出=" + (recordDoorNO == 1 ? "出门" : "进门")
+ + ",有效=" + (recordValid == 1 ? "通过" : "禁止")
+ + ",时间=" + recordTime
+ + ",描述=" + WGUtils.getReasonDetailChinese(reason) + "";
+ Log_orderSuccess.info("控制器:" + sno + msg);
+ if(recordValid == 1) {
+ //有效刷卡调考勤存储过程
+ CheckInDto checkIn = new CheckInDto();
+ checkIn.setDeviceId(sno+"");
+ checkIn.setCardNo(cardNo);
+ checkIn.setFunNo(8);
+ checkIn.setFlag(recordDoorNO == 1 ? 1 : 0);
+ checkIn.setCheckTime(recordTime);
+ CheckOutDto checkOutDto = xaFeign.checkIn(checkIn);
+ if(checkOutDto.getIsSuccess() == 1){
+ //考勤成功
+ Log_kaoInfo.info("考勤成功!,设备:"+sno+"卡号:"+cardNo+"方向:"+(recordDoorNO == 1 ? "出门" : "进门")+"______"+ recordTime);
+ }else {
+ //考勤失败
+ Log_orderFail.error("考勤失败!,设备:"+sno+"卡号:"+cardNo + "---"+ checkOutDto.getOut());
+ }
+ }else {
+ //判断是否请假
+ String studentNum = smFeign.checkLeave(cardNo);
+ if (StringUtils.isNotBlank(studentNum)) {
+ int outOf = recordDoorNO == 1 ? 1 : 0;
+ //远程开门
+ openDoor(xaFeign,sno,"64",recordDoorNO,cardNo);
+ Log_orderSuccess.info("请假开门成功"+cardNo);
+ } else {
+ //没有请假不做任何处理,则是刷卡异常,入库
+ UserDto user = smFeign.selectUserByCardNum(cardNo);
+ PassFailDto passFail = new PassFailDto();
+ passFail.setCardNum(cardNo);
+ passFail.setDeviceId(sno+"");
+ passFail.setDirection((recordDoorNO == 1 ? "出门" : "进门"));
+ passFail.setResultIntro(WGUtils.getReasonDetailChinese(reason));
+ passFail.setInTime(DateUtils.string2Date(recordTime, DateUtils.format2));
+ passFail.setCreateTime(new Date());
+ passFail.setSchoolId(user.getSchoolId());
+ xaFeign.insertPassFail(passFail);
+ }
+ }
+ }
+ }
+
+ private static void push(byte[] recv,XaFeign xaFeign){
+ long index = WgUdpCommShort.getXidOfCommand(recv);
+ long sno = WgUdpCommShort.getLongByByte(recv, 4, 4);
+ String functionId = WGUtils.byte2Hex(recv[1]);
+ SendMessageDto sendMessage = xaFeign.selectMessage(sno+"",index,functionId);
+ if(sendMessage != null){
+ if(recv[8] == 1){
+ sendMessage.setCorrect(1);
+ }else {
+ sendMessage.setCorrect(0);
+ }
+ StringBuffer result = new StringBuffer();
+ for(byte b : recv){
+ result.append(WGUtils.byte2Hex(b)).append("-");
+ }
+ sendMessage.setResult(result.toString().substring(0,result.toString().length()-1));
+ xaFeign.updateMessage(sendMessage.getId(),sendMessage.getResult(),sendMessage.getCorrect());
+ }
+ }
+
+ //远程开门
+ public static long openDoor(XaFeign xaFeign,long sno , String outsideOrderId,int doorNo , String cardNo){
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ int doorNO =doorNo;
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ pkt.data[0] =(byte) (doorNO & 0xff);
+ if(StringUtils.isNotBlank(cardNo)){
+ pkt.data[20] = WGUtils.toHex(cardNo.substring(0,2));
+ pkt.data[21] = WGUtils.toHex(cardNo.substring(2,4));
+ pkt.data[22] = WGUtils.toHex(cardNo.substring(4,6));
+ pkt.data[23] = WGUtils.toHex(cardNo.substring(6,8));
+ }
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ return result ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return 0L;
+ }
+
+ //重置控制板时间
+ public static long setTime(XaFeign xaFeign,long sno , String outsideOrderId){
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ Calendar cal = (Calendar.getInstance());
+ pkt.data[0] = WGUtils.toHex(String.valueOf(cal.get(Calendar.YEAR)).substring(0,2));
+ pkt.data[1] = WGUtils.toHex(String.valueOf(cal.get(Calendar.YEAR)).substring(2,4));
+ pkt.data[2] = WGUtils.toHex(String.valueOf(cal.get(Calendar.MONTH)+1));
+ pkt.data[3] = WGUtils.toHex(String.valueOf(cal.get(Calendar.DATE)));
+ pkt.data[4] =WGUtils.toHex(String.valueOf(cal.get(Calendar.HOUR_OF_DAY)));
+ pkt.data[5] =WGUtils.toHex(String.valueOf(cal.get(Calendar.MINUTE)));
+ pkt.data[6] = WGUtils.toHex(String.valueOf(cal.get(Calendar.SECOND)));
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ return result ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return 0L;
+ }
+
+
+
+ //设置考勤时段
+ public static List SetAttendanceTime(XaFeign xaFeign,long sno ,String outsideOrderId, int shiduan , Date begin ,Date end ,
+ int isMonDay ,int isTuesDay , int isWednesDay ,int isThursDay , int isFriday ,
+ int isSaturDay , int isWeekend , String shiqu){
+ List resultList = new ArrayList<>();
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ String[] shiQuArray = shiqu.split(",");
+ int shiDuanCount = shiQuArray.length / 6 ;
+ for (int i = 0; i < shiDuanCount; i++){
+ if (i == 0) {
+ pkt.data[0] = WGUtils.toHex(shiduan+"");
+ } else {
+ pkt.data[0] = WGUtils.toHex((shiduan+20*i)+"");
+ }
+ Calendar c = Calendar.getInstance();
+ c.setTime(begin);
+ //开始时间 20 19 01 01
+ pkt.data[1] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2));
+ pkt.data[2] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4));
+ pkt.data[3] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1));
+ pkt.data[4] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE)));
+ //结束时间
+ c.setTime(end);
+ pkt.data[5] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2));
+ pkt.data[6] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4));
+ pkt.data[7] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1));
+ pkt.data[8] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE)));
+ //星期几 有效
+ pkt.data[9] = WGUtils.toHex(String.valueOf(isMonDay));
+ pkt.data[10] = WGUtils.toHex(String.valueOf(isTuesDay));
+ pkt.data[11] = WGUtils.toHex(String.valueOf(isWednesDay));
+ pkt.data[12] = WGUtils.toHex(String.valueOf(isThursDay));
+ pkt.data[13] = WGUtils.toHex(String.valueOf(isFriday));
+ pkt.data[14] = WGUtils.toHex(String.valueOf(isSaturDay));
+ pkt.data[15] = WGUtils.toHex(String.valueOf(isWeekend));
+ //有效时区
+ pkt.data[16] = WGUtils.toHex(shiQuArray[i * 6 + 0].substring(0, 2));
+ pkt.data[17] = WGUtils.toHex(shiQuArray[i * 6 + 0].substring(3, 5));
+
+ pkt.data[18] = WGUtils.toHex(shiQuArray[i * 6 + 1].substring(0, 2));
+ pkt.data[19] = WGUtils.toHex(shiQuArray[i * 6 + 1].substring(3, 5));
+
+ pkt.data[20] = WGUtils.toHex(shiQuArray[i * 6 + 2].substring(0, 2));
+ pkt.data[21] = WGUtils.toHex(shiQuArray[i * 6 + 2].substring(3, 5));
+
+ pkt.data[22] = WGUtils.toHex(shiQuArray[i * 6 + 3].substring(0, 2));
+ pkt.data[23] = WGUtils.toHex(shiQuArray[i * 6 + 3].substring(3, 5));
+
+ pkt.data[24] = WGUtils.toHex(shiQuArray[i * 6 + 4].substring(0, 2));
+ pkt.data[25] = WGUtils.toHex(shiQuArray[i * 6 + 4].substring(3, 5));
+
+ pkt.data[26] = WGUtils.toHex(shiQuArray[i * 6 + 5].substring(0, 2));
+ pkt.data[27] = WGUtils.toHex(shiQuArray[i * 6 + 5].substring(3, 5));
+ if (shiDuanCount != 1) {
+ //需要链接时段
+ if (i != shiDuanCount - 1) {
+ //只要不是最后一个时段
+ pkt.data[28] = WGUtils.toHex((shiduan+20*(i+1)+""));
+ } else {
+ pkt.data[28] = 0;
+ }
+ } else {
+ pkt.data[28] = 0;
+ }
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ resultList.add(result);
+ }
+ return resultList ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return resultList;
+ }
+
+
+ //设置权限
+ public static long SetSignalCardInfo(XaFeign xaFeign,long sno , String outsideOrderId, String cardNo , int shiduan , Date begin , Date end){
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ pkt.iDevSn = sno;
+ //0D D7 37 00
+ pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2));
+ pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4));
+ pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6));
+ pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8));
+
+ //20 10 01 01 起始日期: 2010年01月01日 (必须大于2001年)
+ Calendar c = Calendar.getInstance();
+ c.setTime(begin);
+ pkt.data[4] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2));
+ pkt.data[5] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4));
+ pkt.data[6] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1));
+ pkt.data[7] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE)));
+ //20 29 12 31 截止日期: 2029年12月31日
+ c.setTime(end);
+ pkt.data[8] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2));
+ pkt.data[9] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4));
+ pkt.data[10] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1));
+ pkt.data[11] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE)));
+ //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
+ pkt.data[12] = WGUtils.toHex(shiduan+"");
+ //01 允许通过 二号门 [对双门, 四门控制器有效]
+ pkt.data[13] = WGUtils.toHex(shiduan+"");
+ //01 允许通过 三号门 [对四门控制器有效]
+ pkt.data[14] = WGUtils.toHex(shiduan+"");
+ //01 允许通过 四号门 [对四门控制器有效]
+ pkt.data[15] = WGUtils.toHex(shiduan+"");
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ return result ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return 0l;
+ }
+
+ //删除单张卡权限
+ public static long clearSinglePower(XaFeign xaFeign,long sno ,String outsideOrderId, String cardNo){
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ pkt.iDevSn = sno;
+ pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2));
+ pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4));
+ pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6));
+ pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8));
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ return result ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return 0l;
+ }
+
+ //删除全部权限
+ public static long clearAllPower(XaFeign xaFeign,long sno ,String outsideOrderId){
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ pkt.iDevSn = sno;
+ pkt.data[0] = (byte) 0x55 ;
+ pkt.data[1] = (byte) 0xAA ;
+ pkt.data[2] = (byte) 0xAA ;
+ pkt.data[3] = (byte) 0x55 ;
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ return result ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return 0l;
+ }
+
+ //查询卡权限
+ public static long searchPower(XaFeign xaFeign,long sno ,String outsideOrderId, String cardNo){
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ pkt.iDevSn = sno;
+ pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2));
+ pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4));
+ pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6));
+ pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8));
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ return result ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return 0l;
+ }
+
+ //删除时段
+ public static long clearShiDuan(XaFeign xaFeign,long sno , String outsideOrderId){
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = sno;
+ try{
+ pkt.Reset();
+ pkt.functionID = WGUtils.toFunctionHex(outsideOrderId);
+ pkt.iDevSn = sno;
+ pkt.data[0] = (byte) 0x55 ;
+ pkt.data[1] = (byte) 0xAA ;
+ pkt.data[2] = (byte) 0xAA ;
+ pkt.data[3] = (byte) 0x55 ;
+ byte[] bytes = pkt.toByte();
+ long index = WgUdpCommShort.getXidOfCommand(bytes);
+ long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes);
+ pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes);
+ return result ;
+ }catch (Exception e){
+ Log_error.error(e.toString());
+ }
+ return 0l;
+ }
+
+ private static long insert(XaFeign xaFeign ,String sn ,String functionId , String cardNo , long index , byte[] recv){
+
+ StringBuffer send = new StringBuffer();
+ for(byte b : recv){
+ send.append(WGUtils.byte2Hex(b)).append("-");
+ }
+ SendMessageDto sendMessage = new SendMessageDto();
+ sendMessage.setDeviceId(sn);
+ sendMessage.setFunctionId(Integer.toHexString(Integer.valueOf(functionId)));
+ sendMessage.setIndex(index);
+ sendMessage.setCardNo(cardNo);
+ sendMessage.setCreateTime(new Date());
+ sendMessage.setSend(send.toString().substring(0,send.toString().length()-1));
+ xaFeign.insertMessage(sendMessage);
+ return sendMessage.getId();
+ }
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java
new file mode 100644
index 0000000..32fcea8
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java
@@ -0,0 +1,90 @@
+package com.sincere.weigeng.utils;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IdleStatus;
+import org.apache.mina.core.session.IoSession;
+
+import java.util.Map;
+import java.util.Queue;
+
+
+/**
+ * Class the extends IoHandlerAdapter in order to properly handle
+ * connections and the data the connections send
+ *
+ * @author Apache MINA Project
+ */
+public class WatchingShortHandler extends IoHandlerAdapter {
+
+ private Queue queue;
+ private Map sessionMap ;
+ public WatchingShortHandler(Queue queue , Map sessionMap) {
+ super();
+ this.queue = queue;
+ this.sessionMap = sessionMap;
+ }
+
+ /**
+ * 异常来关闭session
+ */
+ @Override
+ public void exceptionCaught(IoSession session, Throwable cause)
+ throws Exception {
+ cause.printStackTrace();
+ session.close(true);
+ }
+
+ /**
+ * 服务器端收到一个消息
+ */
+ @Override
+ public void messageReceived(IoSession session, Object message) throws Exception {
+ IoBuffer io = (IoBuffer) message;
+ if (io.hasRemaining()) {
+ byte[] validBytes = new byte[io.remaining()];
+ io.get(validBytes,0,io.remaining());
+ if (validBytes.length == WgUdpCommShort.WGPacketSize) {
+ synchronized (queue) {
+ long sn = WgUdpCommShort.getLongByByte(validBytes, 4, 4);
+ sessionMap.put(sn,session);
+ queue.offer(validBytes);
+ }
+ } else {
+ }
+ }
+ }
+
+ @Override
+ public void sessionClosed(IoSession session) throws Exception {
+ }
+
+ @Override
+ public void sessionCreated(IoSession session) throws Exception {
+ }
+
+ @Override
+ public void sessionIdle(IoSession session, IdleStatus status)
+ throws Exception {
+ }
+
+ @Override
+ public void sessionOpened(IoSession session) throws Exception {
+ }
+
+ public Queue getQueue() {
+ return queue;
+ }
+
+ public void setQueue(Queue queue) {
+ this.queue = queue;
+ }
+
+ public Map getSessionMap() {
+ return sessionMap;
+ }
+
+ public void setSessionMap(Map sessionMap) {
+ this.sessionMap = sessionMap;
+ }
+}
diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java
new file mode 100644
index 0000000..30234cf
--- /dev/null
+++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java
@@ -0,0 +1,120 @@
+package com.sincere.weigeng.utils;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.session.IoSession;
+
+public class WgUdpCommShort { //短报文协议
+
+ public static final int WGPacketSize = 64; //报文长度
+ public static final byte Type = 0x17; //2015-04-30 08:50:29 0x19; //类型
+ public static final int ControllerPort = 60000; //控制器端口
+ public static final long SpecialFlag = 0x55AAAA55; //特殊标识 防止误操作
+
+ public static byte[] longToByte(long number) {
+ byte[] b = new byte[8];
+ for (int i = 0; i < 8; i++) {
+ b[i] = (byte) (number % 256);
+ number >>= 8;
+ }
+ return b;
+ }
+
+ //从字节转换为 long型数据, 最大长度为8字节 低位在前, 高位在后...
+ //bytlen (1--8), 不在此范围则返回 -1
+ public static long getLongByByte(byte[] data,int startIndex,int bytlen)
+ {
+ long ret =-1;
+ if ((bytlen >=1) && (bytlen <=8))
+ {
+ ret = getIntByByte(data[startIndex + bytlen-1]);
+ for (int i=1; i= WGPacketSize)
+ {
+ ret = getLongByByte(cmd, 40, 4);
+ }
+ return ret;
+ }
+
+ public WgUdpCommShort()
+ {
+ Reset();
+ }
+ public void Reset() //数据复位
+ {
+ for(int i=0; i
+
+
+
+
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} -%msg%n
+
+
+
+ 1
+
+
+ ${logPath}/info/orderSuccess/%d{yyyy-MM-dd HH}.log
+ ${maxHistory}
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} -%msg%n
+
+
+
+ 1
+
+
+ ${logPath}/info/orderFail/%d{yyyy-MM-dd HH}.log
+ ${maxHistory}
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} -%msg%n
+
+
+
+ 1
+
+
+ ${logPath}/info/heartBeat/%d{yyyy-MM-dd HH}.log
+ ${maxHistory}
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} -%msg%n
+
+
+
+ 1
+
+
+ ${logPath}/info/kaoInfo/%d{yyyy-MM-dd HH}.log
+ ${maxHistory}
+
+
+
+
+
+
+
+
+ ERROR
+
+
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
+
+
+
+ 1
+
+ ${logPath}/infoError/${PROJECT_NAME}.%d{yyyy-MM-dd}.log
+
+ ${maxHistory}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
--
libgit2 0.21.0