SmartVisitorController.java 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. package com.template.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  6. import com.fasterxml.jackson.core.JsonProcessingException;
  7. import com.fasterxml.jackson.databind.ObjectMapper;
  8. import com.seewo.open.sdk.DefaultSeewoClient;
  9. import com.seewo.open.sdk.SeewoClient;
  10. import com.seewo.open.sdk.auth.Account;
  11. import com.template.annotation.DESRespondSecret;
  12. import com.template.api.SmartVisitorControllerAPI;
  13. import com.template.common.utils.*;
  14. import com.template.config.ControlConfig;
  15. import com.template.config.ParkConfig;
  16. import com.template.config.SeewoConfig;
  17. import com.template.model.enumModel.*;
  18. import com.template.model.pojo.*;
  19. import com.template.model.request.otherAppointmentRequest;
  20. import com.template.model.request.parentsAppointmentRequest;
  21. import com.template.model.request.turnOnTheDeviceRequest;
  22. import com.template.model.result.CommonResult;
  23. import com.template.model.result.PageUtils;
  24. import com.template.model.seewo.HomeSchoolServiceSendNoteToKidParam;
  25. import com.template.model.seewo.HomeSchoolServiceSendNoteToKidRequest;
  26. import com.template.model.seewo.HomeSchoolServiceSendNoteToKidResult;
  27. import com.template.model.vo.*;
  28. import com.template.services.*;
  29. import org.slf4j.Logger;
  30. import org.slf4j.LoggerFactory;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import org.springframework.validation.BindingResult;
  34. import org.springframework.web.bind.annotation.RequestParam;
  35. import org.springframework.web.bind.annotation.RestController;
  36. import javax.annotation.Resource;
  37. import java.net.URLDecoder;
  38. import java.net.URLEncoder;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. import static com.template.common.utils.AesTestOne.decrypt;
  42. import static com.template.common.utils.StrUtils.getUUIDBits;
  43. /**
  44. * <p>
  45. * 前端控制器
  46. * </p>
  47. *
  48. * @author ceshi
  49. * @since 2023-12-04
  50. */
  51. @RestController
  52. //返回参数加密注解
  53. @DESRespondSecret
  54. public class SmartVisitorController implements SmartVisitorControllerAPI {
  55. private static Logger logger = LoggerFactory.getLogger(SmartVisitorController.class);
  56. @Autowired
  57. private SmartAuthorGroupService smartAuthorGroupService;
  58. @Autowired
  59. private SmartVisitorService smartVisitorService;
  60. @Autowired
  61. private SmartQrcodeService smartQrcodeService;
  62. @Autowired
  63. private SmartDeviceService smartDeviceService;
  64. @Autowired
  65. private SmartUserService smartUserService;
  66. @Resource
  67. private ControlConfig controlConfig;
  68. @Resource
  69. private SeewoConfig seewoConfig;
  70. @Resource
  71. private ParkConfig parkConfig;
  72. @Autowired
  73. SmartVisitorParentsConfigService smartVisitorParentsConfigService;
  74. @Autowired
  75. SmartVisitorRestsConfigService smartVisitorRestsConfigService;
  76. /**
  77. * 新增访客预约
  78. *
  79. * @param smartApply 访客预约数据
  80. * @param bindingResult
  81. * @return
  82. */
  83. @Override
  84. @DESRespondSecret(validated = true)
  85. public CommonResult insertSmartVisitor(SmartVisitor smartApply, BindingResult bindingResult) {
  86. if (bindingResult.hasErrors()) {
  87. String st = paramUtils.getParamError(bindingResult);
  88. return CommonResult.fail(st);
  89. }
  90. int result = smartVisitorService.insertSmartVisitor(smartApply);
  91. return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
  92. }
  93. /**
  94. * 更新访客预约
  95. *
  96. * @param sa 访客预约数据
  97. * @param bindingResult
  98. * @return
  99. */
  100. @Override
  101. @DESRespondSecret(validated = true)
  102. public CommonResult updateSmartVisitorById(SmartVisitor sa, BindingResult bindingResult) {
  103. if (bindingResult.hasErrors()) {
  104. String st = paramUtils.getParamError(bindingResult);
  105. return CommonResult.fail(st);
  106. }
  107. int result = smartVisitorService.updateSmartVisitor(sa);
  108. return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
  109. }
  110. /**
  111. * 访客预约分页数据查询
  112. *
  113. * @param currentPage 当前页数
  114. * @param pageCount 一页数据条数
  115. * @param name 查询名称
  116. * @return
  117. */
  118. @Override
  119. @DESRespondSecret(validated = true)
  120. public CommonResult queryPageSmartVisitor(int currentPage, int pageCount, String name) {
  121. PageUtils<SmartVisitor> result = smartVisitorService.queryPageSmartVisitors(currentPage, pageCount, name);
  122. return CommonResult.ok(result);
  123. }
  124. @Override
  125. @DESRespondSecret(validated = true)
  126. public CommonResult deleteSmartVisitorById(int id) {
  127. SmartVisitor data = smartVisitorService.getSmartById(id);
  128. if (data == null) {
  129. return CommonResult.fail("当前数据不存在,删除失败!");
  130. }
  131. //审核通过就不能删除
  132. if (data.getStatu().intValue() == eApproveStatu.Pushed.getValue()) {
  133. return CommonResult.fail("无法删除已审核通过的访客数据");
  134. }
  135. //已审核通过的数据不能删除 那么就不需要进行下面这些操作
  136. //region 推送到希沃班牌,通知访客记录取消
  137. //endregion
  138. //region 删除百胜中的访客数据
  139. //endregion
  140. int result = smartVisitorService.deleteSmartVisitorById(id);
  141. return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
  142. }
  143. @Override
  144. @DESRespondSecret(validated = true)
  145. public CommonResult parentsAppointment(parentsAppointmentRequest par, BindingResult bindingResult) {
  146. if (bindingResult.hasErrors()) {
  147. String st = paramUtils.getParamError(bindingResult);
  148. return CommonResult.fail(st);
  149. }
  150. //参数判断 判断受访学生信息是否为空
  151. if (par.getStudents() == null) {
  152. return CommonResult.fail("请选择受访学生");
  153. }
  154. if (par.getStudents().size() <= 0) {
  155. return CommonResult.fail("请选择受访学生");
  156. }
  157. //根据用户ID查询相关信息
  158. SmartUser su = smartUserService.getSmartById(par.getUserId());
  159. if (su == null) {
  160. return CommonResult.fail("当前用户信息不合法,无法进行预约!");
  161. }
  162. String startTime = par.getVisitorTime();
  163. String endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  164. //要进行家长数据重复判断
  165. //那是不是第二次预约的时间不能在那个可访问的时间段内
  166. //例如:比如,第一次约了7:00-10:00;那第二次:6:00-7:30 或 8:11-13:00都不行
  167. Integer count = smartVisitorService.queryVisitorCount(su.getIdCard(), startTime, endTime);
  168. if (count > 0) {
  169. return CommonResult.fail("该时间段已预约,请勿重复预约!");
  170. }
  171. List<SmartVisitor> svs = new ArrayList<>();
  172. for (AffiliateUserVo student : par.getStudents()) {
  173. SmartVisitor sv = new SmartVisitor();
  174. sv.setUserId(par.getUserId());
  175. sv.setUserName(su.getName());
  176. sv.setUserPhone(su.getPhone());
  177. sv.setUserNumber(su.getIdCard());
  178. sv.setPeerNum(par.getPeerNum());
  179. sv.setCarNum(par.getCarNum());
  180. sv.setVisitReason(par.getVisitReason());
  181. // sv.setStatu(eApproveStatu.Audit.getValue());
  182. sv.setVisitorTime(TimeExchange.StringToDate(par.getVisitorTime(), "yyyy-MM-dd HH:mm:ss"));
  183. sv.setVisitorDeadline(TimeExchange.StringToDate(TimeExchange.AddTimeDesH(sv.getVisitorTime(), 4), "yyyy-MM-dd HH:mm:ss"));
  184. sv.setRespondent(student.getId());
  185. sv.setResponcode(student.getCardNo());
  186. sv.setRespondentName(student.getName());
  187. //将第一个受访学生的部门ID带过去
  188. sv.setDepartmentId(student.getDepartmentId());
  189. sv.setVisitorType(eVisitorType.Parent.getValue());
  190. // 获取受访者id
  191. Integer respondent = sv.getRespondent();
  192. SmartUser smartUser = smartUserService.getById(respondent);
  193. Integer schoolClass = smartUser.getSchoolClass();
  194. SmartVisitorParentsConfig svpc = smartVisitorParentsConfigService.getById(schoolClass);
  195. Integer appAuditConfig = svpc.getAppAuditConfig();
  196. if (1==appAuditConfig) {//需要审核
  197. sv.setStatu(1);
  198. }else {//不需要审核
  199. Integer appPushConfig = svpc.getAppPushConfig();
  200. // 判断是否需要推送
  201. if (5==appPushConfig) {//需要推送
  202. String content = sv.getRespondentName() + "你的家长将于" + TimeExchange.chineseDateTime(sv.getVisitorTime()) + "到校!";
  203. //将预约信息推送到希沃班牌
  204. CommonResult seewo = pushInfo(sv.getUserPhone(), sv.getResponcode(), content);
  205. }
  206. // 核销
  207. Integer appCancelConfig = svpc.getAppCancelConfig();
  208. if (6==appCancelConfig) {//需要核销
  209. sv.setStatu(7);
  210. }else {//不需要核销
  211. sv.setStatu(9);
  212. }
  213. // 门禁配置
  214. Integer accessConfig = svpc.getAccessConfig();
  215. if (0==accessConfig) {
  216. try {
  217. if (!ObjectUtils.isEmpty(sv.getCarNum())) {
  218. String appId = parkConfig.getAppId();
  219. String carNo = sv.getCarNum();
  220. String parkKey = parkConfig.getParkKey();
  221. String rand = String.valueOf(Math.random());
  222. String reserveTime = TimeExchange.DateToString(sv.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  223. String reserveEndTime = TimeExchange.DateToString(sv.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  224. String version = "v1.0";
  225. String appSecret = parkConfig.getAppSecret();
  226. String url = parkConfig.getUrl() + "Inform/Reservation";
  227. JSONObject jsonobject = new JSONObject();
  228. jsonobject.put("appid", appId);
  229. jsonobject.put("carNo", carNo);
  230. jsonobject.put("parkKey", parkKey);
  231. jsonobject.put("rand", rand);
  232. jsonobject.put("reserveEndTime", reserveEndTime);
  233. jsonobject.put("reserveTime", reserveTime);
  234. jsonobject.put("version", "v1.0");
  235. //appid=ymdd36ed157ac423e2&carNo=赣U123659&parkKey=wdcmq9rc&rand=9.94995525689689966&reserveEndTime=2023-12-22 20:12:10&reserveTime=2023-12-21 18:12:10&version=v1.0&50596cd243dc4547b4c05f01f8ea02a4
  236. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  237. String sign = CommonUtil.MD5(md5Str);
  238. //sign签名
  239. jsonobject.put("sign", sign);
  240. //返回的结果中 code为1表示成功
  241. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  242. logger.info(result);
  243. if (!result.contains("预约成功")) {
  244. throw new Exception("审核失败");
  245. }
  246. ObjectMapper objectMapper = new ObjectMapper();
  247. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  248. sv.setBsOrderNo(reservation.getData().getReOrderNo());
  249. } else {
  250. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  251. String visitorNo = getUUIDBits(16);
  252. //region 将访客数据下发到设备
  253. for (SmartDevice device : devices) {
  254. CommonResult<String> insertVisitor = bsInsertVisitor(su, TimeExchange.DateToString(sv.getVisitorTime()), TimeExchange.DateToString(sv.getVisitorDeadline()), device.getNum(), visitorNo);
  255. if (!insertVisitor.isSuccess()) {
  256. throw new Exception(insertVisitor.getMessage());
  257. }
  258. sv.setVisitorsync(sv.getVisitorsync() == null ? insertVisitor.getData() : (sv.getVisitorsync() + "," + insertVisitor.getData()));
  259. sv.setDeviceNum(sv.getDeviceNum() == null ? device.getNum() : (sv.getDeviceNum() + "," + device.getNum()));
  260. }
  261. String code = GetVertifyCode.getRandomNumCode(6);
  262. sv.setVisitorCode(code);
  263. }
  264. } catch (Exception e) {
  265. throw new RuntimeException(e);
  266. }
  267. }
  268. }
  269. svs.add(sv);
  270. }
  271. boolean result = smartVisitorService.insertVisitorBatch(svs);
  272. return result ? CommonResult.ok("预约成功,等待审批通过") : CommonResult.fail("预约失败");
  273. }
  274. @Override
  275. @DESRespondSecret(validated = true)
  276. public CommonResult otherAppointment(otherAppointmentRequest oar, BindingResult bindingResult) {
  277. if (bindingResult.hasErrors()) {
  278. String st = paramUtils.getParamError(bindingResult);
  279. return CommonResult.fail(st);
  280. }
  281. //根据用户ID查询相关信息
  282. SmartUser su = smartUserService.getSmartById(oar.getUserId());
  283. if (su == null) {
  284. return CommonResult.fail("当前用户信息不合法,无法进行预约!");
  285. }
  286. String startTime = oar.getVisitorTime();
  287. String endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  288. //要进行访客数据重复判断
  289. //那是不是第二次预约的时间不能在那个可访问的时间段内
  290. //例如:比如,第一次约了7:00-10:00;那第二次:6:00-7:30 或 8:11-13:00都不行
  291. // Integer count = smartVisitorService.queryVisitorCount(su.getIdCard(), startTime, endTime);
  292. // if (count > 0) {
  293. // return CommonResult.fail("该时间段已预约,请勿重复预约!");
  294. // }
  295. SmartVisitor sv = new SmartVisitor();
  296. sv.setUserId(oar.getUserId());
  297. sv.setUserName(oar.getUserName());
  298. sv.setUserPhone(oar.getUserPhone());
  299. sv.setUserNumber(oar.getUserCard());
  300. sv.setPeerNum(oar.getPeerNum());
  301. sv.setCarNum(oar.getCarNum());
  302. sv.setVisitReason(oar.getVisitReason());
  303. // sv.setStatu(eApproveStatu.Audit.getValue());
  304. sv.setVisitorTime(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  305. sv.setVisitorDeadline(TimeExchange.StringToDate(endTime, "yyyy-MM-dd HH:mm:ss"));
  306. sv.setRespondentName(oar.getRespondentName());
  307. sv.setRespondentPhone(oar.getRespondentPhone());
  308. sv.setVisitorType(eVisitorType.Other.getValue());
  309. List<SmartVisitorRestsConfig> list = smartVisitorRestsConfigService.list(new LambdaQueryWrapper<>());
  310. SmartVisitorRestsConfig smartVisitorRestsConfig = list.get(0);
  311. Integer auditConfig = smartVisitorRestsConfig.getAuditConfig();
  312. if (1==auditConfig) {//需要审核
  313. sv.setStatu(1);
  314. }else if (9==auditConfig){
  315. sv.setStatu(9);
  316. Integer accessConfig = smartVisitorRestsConfig.getAccessConfig();
  317. if (0==accessConfig) {//推送到门禁
  318. try {
  319. if (!ObjectUtils.isEmpty(sv.getCarNum())) {
  320. String appId = parkConfig.getAppId();
  321. String carNo = sv.getCarNum();
  322. String parkKey = parkConfig.getParkKey();
  323. String rand = String.valueOf(Math.random());
  324. String reserveTime = TimeExchange.DateToString(sv.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  325. String reserveEndTime = TimeExchange.DateToString(sv.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  326. String version = "v1.0";
  327. String appSecret = parkConfig.getAppSecret();
  328. String url = parkConfig.getUrl() + "Inform/Reservation";
  329. JSONObject jsonobject = new JSONObject();
  330. jsonobject.put("appid", appId);
  331. jsonobject.put("carNo", carNo);
  332. jsonobject.put("parkKey", parkKey);
  333. jsonobject.put("rand", rand);
  334. jsonobject.put("reserveEndTime", reserveEndTime);
  335. jsonobject.put("reserveTime", reserveTime);
  336. jsonobject.put("version", "v1.0");
  337. //appid=ymdd36ed157ac423e2&carNo=赣U123659&parkKey=wdcmq9rc&rand=9.94995525689689966&reserveEndTime=2023-12-22 20:12:10&reserveTime=2023-12-21 18:12:10&version=v1.0&50596cd243dc4547b4c05f01f8ea02a4
  338. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  339. String sign = CommonUtil.MD5(md5Str);
  340. //sign签名
  341. jsonobject.put("sign", sign);
  342. //返回的结果中 code为1表示成功
  343. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  344. logger.info(result);
  345. if (!result.contains("预约成功")) {
  346. throw new Exception("审核失败");
  347. }
  348. ObjectMapper objectMapper = new ObjectMapper();
  349. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  350. sv.setBsOrderNo(reservation.getData().getReOrderNo());
  351. } else {
  352. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  353. String visitorNo = getUUIDBits(16);
  354. //region 将访客数据下发到设备
  355. for (SmartDevice device : devices) {
  356. CommonResult<String> insertVisitor = bsInsertVisitor(su, TimeExchange.DateToString(sv.getVisitorTime()), TimeExchange.DateToString(sv.getVisitorDeadline()), device.getNum(), visitorNo);
  357. if (!insertVisitor.isSuccess()) {
  358. throw new Exception(insertVisitor.getMessage());
  359. }
  360. sv.setVisitorsync(sv.getVisitorsync() == null ? insertVisitor.getData() : (sv.getVisitorsync() + "," + insertVisitor.getData()));
  361. sv.setDeviceNum(sv.getDeviceNum() == null ? device.getNum() : (sv.getDeviceNum() + "," + device.getNum()));
  362. }
  363. String code = GetVertifyCode.getRandomNumCode(6);
  364. sv.setVisitorCode(code);
  365. }
  366. //发送短信给其他访客用户
  367. if (!ObjectUtils.isEmpty(sv.getVisitorCode())) {
  368. String message = SendSms.sendVisitorSms("+86" + sv.getUserPhone(), TimeExchange.getYear(sv.getVisitorTime()), TimeExchange.getMonth(sv.getVisitorTime()), TimeExchange.getDay(sv.getVisitorTime()), TimeExchange.getTime(sv.getVisitorTime()), TimeExchange.getTime(sv.getVisitorDeadline()),sv.getVisitorCode());
  369. if (!message.contains("success")) {
  370. throw new Exception("发送失败");
  371. }
  372. }
  373. } catch (Exception e) {
  374. throw new RuntimeException(e);
  375. }
  376. }
  377. }
  378. int result = smartVisitorService.insertSmartVisitor(sv);
  379. return result > 0 ? CommonResult.ok("预约成功,等待审批通过") : CommonResult.ok("预约失败");
  380. }
  381. @Override
  382. @DESRespondSecret(validated = true)
  383. public CommonResult appointmentPageRecord(int currentPage, int pageCount, Integer userId, int type, String createStartTime, String createEndTime, String keyWord, String visitorStartTime, String visitorEndTime) {
  384. PageUtils<VisitorPageVo> result = smartVisitorService.smartVisitorPageByUserId(currentPage, pageCount, userId, type, createStartTime, createEndTime, keyWord, visitorStartTime, visitorEndTime);
  385. return CommonResult.ok(result);
  386. }
  387. /**
  388. * 访客记录审核
  389. *
  390. * @param id 数据ID
  391. * @param type 操作类型:
  392. * 同意,并推送:1
  393. * 拒绝:2
  394. * @return
  395. */
  396. @Override
  397. @Transactional(rollbackFor = {Exception.class})
  398. public CommonResult examineRecord(int id, int type) throws Exception {
  399. SmartVisitor visitor = smartVisitorService.getSmartById(id);
  400. if (visitor == null) {
  401. return CommonResult.fail("访客记录已失效,审核失败!");
  402. }
  403. //审核处理后的数据不能再处理判断
  404. if (visitor.getStatu().intValue() != eApproveStatu.Audit.getValue()) {
  405. return CommonResult.fail("该记录已被操作过,请勿重复操作");
  406. }
  407. try {
  408. if (type == eExamineStatu.Agree.getValue()) {
  409. visitor.setStatu(eApproveStatu.Pushed.getValue());
  410. //家长访客预约才需要将消息推送到希沃电子班牌
  411. if (visitor.getVisitorType().intValue() == eVisitorType.Parent.getValue()) {
  412. String content = visitor.getRespondentName() + "你的家长将于" + TimeExchange.chineseDateTime(visitor.getVisitorTime()) + "到校!";
  413. //将预约信息推送到希沃班牌
  414. CommonResult seewo = pushInfo(visitor.getUserPhone(), visitor.getResponcode(), content);
  415. if (!seewo.getCode().equals("200")) {
  416. throw new Exception("审核失败");
  417. }
  418. }
  419. //将数据写入门禁系统逻辑
  420. //家长不能使用车牌系统 其他的可以使用车牌逻辑
  421. if (!ObjectUtils.isEmpty(visitor.getCarNum())) {
  422. String appId = parkConfig.getAppId();
  423. String carNo = visitor.getCarNum();
  424. String parkKey = parkConfig.getParkKey();
  425. String rand = String.valueOf(Math.random());
  426. String reserveTime = TimeExchange.DateToString(visitor.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  427. String reserveEndTime = TimeExchange.DateToString(visitor.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  428. String version = "v1.0";
  429. String appSecret = parkConfig.getAppSecret();
  430. String url = parkConfig.getUrl() + "Inform/Reservation";
  431. JSONObject jsonobject = new JSONObject();
  432. jsonobject.put("appid", appId);
  433. jsonobject.put("carNo", carNo);
  434. jsonobject.put("parkKey", parkKey);
  435. jsonobject.put("rand", rand);
  436. jsonobject.put("reserveEndTime", reserveEndTime);
  437. jsonobject.put("reserveTime", reserveTime);
  438. jsonobject.put("version", "v1.0");
  439. //appid=ymdd36ed157ac423e2&carNo=赣U123659&parkKey=wdcmq9rc&rand=9.94995525689689966&reserveEndTime=2023-12-22 20:12:10&reserveTime=2023-12-21 18:12:10&version=v1.0&50596cd243dc4547b4c05f01f8ea02a4
  440. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  441. String sign = CommonUtil.MD5(md5Str);
  442. //sign签名
  443. jsonobject.put("sign", sign);
  444. //返回的结果中 code为1表示成功
  445. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  446. logger.info(result);
  447. if (!result.contains("预约成功")) {
  448. throw new Exception("审核失败");
  449. }
  450. ObjectMapper objectMapper = new ObjectMapper();
  451. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  452. visitor.setBsOrderNo(reservation.getData().getReOrderNo());
  453. } else {
  454. //查找用户是否存在
  455. SmartUser user = smartUserService.getSmartById(visitor.getUserId());
  456. if (user == null) {
  457. throw new Exception("访客用户ID在系统中不存在,无法将访客信息下发到门禁设备!");
  458. }
  459. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  460. String visitorNo = getUUIDBits(16);
  461. //region 将访客数据下发到设备
  462. for (SmartDevice device : devices) {
  463. CommonResult<String> insertVisitor = bsInsertVisitor(user, TimeExchange.DateToString(visitor.getVisitorTime()), TimeExchange.DateToString(visitor.getVisitorDeadline()), device.getNum(), visitorNo);
  464. if (!insertVisitor.isSuccess()) {
  465. throw new Exception(insertVisitor.getMessage());
  466. }
  467. visitor.setVisitorsync(visitor.getVisitorsync() == null ? insertVisitor.getData() : (visitor.getVisitorsync() + "," + insertVisitor.getData()));
  468. visitor.setDeviceNum(visitor.getDeviceNum() == null ? device.getNum() : (visitor.getDeviceNum() + "," + device.getNum()));
  469. }
  470. //endregion
  471. String code = GetVertifyCode.getRandomNumCode(6);
  472. visitor.setVisitorCode(code);
  473. }
  474. } else if (type == eExamineStatu.Refused.getValue()) {
  475. visitor.setStatu(eApproveStatu.Refused.getValue());
  476. }
  477. int result = smartVisitorService.updateSmartVisitor(visitor);
  478. if (result <= 0) {
  479. throw new Exception("审核失败");
  480. }
  481. //发送短信给其他访客用户
  482. if (!ObjectUtils.isEmpty(visitor.getVisitorCode()) && type == eExamineStatu.Agree.getValue()) {
  483. String message = SendSms.sendVisitorSms("+86" + visitor.getUserPhone(), TimeExchange.getYear(visitor.getVisitorTime()), TimeExchange.getMonth(visitor.getVisitorTime()), TimeExchange.getDay(visitor.getVisitorTime()), TimeExchange.getTime(visitor.getVisitorTime()), TimeExchange.getTime(visitor.getVisitorDeadline()), visitor.getVisitorCode());
  484. if (!message.contains("success")) {
  485. throw new Exception("审核失败");
  486. }
  487. }
  488. } catch (Exception e) {
  489. throw new Exception("审核失败");
  490. }
  491. return CommonResult.ok("审核成功");
  492. }
  493. @Override
  494. public CommonResult testVisitorDevice(int id, String deviceNo) throws Exception {
  495. SmartUser user = smartUserService.getSmartById(id);
  496. if (user == null) {
  497. return CommonResult.fail("访客用户ID在系统中不存在,无法将访客信息下发到门禁设备!");
  498. }
  499. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  500. String visitorNo = getUUIDBits(16);
  501. //region 将访客数据下发到设备
  502. for (SmartDevice device : devices) {
  503. CommonResult<String> insertVisitor = bsInsertVisitor(user, "2024-03-28 10:00:00", "2024-03-28 11:00:00", device.getNum(), visitorNo);
  504. if (!insertVisitor.isSuccess()) {
  505. return CommonResult.fail(insertVisitor.getMessage());
  506. }
  507. }
  508. return CommonResult.ok("操作成功");
  509. }
  510. @Override
  511. @DESRespondSecret(validated = false)
  512. public CommonResult getPage(int currentPage, int pageCount,Integer type, String keyWord, Integer status, String startTime, String endTime,String visitorStartTime,String visitorEndTime) {
  513. PageUtils<SmartVisitor> page= smartVisitorService.getPage(currentPage,pageCount,type,keyWord,status,startTime,endTime,visitorStartTime,visitorEndTime);
  514. return CommonResult.ok(page);
  515. }
  516. @Override
  517. public CommonResult parentsAudit(int id, int type) {
  518. return null;
  519. }
  520. /**
  521. * 1、学生请假:
  522. * 我们这边调用请假接口之后,把请假数据写到了百胜系统的"学生请假登记"页面中,那到时候学生是通过任意设备都能进出吗?
  523. * 即:万载三中有 A、B、C、D四台门禁设备,学生张三 2024-03-01 10:00:00 到 2024-03-01 12:00:00 请假,张三 2024-03-01 10:10:00的时候能否通过A、B、C、D四台门禁设备?
  524. * <p>
  525. * 注:如果要修改请假数据则要先修改系统中的学生编码,再去新增一条请假数据
  526. * 即:修改了这个学生编码之后再下发请假数据的话,原有的该学号的请假数据就会在设备中被清除
  527. * <p>
  528. * 2、访客设备:
  529. * 我们这边调用门禁访客设备接口,是把数据下发到系统还是到门禁设备?
  530. * 如果是写到门禁的话,后续添加访客数据是否会清除之前的所有已写入的访客数据?
  531. * <p>
  532. * <p>
  533. * 答:
  534. * 1、请假数据会自动会同步到设备
  535. * 2、访客数据是下发到门禁设备的,访客数据有效期到了之后会自动被清除掉;如果删除系统中的用户数据会自动把门禁中的用户数据也删掉,如果是已有的则进行更新操作;
  536. *
  537. * @param su
  538. * @param startTime
  539. * @param endTime
  540. * @param deviceNo
  541. * @param visitorNo
  542. * @return
  543. * @throws Exception
  544. */
  545. //region 百胜添加访客数据到设备
  546. public CommonResult<String> bsInsertVisitor(SmartUser su, String startTime, String endTime, String deviceNo, String visitorNo) throws Exception {
  547. //region 百胜添加教师数据
  548. String appId = controlConfig.getAppId();
  549. String schoolno = controlConfig.getSchoolCode();
  550. String timestamp = TimeExchange.DateNowTimeStamo();
  551. String appSecret = controlConfig.getAppSecret();
  552. String url = controlConfig.getUrl() + "visitor/sync";
  553. JSONObject jsonobject = new JSONObject();
  554. jsonobject.put("appid", appId);
  555. String str = "{\"device_no\":\"" + deviceNo + "\",\"visitor_begindate\":\"" + startTime + "\",\"visitor_enddate\":\"" + endTime + "\",\"visitor_idcard\":\"" + su.getIdCard() + "\",\"visitor_name\":\"" + su.getName() + "\",\"visitor_no\":\"" + visitorNo + "\",\"visitor_phone\":\"" + su.getPhone() + "\",\"visitor_photo\":\"" + su.getHeadImage() + "\",\"visitor_sex\":\"" + su.getSexId() + "\"}";
  556. String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
  557. jsonobject.put("data", aesStr);
  558. jsonobject.put("schoolno", schoolno);
  559. jsonobject.put("timestamp", timestamp);
  560. String md5Str = "appid=" + appId + "&data={\"device_no\":\"" + deviceNo + "\",\"visitor_begindate\":\"" + startTime + "\",\"visitor_enddate\":\"" + endTime + "\",\"visitor_idcard\":\"" + su.getIdCard() + "\",\"visitor_name\":\"" + su.getName() + "\",\"visitor_no\":\"" + visitorNo + "\",\"visitor_phone\":\"" + su.getPhone() + "\",\"visitor_photo\":\"" + su.getHeadImage() + "\",\"visitor_sex\":\"" + su.getSexId() + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
  561. String sign = CommonUtil.MD5(md5Str);
  562. //sign签名
  563. jsonobject.put("sign", sign);
  564. //返回的结果中 code为1表示成功
  565. String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());
  566. ObjectMapper objectMapper = new ObjectMapper();
  567. BsDeviceVo device = objectMapper.readValue(bsResult, BsDeviceVo.class);
  568. if (!bsResult.contains("添加成功")) {
  569. return CommonResult.fail(device.getMsg());
  570. }
  571. // URL解码
  572. String decodedUrl = URLDecoder.decode(device.getData(), "UTF-8");
  573. BsDeviceNoVo deviceNoData = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsDeviceNoVo.class);
  574. su.setBsStaffCode(deviceNoData.getVisitorsync_no());
  575. return CommonResult.ok("200", "新增成功", deviceNoData.getVisitorsync_no());
  576. //endregion
  577. }
  578. //endregion
  579. /**
  580. * 将预约信息推送到希沃电子班牌
  581. *
  582. * @param parentPhone 预约手机号(家长手机号 在希沃中学生会和家长手机号绑定 可以绑定多个家长)
  583. * @param studentCode 学生编号 希沃中的学生编号和万载系统中的一致
  584. * @param content 消息内容
  585. * @return
  586. */
  587. public CommonResult pushInfo(String parentPhone, String studentCode, String content) {
  588. //初始化客户端
  589. SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  590. HomeSchoolServiceSendNoteToKidParam param = new HomeSchoolServiceSendNoteToKidParam();
  591. //响应体,MimeType为 application/json
  592. HomeSchoolServiceSendNoteToKidParam.RequestBody requestBody = HomeSchoolServiceSendNoteToKidParam.RequestBody.builder()
  593. .build();
  594. param.setRequestBody(requestBody);
  595. //query
  596. HomeSchoolServiceSendNoteToKidParam.Query query = HomeSchoolServiceSendNoteToKidParam.Query.builder()
  597. .appId(seewoConfig.getAppId())
  598. .schoolUid(seewoConfig.getSchoolId())
  599. .senderPhone(parentPhone)
  600. .studentCode(studentCode)
  601. .type(1)
  602. .content(content)
  603. .autoRegister(0)
  604. .build();
  605. requestBody.setQuery(query);
  606. param.setRequestBody(requestBody);
  607. HomeSchoolServiceSendNoteToKidRequest request = new HomeSchoolServiceSendNoteToKidRequest(param);
  608. logger.info("入参:" + request);
  609. //如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
  610. //request.setServerUrl("https://openapi.test.seewo.com")
  611. //执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
  612. HomeSchoolServiceSendNoteToKidResult result = seewoClient.invoke(request);
  613. logger.info("出参:" + result);
  614. if (!result.getMessage().equals("success")) {
  615. CommonResult.fail();
  616. }
  617. return CommonResult.ok();
  618. }
  619. /**
  620. * 获取到访代办数据
  621. *
  622. * @param userId
  623. * @return
  624. */
  625. @Override
  626. @DESRespondSecret(validated = false)
  627. public CommonResult visitingAgencys(int currentPage, int pageCount, int userId, int type) {
  628. SmartUser user = smartUserService.getSmartById(userId);
  629. if (user == null) {
  630. return CommonResult.fail("当前用户数据无效,获取到访数据失败");
  631. }
  632. if (user.getIdentityId().intValue() != eIdentityStatu.Teacher.getValue()) {
  633. return CommonResult.fail("非教师身份无法获取到访数据");
  634. }
  635. //是否是管理员
  636. String whereSql = null;
  637. //获取的权限组数据
  638. List<SmartAuthorGroup> authorGroups = smartAuthorGroupService.smartAuthorGroup(user.getId());
  639. for (SmartAuthorGroup authorGroup : authorGroups) {
  640. List<String> applyIds = Arrays.asList(authorGroup.getApplyId().split(","));
  641. //菜单表中7是访客预约
  642. long appointCount = applyIds.stream().filter(e -> e.equals("7")).count();
  643. if (appointCount > 0) {
  644. whereSql = "visitor_type = 2";
  645. break;
  646. }
  647. }
  648. List<Integer> studentIds = null;
  649. //班主任
  650. if (user.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
  651. //班级ID
  652. Integer schoolClass = user.getSchoolClass();
  653. //获取该班级下的所有学生ID数据
  654. List<SmartUser> students = smartUserService.queryStudentBySchoolClass(user.getSchoolClass());
  655. if (students == null) {
  656. return CommonResult.fail("当前身份下不存在学生信息");
  657. }
  658. studentIds = students.stream().map(SmartUser::getId).collect(Collectors.toList());
  659. }
  660. PageUtils<SmartVisitor> result = new PageUtils<SmartVisitor>(null, 0, pageCount, currentPage);
  661. if (whereSql == null && studentIds == null) {
  662. return CommonResult.ok(result);
  663. }
  664. result = smartVisitorService.queryVisitorPageDatas(currentPage, pageCount, type, studentIds, studentIds != null && whereSql != null ? "or " + whereSql : whereSql);
  665. return CommonResult.ok(result);
  666. }
  667. /**
  668. * 扫码 分为 身份码 和 访客码
  669. * 1、身份码:
  670. * 1.1、如果是老师 任意通行
  671. * 1.2、如果是家长 找有没有访客数据
  672. * 1.3、如果是学生 不让通行
  673. * <p>
  674. * 2、访客码
  675. * 2.1、找下是否存在访客预约记录
  676. * <p>
  677. * 扫码记录增加是否已进 和 是否已出字段
  678. *
  679. * @param data
  680. * @return
  681. * @throws JsonProcessingException
  682. */
  683. @Override
  684. public TurnOnDeviceVo turnOnTheDevice(turnOnTheDeviceRequest data) throws JsonProcessingException {
  685. logger.info("进入扫码解析,参数:" + JSON.toJSON(data));
  686. TurnOnDeviceVo result = new TurnOnDeviceVo();
  687. logger.info("进入扫码解析1");
  688. //region 参数判断
  689. if (data == null) {
  690. result.setResultcode(2);
  691. result.setMessage("扫码参数不能为空");
  692. result.setActionName("qrCodePush");
  693. return result;
  694. }
  695. logger.info("进入扫码解析2");
  696. if (data.getActionName() == null) {
  697. result.setResultcode(2);
  698. result.setMessage("指令不能为空");
  699. result.setActionName("qrCodePush");
  700. return result;
  701. }
  702. logger.info("进入扫码解析3");
  703. if (!data.getActionName().equals("qrCodePush")) {
  704. result.setResultcode(2);
  705. result.setMessage("指令错误");
  706. result.setActionName("qrCodePush");
  707. return result;
  708. }
  709. logger.info("进入扫码解析4");
  710. if (data.getData() == null) {
  711. result.setResultcode(2);
  712. result.setMessage("二维码内容不能为空");
  713. result.setActionName("qrCodePush");
  714. return result;
  715. }
  716. logger.info("进入扫码解析5");
  717. ObjectMapper objectMapper = new ObjectMapper();
  718. qrCodeVo codeVo = objectMapper.readValue(data.getData(), qrCodeVo.class);
  719. if (codeVo == null) {
  720. result.setResultcode(2);
  721. result.setMessage("二维码内容不能为空");
  722. result.setActionName("qrCodePush");
  723. return result;
  724. }
  725. logger.info("进入扫码解析6");
  726. if (codeVo.getQrCode() == null) {
  727. result.setResultcode(2);
  728. result.setMessage("二维码内容不能为空");
  729. result.setActionName("qrCodePush");
  730. return result;
  731. }
  732. logger.info("进入扫码解析7");
  733. if (data.getDeviceno() == null) {
  734. result.setResultcode(2);
  735. result.setMessage("设备编号不能为空");
  736. result.setActionName("qrCodePush");
  737. return result;
  738. }
  739. logger.info("进入扫码解析8");
  740. if (data.getVersion() == null) {
  741. result.setResultcode(2);
  742. result.setMessage("版本不能为空");
  743. result.setActionName("qrCodePush");
  744. return result;
  745. }
  746. //endregion
  747. logger.info("进入扫码解析9");
  748. //解码逻辑
  749. QrcodeImageVo qiv = objectMapper.readValue(codeVo.getQrCode(), QrcodeImageVo.class);
  750. logger.info("进入扫码解析10");
  751. SmartDevice deviceData = smartDeviceService.queryDeviceByNum(data.getDeviceno());
  752. if (deviceData == null) {
  753. logger.info("进入扫码解析11");
  754. result.setResultcode(2);
  755. result.setMessage("设备不存在");
  756. result.setActionName("qrCodePush");
  757. return result;
  758. }
  759. if (qiv.getType().intValue() == eQrcodeType.Identity.getValue()) {//身份码
  760. //身份码中的ID是身份码ID
  761. logger.info("进入身份码扫码解析1");
  762. //目前二维码一分钟内有效
  763. //过期:(时间戳 + 有效期分钟数)<= 当前时间
  764. //时间戳转时间
  765. Date dateNow = TimeExchange.StringToDate(TimeExchange.TimeRangeMinute(qiv.getTimestamp(), 1), "yyyy-MM-dd HH:mm:ss");
  766. logger.info("dateNow参数:" + TimeExchange.DateToString(dateNow));
  767. logger.info("当前时间参数:" + TimeExchange.DateToString(new Date()));
  768. if (new Date().after(dateNow)) {
  769. logger.info("身份码过期");
  770. result.setResultcode(2);
  771. result.setMessage("身份码已过期");
  772. result.setActionName("qrCodePush");
  773. return result;
  774. }
  775. logger.info("进入身份码扫码解析2");
  776. SmartUser user = smartUserService.getSmartById(qiv.getId());
  777. if (user == null) {
  778. result.setResultcode(2);
  779. result.setMessage("用户身份无效,刷码失败");
  780. result.setActionName("qrCodePush");
  781. return result;
  782. }
  783. //成功后将刷码记录存储到数据表中
  784. SmartQrcode sq = new SmartQrcode();
  785. /**
  786. * 1、身份码逻辑
  787. * 1.1、如果是老师 任意通行
  788. * 1.2、如果是家长 找有没有访客数据
  789. * 1.3、如果是学生 不让通行
  790. */
  791. switch (user.getIdentityId().intValue()) {
  792. case 1://家长
  793. //查找是否存在访客记录
  794. SmartVisitor visitor = smartVisitorService.queryParentVisitor(user.getId());
  795. if(visitor == null){
  796. logger.info("无访客数据,家长无法通行");
  797. result.setResultcode(2);
  798. result.setMessage("无访客数据,家长无法通行");
  799. result.setActionName("qrCodePush");
  800. return result;
  801. }
  802. sq.setUserId(qiv.getId());
  803. sq.setQrcodeType(qiv.getType());
  804. sq.setSourceCode(data.getData());
  805. sq.setDataId(visitor.getId());
  806. sq.setIsSuccess(1);
  807. sq.setAccessState(deviceData.getEntrance());
  808. break;
  809. case 2://学生
  810. logger.info("学生无法使用身份码通行");
  811. result.setResultcode(2);
  812. result.setMessage("学生无法使用身份码通行");
  813. result.setActionName("qrCodePush");
  814. return result;
  815. case 3://老师
  816. sq.setUserId(qiv.getId());
  817. sq.setQrcodeType(qiv.getType());
  818. sq.setSourceCode(data.getData());
  819. sq.setDataId(0);
  820. sq.setIsSuccess(1);
  821. sq.setAccessState(deviceData.getEntrance());
  822. break;
  823. default:
  824. break;
  825. }
  826. logger.info("进入身份码扫码解析3");
  827. int insertResult = smartQrcodeService.insertSmartQrcode(sq);
  828. if (insertResult <= 0) {
  829. result.setResultcode(2);
  830. result.setMessage("新增刷码记录失败");
  831. result.setActionName("qrCodePush");
  832. return result;
  833. }
  834. logger.info("进入身份码扫码解析4");
  835. result.setResultcode(1);
  836. result.setMessage("成功");
  837. result.setActionName("qrCodePush");
  838. logger.info("进入身份码扫码解析,结果:" + JSON.toJSON(result));
  839. } else if (qiv.getType().intValue() == eQrcodeType.Visitor.getValue()) {//访客码
  840. //访客码中的ID是访客数据的ID
  841. //查找是否存在访客记录
  842. SmartVisitor visitor = smartVisitorService.getSmartById(qiv.getId());
  843. if(visitor == null){
  844. logger.info("无访客数据,访客无法通行");
  845. result.setResultcode(2);
  846. result.setMessage("无访客数据,访客无法通行");
  847. result.setActionName("qrCodePush");
  848. return result;
  849. }
  850. //成功后将刷码记录存储到数据表中
  851. SmartQrcode sq = new SmartQrcode();
  852. sq.setUserId(visitor.getUserId());
  853. sq.setQrcodeType(qiv.getType());
  854. sq.setSourceCode(data.getData());
  855. sq.setDataId(visitor.getId());
  856. sq.setIsSuccess(1);
  857. sq.setAccessState(deviceData.getEntrance());
  858. logger.info("进入访客码扫码解析3");
  859. int insertResult = smartQrcodeService.insertSmartQrcode(sq);
  860. if (insertResult <= 0) {
  861. result.setResultcode(2);
  862. result.setMessage("新增刷码记录失败");
  863. result.setActionName("qrCodePush");
  864. return result;
  865. }
  866. logger.info("进入访客码扫码解析4");
  867. result.setResultcode(1);
  868. result.setMessage("成功");
  869. result.setActionName("qrCodePush");
  870. logger.info("进入访客码扫码解析,结果:" + JSON.toJSON(result));
  871. }
  872. return result;
  873. }
  874. }