Ver código fonte

1、门禁开门记录

slowslo 4 anos atrás
pai
commit
e81a2c7b6c
24 arquivos alterados com 366 adições e 67 exclusões
  1. 20 2
      blade-biz-common/src/main/java/org/springblade/common/constant/CommonConstant.java
  2. 2 0
      blade-service-api/estate-api/src/main/java/org/springblade/estate/dto/AccessRecordDTO.java
  3. 9 0
      blade-service-api/estate-api/src/main/java/org/springblade/estate/entity/AccessRecord.java
  4. 2 1
      blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/AccessRecordClientFallback.java
  5. 6 1
      blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/GuestRecordClientFallback.java
  6. 2 1
      blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/IAccessRecordClient.java
  7. 3 0
      blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/IGuestRecordClient.java
  8. 9 4
      blade-service-api/third-api/src/main/java/org/springblade/third/doordevice/feign/DoorDeviceButtFallback.java
  9. 15 7
      blade-service-api/third-api/src/main/java/org/springblade/third/doordevice/feign/IDoorDeviceButtClient.java
  10. 6 7
      blade-service/device/src/main/java/org/springblade/device/controller/DoorDeviceController.java
  11. 2 0
      blade-service/device/src/main/java/org/springblade/device/service/IDoorDeviceService.java
  12. 25 0
      blade-service/device/src/main/java/org/springblade/device/service/impl/DoorDeviceServiceImpl.java
  13. 1 1
      blade-service/estate/src/main/java/org/springblade/estate/controller/AccessRecordController.java
  14. 2 1
      blade-service/estate/src/main/java/org/springblade/estate/feign/AccessRecordClient.java
  15. 6 0
      blade-service/estate/src/main/java/org/springblade/estate/feign/GuestRecordRecordClient.java
  16. 3 0
      blade-service/estate/src/main/java/org/springblade/estate/mapper/AccessRecordMapper.xml
  17. 7 1
      blade-service/estate/src/main/java/org/springblade/estate/service/IAccessRecordService.java
  18. 110 20
      blade-service/estate/src/main/java/org/springblade/estate/service/impl/AccessRecordServiceImpl.java
  19. 23 13
      blade-service/third/src/main/java/org/springblade/third/doordevice/feign/DoorDeviceButtClient.java
  20. 2 0
      blade-service/third/src/main/java/org/springblade/third/doordevice/provider/IDoorDeviceService.java
  21. 6 0
      blade-service/third/src/main/java/org/springblade/third/doordevice/provider/impl/QinLinMqProvider.java
  22. 33 0
      blade-service/third/src/main/java/org/springblade/third/doordevice/provider/impl/ZHProvider.java
  23. 58 6
      blade-service/third/src/main/java/org/springblade/third/zongheng/ZHDeviceController.java
  24. 14 2
      blade-service/third/src/main/java/org/springblade/third/zongheng/handler/FaceCompareEventHandler.java

+ 20 - 2
blade-biz-common/src/main/java/org/springblade/common/constant/CommonConstant.java

@@ -105,8 +105,9 @@ public interface CommonConstant {
 		ADMIN_USER_NUMBER_FLAG("101", "管理员数字标记"),
 		USER_NUMBER_FLAG("102", "住户数字标记"),
 		SERVER_USER_NUMBER_FLAG("103", "服务员数字标记"),
-		GUEST_FLAG("104", "访客标识"),
-		ENTERPRISE_STAFF_FLAG("QYYG_", "企业员工标识");
+		GUEST_FLAG("FQ_", "访客标识"),
+		ENTERPRISE_STAFF_FLAG("QYYG_", "企业员工标识"),
+		ADMIN_FLAG("ADMIN_", "管理员标识");
 
 		private String value;
 		private String txt;
@@ -117,6 +118,23 @@ public interface CommonConstant {
 		}
 	}
 
+	@Getter
+	enum UserType{
+
+		HOUSE_USER("住户", 1),
+		STAFF("企业员工",2),
+		SERVER("服务人员",3),
+		GUEST("访客",4),
+		ADMIN("管理员",5);
+		String name;
+		Integer type;
+		UserType(String name,Integer type){
+			this.name = name;
+			this.type = type;
+		}
+
+	}
+
 	@Getter
 	enum SystemConf {
 

+ 2 - 0
blade-service-api/estate-api/src/main/java/org/springblade/estate/dto/AccessRecordDTO.java

@@ -31,4 +31,6 @@ import lombok.EqualsAndHashCode;
 public class AccessRecordDTO extends AccessRecord {
 	private static final long serialVersionUID = 1L;
 
+	private Integer userType;
+
 }

+ 9 - 0
blade-service-api/estate-api/src/main/java/org/springblade/estate/entity/AccessRecord.java

@@ -140,5 +140,14 @@ public class AccessRecord extends BaseEntity {
 	@ApiModelProperty("租户id")
 	private String tenantId;
 
+	@ApiModelProperty(value = "指令序号")
+	private String commandSeq;
+
+	@ApiModelProperty(value = "开门是否成功,1成功,-1失败")
+	private Integer openSuccess;
+
+	@ApiModelProperty(value = "失败原因")
+	private String failReason;
+
 
 }

+ 2 - 1
blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/AccessRecordClientFallback.java

@@ -2,6 +2,7 @@ package org.springblade.estate.feign;
 
 import org.springblade.core.tool.api.R;
 import org.springblade.estate.dto.AccessRecordCountDto;
+import org.springblade.estate.dto.AccessRecordDTO;
 import org.springblade.estate.entity.AccessRecord;
 import org.springblade.estate.vo.AccessRecordVO;
 import org.springframework.stereotype.Component;
@@ -72,7 +73,7 @@ public class AccessRecordClientFallback implements IAccessRecordClient {
 	}
 
 	@Override
-	public R generateAccessRecord(AccessRecord accessRecord) {
+	public R generateAccessRecord(AccessRecordDTO accessRecord) {
 		return null;
 	}
 

+ 6 - 1
blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/GuestRecordClientFallback.java

@@ -66,4 +66,9 @@ public class GuestRecordClientFallback implements IGuestRecordClient {
             return false;
         }
 
-    }
+	@Override
+	public GuestRecord getById(Long id) {
+		return null;
+	}
+
+}

