admin/src/views/business/retention.vue
@@ -76,6 +76,15 @@ </el-image> </template> </el-table-column> <el-table-column label="操作" min-width="120" fixed="right" > <template slot-scope="{row}"> <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:retention:delete']">标记离场</el-button> </template> </el-table-column> </el-table> <pagination @size-change="handleSizeChange" server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitEventController.java
@@ -71,14 +71,14 @@ @ApiOperation("分页查询") @PostMapping("/page") //@RequiresPermissions("business:visitevent:query") @RequiresPermissions("business:visitevent:query") public ApiResponse<PageData<VisitEvent>> findPage (@RequestBody PageWrap<VisitEvent> pageWrap) { return ApiResponse.success(visitEventService.findVisitPage(pageWrap)); } @ApiOperation("导出Excel") @PostMapping("/exportExcel") //@RequiresPermissions("business:visitevent:exportExcel") @RequiresPermissions("business:visitevent:exportExcel") public void exportExcel (@RequestBody PageWrap<VisitEvent> pageWrap, HttpServletResponse response) { ExcelExporter.build(VisitEvent.class).export(visitEventService.findPageExcel(pageWrap), "访客出入事件_" + System.currentTimeMillis(), response); } server/dmvisit_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -50,7 +50,7 @@ try { TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai"); //TimeZone tz = TimeZone.getTimeZone("GMT-01"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+'z"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+'08:00"); df.setTimeZone(tz); String nowAsISO = df.format(date); return nowAsISO; server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -141,8 +141,8 @@ @ExcelColumn(name="海康标识") private String hkId; @ApiModelProperty(value = "海康同步状态 0未同步 1已同步 2同步失败 3不符合下发条件 ", example = "1") @ExcelColumn(name="海康同步状态 0未同步 1已同步 2同步失败 3不符合下发条件") @ApiModelProperty(value = "海康同步状态 0未同步 1已同步 2同步失败 3不符合下发条件 4等待删除权限 ", example = "1") @ExcelColumn(name="海康同步状态 0未同步 1已同步 2同步失败 3不符合下发条件 4等待删除权限") private Integer hkStatus; @ApiModelProperty(value = "海康最近同步时间") server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitEventServiceImpl.java
@@ -277,10 +277,10 @@ VisitEvent::getEventType, pageWrap.getModel().getEventType()) .ge(StringUtils.isNotBlank(pageWrap.getModel().getStartTime()), VisitEvent::getHappenTime, VisitEvent::getCreateDate, pageWrap.getModel().getStartTime()) .le(StringUtils.isNotBlank(pageWrap.getModel().getEndTime()), VisitEvent::getHappenTime, VisitEvent::getCreateDate, pageWrap.getModel().getEndTime()) .eq(VisitEvent::getIsdeleted,Constants.ZERO); queryWrapper.orderByDesc(VisitEvent::getHappenTime); server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -67,6 +67,8 @@ public class VisitsServiceImpl implements VisitsService { @Autowired private RetentionMapper retentionMapper; @Autowired private VisitsMapper visitsMapper; @Autowired private ApproveMapper approveMapper; @@ -1159,6 +1161,10 @@ BaseResponse response = HKService.outVisitAppiontment(request); visitsMapper.update(null,new UpdateWrapper<Visits>().lambda().set(Visits::getStatus,Constants.VisitStatus.signout) .eq(Visits::getId,visitId)); //产出在场人员信息 retentionMapper.delete(new UpdateWrapper<Retention>().lambda() .eq(Retention::getType,Constants.memberType.visitor) .eq(Retention::getMemberId,visits.getMemberId())); } } server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -41,6 +41,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -84,6 +85,8 @@ @Autowired private DeviceEventJoinMapper deviceEventJoinMapper; @Value("${debug_model}") private Boolean isDebug; @Autowired private CarEventJoinMapper carEventJoinMapper; @@ -337,9 +340,11 @@ Date date = new Date(); int num =0; for(ErpUserListResponse response : list){ response.setPhone("1534569100"+num); response.setFaceImg("20223402/DM1005.png"); response.setIdNo("34112219880427200"+num); if(isDebug){ response.setPhone("1534569100"+num); response.setFaceImg("20223402/DM1005.png"); response.setIdNo("34112219880427200"+num); } num++; Company company = new Company(); if(StringUtils.isNotBlank(response.getOrgId())){ @@ -819,66 +824,80 @@ @Override public void userUpdate(UserUpdateRequest param){ try{ if(Objects.isNull(param) ||Objects.isNull(param.getId())//编码 ||StringUtils.isBlank(param.getName())//名称 ||StringUtils.isBlank(param.getIdNo())//证件号 ||Objects.isNull(param.getIdType())//证件类型 ||Objects.isNull(param.getSex())//性别 ||Objects.isNull(param.getOrgId())//所属组织编码 if(param.getIsdeleted() == 1){ if( Objects.isNull(param.getId()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } memberMapper.update(null,new UpdateWrapper<Member>().lambda() .eq(Member::getErpId,param.getId()) .eq(Member::getIsdeleted,Constants.ZERO) .set(Member::getIsdeleted,Constants.ONE) .set(Member::getHkStatus,Constants.ZERO) .set(Member::getEditDate,new Date()) .set(Member::getRemark,"待同步安防平台") ); }else { if( Objects.isNull(param) ||Objects.isNull(param.getId())//编码 ||StringUtils.isBlank(param.getName())//名称 ||StringUtils.isBlank(param.getIdNo())//证件号 ||Objects.isNull(param.getIdType())//证件类型 ||Objects.isNull(param.getSex())//性别 ||Objects.isNull(param.getOrgId())//所属组织编码 // ||StringUtils.isBlank(param.getFaceImg())//人脸照片 ||StringUtils.isBlank(param.getCode())//工号 ||StringUtils.isBlank(param.getPhone())//手机号 ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); ||StringUtils.isBlank(param.getCode())//工号 ||StringUtils.isBlank(param.getPhone())//手机号 ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getErpId,param.getId()).last("limit 1")); Company company = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,param.getOrgId()).last("limit 1")); if(Objects.isNull(company)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到组织信息"); } List<Integer> doorIds = null; if(Objects.isNull(member)){ member = new Member(); BeanUtils.copyProperties(param,member); member.setId(null); member.setCreateDate(new Date()); member.setRemark("待同步安防平台"); member.setHkStatus(Constants.ZERO); member.setErpStatus(Constants.ONE); member.setErpDate(new Date()); member.setErpId(param.getId()); member.setFsStatus(Constants.ZERO); member.setCompanyId(company.getId()); member.setType(Constants.memberType.internal); String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,param.getIdNo()); member.setIdcardNo(encryptIdNo); member.setStartTime(param.getValidStartTime()); member.setRoleId(param.getRoleIds()!=null?JSONObject.toJSONString(param.getRoleIds()):null); member.setEndTime(param.getValidEndTime()); member.setIdcardDecode(Constants.getTuominStr(param.getIdNo())); member.setErpOrgId(param.getOrgId()); memberMapper.insert(member); }else{ Integer id = member.getId(); BeanUtils.copyProperties(param,member); member.setId(id); member.setCompanyId(company.getId()); String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,param.getIdNo()); member.setIdcardNo(encryptIdNo); member.setIdcardDecode(Constants.getTuominStr(param.getIdNo())); member.setErpOrgId(param.getOrgId()); member.setEditDate(new Date()); member.setErpDate(new Date()); member.setHkStatus(Constants.ZERO); member.setRemark("待同步安防平台"); member.setStartTime(param.getValidStartTime()); member.setEndTime(param.getValidEndTime()); memberMapper.updateById(member); } //添加人员卡片数据 getRoleIdByParam(param.getRoleIds(),member); dealMemberCard(member,param); } Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getErpId,param.getId()).last("limit 1")); Company company = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,param.getOrgId()).last("limit 1")); if(Objects.isNull(company)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到组织信息"); } List<Integer> doorIds = null; if(Objects.isNull(member)){ member = new Member(); BeanUtils.copyProperties(param,member); member.setId(null); member.setCreateDate(new Date()); member.setRemark("待同步安防平台"); member.setHkStatus(Constants.ZERO); member.setErpStatus(Constants.ONE); member.setErpDate(new Date()); member.setErpId(param.getId()); member.setFsStatus(Constants.ZERO); member.setCompanyId(company.getId()); member.setType(Constants.memberType.internal); String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,param.getIdNo()); member.setIdcardNo(encryptIdNo); member.setStartTime(param.getValidStartTime()); member.setRoleId(param.getRoleIds()!=null?JSONObject.toJSONString(param.getRoleIds()):null); member.setEndTime(param.getValidEndTime()); member.setIdcardDecode(Constants.getTuominStr(param.getIdNo())); member.setErpOrgId(param.getOrgId()); memberMapper.insert(member); }else{ Integer id = member.getId(); BeanUtils.copyProperties(param,member); member.setId(id); member.setCompanyId(company.getId()); String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,param.getIdNo()); member.setIdcardNo(encryptIdNo); member.setIdcardDecode(Constants.getTuominStr(param.getIdNo())); member.setErpOrgId(param.getOrgId()); member.setEditDate(new Date()); member.setErpDate(new Date()); member.setHkStatus(Constants.ZERO); member.setRemark("待同步安防平台"); member.setStartTime(param.getValidStartTime()); member.setEndTime(param.getValidEndTime()); memberMapper.updateById(member); } //添加人员卡片数据 getRoleIdByParam(param.getRoleIds(),member); dealMemberCard(member,param); }catch (BusinessException e){ throw e; }finally { server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncEmpowerServiceImpl.java
@@ -12,12 +12,11 @@ import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.dao.business.DeviceMapper; import com.doumee.dao.business.MemberCardMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.join.EmpowerJoinMapper; import com.doumee.dao.business.join.VisitsJoinMapper; import com.doumee.dao.business.model.Device; import com.doumee.dao.business.model.Empower; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Visits; import com.doumee.dao.business.model.*; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -39,7 +38,11 @@ @Autowired private EmpowerJoinMapper empowerMapper; @Autowired private MemberMapper memberMapper; @Autowired private DeviceMapper deviceMapper; @Autowired private MemberCardMapper memberCardMapper; /** * 定时查询权限下发任务进度执行结果 @@ -104,6 +107,7 @@ } } checkDelMemberTask(); }catch (Exception e){ e.printStackTrace(); }finally { @@ -111,6 +115,62 @@ } } /** * 对海康删除组织信息 * @param id * @param date */ private boolean doHkDeleteUser(Integer id,String delHkIds, Date date ) { if(StringUtils.isBlank(delHkIds)){ return true; } UserDelRequest request = new UserDelRequest(); request.setPersonIds(new String[]{delHkIds}); BaseResponse<List<UserDelResponse>> result = HKService.delBatchUser(request); if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){ List<String> fIds = new ArrayList<>(); //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕) if(result.getData()!=null && result.getData().size()>0){ log.info("海康删除用户失败:==============="+result.getData().get(0).getPersonId()); memberMapper.update(null,new UpdateWrapper<Member>().lambda() .set(Member::getHkStatus,Constants.TWO)//同步失败 .set(Member::getHkDate,date) .in(Member::getId, id)); }else{ //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕) memberMapper.update(null,new UpdateWrapper<Member>().lambda() .set(Member::getHkStatus,Constants.ONE)//同步成功 .set(Member::getHkDate,date) .in(Member::getId, id)); //删除所有绑定的卡片信息 memberCardMapper.delete(new QueryWrapper<MemberCard>().lambda().eq(MemberCard::getMemberId,id)); } return true; } return false; } /** * 检查删除人员的权限是否都删除完成,如果权限删除完成, 进行海康人员的删除操作 */ private void checkDelMemberTask() { List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda() .eq(Member::getIsdeleted,Constants.ONE) .eq(Member::getHkStatus,Constants.FOUR)); if(memberList!=null &&memberList.size()>0 ){ Date date = new Date(); for(Member member : memberList){ if(empowerMapper.selectCount(new QueryWrapper<Empower>().lambda() .eq(Empower::getMemberId,member.getId()) .eq(Empower::getIsdeleted,Constants.ONE) .ne(Empower::getSendStatus,Constants.EmpowerStatus.pass)) ==0){ //如果权限都已经删除成功,则删除海康人员和卡片数据 doHkDeleteUser(member.getId(),member.getHkId(),date); } } } } public void syncEmpowerDetailDataOld(){ if(Constants.DEALING_HK_EMPOWER_DETAIL){ return ; server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
@@ -94,7 +94,7 @@ * * 10:邀约中(员工发起邀约,访客还未应邀)、 * * 11:邀约失效(员工发起邀约,一直到当前时间超过预计离开时间,访客还未应邀) */ if (model.getVisitorStatus()!=null && "3,4,11".contains( model.getVisitorStatus()+"" )){ if (model.getVisitorStatus()!=null && ",3,4,11,".contains( "," +model.getVisitorStatus()+"," )){ //对相应状态下的数据进行【已失效】处理 Visits update = new Visits(); //已失效 @@ -106,7 +106,7 @@ update.setRemark("超时未登记"); visitsMapper.updateById(update); } if (model.getVisitorStatus()!=null && "5,6".contains( model.getVisitorStatus()+"" )){ if (model.getVisitorStatus()!=null && ",5,6,".contains( "," +model.getVisitorStatus()+"," )){ // 对相应状态下的数据进行【已签离】处理 if(!Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.signout)){ Visits update = new Visits(); @@ -125,7 +125,7 @@ .eq(Retention::getMemberId,c.getMemberId())); } } if (model.getVisitorStatus()!=null&& "7,8".contains( model.getVisitorStatus()+"")){ if (model.getVisitorStatus()!=null&& ",7,8,".contains( "," +model.getVisitorStatus()+"," )){ //如果已登记 if(!Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.signin)){ Visits update = new Visits(); @@ -453,7 +453,7 @@ MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Visits.class) .selectAs(Member::getType,Visits::getMemberType) .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId); .leftJoin(Member.class,Member::getId,Visits::getMemberId); queryWrapper.in(Visits::getStatus, Arrays.asList(new Integer[]{Constants.VisitStatus.xfSuccess,Constants.VisitStatus.signin}) ); List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper); return list; server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java
@@ -264,7 +264,7 @@ List<Member> list = memberMapper.selectJoinList(Member.class,new MPJLambdaWrapper<Member>() .selectAll(Member.class ) .selectAs(Company::getHkId,Member::getHkOrgId) .isNotNull(Member::getFaceImg) .isNotNull(Member::getFaceId) .leftJoin(Company.class,Company::getId,Member::getCompanyId) .eq(Member::getHkStatus,Constants.ZERO) .eq(Member::getType,Constants.memberType.internal) @@ -329,6 +329,14 @@ } return false; } private void dealDelMemberRoleEmpower(Member member ) { //待移除权限的设备数据授权记录(针对删除和更新丢失的权限,需要同步下发删除权限) empowerMapper.update(null,new UpdateWrapper<Empower>().lambda() .eq(Empower::getMemberId,member.getId()) .set(Empower::getIsdeleted,Constants.ONE) .eq(Empower::getIsdeleted,Constants.ZERO) .set(Empower::getSendStatus,Constants.ZERO)); } private void dealMemberRoleEmpower(Member member ) { //处理新增的人员卡片数据(与海康同步) List<MemberCard> cards = dealMemberHkCard(member); @@ -374,7 +382,6 @@ deviceIds.add(deviceRole.getId()); list.add(model); } } //待移除权限的设备数据授权记录(针对删除和更新丢失的权限,需要同步下发删除权限) empowerMapper.update(null,new UpdateWrapper<Empower>().lambda() @@ -479,13 +486,16 @@ private void dealUserHkEditBiz(Member c, Date date, String path) { c.setHkStatus(Constants.ONE); if(Constants.equalsInteger(Constants.ONE,c.getIsdeleted())){ //处理删除数据(删除之前下发的海康人员信息) boolean r = doHkDeleteUser(c.getId(),c.getHkId(),date); //处理删除数据(删除之前下发的海康人员权限信息) dealDelMemberRoleEmpower(c); c.setHkStatus(Constants.FOUR ); c.setRemark( "等待删除授权!"); /*boolean r = doHkDeleteUser(c.getId(),c.getHkId(),date); c.setHkStatus(r?Constants.ONE:Constants.TWO); c.setRemark(r?null:"删除海康人员信息失败!"); c.setIsdeleted(r? Constants.ONE: Constants.ZERO);//删除失败,恢复数据 //删除所有绑定的卡片信息 memberCardMapper.delete(new QueryWrapper<MemberCard>().lambda().eq(MemberCard::getMemberId,c.getId())); memberCardMapper.delete(new QueryWrapper<MemberCard>().lambda().eq(MemberCard::getMemberId,c.getId()));*/ }else{ //处理修改数据,并且更新人脸 UserAddRequest addHkModel = getUserAddModel(c,path,1);//修改