package com.yx.face.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.yx.face.boot.config.TaskPoolConfig;
import com.yx.face.boot.restful.RestDTO;
import com.yx.face.boot.restful.ServiceException;
import com.yx.face.boot.uitls.*;
import com.yx.face.dao.*;
import com.yx.face.model.dto.WxInfoDTO;
import com.yx.face.model.entity.*;
import com.yx.face.model.query.QueryUser;
import com.yx.face.model.vo.UserInfoVO;
import com.yx.face.netty_client.NettyClient;
import com.yx.face.service.UserInfoService;
import com.yx.face.service.feign.TBDeviceFaceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.*;
/**
* @description: 用户基础信息表(UserInfo)表服务实现类
* @author: PWB
* @since: 1.0
* @date: 2021-06-04 14:25:50
*/
@Slf4j
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Resource
private UserInfoDao userInfoDao;
@Resource
private UserFaceRecordsDao userFaceRecordsDao;
@Resource
private FacePassDao facePassDao;
@Resource
private FaceDeviceDao faceDeviceDao;
@Resource
private FaceRequestLogDao faceRequestLogDao;
@Resource
private FaceTaskDao faceTaskDao;
@Autowired
private TBDeviceFaceService tbDeviceFaceService;
//常客
@Resource
private UserWhitelistDao userWhitelistdao;
@Resource
private UserFaceRecordsFromDao userFaceRecordsFromDao;
@Resource
private UserVisitorListDao userVisitorListDao;
@Resource
private UserBlackListDao userBlackListDao;
@Resource
private UserInfoFromDao userInfoFromDao;
@Autowired
private TaskPoolConfig taskPoolConfig;
@Autowired
private NettyClient nettyClient;
@Autowired
private AsyncTriggerRetryImpl asyncTriggerRetryImpl;
// @Value("${wx.phone.url}")
private static final String wxUrl = "http://192.168.99.11:9810/winxin-fyzd/weiXin/getPhone";
@Override
public String getWxPhone(WxInfoDTO dto) {
String sync = OkHttpUtils.builder().url(wxUrl)
// 有参数的话添加参数,可多个
.addParam("code", dto.getCode())
.addParam("signature", dto.getSignature())
.addParam("rawData", dto.getRawData())
.addParam("iv", dto.getIv())
.addParam("encryptedData", dto.getEncryptedData())
.post(true)
.sync();
if (org.apache.commons.lang3.StringUtils.isBlank(sync)) {
throw new ServiceException("获取登录后的session信息失败");
}
JSONObject jsonObject = JSON.parseObject(sync);
String code = jsonObject.getString("code");
if ("500".equals(code)) {
throw new ServiceException("网络异常请重新获取哦~");
}
String phone = jsonObject.getString("phone");
if (org.apache.commons.lang3.StringUtils.isBlank(phone)) {
throw new ServiceException("网络异常请重新获取哦~");
}
String openid = jsonObject.getString("openid");
if (org.apache.commons.lang3.StringUtils.isBlank(openid)) {
throw new ServiceException("网络异常请重新获取哦~");
}
// UserInfo userInfo = new UserInfo();
// userInfo.setPhone(phone);
// userInfo = userInfoDao.selectOne(userInfo);
// Date now = new Date();
// if (userInfo != null) {
// UserInfo info = new UserInfo();
// info.setId(userInfo.getId());
// info.setOpenId(openid);
// info.setUpdateTime(now);
// userInfoDao.updateByPrimaryKeySelective(info);
// return phone;
// }
// userInfo = new UserInfo();
// userInfo.setOpenId(openid);
// userInfo.setPhone(phone);
// userInfo.setUsername("");
// userInfo.setIdNumber("");
// userInfo.setRoleId(1);
// userInfo.setAuthId(0);
// userInfo.setUpdateTime(now);
// userInfo.setCreateTime(now);
// userInfoDao.insertSelective(userInfo);
return phone;
}
@Override
public void confirmFaceNotify(String result) {
Map map = JsonUtils.toMap(result);
if (CollectionUtils.isEmpty(map)) {
return;
}
String taskId = map.get("taskId").toString();
String name = map.get("name").toString();
String phone = map.get("phone").toString();
String idNumber = map.get("idNumber").toString();
if (!StringUtils.hasText(taskId)) {
return;
}
if (!StringUtils.hasText(name)) {
return;
}
if (!StringUtils.hasText(phone)) {
return;
}
if (!StringUtils.hasText(idNumber)) {
return;
}
Date now = new Date();
UserInfo userInfo = new UserInfo();
userInfo.setPhone(phone);
userInfo = userInfoDao.selectOne(userInfo);
String image = buildImage(map.get("img").toString(), phone);
if (userInfo == null) {
userInfo = new UserInfo();
userInfo.setUsername(name);
userInfo.setPhone(phone);
userInfo.setIdNumber(idNumber);
userInfo.setRoleId(1);
userInfo.setAuthId(0);
userInfo.setAvatar(image);
userInfo.setUpdateTime(now);
userInfo.setCreateTime(now);
userInfoDao.insertSelective(userInfo);
} else {
userInfo.setUsername(name);
userInfo.setPhone(phone);
userInfo.setAvatar(image);
userInfo.setIdNumber(idNumber);
userInfo.setUpdateTime(now);
userInfoDao.updateByPrimaryKeySelective(userInfo);
}
UserFaceRecords faceRecords = new UserFaceRecords();
faceRecords.setTaskId(taskId);
faceRecords.setUserId(userInfo.getId());
faceRecords.setPhone(userInfo.getPhone());
faceRecords.setIdNumber(userInfo.getIdNumber());
faceRecords.setUsername(name);
faceRecords.setPhoto(image);
faceRecords.setToken(map.get("token").toString());
faceRecords.setCreateTime(now);
userFaceRecordsDao.insertSelective(faceRecords);
}
@Override
public PageInfo getUsers(RestDTO dto) {
PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
return new PageInfo<>(userInfoDao.getUsersByFacePass(dto.getData()));
}
@Override
public Map doGetFacePass(Integer userId, String taskId) {
log.info("数据*************; " + userId + "*******************" + taskId);
String admin = taskId.split("-")[0];
//返回值
Map map = new HashMap<>(2);
// 人员类型
Integer type = 3;
//时间
Date now = new Date();
//
Date date = null;
//用户信息
UserInfo userInfo = userInfoDao.selectByPrimaryKey(userId);
if (org.apache.commons.lang3.StringUtils.isBlank(userInfo.getPhone())) {
throw new ServiceException("手机号为空请重新登录哦~");
}
//校验是否在黑名单
UserBlackList userBlackList = new UserBlackList();
userBlackList.setPhone(userBlackList.getPhone());
userBlackList.setAdminId(Integer.valueOf(admin));
UserBlackList userBlackOne = userBlackListDao.selectOne(userBlackList);
if (userBlackOne != null) {
throw new ServiceException("禁止下发哦~");
}
//常客
UserWhitelist byPhoneAndId = userWhitelistdao.getByPhoneAndId(userInfo.getPhone(), null, Integer.valueOf(admin));
// 访客
UserVisitorList userVisitorList = userVisitorListDao.getByPhoneAndId(userInfo.getPhone(), Integer.valueOf(admin));
//常客
if (byPhoneAndId != null) {
type = 2;
//一年
date = DateUtils.addYears(now, 1);
} else {
//12 小时
date = DateUtils.addHours(now, 12);
}
//人脸下发
try {
downFaceByTask(userInfo, DateUtils.addMinutes(now, -10), date, type, taskId, byPhoneAndId, userVisitorList);
} catch (Exception e) {
log.info("日志" + e.getMessage());
e.printStackTrace();
throw new ServiceException("下发失败请重新再试哦~");
}
map.put("status", true);
map.put("date", date);
return map;
}
/**
* @param userInfo 用户信息
* @param startTime 开始时间
* @param endTime 结束时间
* @param type 类型
* @param taskId id
* @param byPhoneAndId 访客信息
*/
@Transactional(rollbackFor = Exception.class)
public void downFaceByTask(UserInfo userInfo, Date startTime, Date endTime, Integer type, String taskId, UserWhitelist byPhoneAndId, UserVisitorList userVisitorList) throws Exception {
//获取adminId
String admin = taskId.split("-")[0];
//获取 adminId下的所有设备
List snList = faceDeviceDao.getSnList(Integer.parseInt(admin));
Map result;
//天波人脸服务请求日志表
FaceRequestLog requestLog;
Date now = new Date();
//人脸下发表
FacePass facePass;
//唯一id
Long faceTaskId;
//人脸清除定时任务
FaceTask faceTask;
//信息
String msg;
//人脸下发到设备里面
if (!snList.isEmpty()) {
for (FaceDevice device : snList) {
Map params = Maps.newHashMapWithExpectedSize(3);
List