SmartVisitorController.java 67 KB

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