package com.template.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.seewo.open.sdk.DefaultSeewoClient; import com.seewo.open.sdk.SeewoClient; import com.seewo.open.sdk.auth.Account; import com.sun.org.apache.bcel.internal.generic.NEW; import com.template.annotation.DESRespondSecret; import com.template.annotation.PassToken; import com.template.api.SmartVisitorControllerAPI; import com.template.common.utils.*; import com.template.config.ControlConfig; import com.template.config.ParkConfig; import com.template.config.SeewoConfig; import com.template.model.dto.ParentsScreenDto; import com.template.model.enumModel.*; import com.template.model.pojo.*; import com.template.model.request.otherAppointmentRequest; import com.template.model.request.parentsAppointmentRequest; import com.template.model.request.turnOnTheDeviceRequest; import com.template.model.result.CommonResult; import com.template.model.result.PageUtils; import com.template.model.seewo.HomeSchoolServiceSendNoteToKidParam; import com.template.model.seewo.HomeSchoolServiceSendNoteToKidRequest; import com.template.model.seewo.HomeSchoolServiceSendNoteToKidResult; import com.template.model.vo.*; import com.template.services.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.net.URLDecoder; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import static com.template.common.utils.AesTestOne.decrypt; import static com.template.common.utils.StrUtils.getUUIDBits; /** *
* 前端控制器 *
* * @author ceshi * @since 2023-12-04 */ @RestController //返回参数加密注解 @DESRespondSecret public class SmartVisitorController implements SmartVisitorControllerAPI { private static Logger logger = LoggerFactory.getLogger(SmartVisitorController.class); @Autowired private SmartAuthorGroupService smartAuthorGroupService; @Autowired private SmartVisitorService smartVisitorService; @Autowired private SmartQrcodeService smartQrcodeService; @Autowired private SmartDeviceService smartDeviceService; @Autowired private SmartUserService smartUserService; @Resource private ControlConfig controlConfig; @Resource private SeewoConfig seewoConfig; @Resource private ParkConfig parkConfig; @Autowired SmartVisitorParentsConfigService smartVisitorParentsConfigService; @Autowired SmartVisitorRestsConfigService smartVisitorRestsConfigService; /** * 新增访客预约 * * @param smartApply 访客预约数据 * @param bindingResult * @return */ @Override @DESRespondSecret(validated = true) public CommonResult insertSmartVisitor(SmartVisitor smartApply, BindingResult bindingResult) { if (bindingResult.hasErrors()) { String st = paramUtils.getParamError(bindingResult); return CommonResult.fail(st); } int result = smartVisitorService.insertSmartVisitor(smartApply); return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败"); } /** * 更新访客预约 * * @param sa 访客预约数据 * @param bindingResult * @return */ @Override @DESRespondSecret(validated = true) public CommonResult updateSmartVisitorById(SmartVisitor sa, BindingResult bindingResult) { if (bindingResult.hasErrors()) { String st = paramUtils.getParamError(bindingResult); return CommonResult.fail(st); } int result = smartVisitorService.updateSmartVisitor(sa); return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败"); } /** * 访客预约分页数据查询 * * @param currentPage 当前页数 * @param pageCount 一页数据条数 * @param name 查询名称 * @return */ @Override @DESRespondSecret(validated = true) public CommonResult queryPageSmartVisitor(int currentPage, int pageCount, String name) { PageUtils* 注:如果要修改请假数据则要先修改系统中的学生编码,再去新增一条请假数据 * 即:修改了这个学生编码之后再下发请假数据的话,原有的该学号的请假数据就会在设备中被清除 *
* 2、访客设备: * 我们这边调用门禁访客设备接口,是把数据下发到系统还是到门禁设备? * 如果是写到门禁的话,后续添加访客数据是否会清除之前的所有已写入的访客数据? *
*
* 答:
* 1、请假数据会自动会同步到设备
* 2、访客数据是下发到门禁设备的,访客数据有效期到了之后会自动被清除掉;如果删除系统中的用户数据会自动把门禁中的用户数据也删掉,如果是已有的则进行更新操作;
*
* @param su
* @param startTime
* @param endTime
* @param deviceNo
* @param visitorNo
* @return
* @throws Exception
*/
//region 百胜添加访客数据到设备
public CommonResult
* 2、访客码
* 2.1、找下是否存在访客预约记录
*
* 扫码记录增加是否已进 和 是否已出字段
*
* @param data
* @return
* @throws JsonProcessingException
*/
@Override
public TurnOnDeviceVo turnOnTheDevice(turnOnTheDeviceRequest data) throws JsonProcessingException {
logger.info("进入扫码解析,参数:" + JSON.toJSON(data));
TurnOnDeviceVo result = new TurnOnDeviceVo();
logger.info("进入扫码解析1");
//region 参数判断
if (data == null) {
result.setResultcode(2);
result.setMessage("扫码参数不能为空");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入扫码解析2");
if (data.getActionName() == null) {
result.setResultcode(2);
result.setMessage("指令不能为空");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入扫码解析3");
if (!data.getActionName().equals("qrCodePush")) {
result.setResultcode(2);
result.setMessage("指令错误");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入扫码解析4");
if (data.getData() == null) {
result.setResultcode(2);
result.setMessage("二维码内容不能为空");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入扫码解析5");
ObjectMapper objectMapper = new ObjectMapper();
qrCodeVo codeVo = objectMapper.readValue(data.getData(), qrCodeVo.class);
if (codeVo == null) {
result.setResultcode(2);
result.setMessage("二维码内容不能为空");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入扫码解析6");
if (codeVo.getQrCode() == null) {
result.setResultcode(2);
result.setMessage("二维码内容不能为空");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入扫码解析7");
if (data.getDeviceno() == null) {
result.setResultcode(2);
result.setMessage("设备编号不能为空");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入扫码解析8");
if (data.getVersion() == null) {
result.setResultcode(2);
result.setMessage("版本不能为空");
result.setActionName("qrCodePush");
return result;
}
//endregion
logger.info("进入扫码解析9");
//解码逻辑
QrcodeImageVo qiv = objectMapper.readValue(codeVo.getQrCode(), QrcodeImageVo.class);
logger.info("进入扫码解析10");
SmartDevice deviceData = smartDeviceService.queryDeviceByNum(data.getDeviceno());
if (deviceData == null) {
logger.info("进入扫码解析11");
result.setResultcode(2);
result.setMessage("设备不存在");
result.setActionName("qrCodePush");
return result;
}
if (qiv.getType().intValue() == eQrcodeType.Identity.getValue()) {//身份码
//身份码中的ID是身份码ID
logger.info("进入身份码扫码解析1");
//目前二维码一分钟内有效
//过期:(时间戳 + 有效期分钟数)<= 当前时间
//时间戳转时间
Date dateNow = TimeExchange.StringToDate(TimeExchange.TimeRangeMinute(qiv.getTimestamp(), 1), "yyyy-MM-dd HH:mm:ss");
logger.info("dateNow参数:" + TimeExchange.DateToString(dateNow));
logger.info("当前时间参数:" + TimeExchange.DateToString(new Date()));
if (new Date().after(dateNow)) {
logger.info("身份码过期");
result.setResultcode(2);
result.setMessage("身份码已过期");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入身份码扫码解析2");
SmartUser user = smartUserService.getSmartById(qiv.getId());
if (user == null) {
result.setResultcode(2);
result.setMessage("用户身份无效,刷码失败");
result.setActionName("qrCodePush");
return result;
}
//成功后将刷码记录存储到数据表中
SmartQrcode sq = new SmartQrcode();
/**
* 1、身份码逻辑
* 1.1、如果是老师 任意通行
* 1.2、如果是家长 找有没有访客数据
* 1.3、如果是学生 不让通行
*/
switch (user.getIdentityId().intValue()) {
case 1://家长
//查找是否存在访客记录
SmartVisitor visitor = smartVisitorService.queryParentVisitor(user.getId());
if (visitor == null) {
logger.info("无访客数据,家长无法通行");
result.setResultcode(2);
result.setMessage("无访客数据,家长无法通行");
result.setActionName("qrCodePush");
return result;
}
sq.setUserId(qiv.getId());
sq.setQrcodeType(qiv.getType());
sq.setSourceCode(data.getData());
sq.setDataId(visitor.getId());
sq.setIsSuccess(1);
sq.setAccessState(deviceData.getEntrance());
break;
case 2://学生
logger.info("学生无法使用身份码通行");
result.setResultcode(2);
result.setMessage("学生无法使用身份码通行");
result.setActionName("qrCodePush");
return result;
case 3://老师
sq.setUserId(qiv.getId());
sq.setQrcodeType(qiv.getType());
sq.setSourceCode(data.getData());
sq.setDataId(0);
sq.setIsSuccess(1);
sq.setAccessState(deviceData.getEntrance());
break;
default:
break;
}
logger.info("进入身份码扫码解析3");
int insertResult = smartQrcodeService.insertSmartQrcode(sq);
if (insertResult <= 0) {
result.setResultcode(2);
result.setMessage("新增刷码记录失败");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入身份码扫码解析4");
result.setResultcode(1);
result.setMessage("成功");
result.setActionName("qrCodePush");
logger.info("进入身份码扫码解析,结果:" + JSON.toJSON(result));
} else if (qiv.getType().intValue() == eQrcodeType.Visitor.getValue()) {//访客码
//访客码中的ID是访客数据的ID
//查找是否存在访客记录
SmartVisitor visitor = smartVisitorService.getSmartById(qiv.getId());
if (visitor == null) {
logger.info("无访客数据,访客无法通行");
result.setResultcode(2);
result.setMessage("无访客数据,访客无法通行");
result.setActionName("qrCodePush");
return result;
}
//成功后将刷码记录存储到数据表中
SmartQrcode sq = new SmartQrcode();
sq.setUserId(visitor.getUserId());
sq.setQrcodeType(qiv.getType());
sq.setSourceCode(data.getData());
sq.setDataId(visitor.getId());
sq.setIsSuccess(1);
sq.setAccessState(deviceData.getEntrance());
logger.info("进入访客码扫码解析3");
int insertResult = smartQrcodeService.insertSmartQrcode(sq);
if (insertResult <= 0) {
result.setResultcode(2);
result.setMessage("新增刷码记录失败");
result.setActionName("qrCodePush");
return result;
}
logger.info("进入访客码扫码解析4");
result.setResultcode(1);
result.setMessage("成功");
result.setActionName("qrCodePush");
logger.info("进入访客码扫码解析,结果:" + JSON.toJSON(result));
}
return result;
}
}