+ 2 - 1
blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/IAccessRecordClient.java

@@ -3,6 +3,7 @@ package org.springblade.estate.feign;
 import io.swagger.annotations.ApiParam;
 import org.springblade.core.tool.api.R;
 import org.springblade.estate.dto.AccessRecordCountDto;
+import org.springblade.estate.dto.AccessRecordDTO;
 import org.springblade.estate.entity.AccessRecord;
 import org.springblade.estate.vo.AccessRecordVO;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -75,6 +76,6 @@ public interface IAccessRecordClient  {
 	AccessRecordCountDto getAccessCount();
 
 	@PostMapping("/generateAccessRecord")
-	R generateAccessRecord(@RequestBody AccessRecord accessRecord);
+	R generateAccessRecord(@RequestBody AccessRecordDTO accessRecord);
 
 }

+ 3 - 0
blade-service-api/estate-api/src/main/java/org/springblade/estate/feign/IGuestRecordClient.java

@@ -71,5 +71,8 @@ public interface IGuestRecordClient {
 	@PostMapping("/remove")
     boolean remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids);
 
+	@GetMapping("/getById")
+	GuestRecord getById(@RequestParam Long id);
+
 
 }

+ 9 - 4
blade-service-api/third-api/src/main/java/org/springblade/third/doordevice/feign/DoorDeviceButtFallback.java

