UserInfoServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. package com.yx.face.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.github.pagehelper.PageHelper;
  5. import com.github.pagehelper.PageInfo;
  6. import com.google.common.collect.Lists;
  7. import com.google.common.collect.Maps;
  8. import com.yx.face.boot.config.TaskPoolConfig;
  9. import com.yx.face.boot.restful.RestDTO;
  10. import com.yx.face.boot.restful.ServiceException;
  11. import com.yx.face.boot.uitls.*;
  12. import com.yx.face.dao.*;
  13. import com.yx.face.model.dto.WxInfoDTO;
  14. import com.yx.face.model.entity.*;
  15. import com.yx.face.model.query.QueryUser;
  16. import com.yx.face.model.vo.UserInfoVO;
  17. import com.yx.face.netty_client.NettyClient;
  18. import com.yx.face.service.UserInfoService;
  19. import com.yx.face.service.feign.TBDeviceFaceService;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.util.CollectionUtils;
  26. import org.springframework.util.StringUtils;
  27. import javax.annotation.Resource;
  28. import java.util.*;
  29. /**
  30. * @description: 用户基础信息表(UserInfo)表服务实现类 <br>
  31. * @author: PWB <br>
  32. * @since: 1.0 <br>
  33. * @date: 2021-06-04 14:25:50 <br>
  34. */
  35. @Slf4j
  36. @Service
  37. public class UserInfoServiceImpl implements UserInfoService {
  38. @Resource
  39. private UserInfoDao userInfoDao;
  40. @Resource
  41. private UserFaceRecordsDao userFaceRecordsDao;
  42. @Resource
  43. private FacePassDao facePassDao;
  44. @Resource
  45. private FaceDeviceDao faceDeviceDao;
  46. @Resource
  47. private FaceRequestLogDao faceRequestLogDao;
  48. @Resource
  49. private FaceTaskDao faceTaskDao;
  50. @Autowired
  51. private TBDeviceFaceService tbDeviceFaceService;
  52. //常客
  53. @Resource
  54. private UserWhitelistDao userWhitelistdao;
  55. @Resource
  56. private UserFaceRecordsFromDao userFaceRecordsFromDao;
  57. @Resource
  58. private UserVisitorListDao userVisitorListDao;
  59. @Resource
  60. private UserBlackListDao userBlackListDao;
  61. @Resource
  62. private UserInfoFromDao userInfoFromDao;
  63. @Autowired
  64. private TaskPoolConfig taskPoolConfig;
  65. @Autowired
  66. private NettyClient nettyClient;
  67. @Autowired
  68. private AsyncTriggerRetryImpl asyncTriggerRetryImpl;
  69. // @Value("${wx.phone.url}")
  70. private static final String wxUrl = "http://192.168.99.11:9810/winxin-fyzd/weiXin/getPhone";
  71. @Override
  72. public String getWxPhone(WxInfoDTO dto) {
  73. String sync = OkHttpUtils.builder().url(wxUrl)
  74. // 有参数的话添加参数,可多个
  75. .addParam("code", dto.getCode())
  76. .addParam("signature", dto.getSignature())
  77. .addParam("rawData", dto.getRawData())
  78. .addParam("iv", dto.getIv())
  79. .addParam("encryptedData", dto.getEncryptedData())
  80. .post(true)
  81. .sync();
  82. if (org.apache.commons.lang3.StringUtils.isBlank(sync)) {
  83. throw new ServiceException("获取登录后的session信息失败");
  84. }
  85. JSONObject jsonObject = JSON.parseObject(sync);
  86. String code = jsonObject.getString("code");
  87. if ("500".equals(code)) {
  88. throw new ServiceException("网络异常请重新获取哦~");
  89. }
  90. String phone = jsonObject.getString("phone");
  91. if (org.apache.commons.lang3.StringUtils.isBlank(phone)) {
  92. throw new ServiceException("网络异常请重新获取哦~");
  93. }
  94. String openid = jsonObject.getString("openid");
  95. if (org.apache.commons.lang3.StringUtils.isBlank(openid)) {
  96. throw new ServiceException("网络异常请重新获取哦~");
  97. }
  98. // UserInfo userInfo = new UserInfo();
  99. // userInfo.setPhone(phone);
  100. // userInfo = userInfoDao.selectOne(userInfo);
  101. // Date now = new Date();
  102. // if (userInfo != null) {
  103. // UserInfo info = new UserInfo();
  104. // info.setId(userInfo.getId());
  105. // info.setOpenId(openid);
  106. // info.setUpdateTime(now);
  107. // userInfoDao.updateByPrimaryKeySelective(info);
  108. // return phone;
  109. // }
  110. // userInfo = new UserInfo();
  111. // userInfo.setOpenId(openid);
  112. // userInfo.setPhone(phone);
  113. // userInfo.setUsername("");
  114. // userInfo.setIdNumber("");
  115. // userInfo.setRoleId(1);
  116. // userInfo.setAuthId(0);
  117. // userInfo.setUpdateTime(now);
  118. // userInfo.setCreateTime(now);
  119. // userInfoDao.insertSelective(userInfo);
  120. return phone;
  121. }
  122. @Override
  123. public void confirmFaceNotify(String result) {
  124. Map<String, Object> map = JsonUtils.toMap(result);
  125. if (CollectionUtils.isEmpty(map)) {
  126. return;
  127. }
  128. String taskId = map.get("taskId").toString();
  129. String name = map.get("name").toString();
  130. String phone = map.get("phone").toString();
  131. String idNumber = map.get("idNumber").toString();
  132. if (!StringUtils.hasText(taskId)) {
  133. return;
  134. }
  135. if (!StringUtils.hasText(name)) {
  136. return;
  137. }
  138. if (!StringUtils.hasText(phone)) {
  139. return;
  140. }
  141. if (!StringUtils.hasText(idNumber)) {
  142. return;
  143. }
  144. Date now = new Date();
  145. UserInfo userInfo = new UserInfo();
  146. userInfo.setPhone(phone);
  147. userInfo = userInfoDao.selectOne(userInfo);
  148. String image = buildImage(map.get("img").toString(), phone);
  149. if (userInfo == null) {
  150. userInfo = new UserInfo();
  151. userInfo.setUsername(name);
  152. userInfo.setPhone(phone);
  153. userInfo.setIdNumber(idNumber);
  154. userInfo.setRoleId(1);
  155. userInfo.setAuthId(0);
  156. userInfo.setAvatar(image);
  157. userInfo.setUpdateTime(now);
  158. userInfo.setCreateTime(now);
  159. userInfoDao.insertSelective(userInfo);
  160. } else {
  161. userInfo.setUsername(name);
  162. userInfo.setPhone(phone);
  163. userInfo.setAvatar(image);
  164. userInfo.setIdNumber(idNumber);
  165. userInfo.setUpdateTime(now);
  166. userInfoDao.updateByPrimaryKeySelective(userInfo);
  167. }
  168. UserFaceRecords faceRecords = new UserFaceRecords();
  169. faceRecords.setTaskId(taskId);
  170. faceRecords.setUserId(userInfo.getId());
  171. faceRecords.setPhone(userInfo.getPhone());
  172. faceRecords.setIdNumber(userInfo.getIdNumber());
  173. faceRecords.setUsername(name);
  174. faceRecords.setPhoto(image);
  175. faceRecords.setToken(map.get("token").toString());
  176. faceRecords.setCreateTime(now);
  177. userFaceRecordsDao.insertSelective(faceRecords);
  178. }
  179. @Override
  180. public PageInfo<UserInfoVO> getUsers(RestDTO<QueryUser> dto) {
  181. PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
  182. return new PageInfo<>(userInfoDao.getUsersByFacePass(dto.getData()));
  183. }
  184. @Override
  185. public Map<String, Object> doGetFacePass(Integer userId, String taskId) {
  186. log.info("数据*************; " + userId + "*******************" + taskId);
  187. String admin = taskId.split("-")[0];
  188. //返回值
  189. Map<String, Object> map = new HashMap<>(2);
  190. // 人员类型
  191. Integer type = 3;
  192. //时间
  193. Date now = new Date();
  194. //
  195. Date date = null;
  196. //用户信息
  197. UserInfo userInfo = userInfoDao.selectByPrimaryKey(userId);
  198. if (org.apache.commons.lang3.StringUtils.isBlank(userInfo.getPhone())) {
  199. throw new ServiceException("手机号为空请重新登录哦~");
  200. }
  201. //校验是否在黑名单
  202. UserBlackList userBlackList = new UserBlackList();
  203. userBlackList.setPhone(userBlackList.getPhone());
  204. userBlackList.setAdminId(Integer.valueOf(admin));
  205. UserBlackList userBlackOne = userBlackListDao.selectOne(userBlackList);
  206. if (userBlackOne != null) {
  207. throw new ServiceException("禁止下发哦~");
  208. }
  209. //常客
  210. UserWhitelist byPhoneAndId = userWhitelistdao.getByPhoneAndId(userInfo.getPhone(), null, Integer.valueOf(admin));
  211. // 访客
  212. UserVisitorList userVisitorList = userVisitorListDao.getByPhoneAndId(userInfo.getPhone(), Integer.valueOf(admin));
  213. //常客
  214. if (byPhoneAndId != null) {
  215. type = 2;
  216. //一年
  217. date = DateUtils.addYears(now, 1);
  218. } else {
  219. //12 小时
  220. date = DateUtils.addHours(now, 12);
  221. }
  222. //人脸下发
  223. try {
  224. downFaceByTask(userInfo, DateUtils.addMinutes(now, -10), date, type, taskId, byPhoneAndId, userVisitorList);
  225. } catch (Exception e) {
  226. log.info("日志" + e.getMessage());
  227. e.printStackTrace();
  228. throw new ServiceException("下发失败请重新再试哦~");
  229. }
  230. map.put("status", true);
  231. map.put("date", date);
  232. return map;
  233. }
  234. /**
  235. * @param userInfo 用户信息
  236. * @param startTime 开始时间
  237. * @param endTime 结束时间
  238. * @param type 类型
  239. * @param taskId id
  240. * @param byPhoneAndId 访客信息
  241. */
  242. @Transactional(rollbackFor = Exception.class)
  243. public void downFaceByTask(UserInfo userInfo, Date startTime, Date endTime, Integer type, String taskId, UserWhitelist byPhoneAndId, UserVisitorList userVisitorList) throws Exception {
  244. //获取adminId
  245. String admin = taskId.split("-")[0];
  246. //获取 adminId下的所有设备
  247. List<FaceDevice> snList = faceDeviceDao.getSnList(Integer.parseInt(admin));
  248. Map<String, Object> result;
  249. //天波人脸服务请求日志表
  250. FaceRequestLog requestLog;
  251. Date now = new Date();
  252. //人脸下发表
  253. FacePass facePass;
  254. //唯一id
  255. Long faceTaskId;
  256. //人脸清除定时任务
  257. FaceTask faceTask;
  258. //信息
  259. String msg;
  260. //人脸下发到设备里面
  261. if (!snList.isEmpty()) {
  262. for (FaceDevice device : snList) {
  263. Map<String, Object> params = Maps.newHashMapWithExpectedSize(3);
  264. List<Map<String, Object>> data = Lists.newArrayListWithExpectedSize(1);
  265. Map<String, Object> dataItem = Maps.newHashMapWithExpectedSize(8);
  266. // 下发参数
  267. dataItem.put("pin", userInfo.getId());
  268. dataItem.put("name", userInfo.getUsername());
  269. dataItem.put("validPeriodStart", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, startTime));
  270. dataItem.put("validPeriodEnd", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, endTime));
  271. dataItem.put("userType", 0);
  272. dataItem.put("photo", userInfo.getAvatar());
  273. if (type == 2) {
  274. dataItem.put("rightno", 105);
  275. } else if (type == 3) {
  276. dataItem.put("rightno", 104);
  277. }
  278. dataItem.put("cardid", userInfo.getIdNumber());
  279. data.add(dataItem);
  280. params.put("SN", device.getSn());
  281. params.put("Data", data);
  282. //天波人脸服务请求日志表
  283. requestLog = new FaceRequestLog();
  284. requestLog.setName("下发人脸");
  285. requestLog.setContext("/downUser");
  286. requestLog.setParams(JsonUtils.toJson(params));
  287. requestLog.setStatus(1);
  288. requestLog.setUsedTime(0L);
  289. requestLog.setUpdateTime(now);
  290. requestLog.setCreateTime(now);
  291. //人脸下发记录表
  292. faceRequestLogDao.insertSelective(requestLog);
  293. params.put("taskId", requestLog.getId());
  294. //人脸下发表
  295. facePass = new FacePass();
  296. facePass.setUserId(userInfo.getId());
  297. facePass.setDeviceSn(device.getSn());
  298. facePass.setDeviceId(device.getId());
  299. facePass.setStartTime(startTime);
  300. facePass.setEndTime(endTime);
  301. facePass.setAdminId(Integer.valueOf(admin));
  302. facePass.setStatus(2);
  303. facePass.setType(type);
  304. facePass.setTaskId(taskId);
  305. facePass.setUpdateTime(now);
  306. facePass.setCreateTime(now);
  307. // //人脸下发
  308. // try {
  309. // result = tbDeviceFaceService.downUser(params);
  310. // log.info("下发人脸downFace = {}", result);
  311. // if (result.get("msg") != null) {
  312. // msg = result.get("msg").toString();
  313. // if (msg.contains("不在线")) {
  314. // //设备不在线 重试 3次
  315. // Boolean retry = triggerRetry(params);
  316. // if (!retry) {
  317. // facePass.setStatus(3);
  318. // }
  319. // }
  320. // }
  321. // } catch (Exception e) {
  322. // log.info("下发失败 原因 {}", e.getMessage());
  323. // //设备不在线 重试 3次
  324. // Boolean retry = triggerRetry(params);
  325. // if (!retry) {
  326. // facePass.setStatus(3);
  327. // }
  328. // }
  329. // //添加人脸
  330. // facePassDao.insertSelective(facePass);
  331. //人脸下发
  332. //添加人脸
  333. facePassDao.insertSelective(facePass);
  334. asyncTriggerRetryImpl.send(params, facePass);
  335. faceTaskId = faceTaskDao.getFaceTaskId(device.getSn(), userInfo.getId());
  336. faceTask = new FaceTask();
  337. faceTask.setId(faceTaskId);
  338. faceTask.setTaskTime(facePass.getEndTime());
  339. faceTask.setStatus(0);
  340. faceTask.setUpdateTime(now);
  341. if (faceTaskId == null) {
  342. faceTask.setDeviceSn(device.getSn());
  343. faceTask.setUserId(userInfo.getId());
  344. faceTask.setCreateTime(now);
  345. faceTaskDao.insertSelective(faceTask);
  346. continue;
  347. }
  348. faceTaskDao.updateByPrimaryKeySelective(faceTask);
  349. }
  350. }
  351. if (byPhoneAndId != null) {
  352. //更新常客列表
  353. UserWhitelist userWhitelist = new UserWhitelist();
  354. userWhitelist.setStatus(1);
  355. userWhitelist.setUpdateTime(now);
  356. userWhitelist.setId(byPhoneAndId.getId());
  357. userWhitelist.setAvatar(userInfo.getAvatar());
  358. userWhitelist.setIdNumber(userInfo.getIdNumber());
  359. userWhitelistdao.updateByPrimaryKeySelective(userWhitelist);
  360. return;
  361. }
  362. UserVisitorList userVisitorOne = new UserVisitorList();
  363. if (userVisitorList == null) {
  364. //更新游客列表
  365. userVisitorOne.setAdminId(Integer.valueOf(admin));
  366. userVisitorOne.setCreateTime(now);
  367. userVisitorOne.setPhone(userInfo.getPhone());
  368. userVisitorOne.setAvatar(userInfo.getAvatar());
  369. userVisitorOne.setIdNumber(userInfo.getIdNumber());
  370. userVisitorOne.setName(userInfo.getUsername());
  371. userVisitorListDao.insert(userVisitorOne);
  372. } else {
  373. //更新游客列表
  374. userVisitorOne.setAdminId(Integer.valueOf(admin));
  375. userVisitorOne.setId(userVisitorList.getId());
  376. userVisitorOne.setUpdateTime(now);
  377. userVisitorOne.setAvatar(userInfo.getAvatar());
  378. userVisitorListDao.updateByPrimaryKeySelective(userVisitorOne);
  379. userVisitorOne = userVisitorListDao.selectByPrimaryKey(userVisitorList.getId());
  380. }
  381. //开启异步线程
  382. UserVisitorList finalUserVisitorOne = userVisitorOne;
  383. taskPoolConfig.executor().execute(new Runnable() {
  384. @Override
  385. public void run() {
  386. Map<String, String> map = new HashMap<>(1);
  387. map.put("user-visitor", JSONObject.toJSONString(finalUserVisitorOne));
  388. nettyClient.sendMessage(JSON.toJSONString(map));
  389. }
  390. });
  391. }
  392. private String buildImage(String image, String phone) {
  393. String path = null;
  394. if (StringUtils.hasText(image)) {
  395. String name = phone + UUID.randomUUID().toString().concat(".png");
  396. path = FileUploadUtil.uploadUtil(image, name);
  397. return path;
  398. }
  399. return path;
  400. }
  401. }