package com.thhy.staff.modules.biz.platuser.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.api.utils.StringUtils; import com.thhy.general.common.BasicMessage; import com.thhy.general.common.BasicStatus; import com.thhy.general.config.SysUserInfo; import com.thhy.general.exception.BasicException; import com.thhy.general.utils.ScreenMqUtils; import com.thhy.general.utils.UserInfoUtils; import com.thhy.staff.config.EmqxConfig; import com.thhy.staff.config.FaceConfig; import com.thhy.staff.modules.biz.applyhistory.entity.UserApplyHistory; import com.thhy.staff.modules.biz.applyhistory.mapper.UserApplyHistoryMapper; import com.thhy.staff.modules.biz.depart.entity.OtherUser; import com.thhy.staff.modules.biz.face.entity.MqContent; import com.thhy.staff.modules.biz.face.mapper.FaceDeviceMapper; import com.thhy.staff.modules.biz.group.entity.GroupUser; import com.thhy.staff.modules.biz.netty.NettyServerHandler; import com.thhy.staff.modules.biz.platuser.entity.*; import com.thhy.staff.modules.biz.platuser.mapper.PlatUserMapper; import com.thhy.staff.modules.biz.platuser.service.PlatUserService; import com.thhy.staff.utils.MqUtils; import com.thhy.staff.utils.ProcessFlag; import com.thhy.staff.utils.StaffNoUtils; import io.netty.channel.ChannelHandlerContext; import org.checkerframework.checker.units.qual.A; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.concurrent.CopyOnWriteArraySet; /** * 服务实现类 * @author zhang_xiao_bo * @since 2023-03-30 12:49:45 */ @Service public class PlatUserServiceImpl implements PlatUserService { private Logger logger = LoggerFactory.getLogger(PlatUserServiceImpl.class); @Autowired private PlatUserMapper platUserMapper; @Autowired private UserApplyHistoryMapper historyMapper; @Autowired private ScreenMqUtils screenMqUtils; @Autowired private FaceDeviceMapper faceDeviceMapper; @Autowired private EmqxConfig emqxConfig; @Autowired private FaceConfig faceConfig; public PlatUser get(Serializable id){ return platUserMapper.queryById(id); } @Override public List queryForPullDown(PlatUserDto platUserDto) { SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(); if(platUserDto==null)platUserDto = new PlatUserDto(); platUserDto.setCompanyId(userInfo.getCompanyId()); return platUserMapper.queryForPullDown(platUserDto); } @Override public List queryForPullDownDorm(PlatUserDto platUserDto) { SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(); if(platUserDto==null)platUserDto = new PlatUserDto(); platUserDto.setCompanyId(userInfo.getCompanyId()); return platUserMapper.queryForPullDownDorm(platUserDto); } public List findList(PlatUserDto platUserDto){ SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); platUserDto.setCompanyId(sysUserInfo.getCompanyId()); return platUserMapper.findList(platUserDto); } @Override public List findListForExport(PlatUserDto platUserDto, String token) { SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(token); platUserDto.setCompanyId(sysUserInfo.getCompanyId()); return platUserMapper.findList(platUserDto); } /** * 增加和修改 * @param platUserDto */ @Transactional public void addPlatUser(PlatUserDto platUserDto){ SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo(); String syncSysFlag = "false"; //String syncJobNum = ""; if(platUserDto.getUserId() == null){ //增加操作 String userId = platUserMapper.queryIdByPhone(platUserDto.getPhone()); if(!StringUtils.isEmpty(userId)){ throw new BasicException(BasicStatus.PHONE_IS_EXIST); } String sysUserId = platUserMapper.querySysUserIdByPhone(platUserDto.getPhone()); if(!StringUtils.isEmpty(sysUserId)){ throw new BasicException(BasicStatus.PHONE_IS_EXIST_SYSUSER); } String userIdno = platUserMapper.queryIdByIdno(platUserDto.getIdNo()); if(!StringUtils.isEmpty(userIdno)){ throw new BasicException(BasicStatus.IDNO_IS_EXIST); } int maxno = platUserMapper.queryMaxJobNum(platUserDto.getUserType()); String newJobNum = StaffNoUtils.create(platUserDto.getUserType(),maxno); platUserDto.setJobNum(newJobNum); platUserDto.setCreateUser(sysUserInfo.getUserId()); platUserDto.setFromPlat(1); //PC platUserMapper.insert(platUserDto); if(platUserDto.getIsLogin()==1) syncSysFlag="first"; }else{ //修改操作 String userId = platUserMapper.queryIdByPhone(platUserDto.getPhone()); String userIdno = platUserMapper.queryIdByIdno(platUserDto.getIdNo()); if (!StringUtils.isEmpty(userId)) { if(!platUserDto.getUserId().equals(userId)){ throw new BasicException(BasicStatus.PHONE_IS_EXIST); } } if (!StringUtils.isEmpty(userIdno)) { if(!platUserDto.getUserId().equals(userIdno)){ throw new BasicException(BasicStatus.IDNO_IS_EXIST); } } PlatUser plat = platUserMapper.queryById(platUserDto.getUserId()); platUserDto.setUpdateUser(sysUserInfo.getUserId()); platUserDto.setUpdateTime(new Date()); if(platUserDto.getIsLogin()==plat.getIsLogin()){ syncSysFlag="false"; }else{ if(platUserDto.getIsLogin()==1)syncSysFlag="updatesync"; if(platUserDto.getIsLogin()==2)syncSysFlag="updatedel"; platUserDto.setJobNum(plat.getJobNum()); } platUserMapper.update(platUserDto); } if("first".equals(syncSysFlag)){ //同步用户表 SysUsers sysUsers = StaffNoUtils.PlatoSys(platUserDto); platUserMapper.insertSysUser(sysUsers); //BasicResult basicResult = sysUserService.insertSysUser(JSON.toJSONString(sysUsers)); //CheckResult.check(basicResult); }else if(!"false".equals(syncSysFlag)){ if("updatesync".equals(syncSysFlag)){ SysUsers sysUsers = StaffNoUtils.PlatoSys(platUserDto); platUserMapper.insertSysUser(sysUsers); }else{ platUserMapper.syncDelete(platUserDto.getJobNum()); } } String posId = platUserDto.getPosId(); String departId = platUserDto.getDepartId(); String groups = platUserDto.getGroups(); platUserMapper.deleteDepartUserByUser(platUserDto.getUserId()); platUserMapper.insertDepartUser(new OtherUser(departId, platUserDto.getUserId())); platUserMapper.deletePositionUserByUser(platUserDto.getUserId()); platUserMapper.insertPositionUser(new OtherUser(posId, platUserDto.getUserId())); platUserMapper.deleteGroupUserByUser(platUserDto.getUserId()); if (!StringUtils.isEmpty(platUserDto.getGroups())) { String[] groupArray = new String[]{groups}; if(groups.contains(",")){ groupArray = groups.split(","); } for(String groupId : groupArray){ platUserMapper.insertGroupUser(new GroupUser(groupId, platUserDto.getUserId())); } } } /** * 删除 * @param userId */ @Transactional public void delete(Serializable userId){ PlatUser platUser = platUserMapper.queryPhoneAndIsLogin(userId); if (platUser.getIsLogin()==1) { platUserMapper.deleteSysUserByPlat(platUser.getUserId()); } platUserMapper.deleteDepartUserByUser(platUser.getUserId()); platUserMapper.deletePositionUserByUser(platUser.getUserId()); platUserMapper.deleteGroupUserByUser(platUser.getUserId()); platUserMapper.deletelogic(userId); } @Override @Transactional public void register(PlatUserDto platUserDto) { if(StringUtils.isEmpty(platUserDto.getOpenId())){ throw new BasicException(BasicStatus.OPEN_ID_IS_MISS); } MpRegisterInfoVo reginfo = platUserMapper.queryByOpenId(platUserDto.getOpenId()); if(reginfo==null){ String phone = platUserMapper.queryIdByPhone(platUserDto.getPhone()); if(!StringUtils.isEmpty(phone)){ throw new BasicException(BasicStatus.PHONE_IS_EXIST); } String userIdno = platUserMapper.queryIdByIdno(platUserDto.getIdNo()); if(!StringUtils.isEmpty(userIdno)){ throw new BasicException(BasicStatus.IDNO_IS_EXIST); } int maxno = platUserMapper.queryMaxJobNum(2); String newJobNum = StaffNoUtils.create(2,maxno); platUserDto.setJobNum(newJobNum); platUserDto.setUserType(2);//劳务人员 platUserDto.setApplyFlag(0); platUserDto.setIsLogin(1); platUserMapper.insert(platUserDto); platUserMapper.deletePositionUserByUser(platUserDto.getUserId()); platUserMapper.insertPositionUser(new OtherUser(platUserDto.getPosId(), platUserDto.getUserId())); }else { if(!reginfo.getCompanyId().equals(platUserDto.getCompanyId())){ throw new BasicException(BasicStatus.USER_ALREADY_HAS_COMPANY); } if(reginfo.getApplyFlag()==1){ throw new BasicException(BasicStatus.REGISTER_IS_PASS); //不要重复注册 } String userId = platUserMapper.queryIdByPhone(platUserDto.getPhone()); String userIdno = platUserMapper.queryIdByIdno(platUserDto.getIdNo()); if (!StringUtils.isEmpty(userId)) { if(!reginfo.getUserId().equals(userId)){ throw new BasicException(BasicStatus.PHONE_IS_EXIST); } } if (!StringUtils.isEmpty(userIdno)) { if(!reginfo.getUserId().equals(userIdno)){ throw new BasicException(BasicStatus.IDNO_IS_EXIST); } } platUserDto.setUserId(reginfo.getUserId()); platUserDto.setApplyFlag(0); platUserMapper.update(platUserDto); if(!reginfo.getPosId().equals(platUserDto.getPosId())){ platUserMapper.deletePositionUserByUser(platUserDto.getUserId()); platUserMapper.insertPositionUser(new OtherUser(platUserDto.getPosId(), platUserDto.getUserId())); } } UserApplyHistory userApplyHistory = new UserApplyHistory(); userApplyHistory.setPlatUserId(platUserDto.getUserId()); userApplyHistory.setProcessFlag(ProcessFlag.REG.getValue()); userApplyHistory.setApplyResult(1); userApplyHistory.setCreateUser(platUserDto.getUserId()); historyMapper.insert(userApplyHistory); //SysUsers sysUsers = StaffNoUtils.PlatoSys(platUserDto); //platUserMapper.insertSysUser(sysUsers); } @Override public Map checkuser(PlatUserDto platUserDto) { Map map = new HashMap<>(); //根据openId获取platUser信息 MpRegisterInfoVo mpRegisterInfoVo = platUserMapper.queryByOpenId(platUserDto.getOpenId()); //判断是否审批完成 if(mpRegisterInfoVo==null){ map.put("regstatus",0); //新用户需要注册 return map; } if(mpRegisterInfoVo.getApplyFlag()==1){ map.put("regstatus",1); //已经审批完成 return map; } if(mpRegisterInfoVo.getApplyFlag()==0){ map.put("regstatus",2); //等待审核 return map; } if(mpRegisterInfoVo.getApplyFlag()==2){ map.put("regstatus",3); //审核未通过 map.put("reginfo",mpRegisterInfoVo); List applyHistories = platUserMapper.queryHistoryByUserId(mpRegisterInfoVo.getUserId()); map.put("applyRecord",applyHistories); return map; } return map; } @Override public Map applyDetail(PlatUserDto platUserDto) { Map map = new HashMap<>(); MpRegisterInfoVo mpRegisterInfoVo = platUserMapper.queryByUserId(platUserDto.getUserId()); map.put("reginfo",mpRegisterInfoVo); List applyHistories = platUserMapper.queryHistoryByUserId(mpRegisterInfoVo.getUserId()); map.put("applyRecord",applyHistories); return map; } @Override public List applyList(PlatUserDto platUserDto) { SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(); if(platUserDto==null) platUserDto = new PlatUserDto(); platUserDto.setCompanyId(userInfo.getCompanyId()); return platUserMapper.queryApplyList(platUserDto); } @Override @Transactional public void apply(UserApplyHistory userApplyHistory) { SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(); userApplyHistory.setCreateUser(userInfo.getUserId()); if(userApplyHistory.getApplyResult()==1){ userApplyHistory.setProcessFlag(ProcessFlag.APPLY_PASS.getValue()); }else { userApplyHistory.setProcessFlag(ProcessFlag.APPLY_NOPASS.getValue()); } historyMapper.insert(userApplyHistory); platUserMapper.updateApplyStatus(userApplyHistory.getUserId(), userApplyHistory.getApplyResult()); if(userApplyHistory.getApplyResult()==1){ PlatUserDto platUserDto = platUserMapper.queryForDtoByUserId(userApplyHistory.getUserId()); SysUsers sysUsers = StaffNoUtils.PlatoSys(platUserDto); platUserMapper.insertSysUser(sysUsers); platUserMapper.deleteDepartUserByUser(userApplyHistory.getUserId()); platUserMapper.insertDepartUser(new OtherUser(userApplyHistory.getDepartId(), platUserDto.getUserId())); } } @Override public void testFace(FaceDto faceDto) { CopyOnWriteArraySet CTXS= NettyServerHandler.CTXS; logger.info("netty链接个数"+CTXS.size()); faceDto.setOp(1); /*CopyOnWriteArraySet SESSIONS = FaceServer.SESSIONS; SESSIONS.forEach(session ->{ try { if (session.isOpen()) { session.getBasicRemote().sendText(JSON.toJSONString(faceDto)); logger.info("成功推送消息到局域网段"+session.getId()+"___"+session.getRequestURI().getHost()); } } catch (IOException e) { throw new RuntimeException(e); } });*/ CTXS.forEach(ctx ->{ if (!ctx.isRemoved()&&ctx.channel().isOpen()) { ctx.write(JSON.toJSONString(faceDto)); ctx.flush(); //logger.info("成功推送消息到局域网段"+session.getId()+"___"+session.getRequestURI().getHost()); } }); /*Map map = AcsMain.addFace(faceDto.getJobNum(),filePrefix+"/"+faceDto.getPhoto()); if(map.containsKey("code")){ if(Integer.parseInt(map.get("code").toString())!=0){ throw new BasicException(new BasicMessage(map.get("code").toString(),map.get("message").toString())); } }*/ } @Override public void addFace(FaceDto faceDto) { faceDto.setOp(1); FaceDto fd = platUserMapper.queryJobNumByUserId(faceDto.getUserId()); platUserMapper.updateFace(faceDto); if(faceDto.getSyncToDevice()==1){ //下发 List sns = faceDeviceMapper.queryDevSn(); MqContent mqContent = new MqContent("sync_person", faceConfig.getUrlPrefix()+faceConfig.getNotify()); JSONObject jsonObject = new JSONObject(); jsonObject.put("path",faceConfig.getUrlPrefix()+faceConfig.getSinglePer()); JSONObject pathParamJson = new JSONObject(); pathParamJson.put("dev_sno",""); pathParamJson.put("limit",10); pathParamJson.put("offset",0); pathParamJson.put("total",1); List userIds = new ArrayList<>(); userIds.add(faceDto.getUserId()); pathParamJson.put("person_list",userIds); pathParamJson.put("person_type","4"); jsonObject.put("path_params",pathParamJson); mqContent.setData(jsonObject); logger.info("下发人脸参数:"+JSON.toJSONString(mqContent)); MqUtils.createClient(emqxConfig,sns,JSON.toJSONString(mqContent)); /*Map map = AcsMain.addFace(fd.getJobNum(),filePrefix+"/"+fd.getPhoto()); if(map.containsKey("code")){ if(Integer.parseInt(map.get("code").toString())!=0){ throw new BasicException(new BasicMessage(map.get("code").toString(),map.get("message").toString())); } }*/ /*CopyOnWriteArraySet SESSIONS = FaceServer.SESSIONS; if(SESSIONS.size()<1){ throw new BasicException(new BasicMessage("99991","与门禁一体机失去链接")); } SESSIONS.forEach(session ->{ try { if (session.isOpen()) { faceDto.setPhoto(filePrefix+faceDto.getPhoto()); session.getBasicRemote().sendText(JSON.toJSONString(faceDto)); logger.info("成功推送消息到局域网段"+session.getId()+"___"+session.getRequestURI().getHost()); } } catch (IOException e) { throw new RuntimeException(e); } });*/ /*CopyOnWriteArraySet CTXS= NettyServerHandler.CTXS; if(CTXS.size()<1){ throw new BasicException(new BasicMessage("99991","与门禁一体机失去链接")); } if(CTXS.size()>1){ logger.info("多个客户端"+CTXS.size()); } CTXS.forEach(ctx ->{ if (!ctx.isRemoved()&&ctx.channel().isOpen()) { logger.info("即将推送消息到局域网段"); faceDto.setJobNum(fd.getJobNum()); faceDto.setRealName(fd.getRealName()); ctx.write(JSON.toJSONString(faceDto)); ctx.flush(); logger.info("成功推送消息到局域网段"); } });*/ } } @Override @Transactional public void delFace(FaceDto faceDto) { String userIds = faceDto.getUserIds(); if(StringUtils.isEmpty(userIds)){ throw new BasicException(BasicStatus.ERROR); } List sns = faceDeviceMapper.queryDevSn(); String[] userIdArray = new String[]{userIds}; if(userIds.contains(",")){ userIdArray = userIds.split(","); } JSONObject jsonObject = new JSONObject(); jsonObject.put("method","delete_person"); jsonObject.put("notify",faceConfig.getUrlPrefix()+"deleteNotify"); JSONObject userIdJSON = new JSONObject(); userIdJSON.put("userIds",userIdArray); jsonObject.put("params",userIdJSON); JSONObject dataJson = new JSONObject(); dataJson.put("person_list",userIdArray); dataJson.put("person_type","4"); jsonObject.put("data",dataJson); String content = jsonObject.toJSONString(); logger.info("删除指令打印"+content); MqUtils.createClient(emqxConfig,sns,content); } @Override public void doorhis(String eventLog) { JSONObject jsonObject = JSONObject.parseObject(eventLog); if(!jsonObject.containsKey("eventType")){ platUserMapper.addDoorHis(eventLog); return; } String eventType = jsonObject.getString("eventType"); if(!"AccessControllerEvent".equals(eventType)){ platUserMapper.addDoorHis(eventLog); return; } JSONObject control = jsonObject.getJSONObject("AccessControllerEvent"); String majorEventType = control.getString("majorEventType"); if(!"1".equals(majorEventType)&&!"5".equals(majorEventType)){ platUserMapper.addDoorHis(eventLog); return; } DoorLis doorLis = new DoorLis(); doorLis.setOriStr(eventLog); doorLis.setIpAddress(jsonObject.getString("ipAddress")); doorLis.setMacAddress(jsonObject.getString("macAddress")); doorLis.setNoticeType(Integer.parseInt(majorEventType)); if("5".equals(majorEventType)){ String subEventType = control.getString("subEventType"); if("75".equals(subEventType)){ doorLis.setVerify(1); doorLis.setName(control.getString("name")); doorLis.setEmployeeNoString(control.getString("employeeNoString")); }else if("76".equals(subEventType)){ doorLis.setVerify(2); } screenMqUtils.sendFace("update"); }else{ String subEventType = control.getString("subEventType"); if("1038".equals(subEventType)){ //联动事件报警 } } platUserMapper.insertDoorLis(doorLis); } @Override public Map faceRecord(String token) { SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(token); int userCount = platUserMapper.queryPlatUser(userInfo.getCompanyId()); Map map = new HashMap<>(); map.put("mod","facerecord"); map.put("totalUserCount",userCount); map.put("watchUserCount",0); map.put("dangerUserCount",0); List list = platUserMapper.queryDoorUser(); map.put("doorUserList",list); PlatUserFace platUserFace = platUserMapper.queryFaceUserByJobNum(list.get(0).getJobNum()); platUserFace.setPassTime(list.get(0).getCreateTime()); platUserFace.setRecordId(list.get(0).getId()); map.put("firstUserInfo",platUserFace); return map; } @Override public Map todayWorkUser(String token) { SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(token); int totalUserCount = platUserMapper.queryPlatUser(userInfo.getCompanyId()); int workUserCount = platUserMapper.countInDoorUserToday(); Map map = new HashMap<>(); map.put("mod","todayAttendance"); map.put("totalUserCount",totalUserCount); map.put("workUserCount",workUserCount); BigDecimal rate = new BigDecimal(0); if(totalUserCount!=0&&workUserCount!=0){ rate = new BigDecimal(workUserCount).divide(new BigDecimal(totalUserCount),2, RoundingMode.HALF_UP); } map.put("rate",rate); return map; } @Override public Map groupUserWork(String token) { SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(token); List groupWorkingList = platUserMapper.groupUserWorking(userInfo.getCompanyId()); groupWorkingList.forEach(gl -> { int count = platUserMapper.countFaceRecordByGroup(gl.getGroupId()); gl.setGroupWorkCount(count); }); Map map = new HashMap<>(); map.put("mod","groupWork"); map.put("groupWork",groupWorkingList); return map; } @Override public void doorlisWithPic(DoorLisPic doorLisPic) { if("5".equals(doorLisPic.getFirstType())){ if("4b".equals(doorLisPic.getSecType())){ doorLisPic.setVerify(1); }else if("4c".equals(doorLisPic.getSecType())){ doorLisPic.setVerify(2); }else if("15".equals(doorLisPic.getSecType())){ doorLisPic.setLockOp(1); }else if("16".equals(doorLisPic.getSecType())){ doorLisPic.setLockOp(2); } }else if("3".equals(doorLisPic.getFirstType())){ } platUserMapper.insertDoorListener(doorLisPic); } public static void main(String[] args) { MqContent mqContent = new MqContent("sync_person", "notify"); String uu = "02d32ee86bec2b11e4b23eb6"; JSONObject jsonObject = new JSONObject(); jsonObject.put("path","/path"); JSONObject pathParamJson = new JSONObject(); pathParamJson.put("dev_sno",""); pathParamJson.put("limit",10); pathParamJson.put("offset",0); pathParamJson.put("total",1); pathParamJson.put("person_list","[\""+uu+"\"]"); pathParamJson.put("person_type","4"); jsonObject.put("path_params",pathParamJson); mqContent.setData(jsonObject); System.out.println(pathParamJson.toJSONString()); } }