@@ -18,10 +18,10 @@ import java.util.Map;
 @Component
 public class DoorDeviceButtFallback implements IDoorDeviceButtClient {
 
-	@Override
-	public R remoteOpenDoor(DoorDevice doorDevice, Map<String,Object> userInfoDto) {
-		return null;
-	}
+//	@Override
+//	public R remoteOpenDoor(DoorDevice doorDevice, Map<String,Object> userInfoDto) {
+//		return null;
+//	}
 
 	@Override
 	public R addUser(List<DoorDevice> doorDeviceList, Map<String,Object> userInfoDto) {
@@ -47,4 +47,9 @@ public class DoorDeviceButtFallback implements IDoorDeviceButtClient {
 	public R pushFaceToDevices(UserDeviceDTO userDeviceDTO) {
 		return null;
 	}
+
+	@Override
+	public R remoteOpenDoor(String serialNum, String factory, boolean isOpen) {
+		return null;
+	}
 }

+ 15 - 7
blade-service-api/third-api/src/main/java/org/springblade/third/doordevice/feign/IDoorDeviceButtClient.java

@@ -6,6 +6,7 @@ import org.springblade.device.dto.UserInfoDto;
 import org.springblade.device.entity.DoorDevice;
 import org.springblade.third.doordevice.dto.UserDeviceDTO;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -20,13 +21,13 @@ import java.util.Map;
 @FeignClient(value = "cyzh-third",path = "/feign/third/doordevice")
 public interface IDoorDeviceButtClient {
 
-	/**
-	 * 远程开门
-	 * @param doorDevice
-	 * @param userInfoDto
-	 */
-	@PostMapping("/remoteOpenDoor")
-	R remoteOpenDoor(@RequestBody DoorDevice doorDevice, @RequestParam Map<String,Object> userInfoDto);
+//	/**
+//	 * 远程开门
+//	 * @param doorDevice
+//	 * @param userInfoDto
+//	 */
+//	@PostMapping("/remoteOpenDoor")
+//	R remoteOpenDoor(@RequestBody DoorDevice doorDevice, @RequestParam Map<String,Object> userInfoDto);
 	/**
 	 * 新增人脸
 	 * @param doorDeviceList
@@ -63,4 +64,11 @@ public interface IDoorDeviceButtClient {
 	 */
 	@PostMapping("/pushFaceToDevices")
 	R pushFaceToDevices(@RequestBody UserDeviceDTO userDeviceDTO);
+
+	/**
+	 * 远程开门
+	 * @param serialNum
+	 */
+	@PostMapping("/remoteOpenDoor")
+	R remoteOpenDoor(@RequestParam String serialNum, @RequestParam String factory, @RequestParam boolean isOpen);
 }

+ 6 - 7
blade-service/device/src/main/java/org/springblade/device/controller/DoorDeviceController.java

@@ -34,6 +34,7 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.device.dto.UserInfoDto;
 import org.springblade.system.expand.feign.IOrgPositionClient;
@@ -163,20 +164,18 @@ public class DoorDeviceController extends BladeController {
 	}
 
 	/**
-	 * 后台一键开门
+	 * 远程开门
+	 * 兼容开门和关门
 	 */
-	@GetMapping("/remoteOpenDoor")
+	@PostMapping("/remoteOpenDoor")
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "一键开门", notes = "传入id")
-	public R remoteOpenDoor(@ApiParam(value = "主键", required = true) String id, BladeUser bladeUser) {
+	public R remoteOpenDoor(@ApiParam(value = "主键", required = true) @RequestParam String id, @RequestParam boolean isOpen, BladeUser bladeUser) {
 		DoorDevice doorDevice = doorDeviceService.getById(Func.toLong(id));
 		if(doorDevice == null){
 			return fail("设备不存在");
 		}
-
-		Map<String,Object> userInfoDto = new HashMap<>();
-		userInfoDto.put("id",CommonConstant.UserFlag.ADMIN_USER_NUMBER_FLAG + Func.toStr(bladeUser.getUserId()));
-		return doorDeviceButtClient.remoteOpenDoor(doorDevice, userInfoDto);
+		return doorDeviceService.remoteOpenDoor(CommonConstant.UserFlag.ADMIN_FLAG.getValue() + String.valueOf(bladeUser.getUserId()), bladeUser.getUserName(), CommonConstant.UserType.ADMIN.getType(), doorDevice.getMacAddress(), doorDevice.getDeviceFactory(), isOpen);
 	}
 
 

+ 2 - 0
blade-service/device/src/main/java/org/springblade/device/service/IDoorDeviceService.java

@@ -43,4 +43,6 @@ public interface IDoorDeviceService extends BaseService<DoorDevice> {
 
 	R heartbeat(String serialNum);
 
+	R remoteOpenDoor(String userId, String userName, Integer userType, String serialNum, String factory, boolean isOpen);
+
 }

+ 25 - 0
blade-service/device/src/main/java/org/springblade/device/service/impl/DoorDeviceServiceImpl.java

@@ -18,12 +18,18 @@ package org.springblade.device.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.codehaus.janino.Access;
 import org.springblade.core.tool.api.R;
 import org.springblade.device.entity.DoorDevice;
 import org.springblade.device.vo.DoorDeviceVO;
 import org.springblade.device.mapper.DoorDeviceMapper;
 import org.springblade.device.service.IDoorDeviceService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.estate.dto.AccessRecordDTO;
+import org.springblade.estate.entity.AccessRecord;
+import org.springblade.estate.feign.IAccessRecordClient;
+import org.springblade.third.doordevice.feign.IDoorDeviceButtClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
@@ -38,6 +44,11 @@ import java.util.Date;
 @Service
 public class DoorDeviceServiceImpl extends BaseServiceImpl<DoorDeviceMapper, DoorDevice> implements IDoorDeviceService {
 
+	@Autowired
+	private IDoorDeviceButtClient doorDeviceButtClient;
+	@Autowired
+	private IAccessRecordClient accessRecordClient;
+
 	@Override
 	public IPage<DoorDeviceVO> selectDoorDevicePage(IPage<DoorDeviceVO> page, DoorDeviceVO doorDevice) {
 		return page.setRecords(baseMapper.selectDoorDevicePage(page, doorDevice));
@@ -62,4 +73,18 @@ public class DoorDeviceServiceImpl extends BaseServiceImpl<DoorDeviceMapper, Doo
 		return R.status(false);
 	}
 
+	@Override
+	public R remoteOpenDoor(String userId, String userName, Integer userType, String serialNum, String factory, boolean isOpen) {
+		//创建开门记录
+		AccessRecordDTO accessRecord = new AccessRecordDTO();
+		accessRecord.setUserId(userId);
+		accessRecord.setUserName(userName);
+		accessRecord.setDeviceMac(serialNum);
+		accessRecord.setUserType(userType);
+		accessRecord.setOpenType(2);
+		accessRecord.setOpenTime(new Date());
+		accessRecordClient.generateAccessRecord(accessRecord);
+		return this.doorDeviceButtClient.remoteOpenDoor(serialNum, factory, isOpen);
+	}
+
 }

+ 1 - 1
blade-service/estate/src/main/java/org/springblade/estate/controller/AccessRecordController.java

@@ -86,7 +86,7 @@ public class AccessRecordController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入accessRecord")
 	public R<IPage<AccessRecordVO>> list(@RequestParam Map<String, Object> accessRecord, Query query, BladeUser bladeUser) {
 		LambdaQueryWrapper<AccessRecord> basicQueryWrapper = new QueryWrapperUtil<AccessRecord>().getBasicQueryWrapperByMap(AccessRecord::getOrgPosition, accessRecord, new AccessRecord(), bladeUser, orgPositionClient);
-		IPage<AccessRecord> pages = accessRecordService.page(Condition.getPage(query), basicQueryWrapper.eq(AccessRecord::getTenantId, bladeUser.getTenantId()));
+		IPage<AccessRecord> pages = accessRecordService.page(Condition.getPage(query), basicQueryWrapper.eq(AccessRecord::getTenantId, bladeUser.getTenantId()).orderByDesc(AccessRecord::getCreateTime));
 		return R.data(AccessRecordWrapper.build(confClient).pageVO(pages));
 	}
 

+ 2 - 1
blade-service/estate/src/main/java/org/springblade/estate/feign/AccessRecordClient.java

@@ -13,6 +13,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.estate.dto.AccessRecordCountDto;
+import org.springblade.estate.dto.AccessRecordDTO;
 import org.springblade.system.expand.feign.IConfClient;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.web.bind.annotation.*;
@@ -129,7 +130,7 @@ public class AccessRecordClient implements IAccessRecordClient {
 
 	@Override
 	@PostMapping("/generateAccessRecord")
-	public R generateAccessRecord(@RequestBody AccessRecord accessRecord) {
+	public R generateAccessRecord(@RequestBody AccessRecordDTO accessRecord) {
 		return this.accessRecordService.generateAccessRecord(accessRecord);
 	}
 

+ 6 - 0
blade-service/estate/src/main/java/org/springblade/estate/feign/GuestRecordRecordClient.java

@@ -120,5 +120,11 @@ public class GuestRecordRecordClient implements IGuestRecordClient {
         return guestService.deleteLogic(Func.toLongList(ids));
         }
 
+	@Override
+	@GetMapping("/getById")
+	public GuestRecord getById(@RequestParam Long id) {
+    	return guestService.getById(id);
+	}
+
 
 }

+ 3 - 0
blade-service/estate/src/main/java/org/springblade/estate/mapper/AccessRecordMapper.xml

@@ -32,6 +32,9 @@
         <result column="device_name" property="deviceName"/>
         <result column="is_out" property="isOut"/>
         <result column="tenant_id" property="tenantId"/>
+        <result column="command_seq" property="commandSeq"/>
+        <result column="open_success" property="openSuccess"/>
+        <result column="fail_reason" property="failReason"/>
     </resultMap>
 
     <resultMap id="accessRecordCountResultMap" type="org.springblade.estate.dto.AccessRecordCountDto">

+ 7 - 1
blade-service/estate/src/main/java/org/springblade/estate/service/IAccessRecordService.java

@@ -17,11 +17,14 @@
 package org.springblade.estate.service;
 
 import org.springblade.core.tool.api.R;
+import org.springblade.estate.dto.AccessRecordDTO;
 import org.springblade.estate.entity.AccessRecord;
 import org.springblade.estate.vo.AccessRecordVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.Date;
+
 /**
  *  服务类
  *
@@ -47,6 +50,9 @@ public interface IAccessRecordService extends BaseService<AccessRecord> {
 
 	Integer selectYearAccessRecordCount();
 
-	R generateAccessRecord(AccessRecord accessRecord);
+	R generateAccessRecord(AccessRecordDTO accessRecord);
+
+	R generateAccessRecord(String serialNum, Long userId, String userFace, Integer userType, Integer openType,
+						   Integer openSuccess, String failReason, String commandSeq, String temperature, Date openDate);
 
 }

+ 110 - 20
blade-service/estate/src/main/java/org/springblade/estate/service/impl/AccessRecordServiceImpl.java

@@ -21,8 +21,11 @@ import org.springblade.community.entity.Agency;
 import org.springblade.community.entity.Residential;
 import org.springblade.community.feign.IAgencyClient;
 import org.springblade.community.feign.IResidentialClient;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.device.entity.DoorDevice;
 import org.springblade.device.feign.IDoorDeviceClient;
 import org.springblade.device.service.IDoorDeviceService;
@@ -30,15 +33,26 @@ import org.springblade.enterprise.entity.Enterprise;
 import org.springblade.enterprise.entity.Staff;
 import org.springblade.enterprise.feign.IEnterpriseClient;
 import org.springblade.enterprise.feign.IStaffClient;
+import org.springblade.estate.dto.AccessRecordDTO;
 import org.springblade.estate.entity.AccessRecord;
+import org.springblade.estate.entity.GuestRecord;
+import org.springblade.estate.feign.IGuestAuthorizeClient;
+import org.springblade.estate.feign.IGuestRecordClient;
+import org.springblade.estate.service.IGuestRecordService;
 import org.springblade.estate.vo.AccessRecordVO;
 import org.springblade.estate.mapper.AccessRecordMapper;
 import org.springblade.estate.service.IAccessRecordService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.util.Assert;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -60,6 +74,10 @@ public class AccessRecordServiceImpl extends BaseServiceImpl<AccessRecordMapper,
 	private IStaffClient staffClient;
 	@Autowired
 	private IDoorDeviceClient doorDeviceClient;
+	@Autowired
+	private IGuestRecordClient guestRecordClient;
+	@Autowired
+	private IUserClient userClient;
 
 	@Override
 	public IPage<AccessRecordVO> selectAccessRecordPage(IPage<AccessRecordVO> page, AccessRecordVO accessRecord) {
@@ -87,32 +105,104 @@ public class AccessRecordServiceImpl extends BaseServiceImpl<AccessRecordMapper,
 	}
 
 	@Override
-	public R generateAccessRecord(AccessRecord accessRecord) {
+	public R generateAccessRecord(AccessRecordDTO accessRecord) {
+		DoorDevice doorDevice = doorDeviceClient.getByMacAddresses(accessRecord.getDeviceMac());
+		Agency agency = agencyClient.getById(doorDevice.getAgencyId());
+		Residential residential = residentialClient.getById(doorDevice.getResidentialId());
 		String userId = accessRecord.getUserId();
-		if(userId.startsWith(CommonConstant.UserFlag.ENTERPRISE_STAFF_FLAG.getValue())){
+		if(accessRecord.getUserType().intValue() == CommonConstant.UserType.STAFF.getType()){
 			Staff staff = staffClient.getById(Long.parseLong(userId.substring(5)));
 			Enterprise enterprise = enterpriseClient.getById(staff.getEnterpriseId());
-			Agency agency = agencyClient.getById(staff.getAgencyId());
-			Residential residential = residentialClient.getById(staff.getResidentialId());
 			accessRecord.setEnterpriseId(staff.getEnterpriseId());
 			accessRecord.setEnterpriseName(enterprise.getEnterpriseName());
-			accessRecord.setAgencyId(agency.getId());
-			accessRecord.setAgencyName(agency.getName());
-			accessRecord.setResidentialId(residential.getId());
-			accessRecord.setResidentialName(residential.getName());
-			accessRecord.setTenantId(staff.getTenantId());
-			accessRecord.setUserId(staff.getId().toString());
-			DoorDevice doorDevice = doorDeviceClient.getByMacAddresses(accessRecord.getDeviceMac());
-			accessRecord.setDeviceId(doorDevice.getId());
-			accessRecord.setDeviceName(doorDevice.getName());
-			accessRecord.setDeviceAddress(doorDevice.getAddress());
-			accessRecord.setOrgPosition(staff.getOrgPosition());
-			accessRecord.setIsDeleted(BladeConstant.DB_NOT_DELETED);
-			accessRecord.setCreateTime(new Date());
-			accessRecord.setUpdateTime(new Date());
-			this.baseMapper.insert(accessRecord);
+			accessRecord.setUserName(staff.getRealName());
+			accessRecord.setUserId(userId);
+		}else if(accessRecord.getUserType().intValue() == CommonConstant.UserType.ADMIN.getType()){
+			R<User> userR = userClient.userInfoById(Long.parseLong(userId.substring(6)));
+			User user = userR.getData();
+			accessRecord.setUserId(userId);
+			accessRecord.setUserName(user.getRealName());
+		}else if(accessRecord.getUserType().intValue() == CommonConstant.UserType.GUEST.getType()){
+			GuestRecord guestRecord = guestRecordClient.getById(Long.parseLong(userId.substring(3)));
+			Enterprise enterprise = enterpriseClient.getById(guestRecord.getEnterpriseId());
+			if(enterprise != null){
+				accessRecord.setEnterpriseId(guestRecord.getEnterpriseId());
+				accessRecord.setEnterpriseName(enterprise.getEnterpriseName());
+			}
+		}
+		accessRecord.setAgencyId(agency.getId());
+		accessRecord.setResidentialId(residential.getId());
+		accessRecord.setAgencyName(agency.getName());
+		accessRecord.setResidentialName(residential.getName());
+		accessRecord.setTenantId(doorDevice.getTenantId());
+		accessRecord.setCreateTime(new Date());
+		accessRecord.setUpdateTime(new Date());
+		accessRecord.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+		accessRecord.setOrgPosition(doorDevice.getOrgPosition());
+		accessRecord.setDeviceId(doorDevice.getId());
+		accessRecord.setDeviceName(doorDevice.getName());
+		accessRecord.setDeviceAddress(doorDevice.getAddress());
+		int insert = this.baseMapper.insert(accessRecord);
+		return R.status(insert > 0? true : false);
+	}
+
+	@Override
+	public R generateAccessRecord(String serialNum, Long userId, String userFace, Integer userType, Integer openType,
+								  Integer openSuccess, String failReason, String commandSeq, String temperature, Date openDate) {
+		Agency agency = null;
+		Residential residential = null;
+		Enterprise enterprise = null;
+		Long enterpriseId = null;
+		String enterpriseName = null;
+		String userName = null;
+		DoorDevice doorDevice = doorDeviceClient.getByMacAddresses(serialNum);
+		if(userType.intValue() == CommonConstant.UserType.STAFF.getType()){
+			Staff staff = staffClient.getById(userId);
+			Assert.notNull(staff, "企业员工不存在");
+			agency = agencyClient.getById(staff.getAgencyId());
+			residential = residentialClient.getById(staff.getResidentialId());
+			enterprise = enterpriseClient.getById(staff.getEnterpriseId());
+			enterpriseId = enterprise.getId();
+			enterpriseName = enterprise.getEnterpriseName();
+			userName = staff.getRealName();
+		}else if(userType.intValue() == CommonConstant.UserType.GUEST.getType()){
+			GuestRecord guest = guestRecordClient.getById(userId);
+			Assert.notNull(guest, "访客记录不存在");
+			agency = agencyClient.getById(guest.getAgencyId());
+			residential = residentialClient.getById(guest.getResidentialId());
+			enterprise = enterpriseClient.getById(guest.getEnterpriseId());
+			enterpriseId = enterprise.getId();
+			enterpriseName = enterprise.getEnterpriseName();
+			userName = guest.getGuestName();
+		}else if(userType.intValue() == CommonConstant.UserType.ADMIN.getType()){
+			agency = agencyClient.getById(doorDevice.getAgencyId());
+			residential = residentialClient.getById(doorDevice.getResidentialId());
+			BladeUser user = AuthUtil.getUser();
+			if(user != null){
+				userName = user.getUserName();
+			}
 		}
-		return R.status(true);
+		AccessRecord record = new AccessRecord();
+		record.setAgencyId(agency.getId());
+		record.setAgencyName(agency.getName());
+		record.setResidentialId(residential.getId());
+		record.setResidentialName(residential.getName());
+		record.setEnterpriseId(enterpriseId);
+		record.setEnterpriseName(enterpriseName);
+		record.setUserName(userName);
+		record.setTenantId(residential.getTenantId());
+		record.setFaceUrl(userFace);
+		record.setOpenType(openType);
+		record.setOpenSuccess(openSuccess);
+		record.setFailReason(failReason);
+		record.setDeviceAddress(doorDevice.getAddress());
+		record.setDeviceMac(doorDevice.getMacAddress());
+		record.setDeviceId(doorDevice.getId());
+		record.setOrgPosition(residential.getOrgPosition());
+		record.setCommandSeq(commandSeq);
+		record.setTemperature(StringUtil.isNoneBlank(temperature) ? new BigDecimal(temperature).compareTo(BigDecimal.ZERO) == 1 ? temperature : null : null);
+		record.setOpenTime(openDate);
+		return R.status(this.save(record));
 	}
 
 }

+ 23 - 13
blade-service/third/src/main/java/org/springblade/third/doordevice/feign/DoorDeviceButtClient.java

@@ -34,19 +34,19 @@ public class DoorDeviceButtClient implements IDoorDeviceButtClient {
 	private final JVTMqProvider jvtMqProvider;
 	private final ZHProvider zhProvider;
 
-	@Override
-	@PostMapping("/remoteOpenDoor")
-	public R remoteOpenDoor(@RequestBody DoorDevice doorDevice,  @RequestParam Map<String,Object> userInfoDto) {
-		Assert.notNull(doorDevice.getDeviceFactory(),"the factory of the device is unknown");
-		Assert.notNull(userInfoDto.get("id"),"the params [userId] is required");
-		switch (doorDevice.getDeviceFactory()){
-			case DeviceConstant.DEVICE_FACTORY_QINLIN://亲邻设备远程开门
-				return qinLinMqProvider.remoteOpenDoor(doorDevice, userInfoDto);
-			case DeviceConstant.DEVICE_FACTROY_JVT: //巨龙设备远程开门
-				return jvtMqProvider.remoteOpenDoor(doorDevice, userInfoDto);
-		}
-		return R.fail("设备不存在");
-	}
+//	@Override
+//	@PostMapping("/remoteOpenDoor")
+//	public R remoteOpenDoor(@RequestBody DoorDevice doorDevice,  @RequestParam Map<String,Object> userInfoDto) {
+//		Assert.notNull(doorDevice.getDeviceFactory(),"the factory of the device is unknown");
+//		Assert.notNull(userInfoDto.get("id"),"the params [userId] is required");
+//		switch (doorDevice.getDeviceFactory()){
+//			case DeviceConstant.DEVICE_FACTORY_QINLIN://亲邻设备远程开门
+//				return qinLinMqProvider.remoteOpenDoor(doorDevice, userInfoDto);
+//			case DeviceConstant.DEVICE_FACTROY_JVT: //巨龙设备远程开门
+//				return jvtMqProvider.remoteOpenDoor(doorDevice, userInfoDto);
+//		}
+//		return R.fail("设备不存在");
+//	}
 
 	@Override
 	@PostMapping("/addUser")
@@ -130,4 +130,14 @@ public class DoorDeviceButtClient implements IDoorDeviceButtClient {
 		return R.status(true);
 	}
 
+	@Override
+	@PostMapping("/remoteOpenDoor")
+	public R remoteOpenDoor(@RequestParam String serialNum, @RequestParam String factory, @RequestParam boolean isOpen) {
+		switch (factory){
+			case "zongheng":
+				zhProvider.remoteOpenDoor(serialNum, isOpen);
+		}
+		return null;
+	}
+
 }

+ 2 - 0
blade-service/third/src/main/java/org/springblade/third/doordevice/provider/IDoorDeviceService.java

@@ -25,4 +25,6 @@ public interface IDoorDeviceService {
 	R deleteDevice(DoorDevice doorDevice);
 
 	R pushUserToDevices(UserDeviceDTO userDeviceDTO, String serialNum);
+
+	R remoteOpenDoor(String serialNum, boolean isOpen);
 }

+ 6 - 0
blade-service/third/src/main/java/org/springblade/third/doordevice/provider/impl/QinLinMqProvider.java

@@ -179,6 +179,12 @@ public class QinLinMqProvider implements IQinLinButtService<String>, IOpenDoorSe
 		return null;
 	}
 
+	@Override
+	public R remoteOpenDoor(String serialNum, boolean isOpen) {
+		return null;
+	}
+
+
 	@Override
 	public R remoteOpenDoor(DoorDevice doorDevice, Map<String,Object> userInfoDto) {
 		QLinUserDevice qLinUserDevice = new QLinUserDevice();

+ 33 - 0
blade-service/third/src/main/java/org/springblade/third/doordevice/provider/impl/ZHProvider.java

@@ -14,10 +14,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.HashOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.io.InputStream;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author lidexi
@@ -90,4 +92,35 @@ public class ZHProvider implements IDoorDeviceService {
 		this.redisTemplate.opsForList().leftPush(listName, request.toJSONString());
 		return R.status(true);
 	}
+
+	@Override
+	public R remoteOpenDoor(String serialNum, boolean isOpen) {
+		HashOperations<String, String, String> hashOperations = this.redisTemplate.opsForHash();
+		String num = hashOperations.get(ZH_DEVICE_INSTRUCT_COMMAND_SEQ, serialNum);
+		Integer commonSeq = 10;
+		if(StringUtil.hasText(num)){
+			commonSeq = Integer.parseInt(num) + 1;
+			num = commonSeq + "";
+		}else{
+			num = "10"; //设备指令的commonSeq从10开始
+		}
+		JSONObject request = new JSONObject();
+		JSONObject data = new JSONObject();
+		if(isOpen){
+			data.put("WorkState", 0);
+		}else{
+			data.put("WorkState", 1);
+		}
+		request.put("Command", ZHConstant.I8H.open_door.getCommand());
+		request.put("CommandSeq", commonSeq);
+		request.put("Type", ZHConstant.I8H.open_door.getType());
+		request.put("Data", data);
+		//设备指令commonSeq计数更新
+		this.redisTemplate.opsForHash().put(ZH_DEVICE_INSTRUCT_COMMAND_SEQ, serialNum, num);
+		//设备指令Data更新
+		String listName = serialNum + "_openDoor";
+		this.redisTemplate.opsForList().leftPush(listName, request.toJSONString());
+		this.redisTemplate.expire(listName, 1L, TimeUnit.MINUTES);
+		return R.status(true);
+	}
 }

+ 58 - 6
blade-service/third/src/main/java/org/springblade/third/zongheng/ZHDeviceController.java

@@ -1,13 +1,20 @@
 package org.springblade.third.zongheng;
 
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.device.feign.IDoorDeviceClient;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.third.constants.ZHConstant;
 import org.springblade.third.zongheng.handler.DeviceEndEventHandlerFactory;
 import org.springblade.third.zongheng.handler.IDeviceEndEventHandler;
+import org.springframework.data.redis.core.HashOperations;
 import org.springframework.data.redis.core.ListOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.util.MultiValueMap;
@@ -21,7 +28,8 @@ import org.springframework.web.multipart.MultipartHttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.util.List;
-import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
 
 @RestController
 @AllArgsConstructor
@@ -31,6 +39,8 @@ public class ZHDeviceController {
 
 	private final RedisTemplate<String, String> redisTemplate;
 	private final IDoorDeviceClient doorDeviceClient;
+	private final static String ZH_DEVICE_INSTRUCT_COMMAND_SEQ = "zh:device:instruct:commonSeq";
+	private final ISysClient sysClient;
 
 	/**
 	 * 纵横设备心跳请求
@@ -44,8 +54,9 @@ public class ZHDeviceController {
 		returnData.put("ReturnStr", "OK");
 		returnData.put("PushEventInfo", true);
 		returnData.put("PushEventPic", true);
-		Long size = redisTemplate.opsForList().size(serialNum + "_list"); //从缓存中获取待下发的指令
-		if(size > 0){
+		Long instructNum = redisTemplate.opsForList().size(serialNum + "_list"); //从缓存中获取待下发的指令
+		Long openDoorInstructNum = redisTemplate.opsForList().size(serialNum + "_openDoor"); //从缓存中获取待下发的指令
+		if(instructNum > 0 || openDoorInstructNum > 0){
 			returnData.put("StartCommand", true);
 		}else{
 			returnData.put("StartCommand", false);
@@ -65,11 +76,52 @@ public class ZHDeviceController {
 	public JSONObject DeviceEndianCommand(@RequestBody JSONObject requestData){
 		String serialNum = requestData.getString("SerialNum");
 		Integer commandSeq = requestData.getInteger("CommandSeq");
+		log.info("===================纵横设备指令请求数据================");
+		log.info(requestData.toJSONString());
 		if(commandSeq == null){ 		//表示请求配置命令
-			String commandStr = this.redisTemplate.opsForList().leftPop(serialNum + "_list");
-			if(StringUtils.isNotBlank(commandStr)){
-				JSONObject commandData = JSONObject.parseObject(commandStr);
+			String instructStr = this.redisTemplate.opsForList().rightPop(serialNum + "_list");
+			String openDoorInstructStr = this.redisTemplate.opsForList().rightPop(serialNum + "_openDoor");
+			if(StringUtil.isNotBlank(openDoorInstructStr)){
+				JSONObject commandData = JSONObject.parseObject(openDoorInstructStr);
+				log.info("===================纵横设备开门指令下发================");
+				log.info(commandData.toJSONString());
+				JSONObject data = commandData.getJSONObject("Data");
+				Integer workState = data.getInteger("WorkState");
+				if(workState == 0){ //0表示开门,1表示要关门
+					R<String> intervalR = sysClient.getParamValue("door_device_open_interval");
+					Timer timer = new Timer();
+					timer.schedule(new TimerTask() {
+						@Override
+						public void run() {
+							//下发关门指令到redis,等下一次设备回来消费,定时5秒后发送
+							HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();
+							String num = hashOperations.get(ZH_DEVICE_INSTRUCT_COMMAND_SEQ, serialNum);
+							Integer commonSeq = 10;
+							if(StringUtil.hasText(num)){
+								commonSeq = Integer.parseInt(num) + 1;
+								num = commonSeq + "";
+							}else{
+								num = "10"; //设备指令的commonSeq从10开始
+							}
+							JSONObject request = JSONObject.parseObject(openDoorInstructStr);
+							JSONObject data = new JSONObject();
+							data.put("WorkState", 1);
+							request.put("Command", ZHConstant.I8H.open_door.getCommand());
+							request.put("CommandSeq", commonSeq);
+							request.put("Type", ZHConstant.I8H.open_door.getType());
+							request.put("Data", data);
+							redisTemplate.opsForList().leftPush(serialNum + "_openDoor", request.toJSONString());
+							timer.cancel();
+							this.cancel();
+						}
+					}, Integer.parseInt(intervalR.getData()) * 1000);
+				}
+				return commandData;
+			}
+			if(StringUtils.isNotBlank(instructStr)){
+				JSONObject commandData = JSONObject.parseObject(instructStr);
 				log.info("===================纵横设备指令下发================");
+				log.info(commandData.toJSONString());
 				return commandData;
 			}
 			return new JSONObject();

+ 14 - 2
blade-service/third/src/main/java/org/springblade/third/zongheng/handler/FaceCompareEventHandler.java

@@ -1,15 +1,19 @@
 package org.springblade.third.zongheng.handler;
 
 import com.alibaba.fastjson.JSONObject;
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.estate.dto.AccessRecordDTO;
 import org.springblade.estate.entity.AccessRecord;
 import org.springblade.estate.feign.IAccessRecordClient;
 import org.springblade.third.zongheng.beans.FaceCompareInfo;
 import org.springblade.utils.OssUtil;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -54,14 +58,22 @@ public class FaceCompareEventHandler implements IDeviceEndEventHandler{
 	}
 
 	private R createAccessRecord(String serialNum, Date openTime, String userId, String userName, String faceUrl, String temperature){
-		AccessRecord accessRecord = new AccessRecord();
+		AccessRecordDTO accessRecord = new AccessRecordDTO();
 		accessRecord.setUserId(userId);
 		accessRecord.setUserName(userName);
 		accessRecord.setDeviceMac(serialNum);
 		accessRecord.setOpenTime(openTime);
 		accessRecord.setOpenType(1);
 		accessRecord.setFaceUrl(faceUrl);
-		accessRecord.setTemperature(temperature);
+		accessRecord.setTemperature(StringUtil.isNoneBlank(temperature) ? new BigDecimal(temperature).compareTo(BigDecimal.ZERO) == 1 ? temperature : null : null);
+		if(userId.startsWith(CommonConstant.UserFlag.ENTERPRISE_STAFF_FLAG.getValue())){
+			accessRecord.setUserType(CommonConstant.UserType.STAFF.getType());
+		}else if(userId.startsWith(CommonConstant.UserFlag.ADMIN_FLAG.getValue())){
+			accessRecord.setUserType(CommonConstant.UserType.ADMIN.getType());
+		}
+		else if(userId.startsWith(CommonConstant.UserFlag.GUEST_FLAG.getValue())){
+			accessRecord.setUserType(CommonConstant.UserType.GUEST.getType());
+		}
 		return accessRecordClient.generateAccessRecord(accessRecord);
 	}
 }