SmartVisitorController.java 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386
  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.metadata.IPage;
  6. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.fasterxml.jackson.core.JsonProcessingException;
  9. import com.fasterxml.jackson.databind.ObjectMapper;
  10. import com.seewo.open.sdk.DefaultSeewoClient;
  11. import com.seewo.open.sdk.SeewoClient;
  12. import com.seewo.open.sdk.auth.Account;
  13. import com.sun.org.apache.bcel.internal.generic.NEW;
  14. import com.template.annotation.DESRespondSecret;
  15. import com.template.api.SmartVisitorControllerAPI;
  16. import com.template.common.utils.*;
  17. import com.template.config.ControlConfig;
  18. import com.template.config.ParkConfig;
  19. import com.template.config.SeewoConfig;
  20. import com.template.model.dto.ParentsScreenDto;
  21. import com.template.model.enumModel.*;
  22. import com.template.model.pojo.*;
  23. import com.template.model.request.otherAppointmentRequest;
  24. import com.template.model.request.parentsAppointmentRequest;
  25. import com.template.model.request.turnOnTheDeviceRequest;
  26. import com.template.model.result.CommonResult;
  27. import com.template.model.result.PageUtils;
  28. import com.template.model.seewo.HomeSchoolServiceSendNoteToKidParam;
  29. import com.template.model.seewo.HomeSchoolServiceSendNoteToKidRequest;
  30. import com.template.model.seewo.HomeSchoolServiceSendNoteToKidResult;
  31. import com.template.model.vo.*;
  32. import com.template.services.*;
  33. import org.slf4j.Logger;
  34. import org.slf4j.LoggerFactory;
  35. import org.springframework.beans.BeanUtils;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.transaction.annotation.Transactional;
  38. import org.springframework.validation.BindingResult;
  39. import org.springframework.web.bind.annotation.RequestParam;
  40. import org.springframework.web.bind.annotation.RestController;
  41. import javax.annotation.Resource;
  42. import java.net.URLDecoder;
  43. import java.net.URLEncoder;
  44. import java.time.LocalDateTime;
  45. import java.time.format.DateTimeFormatter;
  46. import java.util.*;
  47. import java.util.stream.Collectors;
  48. import static com.template.common.utils.AesTestOne.decrypt;
  49. import static com.template.common.utils.StrUtils.getUUIDBits;
  50. /**
  51. * <p>
  52. * 前端控制器
  53. * </p>
  54. *
  55. * @author ceshi
  56. * @since 2023-12-04
  57. */
  58. @RestController
  59. //返回参数加密注解
  60. @DESRespondSecret
  61. public class SmartVisitorController implements SmartVisitorControllerAPI {
  62. private static Logger logger = LoggerFactory.getLogger(SmartVisitorController.class);
  63. @Autowired
  64. private SmartAuthorGroupService smartAuthorGroupService;
  65. @Autowired
  66. private SmartVisitorService smartVisitorService;
  67. @Autowired
  68. private SmartQrcodeService smartQrcodeService;
  69. @Autowired
  70. private SmartDeviceService smartDeviceService;
  71. @Autowired
  72. private SmartUserService smartUserService;
  73. @Resource
  74. private ControlConfig controlConfig;
  75. @Resource
  76. private SeewoConfig seewoConfig;
  77. @Resource
  78. private ParkConfig parkConfig;
  79. @Autowired
  80. SmartVisitorParentsConfigService smartVisitorParentsConfigService;
  81. @Autowired
  82. SmartVisitorRestsConfigService smartVisitorRestsConfigService;
  83. /**
  84. * 新增访客预约
  85. *
  86. * @param smartApply 访客预约数据
  87. * @param bindingResult
  88. * @return
  89. */
  90. @Override
  91. @DESRespondSecret(validated = true)
  92. public CommonResult insertSmartVisitor(SmartVisitor smartApply, BindingResult bindingResult) {
  93. if (bindingResult.hasErrors()) {
  94. String st = paramUtils.getParamError(bindingResult);
  95. return CommonResult.fail(st);
  96. }
  97. int result = smartVisitorService.insertSmartVisitor(smartApply);
  98. return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
  99. }
  100. /**
  101. * 更新访客预约
  102. *
  103. * @param sa 访客预约数据
  104. * @param bindingResult
  105. * @return
  106. */
  107. @Override
  108. @DESRespondSecret(validated = true)
  109. public CommonResult updateSmartVisitorById(SmartVisitor sa, BindingResult bindingResult) {
  110. if (bindingResult.hasErrors()) {
  111. String st = paramUtils.getParamError(bindingResult);
  112. return CommonResult.fail(st);
  113. }
  114. int result = smartVisitorService.updateSmartVisitor(sa);
  115. return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
  116. }
  117. /**
  118. * 访客预约分页数据查询
  119. *
  120. * @param currentPage 当前页数
  121. * @param pageCount 一页数据条数
  122. * @param name 查询名称
  123. * @return
  124. */
  125. @Override
  126. @DESRespondSecret(validated = true)
  127. public CommonResult queryPageSmartVisitor(int currentPage, int pageCount, String name) {
  128. PageUtils<SmartVisitor> result = smartVisitorService.queryPageSmartVisitors(currentPage, pageCount, name);
  129. return CommonResult.ok(result);
  130. }
  131. @Override
  132. @DESRespondSecret(validated = true)
  133. public CommonResult deleteSmartVisitorById(int id) {
  134. SmartVisitor data = smartVisitorService.getSmartById(id);
  135. if (data == null) {
  136. return CommonResult.fail("当前数据不存在,删除失败!");
  137. }
  138. //审核通过就不能删除
  139. if (data.getStatu().intValue() == eApproveStatu.Pushed.getValue()) {
  140. return CommonResult.fail("无法删除已审核通过的访客数据");
  141. }
  142. //已审核通过的数据不能删除 那么就不需要进行下面这些操作
  143. //region 推送到希沃班牌,通知访客记录取消
  144. //endregion
  145. //region 删除百胜中的访客数据
  146. //endregion
  147. int result = smartVisitorService.deleteSmartVisitorById(id);
  148. return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
  149. }
  150. @Override
  151. @DESRespondSecret(validated = true)
  152. public CommonResult parentsAppointment(parentsAppointmentRequest par, BindingResult bindingResult) {
  153. if (bindingResult.hasErrors()) {
  154. String st = paramUtils.getParamError(bindingResult);
  155. return CommonResult.fail(st);
  156. }
  157. //参数判断 判断受访学生信息是否为空
  158. if (par.getStudents() == null) {
  159. return CommonResult.fail("请选择受访学生");
  160. }
  161. if (par.getStudents().size() <= 0) {
  162. return CommonResult.fail("请选择受访学生");
  163. }
  164. //根据用户ID查询相关信息
  165. SmartUser su = smartUserService.getSmartById(par.getUserId());
  166. if (su == null) {
  167. return CommonResult.fail("当前用户信息不合法,无法进行预约!");
  168. }
  169. String startTime = par.getVisitorTime();
  170. String endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  171. //要进行家长数据重复判断
  172. //那是不是第二次预约的时间不能在那个可访问的时间段内
  173. //例如:比如,第一次约了7:00-10:00;那第二次:6:00-7:30 或 8:11-13:00都不行
  174. Integer count = smartVisitorService.queryVisitorCount(su.getIdCard(), startTime, endTime);
  175. if (count > 0) {
  176. return CommonResult.fail("该时间段已预约,请勿重复预约!");
  177. }
  178. List<SmartVisitor> svs = new ArrayList<>();
  179. for (AffiliateUserVo student : par.getStudents()) {
  180. SmartVisitor sv = new SmartVisitor();
  181. sv.setUserId(par.getUserId());
  182. sv.setUserName(su.getName());
  183. sv.setUserPhone(su.getPhone());
  184. sv.setUserNumber(su.getIdCard());
  185. sv.setPeerNum(par.getPeerNum());
  186. sv.setCarNum(par.getCarNum());
  187. sv.setVisitReason(par.getVisitReason());
  188. // sv.setStatu(eApproveStatu.Audit.getValue());
  189. sv.setVisitorTime(TimeExchange.StringToDate(par.getVisitorTime(), "yyyy-MM-dd HH:mm:ss"));
  190. sv.setVisitorDeadline(TimeExchange.StringToDate(TimeExchange.AddTimeDesH(sv.getVisitorTime(), 4), "yyyy-MM-dd HH:mm:ss"));
  191. sv.setRespondent(student.getId());
  192. sv.setResponcode(student.getCardNo());
  193. sv.setRespondentName(student.getName());
  194. //将第一个受访学生的部门ID带过去
  195. sv.setDepartmentId(student.getDepartmentId());
  196. sv.setVisitorType(eVisitorType.Parent.getValue());
  197. // 图片
  198. sv.setImage(par.getImage());
  199. // 获取受访者id
  200. Integer respondent = sv.getRespondent();
  201. SmartUser smartUser = smartUserService.getById(respondent);
  202. Integer schoolClass = smartUser.getSchoolClass();
  203. SmartVisitorParentsConfig svpc = smartVisitorParentsConfigService.getById(schoolClass);
  204. Integer appAuditConfig = svpc.getAppAuditConfig();
  205. if (1 == appAuditConfig) {//需要审核
  206. sv.setStatu(1);
  207. } else {//不需要审核
  208. Integer appPushConfig = svpc.getAppPushConfig();
  209. // 判断是否需要推送
  210. if (5 == appPushConfig) {//需要推送
  211. String content = sv.getRespondentName() + "你的家长将于" + TimeExchange.chineseDateTime(sv.getVisitorTime()) + "到校!";
  212. //将预约信息推送到希沃班牌
  213. CommonResult seewo = pushInfo(sv.getUserPhone(), sv.getResponcode(), content);
  214. }
  215. // 核销
  216. Integer appCancelConfig = svpc.getAppCancelConfig();
  217. if (6 == appCancelConfig) {//需要核销
  218. sv.setStatu(7);
  219. } else {//不需要核销
  220. sv.setStatu(9);
  221. }
  222. // 门禁配置
  223. Integer accessConfig = svpc.getAccessConfig();
  224. if (0 == accessConfig) {
  225. try {
  226. if (!ObjectUtils.isEmpty(sv.getCarNum())) {
  227. String appId = parkConfig.getAppId();
  228. String carNo = sv.getCarNum();
  229. String parkKey = parkConfig.getParkKey();
  230. String rand = String.valueOf(Math.random());
  231. String reserveTime = TimeExchange.DateToString(sv.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  232. String reserveEndTime = TimeExchange.DateToString(sv.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  233. String version = "v1.0";
  234. String appSecret = parkConfig.getAppSecret();
  235. String url = parkConfig.getUrl() + "Inform/Reservation";
  236. JSONObject jsonobject = new JSONObject();
  237. jsonobject.put("appid", appId);
  238. jsonobject.put("carNo", carNo);
  239. jsonobject.put("parkKey", parkKey);
  240. jsonobject.put("rand", rand);
  241. jsonobject.put("reserveEndTime", reserveEndTime);
  242. jsonobject.put("reserveTime", reserveTime);
  243. jsonobject.put("version", "v1.0");
  244. //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
  245. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  246. String sign = CommonUtil.MD5(md5Str);
  247. //sign签名
  248. jsonobject.put("sign", sign);
  249. //返回的结果中 code为1表示成功
  250. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  251. logger.info(result);
  252. if (!result.contains("预约成功")) {
  253. throw new Exception("审核失败");
  254. }
  255. ObjectMapper objectMapper = new ObjectMapper();
  256. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  257. sv.setBsOrderNo(reservation.getData().getReOrderNo());
  258. } else {
  259. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  260. String visitorNo = getUUIDBits(16);
  261. //region 将访客数据下发到设备
  262. for (SmartDevice device : devices) {
  263. CommonResult<String> insertVisitor = bsInsertVisitor(su, TimeExchange.DateToString(sv.getVisitorTime()), TimeExchange.DateToString(sv.getVisitorDeadline()), device.getNum(), visitorNo);
  264. if (!insertVisitor.isSuccess()) {
  265. throw new Exception(insertVisitor.getMessage());
  266. }
  267. sv.setVisitorsync(sv.getVisitorsync() == null ? insertVisitor.getData() : (sv.getVisitorsync() + "," + insertVisitor.getData()));
  268. sv.setDeviceNum(sv.getDeviceNum() == null ? device.getNum() : (sv.getDeviceNum() + "," + device.getNum()));
  269. }
  270. String code = GetVertifyCode.getRandomNumCode(6);
  271. sv.setVisitorCode(code);
  272. }
  273. } catch (Exception e) {
  274. throw new RuntimeException(e);
  275. }
  276. }
  277. }
  278. svs.add(sv);
  279. }
  280. boolean result = smartVisitorService.insertVisitorBatch(svs);
  281. return result ? CommonResult.ok("预约成功") : CommonResult.fail("预约失败");
  282. }
  283. @Override
  284. @DESRespondSecret(validated = true)
  285. public CommonResult otherAppointment(otherAppointmentRequest oar, BindingResult bindingResult) {
  286. if (bindingResult.hasErrors()) {
  287. String st = paramUtils.getParamError(bindingResult);
  288. return CommonResult.fail(st);
  289. }
  290. //根据用户ID查询相关信息
  291. SmartUser su = smartUserService.getSmartById(oar.getUserId());
  292. if (su == null) {
  293. return CommonResult.fail("当前用户信息不合法,无法进行预约!");
  294. }
  295. String startTime = oar.getVisitorTime();
  296. String endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  297. //要进行访客数据重复判断
  298. //那是不是第二次预约的时间不能在那个可访问的时间段内
  299. //例如:比如,第一次约了7:00-10:00;那第二次:6:00-7:30 或 8:11-13:00都不行
  300. // Integer count = smartVisitorService.queryVisitorCount(su.getIdCard(), startTime, endTime);
  301. // if (count > 0) {
  302. // return CommonResult.fail("该时间段已预约,请勿重复预约!");
  303. // }
  304. SmartVisitor sv = new SmartVisitor();
  305. sv.setUserId(oar.getUserId());
  306. sv.setUserName(oar.getUserName());
  307. sv.setUserPhone(oar.getUserPhone());
  308. sv.setUserNumber(oar.getUserCard());
  309. sv.setPeerNum(oar.getPeerNum());
  310. sv.setCarNum(oar.getCarNum());
  311. sv.setVisitReason(oar.getVisitReason());
  312. // sv.setStatu(eApproveStatu.Audit.getValue());
  313. sv.setVisitorTime(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  314. sv.setVisitorDeadline(TimeExchange.StringToDate(endTime, "yyyy-MM-dd HH:mm:ss"));
  315. sv.setRespondentName(oar.getRespondentName());
  316. sv.setRespondentPhone(oar.getRespondentPhone());
  317. sv.setVisitorType(eVisitorType.Other.getValue());
  318. List<SmartVisitorRestsConfig> list = smartVisitorRestsConfigService.list(new LambdaQueryWrapper<>());
  319. SmartVisitorRestsConfig smartVisitorRestsConfig = list.get(0);
  320. Integer auditConfig = smartVisitorRestsConfig.getAuditConfig();
  321. if (1 == auditConfig) {//需要审核
  322. sv.setStatu(1);
  323. } else if (9 == auditConfig) {
  324. sv.setStatu(9);
  325. Integer accessConfig = smartVisitorRestsConfig.getAccessConfig();
  326. if (0 == accessConfig) {//推送到门禁
  327. try {
  328. if (!ObjectUtils.isEmpty(sv.getCarNum())) {
  329. String appId = parkConfig.getAppId();
  330. String carNo = sv.getCarNum();
  331. String parkKey = parkConfig.getParkKey();
  332. String rand = String.valueOf(Math.random());
  333. String reserveTime = TimeExchange.DateToString(sv.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  334. String reserveEndTime = TimeExchange.DateToString(sv.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  335. String version = "v1.0";
  336. String appSecret = parkConfig.getAppSecret();
  337. String url = parkConfig.getUrl() + "Inform/Reservation";
  338. JSONObject jsonobject = new JSONObject();
  339. jsonobject.put("appid", appId);
  340. jsonobject.put("carNo", carNo);
  341. jsonobject.put("parkKey", parkKey);
  342. jsonobject.put("rand", rand);
  343. jsonobject.put("reserveEndTime", reserveEndTime);
  344. jsonobject.put("reserveTime", reserveTime);
  345. jsonobject.put("version", "v1.0");
  346. //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
  347. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  348. String sign = CommonUtil.MD5(md5Str);
  349. //sign签名
  350. jsonobject.put("sign", sign);
  351. //返回的结果中 code为1表示成功
  352. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  353. logger.info(result);
  354. if (!result.contains("预约成功")) {
  355. throw new Exception("审核失败");
  356. }
  357. ObjectMapper objectMapper = new ObjectMapper();
  358. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  359. sv.setBsOrderNo(reservation.getData().getReOrderNo());
  360. } else {
  361. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  362. String visitorNo = getUUIDBits(16);
  363. //region 将访客数据下发到设备
  364. for (SmartDevice device : devices) {
  365. CommonResult<String> insertVisitor = bsInsertVisitor(su, TimeExchange.DateToString(sv.getVisitorTime()), TimeExchange.DateToString(sv.getVisitorDeadline()), device.getNum(), visitorNo);
  366. if (!insertVisitor.isSuccess()) {
  367. throw new Exception(insertVisitor.getMessage());
  368. }
  369. sv.setVisitorsync(sv.getVisitorsync() == null ? insertVisitor.getData() : (sv.getVisitorsync() + "," + insertVisitor.getData()));
  370. sv.setDeviceNum(sv.getDeviceNum() == null ? device.getNum() : (sv.getDeviceNum() + "," + device.getNum()));
  371. }
  372. String code = GetVertifyCode.getRandomNumCode(6);
  373. sv.setVisitorCode(code);
  374. }
  375. //发送短信给其他访客用户
  376. if (!ObjectUtils.isEmpty(sv.getVisitorCode())) {
  377. 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());
  378. if (!message.contains("success")) {
  379. throw new Exception("发送失败");
  380. }
  381. }
  382. } catch (Exception e) {
  383. throw new RuntimeException(e);
  384. }
  385. }
  386. }
  387. int result = smartVisitorService.insertSmartVisitor(sv);
  388. return result > 0 ? CommonResult.ok("预约成功,等待审批通过") : CommonResult.ok("预约失败");
  389. }
  390. @Override
  391. @DESRespondSecret(validated = true)
  392. public CommonResult appointmentPageRecord(int currentPage, int pageCount, Integer userId, int type, String createStartTime, String createEndTime, String keyWord, String visitorStartTime, String visitorEndTime) {
  393. PageUtils<VisitorPageListVo> result = smartVisitorService.smartVisitorPageByUserId(currentPage, pageCount, userId, type, createStartTime, createEndTime, keyWord, visitorStartTime, visitorEndTime);
  394. return CommonResult.ok(result);
  395. }
  396. /**
  397. * 访客记录审核
  398. *
  399. * @param id 数据ID
  400. * @param type 操作类型:
  401. * 同意,并推送:1
  402. * 拒绝:2
  403. * @return
  404. */
  405. @Override
  406. @Transactional(rollbackFor = {Exception.class})
  407. public CommonResult examineRecord(int id, int type) throws Exception {
  408. SmartVisitor visitor = smartVisitorService.getSmartById(id);
  409. if (visitor == null) {
  410. return CommonResult.fail("访客记录已失效,审核失败!");
  411. }
  412. //审核处理后的数据不能再处理判断
  413. if (visitor.getStatu().intValue() != eApproveStatu.Audit.getValue()) {
  414. return CommonResult.fail("该记录已被操作过,请勿重复操作");
  415. }
  416. try {
  417. if (type == eExamineStatu.Agree.getValue()) {
  418. visitor.setStatu(eApproveStatu.Pushed.getValue());
  419. //家长访客预约才需要将消息推送到希沃电子班牌
  420. if (visitor.getVisitorType().intValue() == eVisitorType.Parent.getValue()) {
  421. String content = visitor.getRespondentName() + "你的家长将于" + TimeExchange.chineseDateTime(visitor.getVisitorTime()) + "到校!";
  422. //将预约信息推送到希沃班牌
  423. CommonResult seewo = pushInfo(visitor.getUserPhone(), visitor.getResponcode(), content);
  424. if (!seewo.getCode().equals("200")) {
  425. throw new Exception("审核失败");
  426. }
  427. }
  428. //将数据写入门禁系统逻辑
  429. //家长不能使用车牌系统 其他的可以使用车牌逻辑
  430. if (!ObjectUtils.isEmpty(visitor.getCarNum())) {
  431. String appId = parkConfig.getAppId();
  432. String carNo = visitor.getCarNum();
  433. String parkKey = parkConfig.getParkKey();
  434. String rand = String.valueOf(Math.random());
  435. String reserveTime = TimeExchange.DateToString(visitor.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  436. String reserveEndTime = TimeExchange.DateToString(visitor.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  437. String version = "v1.0";
  438. String appSecret = parkConfig.getAppSecret();
  439. String url = parkConfig.getUrl() + "Inform/Reservation";
  440. JSONObject jsonobject = new JSONObject();
  441. jsonobject.put("appid", appId);
  442. jsonobject.put("carNo", carNo);
  443. jsonobject.put("parkKey", parkKey);
  444. jsonobject.put("rand", rand);
  445. jsonobject.put("reserveEndTime", reserveEndTime);
  446. jsonobject.put("reserveTime", reserveTime);
  447. jsonobject.put("version", "v1.0");
  448. //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
  449. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  450. String sign = CommonUtil.MD5(md5Str);
  451. //sign签名
  452. jsonobject.put("sign", sign);
  453. //返回的结果中 code为1表示成功
  454. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  455. logger.info(result);
  456. if (!result.contains("预约成功")) {
  457. throw new Exception("审核失败");
  458. }
  459. ObjectMapper objectMapper = new ObjectMapper();
  460. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  461. visitor.setBsOrderNo(reservation.getData().getReOrderNo());
  462. } else {
  463. //查找用户是否存在
  464. SmartUser user = smartUserService.getSmartById(visitor.getUserId());
  465. if (user == null) {
  466. throw new Exception("访客用户ID在系统中不存在,无法将访客信息下发到门禁设备!");
  467. }
  468. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  469. String visitorNo = getUUIDBits(16);
  470. //region 将访客数据下发到设备
  471. for (SmartDevice device : devices) {
  472. CommonResult<String> insertVisitor = bsInsertVisitor(user, TimeExchange.DateToString(visitor.getVisitorTime()), TimeExchange.DateToString(visitor.getVisitorDeadline()), device.getNum(), visitorNo);
  473. if (!insertVisitor.isSuccess()) {
  474. throw new Exception(insertVisitor.getMessage());
  475. }
  476. visitor.setVisitorsync(visitor.getVisitorsync() == null ? insertVisitor.getData() : (visitor.getVisitorsync() + "," + insertVisitor.getData()));
  477. visitor.setDeviceNum(visitor.getDeviceNum() == null ? device.getNum() : (visitor.getDeviceNum() + "," + device.getNum()));
  478. }
  479. //endregion
  480. String code = GetVertifyCode.getRandomNumCode(6);
  481. visitor.setVisitorCode(code);
  482. }
  483. } else if (type == eExamineStatu.Refused.getValue()) {
  484. visitor.setStatu(eApproveStatu.Refused.getValue());
  485. }
  486. int result = smartVisitorService.updateSmartVisitor(visitor);
  487. if (result <= 0) {
  488. throw new Exception("审核失败");
  489. }
  490. //发送短信给其他访客用户
  491. if (!ObjectUtils.isEmpty(visitor.getVisitorCode()) && type == eExamineStatu.Agree.getValue()) {
  492. 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());
  493. if (!message.contains("success")) {
  494. throw new Exception("审核失败");
  495. }
  496. }
  497. } catch (Exception e) {
  498. throw new Exception("审核失败");
  499. }
  500. return CommonResult.ok("审核成功");
  501. }
  502. @Override
  503. public CommonResult testVisitorDevice(int id, String deviceNo) throws Exception {
  504. SmartUser user = smartUserService.getSmartById(id);
  505. if (user == null) {
  506. return CommonResult.fail("访客用户ID在系统中不存在,无法将访客信息下发到门禁设备!");
  507. }
  508. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  509. String visitorNo = getUUIDBits(16);
  510. //region 将访客数据下发到设备
  511. for (SmartDevice device : devices) {
  512. CommonResult<String> insertVisitor = bsInsertVisitor(user, "2024-03-28 10:00:00", "2024-03-28 11:00:00", device.getNum(), visitorNo);
  513. if (!insertVisitor.isSuccess()) {
  514. return CommonResult.fail(insertVisitor.getMessage());
  515. }
  516. }
  517. return CommonResult.ok("操作成功");
  518. }
  519. @Override
  520. @DESRespondSecret(validated = true)
  521. public CommonResult getPage(int currentPage, int pageCount, Integer type, String keyWord, Integer status, String startTime, String endTime, String visitorStartTime, String visitorEndTime) {
  522. PageUtils<SmartVisitorVo> page = smartVisitorService.getPage(currentPage, pageCount, type, keyWord, status, startTime, endTime, visitorStartTime, visitorEndTime);
  523. return CommonResult.ok(page);
  524. }
  525. @Override
  526. public CommonResult parentsAudit(int id, int type) {
  527. SmartVisitor sv = smartVisitorService.getSmartById(id);
  528. if (sv == null) {
  529. return CommonResult.fail("访客记录已失效,审核失败!");
  530. }
  531. //审核处理后的数据不能再处理判断
  532. if (sv.getStatu().intValue() != eApproveStatu.Audit.getValue()) {
  533. return CommonResult.fail("该记录已被操作过,请勿重复操作");
  534. }
  535. try {
  536. // 同意
  537. if (type == 4) {
  538. // 获取受访者id
  539. Integer respondent = sv.getRespondent();
  540. SmartUser smartUser = smartUserService.getById(respondent);
  541. Integer schoolClass = smartUser.getSchoolClass();
  542. SmartVisitorParentsConfig svpc = smartVisitorParentsConfigService.getById(schoolClass);
  543. Integer appPushConfig = svpc.getAppPushConfig();
  544. // 判断是否需要推送
  545. if (5 == appPushConfig) {//需要推送
  546. String content = sv.getRespondentName() + "你的家长将于" + TimeExchange.chineseDateTime(sv.getVisitorTime()) + "到校!";
  547. //将预约信息推送到希沃班牌
  548. CommonResult seewo = pushInfo(sv.getUserPhone(), sv.getResponcode(), content);
  549. }
  550. // 核销
  551. Integer appCancelConfig = svpc.getAppCancelConfig();
  552. if (6 == appCancelConfig) {//需要核销
  553. sv.setStatu(7);
  554. } else {//不需要核销
  555. sv.setStatu(9);
  556. }
  557. // 门禁配置
  558. Integer accessConfig = svpc.getAccessConfig();
  559. if (0 == accessConfig) {
  560. if (!ObjectUtils.isEmpty(sv.getCarNum())) {
  561. String appId = parkConfig.getAppId();
  562. String carNo = sv.getCarNum();
  563. String parkKey = parkConfig.getParkKey();
  564. String rand = String.valueOf(Math.random());
  565. String reserveTime = TimeExchange.DateToString(sv.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  566. String reserveEndTime = TimeExchange.DateToString(sv.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  567. String version = "v1.0";
  568. String appSecret = parkConfig.getAppSecret();
  569. String url = parkConfig.getUrl() + "Inform/Reservation";
  570. JSONObject jsonobject = new JSONObject();
  571. jsonobject.put("appid", appId);
  572. jsonobject.put("carNo", carNo);
  573. jsonobject.put("parkKey", parkKey);
  574. jsonobject.put("rand", rand);
  575. jsonobject.put("reserveEndTime", reserveEndTime);
  576. jsonobject.put("reserveTime", reserveTime);
  577. jsonobject.put("version", "v1.0");
  578. //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
  579. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  580. String sign = CommonUtil.MD5(md5Str);
  581. //sign签名
  582. jsonobject.put("sign", sign);
  583. //返回的结果中 code为1表示成功
  584. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  585. logger.info(result);
  586. if (!result.contains("预约成功")) {
  587. throw new Exception("审核失败");
  588. }
  589. ObjectMapper objectMapper = new ObjectMapper();
  590. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  591. sv.setBsOrderNo(reservation.getData().getReOrderNo());
  592. } else {
  593. //查找用户是否存在
  594. SmartUser user = smartUserService.getSmartById(sv.getUserId());
  595. if (user == null) {
  596. throw new Exception("访客用户ID在系统中不存在,无法将访客信息下发到门禁设备!");
  597. }
  598. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  599. String visitorNo = getUUIDBits(16);
  600. //region 将访客数据下发到设备
  601. for (SmartDevice device : devices) {
  602. CommonResult<String> insertVisitor = bsInsertVisitor(user, TimeExchange.DateToString(sv.getVisitorTime()), TimeExchange.DateToString(sv.getVisitorDeadline()), device.getNum(), visitorNo);
  603. if (!insertVisitor.isSuccess()) {
  604. throw new Exception(insertVisitor.getMessage());
  605. }
  606. sv.setVisitorsync(sv.getVisitorsync() == null ? insertVisitor.getData() : (sv.getVisitorsync() + "," + insertVisitor.getData()));
  607. sv.setDeviceNum(sv.getDeviceNum() == null ? device.getNum() : (sv.getDeviceNum() + "," + device.getNum()));
  608. }
  609. String code = GetVertifyCode.getRandomNumCode(6);
  610. sv.setVisitorCode(code);
  611. }
  612. }
  613. } else if (type == 2) {//拒绝
  614. sv.setStatu(2);
  615. }
  616. int result = smartVisitorService.updateSmartVisitor(sv);
  617. if (result <= 0) {
  618. throw new Exception("审核失败");
  619. }
  620. } catch (Exception e) {
  621. throw new RuntimeException(e);
  622. }
  623. return CommonResult.ok("审核成功");
  624. }
  625. @Override
  626. public CommonResult restsAudit(int id, int type) {
  627. SmartVisitor sv = smartVisitorService.getSmartById(id);
  628. if (sv == null) {
  629. return CommonResult.fail("访客记录已失效,审核失败!");
  630. }
  631. //审核处理后的数据不能再处理判断
  632. if (sv.getStatu().intValue() != eApproveStatu.Audit.getValue()) {
  633. return CommonResult.fail("该记录已被操作过,请勿重复操作");
  634. }
  635. try {
  636. // 同意
  637. if (type == 4) {
  638. sv.setStatu(9);
  639. List<SmartVisitorRestsConfig> list = smartVisitorRestsConfigService.list(new LambdaQueryWrapper<>());
  640. SmartVisitorRestsConfig smartVisitorRestsConfig = list.get(0);
  641. Integer accessConfig = smartVisitorRestsConfig.getAccessConfig();
  642. if (0 == accessConfig) {
  643. //推送到门禁
  644. if (!ObjectUtils.isEmpty(sv.getCarNum())) {
  645. String appId = parkConfig.getAppId();
  646. String carNo = sv.getCarNum();
  647. String parkKey = parkConfig.getParkKey();
  648. String rand = String.valueOf(Math.random());
  649. String reserveTime = TimeExchange.DateToString(sv.getVisitorTime(), "yyyy-MM-dd HH:mm:ss");
  650. String reserveEndTime = TimeExchange.DateToString(sv.getVisitorDeadline(), "yyyy-MM-dd HH:mm:ss");
  651. String version = "v1.0";
  652. String appSecret = parkConfig.getAppSecret();
  653. String url = parkConfig.getUrl() + "Inform/Reservation";
  654. JSONObject jsonobject = new JSONObject();
  655. jsonobject.put("appid", appId);
  656. jsonobject.put("carNo", carNo);
  657. jsonobject.put("parkKey", parkKey);
  658. jsonobject.put("rand", rand);
  659. jsonobject.put("reserveEndTime", reserveEndTime);
  660. jsonobject.put("reserveTime", reserveTime);
  661. jsonobject.put("version", "v1.0");
  662. //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
  663. String md5Str = "appid=" + appId + "&carNo=" + carNo + "&parkKey=" + parkKey + "&rand=" + rand + "&reserveEndTime=" + reserveEndTime + "&reserveTime=" + reserveTime + "&version=" + version + "&" + appSecret;
  664. String sign = CommonUtil.MD5(md5Str);
  665. //sign签名
  666. jsonobject.put("sign", sign);
  667. //返回的结果中 code为1表示成功
  668. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  669. logger.info(result);
  670. if (!result.contains("预约成功")) {
  671. throw new Exception("审核失败");
  672. }
  673. ObjectMapper objectMapper = new ObjectMapper();
  674. BsReservationVo reservation = objectMapper.readValue(result, BsReservationVo.class);
  675. sv.setBsOrderNo(reservation.getData().getReOrderNo());
  676. } else {
  677. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  678. String visitorNo = getUUIDBits(16);
  679. //region 将访客数据下发到设备
  680. for (SmartDevice device : devices) {
  681. //查找用户是否存在
  682. SmartUser user = smartUserService.getSmartById(sv.getUserId());
  683. if (user == null) {
  684. throw new Exception("访客用户ID在系统中不存在,无法将访客信息下发到门禁设备!");
  685. }
  686. CommonResult<String> insertVisitor = bsInsertVisitor(user, TimeExchange.DateToString(sv.getVisitorTime()), TimeExchange.DateToString(sv.getVisitorDeadline()), device.getNum(), visitorNo);
  687. if (!insertVisitor.isSuccess()) {
  688. throw new Exception(insertVisitor.getMessage());
  689. }
  690. sv.setVisitorsync(sv.getVisitorsync() == null ? insertVisitor.getData() : (sv.getVisitorsync() + "," + insertVisitor.getData()));
  691. sv.setDeviceNum(sv.getDeviceNum() == null ? device.getNum() : (sv.getDeviceNum() + "," + device.getNum()));
  692. }
  693. String code = GetVertifyCode.getRandomNumCode(6);
  694. sv.setVisitorCode(code);
  695. }
  696. //发送短信给其他访客用户
  697. if (!ObjectUtils.isEmpty(sv.getVisitorCode())) {
  698. 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());
  699. if (!message.contains("success")) {
  700. throw new Exception("发送失败");
  701. }
  702. }
  703. }
  704. } else if (type == 2) {//拒绝
  705. sv.setStatu(2);
  706. }
  707. int result = smartVisitorService.updateSmartVisitor(sv);
  708. if (result <= 0) {
  709. throw new Exception("审核失败");
  710. }
  711. } catch (Exception e) {
  712. throw new RuntimeException(e);
  713. }
  714. return CommonResult.ok("审核成功");
  715. }
  716. @Override
  717. public CommonResult parentsScreen(ParentsScreenDto par, BindingResult bindingResult) {
  718. if (bindingResult.hasErrors()) {
  719. String st = paramUtils.getParamError(bindingResult);
  720. return CommonResult.fail(st);
  721. }
  722. //参数判断 判断受访学生信息是否为空
  723. if (par.getStudents() == null) {
  724. return CommonResult.fail("请选择受访学生");
  725. }
  726. if (par.getStudents().size() <= 0) {
  727. return CommonResult.fail("请选择受访学生");
  728. }
  729. //根据用户ID查询相关信息
  730. SmartUser su = smartUserService.getSmartById(par.getUserId());
  731. if (su == null) {
  732. return CommonResult.fail("当前用户信息不合法,无法进行预约!");
  733. }
  734. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  735. LocalDateTime date = LocalDateTime.now();
  736. String startTime = date.format(dateTimeFormatter1);
  737. String endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  738. //要进行家长数据重复判断
  739. //那是不是第二次预约的时间不能在那个可访问的时间段内
  740. //例如:比如,第一次约了7:00-10:00;那第二次:6:00-7:30 或 8:11-13:00都不行
  741. Integer count = smartVisitorService.queryVisitorCount(su.getIdCard(), startTime, endTime);
  742. if (count > 0) {
  743. return CommonResult.fail("该时间段已预约,请勿重复预约!");
  744. }
  745. List<SmartVisitor> svs = new ArrayList<>();
  746. for (AffiliateUserVo student : par.getStudents()) {
  747. SmartVisitor sv = new SmartVisitor();
  748. sv.setUserId(par.getUserId());
  749. sv.setUserName(su.getName());
  750. sv.setUserPhone(su.getPhone());
  751. sv.setUserNumber(su.getIdCard());
  752. sv.setPeerNum(0);
  753. sv.setVisitReason(par.getVisitReason());
  754. // sv.setStatu(eApproveStatu.Audit.getValue());
  755. sv.setVisitorTime(TimeExchange.StringToDate(startTime, "yyyy-MM-dd HH:mm:ss"));
  756. sv.setVisitorDeadline(TimeExchange.StringToDate(TimeExchange.AddTimeDesH(sv.getVisitorTime(), 4), "yyyy-MM-dd HH:mm:ss"));
  757. sv.setRespondent(student.getId());
  758. sv.setResponcode(student.getCardNo());
  759. sv.setRespondentName(student.getName());
  760. //将第一个受访学生的部门ID带过去
  761. sv.setDepartmentId(student.getDepartmentId());
  762. sv.setVisitorType(eVisitorType.Parent.getValue());
  763. // 获取受访者id
  764. Integer respondent = sv.getRespondent();
  765. SmartUser smartUser = smartUserService.getById(respondent);
  766. Integer schoolClass = smartUser.getSchoolClass();
  767. SmartVisitorParentsConfig svpc = smartVisitorParentsConfigService.getById(schoolClass);
  768. Integer screenAuditConfig = svpc.getScreenAuditConfig();
  769. if (1 == screenAuditConfig) {//需要审核
  770. sv.setStatu(1);
  771. } else {//不需要审核
  772. Integer screenPushConfig = svpc.getScreenPushConfig();
  773. // 判断是否需要推送
  774. if (5 == screenPushConfig) {//需要推送
  775. String content = sv.getRespondentName() + "你的家长将于" + TimeExchange.chineseDateTime(sv.getVisitorTime()) + "到校!";
  776. //将预约信息推送到希沃班牌
  777. CommonResult seewo = pushInfo(sv.getUserPhone(), sv.getResponcode(), content);
  778. }
  779. // 核销
  780. Integer screenCancelConfig = svpc.getScreenCancelConfig();
  781. if (6 == screenCancelConfig) {//需要核销
  782. sv.setStatu(7);
  783. } else {//不需要核销
  784. sv.setStatu(9);
  785. }
  786. // 门禁配置
  787. Integer accessConfig = svpc.getAccessConfig();
  788. if (0 == accessConfig) {
  789. try {
  790. List<SmartDevice> devices = smartDeviceService.queryOnLineDevice();
  791. String visitorNo = getUUIDBits(16);
  792. //region 将访客数据下发到设备
  793. for (SmartDevice device : devices) {
  794. CommonResult<String> insertVisitor = bsInsertVisitor(su, TimeExchange.DateToString(sv.getVisitorTime()), TimeExchange.DateToString(sv.getVisitorDeadline()), device.getNum(), visitorNo);
  795. if (!insertVisitor.isSuccess()) {
  796. throw new Exception(insertVisitor.getMessage());
  797. }
  798. sv.setVisitorsync(sv.getVisitorsync() == null ? insertVisitor.getData() : (sv.getVisitorsync() + "," + insertVisitor.getData()));
  799. sv.setDeviceNum(sv.getDeviceNum() == null ? device.getNum() : (sv.getDeviceNum() + "," + device.getNum()));
  800. }
  801. String code = GetVertifyCode.getRandomNumCode(6);
  802. sv.setVisitorCode(code);
  803. } catch (Exception e) {
  804. throw new RuntimeException(e);
  805. }
  806. }
  807. }
  808. svs.add(sv);
  809. }
  810. boolean result = smartVisitorService.insertVisitorBatch(svs);
  811. return result ? CommonResult.ok("预约成功") : CommonResult.fail("预约失败");
  812. }
  813. @Override
  814. @DESRespondSecret(validated = true)
  815. public CommonResult getScreenPage(int currentPage, int pageCount, String phone,String status) {
  816. PageUtils<SmartVisitorScreenListVo> page = smartVisitorService.getScreenPage(currentPage, pageCount,phone,status);
  817. return CommonResult.ok(page);
  818. }
  819. @Override
  820. public CommonResult cancel(int id) {
  821. boolean b = smartVisitorService.removeById(id);
  822. if (b) {
  823. return CommonResult.ok();
  824. }
  825. return CommonResult.fail();
  826. }
  827. @Override
  828. public CommonResult verification(int id) {
  829. SmartVisitor sv = smartVisitorService.getSmartById(id);
  830. if (sv == null) {
  831. return CommonResult.fail("访客记录已失效,审核失败!");
  832. }
  833. Integer statu = sv.getStatu();
  834. if (9==statu) {
  835. return CommonResult.fail("该记录已完成,请勿重复操作");
  836. }
  837. if (2==statu) {
  838. return CommonResult.fail("该记录未同意");
  839. }
  840. if (1==statu) {
  841. return CommonResult.fail("该记录还未通过审核");
  842. }
  843. if (7==statu) {
  844. sv.setStatu(8);
  845. int result = smartVisitorService.updateSmartVisitor(sv);
  846. if (result > 0) {
  847. return CommonResult.ok("进校核销成功");
  848. }
  849. }else if(8==statu){
  850. sv.setStatu(9);
  851. int result = smartVisitorService.updateSmartVisitor(sv);
  852. if (result > 0) {
  853. return CommonResult.ok("出校核销成功");
  854. }
  855. }
  856. return CommonResult.fail();
  857. }
  858. /**
  859. * 1、学生请假:
  860. * 我们这边调用请假接口之后,把请假数据写到了百胜系统的"学生请假登记"页面中,那到时候学生是通过任意设备都能进出吗?
  861. * 即:万载三中有 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四台门禁设备?
  862. * <p>
  863. * 注:如果要修改请假数据则要先修改系统中的学生编码,再去新增一条请假数据
  864. * 即:修改了这个学生编码之后再下发请假数据的话,原有的该学号的请假数据就会在设备中被清除
  865. * <p>
  866. * 2、访客设备:
  867. * 我们这边调用门禁访客设备接口,是把数据下发到系统还是到门禁设备?
  868. * 如果是写到门禁的话,后续添加访客数据是否会清除之前的所有已写入的访客数据?
  869. * <p>
  870. * <p>
  871. * 答:
  872. * 1、请假数据会自动会同步到设备
  873. * 2、访客数据是下发到门禁设备的,访客数据有效期到了之后会自动被清除掉;如果删除系统中的用户数据会自动把门禁中的用户数据也删掉,如果是已有的则进行更新操作;
  874. *
  875. * @param su
  876. * @param startTime
  877. * @param endTime
  878. * @param deviceNo
  879. * @param visitorNo
  880. * @return
  881. * @throws Exception
  882. */
  883. //region 百胜添加访客数据到设备
  884. public CommonResult<String> bsInsertVisitor(SmartUser su, String startTime, String endTime, String deviceNo, String visitorNo) throws Exception {
  885. //region 百胜添加教师数据
  886. String appId = controlConfig.getAppId();
  887. String schoolno = controlConfig.getSchoolCode();
  888. String timestamp = TimeExchange.DateNowTimeStamo();
  889. String appSecret = controlConfig.getAppSecret();
  890. String url = controlConfig.getUrl() + "visitor/sync";
  891. JSONObject jsonobject = new JSONObject();
  892. jsonobject.put("appid", appId);
  893. 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() + "\"}";
  894. String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
  895. jsonobject.put("data", aesStr);
  896. jsonobject.put("schoolno", schoolno);
  897. jsonobject.put("timestamp", timestamp);
  898. 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;
  899. String sign = CommonUtil.MD5(md5Str);
  900. //sign签名
  901. jsonobject.put("sign", sign);
  902. //返回的结果中 code为1表示成功
  903. String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());
  904. ObjectMapper objectMapper = new ObjectMapper();
  905. BsDeviceVo device = objectMapper.readValue(bsResult, BsDeviceVo.class);
  906. if (!bsResult.contains("添加成功")) {
  907. return CommonResult.fail(device.getMsg());
  908. }
  909. // URL解码
  910. String decodedUrl = URLDecoder.decode(device.getData(), "UTF-8");
  911. BsDeviceNoVo deviceNoData = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsDeviceNoVo.class);
  912. su.setBsStaffCode(deviceNoData.getVisitorsync_no());
  913. return CommonResult.ok("200", "新增成功", deviceNoData.getVisitorsync_no());
  914. //endregion
  915. }
  916. //endregion
  917. /**
  918. * 将预约信息推送到希沃电子班牌
  919. *
  920. * @param parentPhone 预约手机号(家长手机号 在希沃中学生会和家长手机号绑定 可以绑定多个家长)
  921. * @param studentCode 学生编号 希沃中的学生编号和万载系统中的一致
  922. * @param content 消息内容
  923. * @return
  924. */
  925. public CommonResult pushInfo(String parentPhone, String studentCode, String content) {
  926. //初始化客户端
  927. SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  928. HomeSchoolServiceSendNoteToKidParam param = new HomeSchoolServiceSendNoteToKidParam();
  929. //响应体,MimeType为 application/json
  930. HomeSchoolServiceSendNoteToKidParam.RequestBody requestBody = HomeSchoolServiceSendNoteToKidParam.RequestBody.builder()
  931. .build();
  932. param.setRequestBody(requestBody);
  933. //query
  934. HomeSchoolServiceSendNoteToKidParam.Query query = HomeSchoolServiceSendNoteToKidParam.Query.builder()
  935. .appId(seewoConfig.getAppId())
  936. .schoolUid(seewoConfig.getSchoolId())
  937. .senderPhone(parentPhone)
  938. .studentCode(studentCode)
  939. .type(1)
  940. .content(content)
  941. .autoRegister(0)
  942. .build();
  943. requestBody.setQuery(query);
  944. param.setRequestBody(requestBody);
  945. HomeSchoolServiceSendNoteToKidRequest request = new HomeSchoolServiceSendNoteToKidRequest(param);
  946. logger.info("入参:" + request);
  947. //如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
  948. //request.setServerUrl("https://openapi.test.seewo.com")
  949. //执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
  950. HomeSchoolServiceSendNoteToKidResult result = seewoClient.invoke(request);
  951. logger.info("出参:" + result);
  952. if (!result.getMessage().equals("success")) {
  953. CommonResult.fail();
  954. }
  955. return CommonResult.ok();
  956. }
  957. /**
  958. * 获取到访代办数据
  959. *
  960. * @param userId
  961. * @return
  962. */
  963. @Override
  964. @DESRespondSecret(validated = false)
  965. public CommonResult visitingAgencys(int currentPage, int pageCount, int userId, int type) {
  966. SmartUser user = smartUserService.getSmartById(userId);
  967. if (user == null) {
  968. return CommonResult.fail("当前用户数据无效,获取到访数据失败");
  969. }
  970. if (user.getIdentityId().intValue() != eIdentityStatu.Teacher.getValue()) {
  971. return CommonResult.fail("非教师身份无法获取到访数据");
  972. }
  973. //是否是管理员
  974. String whereSql = null;
  975. //获取的权限组数据
  976. List<SmartAuthorGroup> authorGroups = smartAuthorGroupService.smartAuthorGroup(user.getId());
  977. for (SmartAuthorGroup authorGroup : authorGroups) {
  978. List<String> applyIds = Arrays.asList(authorGroup.getApplyId().split(","));
  979. //菜单表中7是访客预约
  980. long appointCount = applyIds.stream().filter(e -> e.equals("7")).count();
  981. if (appointCount > 0) {
  982. whereSql = "visitor_type = 2";
  983. break;
  984. }
  985. }
  986. List<Integer> studentIds = null;
  987. //班主任
  988. if (user.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
  989. //班级ID
  990. Integer schoolClass = user.getSchoolClass();
  991. //获取该班级下的所有学生ID数据
  992. List<SmartUser> students = smartUserService.queryStudentBySchoolClass(user.getSchoolClass());
  993. if (students == null) {
  994. return CommonResult.fail("当前身份下不存在学生信息");
  995. }
  996. studentIds = students.stream().map(SmartUser::getId).collect(Collectors.toList());
  997. }
  998. PageUtils<SmartVisitor> result = new PageUtils<SmartVisitor>(null, 0, pageCount, currentPage);
  999. if (whereSql == null && studentIds == null) {
  1000. return CommonResult.ok(result);
  1001. }
  1002. result = smartVisitorService.queryVisitorPageDatas(currentPage, pageCount, type, studentIds, studentIds != null && whereSql != null ? "or " + whereSql : whereSql);
  1003. return CommonResult.ok(result);
  1004. }
  1005. /**
  1006. * 扫码 分为 身份码 和 访客码
  1007. * 1、身份码:
  1008. * 1.1、如果是老师 任意通行
  1009. * 1.2、如果是家长 找有没有访客数据
  1010. * 1.3、如果是学生 不让通行
  1011. * <p>
  1012. * 2、访客码
  1013. * 2.1、找下是否存在访客预约记录
  1014. * <p>
  1015. * 扫码记录增加是否已进 和 是否已出字段
  1016. *
  1017. * @param data
  1018. * @return
  1019. * @throws JsonProcessingException
  1020. */
  1021. @Override
  1022. public TurnOnDeviceVo turnOnTheDevice(turnOnTheDeviceRequest data) throws JsonProcessingException {
  1023. logger.info("进入扫码解析,参数:" + JSON.toJSON(data));
  1024. TurnOnDeviceVo result = new TurnOnDeviceVo();
  1025. logger.info("进入扫码解析1");
  1026. //region 参数判断
  1027. if (data == null) {
  1028. result.setResultcode(2);
  1029. result.setMessage("扫码参数不能为空");
  1030. result.setActionName("qrCodePush");
  1031. return result;
  1032. }
  1033. logger.info("进入扫码解析2");
  1034. if (data.getActionName() == null) {
  1035. result.setResultcode(2);
  1036. result.setMessage("指令不能为空");
  1037. result.setActionName("qrCodePush");
  1038. return result;
  1039. }
  1040. logger.info("进入扫码解析3");
  1041. if (!data.getActionName().equals("qrCodePush")) {
  1042. result.setResultcode(2);
  1043. result.setMessage("指令错误");
  1044. result.setActionName("qrCodePush");
  1045. return result;
  1046. }
  1047. logger.info("进入扫码解析4");
  1048. if (data.getData() == null) {
  1049. result.setResultcode(2);
  1050. result.setMessage("二维码内容不能为空");
  1051. result.setActionName("qrCodePush");
  1052. return result;
  1053. }
  1054. logger.info("进入扫码解析5");
  1055. ObjectMapper objectMapper = new ObjectMapper();
  1056. qrCodeVo codeVo = objectMapper.readValue(data.getData(), qrCodeVo.class);
  1057. if (codeVo == null) {
  1058. result.setResultcode(2);
  1059. result.setMessage("二维码内容不能为空");
  1060. result.setActionName("qrCodePush");
  1061. return result;
  1062. }
  1063. logger.info("进入扫码解析6");
  1064. if (codeVo.getQrCode() == null) {
  1065. result.setResultcode(2);
  1066. result.setMessage("二维码内容不能为空");
  1067. result.setActionName("qrCodePush");
  1068. return result;
  1069. }
  1070. logger.info("进入扫码解析7");
  1071. if (data.getDeviceno() == null) {
  1072. result.setResultcode(2);
  1073. result.setMessage("设备编号不能为空");
  1074. result.setActionName("qrCodePush");
  1075. return result;
  1076. }
  1077. logger.info("进入扫码解析8");
  1078. if (data.getVersion() == null) {
  1079. result.setResultcode(2);
  1080. result.setMessage("版本不能为空");
  1081. result.setActionName("qrCodePush");
  1082. return result;
  1083. }
  1084. //endregion
  1085. logger.info("进入扫码解析9");
  1086. //解码逻辑
  1087. QrcodeImageVo qiv = objectMapper.readValue(codeVo.getQrCode(), QrcodeImageVo.class);
  1088. logger.info("进入扫码解析10");
  1089. SmartDevice deviceData = smartDeviceService.queryDeviceByNum(data.getDeviceno());
  1090. if (deviceData == null) {
  1091. logger.info("进入扫码解析11");
  1092. result.setResultcode(2);
  1093. result.setMessage("设备不存在");
  1094. result.setActionName("qrCodePush");
  1095. return result;
  1096. }
  1097. if (qiv.getType().intValue() == eQrcodeType.Identity.getValue()) {//身份码
  1098. //身份码中的ID是身份码ID
  1099. logger.info("进入身份码扫码解析1");
  1100. //目前二维码一分钟内有效
  1101. //过期:(时间戳 + 有效期分钟数)<= 当前时间
  1102. //时间戳转时间
  1103. Date dateNow = TimeExchange.StringToDate(TimeExchange.TimeRangeMinute(qiv.getTimestamp(), 1), "yyyy-MM-dd HH:mm:ss");
  1104. logger.info("dateNow参数:" + TimeExchange.DateToString(dateNow));
  1105. logger.info("当前时间参数:" + TimeExchange.DateToString(new Date()));
  1106. if (new Date().after(dateNow)) {
  1107. logger.info("身份码过期");
  1108. result.setResultcode(2);
  1109. result.setMessage("身份码已过期");
  1110. result.setActionName("qrCodePush");
  1111. return result;
  1112. }
  1113. logger.info("进入身份码扫码解析2");
  1114. SmartUser user = smartUserService.getSmartById(qiv.getId());
  1115. if (user == null) {
  1116. result.setResultcode(2);
  1117. result.setMessage("用户身份无效,刷码失败");
  1118. result.setActionName("qrCodePush");
  1119. return result;
  1120. }
  1121. //成功后将刷码记录存储到数据表中
  1122. SmartQrcode sq = new SmartQrcode();
  1123. /**
  1124. * 1、身份码逻辑
  1125. * 1.1、如果是老师 任意通行
  1126. * 1.2、如果是家长 找有没有访客数据
  1127. * 1.3、如果是学生 不让通行
  1128. */
  1129. switch (user.getIdentityId().intValue()) {
  1130. case 1://家长
  1131. //查找是否存在访客记录
  1132. SmartVisitor visitor = smartVisitorService.queryParentVisitor(user.getId());
  1133. if (visitor == null) {
  1134. logger.info("无访客数据,家长无法通行");
  1135. result.setResultcode(2);
  1136. result.setMessage("无访客数据,家长无法通行");
  1137. result.setActionName("qrCodePush");
  1138. return result;
  1139. }
  1140. sq.setUserId(qiv.getId());
  1141. sq.setQrcodeType(qiv.getType());
  1142. sq.setSourceCode(data.getData());
  1143. sq.setDataId(visitor.getId());
  1144. sq.setIsSuccess(1);
  1145. sq.setAccessState(deviceData.getEntrance());
  1146. break;
  1147. case 2://学生
  1148. logger.info("学生无法使用身份码通行");
  1149. result.setResultcode(2);
  1150. result.setMessage("学生无法使用身份码通行");
  1151. result.setActionName("qrCodePush");
  1152. return result;
  1153. case 3://老师
  1154. sq.setUserId(qiv.getId());
  1155. sq.setQrcodeType(qiv.getType());
  1156. sq.setSourceCode(data.getData());
  1157. sq.setDataId(0);
  1158. sq.setIsSuccess(1);
  1159. sq.setAccessState(deviceData.getEntrance());
  1160. break;
  1161. default:
  1162. break;
  1163. }
  1164. logger.info("进入身份码扫码解析3");
  1165. int insertResult = smartQrcodeService.insertSmartQrcode(sq);
  1166. if (insertResult <= 0) {
  1167. result.setResultcode(2);
  1168. result.setMessage("新增刷码记录失败");
  1169. result.setActionName("qrCodePush");
  1170. return result;
  1171. }
  1172. logger.info("进入身份码扫码解析4");
  1173. result.setResultcode(1);
  1174. result.setMessage("成功");
  1175. result.setActionName("qrCodePush");
  1176. logger.info("进入身份码扫码解析,结果:" + JSON.toJSON(result));
  1177. } else if (qiv.getType().intValue() == eQrcodeType.Visitor.getValue()) {//访客码
  1178. //访客码中的ID是访客数据的ID
  1179. //查找是否存在访客记录
  1180. SmartVisitor visitor = smartVisitorService.getSmartById(qiv.getId());
  1181. if (visitor == null) {
  1182. logger.info("无访客数据,访客无法通行");
  1183. result.setResultcode(2);
  1184. result.setMessage("无访客数据,访客无法通行");
  1185. result.setActionName("qrCodePush");
  1186. return result;
  1187. }
  1188. //成功后将刷码记录存储到数据表中
  1189. SmartQrcode sq = new SmartQrcode();
  1190. sq.setUserId(visitor.getUserId());
  1191. sq.setQrcodeType(qiv.getType());
  1192. sq.setSourceCode(data.getData());
  1193. sq.setDataId(visitor.getId());
  1194. sq.setIsSuccess(1);
  1195. sq.setAccessState(deviceData.getEntrance());
  1196. logger.info("进入访客码扫码解析3");
  1197. int insertResult = smartQrcodeService.insertSmartQrcode(sq);
  1198. if (insertResult <= 0) {
  1199. result.setResultcode(2);
  1200. result.setMessage("新增刷码记录失败");
  1201. result.setActionName("qrCodePush");
  1202. return result;
  1203. }
  1204. logger.info("进入访客码扫码解析4");
  1205. result.setResultcode(1);
  1206. result.setMessage("成功");
  1207. result.setActionName("qrCodePush");
  1208. logger.info("进入访客码扫码解析,结果:" + JSON.toJSON(result));
  1209. }
  1210. return result;
  1211. }
  1212. }