海康下发修改

This commit is contained in:
GUO 2024-06-16 13:36:40 +08:00
parent 576f600850
commit 9677938533
9 changed files with 116 additions and 34 deletions

View File

@ -496,7 +496,7 @@ public class AsyncHikvision {
* @param allDevList
* @param workerList 下发的人员
* @param workerAndDevSnList 构建的下发的人员和设备的关系
* @param userId
* @param userId 批量下发的通知的人
* @param checkEditWorkers
* @param sendNotice
*/
@ -507,11 +507,17 @@ public class AsyncHikvision {
ProjectInfoExtVo project = projectService.getProjectInfoBySn(projectSn);
//判断人员的图片存在isc
Map<String, WorkerInfo> workerIdMap = workerList.stream().collect(Collectors.toMap(workerInfo -> workerInfo.getId() + "", Function.identity()));
ArrayList<Future> futures = new ArrayList<>();
if (checkEditWorkers) {
ArrayList<WorkerInfo> needEditWorkers = getNeedEditWorkers(workerList, project, workerIdMap);
if (CollUtil.isNotEmpty(needEditWorkers)) {
for (WorkerInfo workerInfo : needEditWorkers) {
workerInfoService.editWorkerForSendBatchAuth(workerInfo);
Future future = workerInfoService.editWorkerAsyncForSendBatchAuth(workerInfo);
futures.add(future);
}
}
for (Future future : futures) {
while (!future.isDone()) {
}
}
}
@ -529,9 +535,9 @@ public class AsyncHikvision {
o1.putAll(o2);
return o1;
}));
ArrayList<Future> futures = new ArrayList<>();
futures = new ArrayList<>();
for (Map.Entry<String, List<JSONObject>> entry : devSnToJoMap.entrySet()) {
Future future = asyncHikvision.sendBatchWorkersForOneDevAsync(workerIdMap, devSnMap, project, devSnToIscDevSnMap, iscDevSnToMyMap, entry, projectSn, sendNotice);
Future future = asyncHikvision.sendBatchWorkersForOneDevAsync(workerIdMap, devSnMap, project, devSnToIscDevSnMap, entry, projectSn, sendNotice, workerList);
futures.add(future);
}
for (Future future : futures) {
@ -559,6 +565,31 @@ public class AsyncHikvision {
log.error("批量下发权限失败:", e);
hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, workerList, 1, 1);
hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, workerList, 1, 3);
sendExcNotice(e, workerList, null);
}
}
/**
* 发送异常通知
*
* @param e
* @param workerList
* @param dev
*/
private void sendExcNotice(Exception e, List<WorkerInfo> workerList, UfaceDev dev) {
String exc;
if (HttpUtils.isTimeOut(e)) {
exc = ",网络异常";
} else {
exc = ",下发异常";
}
List<WorkerInfo> failWorkers = workerList.stream().filter(workerInfo -> !Objects.equals(workerInfo.getSendSuccessStatus(), 1)).collect(Collectors.toList());
for (WorkerInfo workerInfo : failWorkers) {
if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) {
noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(),
StrUtil.format("{}{}设备下发权限失败{}", workerInfo.getWorkerName(), dev != null ? dev.getDevName() : "有些", exc),
"人员下发设备提醒", "1");
}
}
}
@ -597,12 +628,14 @@ public class AsyncHikvision {
* @param devSnMap
* @param project
* @param devSnToIscDevSnMap
* @param iscDevSnToMyMap
* @param devSnToJoEntry
* @param sendNotice
* @param workerList
*/
@Async("workerAuthHkExecutor")
public Future sendBatchWorkersForOneDevAsync(Map<String, WorkerInfo> workerIdMap, Map<String, UfaceDev> devSnMap, ProjectInfoExtVo project, Map<String, JSONObject> devSnToIscDevSnMap, Map<String, Map<String, JSONObject>> iscDevSnToMyMap, Map.Entry<String, List<JSONObject>> devSnToJoEntry, String projectSn, boolean sendNotice) {
public Future sendBatchWorkersForOneDevAsync(Map<String, WorkerInfo> workerIdMap, Map<String, UfaceDev> devSnMap, ProjectInfoExtVo project, Map<String, JSONObject> devSnToIscDevSnMap, Map.Entry<String, List<JSONObject>> devSnToJoEntry, String projectSn, boolean sendNotice, List<WorkerInfo> workerList) {
String devSn = devSnToJoEntry.getKey();
UfaceDev dev = devSnMap.get(devSn);
try {
//添加权限配置人员列表设备列表这个接口只要没报错你就直接去下一步就行了
List<String> addAuthWorkerIds = devSnToJoEntry.getValue().stream().filter(jo -> jo.getBoolean(Cts.IS_ADD_AUTH)).map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList());
@ -619,7 +652,6 @@ public class AsyncHikvision {
JSONObject aaRJo = HikvisionUtil.deleteAuth(project, getAddOrDeleteAuthParam(devSnToJoEntry, deleteAuthWorkerIds, devSnToIscDevSnMap));
HikvisionUtil.getJSONObjectData(aaRJo);
}
String devSn = devSnToJoEntry.getKey();
//然后调用根据出入权限配置快捷下载设备列表添加权限配置+快捷下发这是一个流程你添加了几个权限下发成功之后就清零了
JSONObject daJo = HikvisionUtil.downloadAuth(project, getQueryDownloadProgressParam(devSnToJoEntry, devSnToIscDevSnMap));
JSONObject daRtJo = HikvisionUtil.getJSONObjectData(daJo);
@ -639,7 +671,7 @@ public class AsyncHikvision {
Set<String> rtWorkerIdSet;
if (CollUtil.isNotEmpty(qaiList)) {
for (int i = 0; i < qaiList.size(); i++) {
handlerBatchWorkersResult(workerIdMap, devSnMap, qaiList, i, devSn, projectSn, addAuthWorkerIds,sendNotice);
handlerBatchWorkersResult(workerIdMap, qaiList, i, devSn, projectSn, addAuthWorkerIds, sendNotice, dev);
}
rtWorkerIdSet = qaiList.stream().map(o -> ((JSONObject) o).getString("personId")).collect(Collectors.toSet());
} else {
@ -671,6 +703,7 @@ public class AsyncHikvision {
log.error("批量下发权限失败:", e);
hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, new ArrayList<>(workerIdMap.values()), 1, 1);
hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, new ArrayList<>(workerIdMap.values()), 1, 3);
sendExcNotice(e, workerList, dev);
}
return null;
}
@ -679,15 +712,15 @@ public class AsyncHikvision {
* 处理结果一个设备批量下发人员
*
* @param workerIdMap
* @param devSnMap
* @param qaiList
* @param i
* @param devSn
* @param projectSn
* @param addAuthWorkerIds
* @param sendNotice
* @param dev
*/
public void handlerBatchWorkersResult(Map<String, WorkerInfo> workerIdMap, Map<String, UfaceDev> devSnMap, JSONArray qaiList, int i, String devSn, String projectSn, List<String> addAuthWorkerIds, boolean sendNotice) {
public void handlerBatchWorkersResult(Map<String, WorkerInfo> workerIdMap, JSONArray qaiList, int i, String devSn, String projectSn, List<String> addAuthWorkerIds, boolean sendNotice, UfaceDev dev) {
JSONObject jo = qaiList.getJSONObject(i);
String personId = jo.getString("personId");
//人脸状态
@ -700,7 +733,6 @@ public class AsyncHikvision {
//2. 删除以后删除的权限状态是 4未配置
//3. 这个人的权限都没了以后你就查不到这个权限条目了
Integer faceStatus = jo.getInteger("faceStatus");
UfaceDev dev = devSnMap.get(devSn);
if (sendNotice) {
if (addAuthWorkerIds.contains(personId)) {
//添加权限

View File

@ -72,6 +72,10 @@ public class AsyncWorker {
}
}
public void sendBatchWokerDev(Map<String, Object> map, ProjectUfaceConfig projectUfaceConfig, List<UfaceDev> allDevList) {
this.sendBatchWokerDevAsync(map, projectUfaceConfig, allDevList);
}
/**
* 批量数据发送任务
*

View File

@ -80,7 +80,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -1177,18 +1176,17 @@ public class HikvisionCall {
.isNull(XzHikvisionSync::getIsSuccess)
.eq(XzHikvisionSync::getType, 3)
.eq(XzHikvisionSync::getOperate, operate)
.eq(XzHikvisionSync::getProjectSn, projectSn)
.eq(XzHikvisionSync::getWhoId, whoId)
.eq(XzHikvisionSync::getBigType, bigType)
);
this.updateTotalStatus(projectSn, whoId, bigType);
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
@Transactional(rollbackFor = Exception.class)
public void updateAllFailStatusIfNull(String projectSn, Long whoId, Integer bigType) {
xzHikvisionSyncMapper.update(null, new LambdaUpdateWrapper<XzHikvisionSync>()
.set(XzHikvisionSync::getIsSuccess, 0)
.isNull(XzHikvisionSync::getIsSuccess)
.eq(XzHikvisionSync::getProjectSn, projectSn)
.eq(XzHikvisionSync::getWhoId, whoId)
.eq(XzHikvisionSync::getBigType, bigType)
);

View File

@ -33,7 +33,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@ -490,7 +489,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
* @param devSns
*/
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
@Transactional(rollbackFor = Exception.class)
public void addHkSyncRecordsAndUpdateWorkerStatus(WorkerInfo workerInfo, String devSns) {
//清除以前的记录
xzHikvisionSyncMapper.delete(new LambdaQueryWrapper<XzHikvisionSync>()
@ -512,7 +511,6 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl<ProjectUfaceConfi
* @param userId
*/
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void buildAndSendBatchWorkerForHk(ProjectUfaceConfig projectUfaceConfig, List<UfaceDev> allDevList, List<WorkerInfo> workerList, Long userId) {
//构建workerAndDevSnList
List<JSONObject> workerAndDevSnList = new ArrayList<>();

View File

@ -15,6 +15,7 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
/**
* @Description: 劳务人员
@ -159,7 +160,7 @@ public interface IWorkerInfoService extends IService<WorkerInfo> {
void deleteWorkerForHikvision(String uniqueId, WorkerInfo workerInfo);
void editWorkerForSendBatchAuth(WorkerInfo workerInfo);
Future editWorkerAsyncForSendBatchAuth(WorkerInfo workerInfo);
void editWorkerForHikvision(WorkerInfo workerInfo);

View File

@ -200,16 +200,20 @@ public class UfaceDevServiceImpl extends ServiceImpl<UfaceDevMapper, UfaceDev> i
public void sendBatchWokerDev(Map<String, Object> map) {
QueryWrapper<ProjectUfaceConfig> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ProjectUfaceConfig::getProjectSn, MapUtils.getString(map, "projectSn"));
ProjectUfaceConfig tempProjectUfaceConfig = projectUfaceConfigService.getOne(queryWrapper);
ProjectUfaceConfig ufaceConfig = projectUfaceConfigService.getOne(queryWrapper);
ThreadLocalUtil.addInKey("now", new Date());
if (tempProjectUfaceConfig != null && tempProjectUfaceConfig.getIssueDev() == 1) {
if (ufaceConfig != null && ufaceConfig.getIssueDev() == 1) {
QueryWrapper<UfaceDev> qw = new QueryWrapper<>();
qw.lambda().eq(UfaceDev::getProjectSn, MapUtils.getString(map, "projectSn"));
List<UfaceDev> list = ufaceDevMapper.selectList(qw);
if (list == null || list.size() == 0) {
throw new OpenAlertException("请先添加设备");
}
asyncWorker.sendBatchWokerDevAsync(map, tempProjectUfaceConfig, list);
if (ufaceConfig.getSupplierType() == 9) {
asyncWorker.sendBatchWokerDev(map, ufaceConfig, list);
} else {
asyncWorker.sendBatchWokerDevAsync(map, ufaceConfig, list);
}
} else {
throw new OpenAlertException("项目配置不下发设备或未配置参数");
}

View File

@ -69,6 +69,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@ -82,6 +83,7 @@ import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
@ -104,94 +106,135 @@ public class WorkerInfoServiceImpl extends ServiceImpl<WorkerInfoMapper, WorkerI
@Lazy
@Autowired
public CarInfoServiceImpl carInfoService;
@Lazy
@Autowired
IWorkerSafeEducationWorkerService workerSafeEducationWorkerService;
@Lazy
@Autowired
WorkerInfoServiceImpl workerInfoService;
@Lazy
@Autowired
private IDictionaryItemService dictionaryItemService;
@Lazy
@Autowired
private InspectTaskRecordMapper inspectTaskRecordMapper;
@Lazy
@Autowired
private XzSupplierQualificationApplyServiceImpl xzSupplierQualificationApplyService;
@Lazy
@Autowired
private AiAnalyseHardWareAlarmRecordMapper aiAnalyseHardWareAlarmRecordMapper;
@Lazy
@Autowired
private HiddenDangerInspectRecordMapper hiddenDangerInspectRecordMapper;
@Lazy
@Autowired
private HikvisionCall hikvisionCall;
@Lazy
@Autowired
private AsyncJiLianDa asyncJiLianDa;
@Lazy
@Autowired
private NoticeServiceImpl noticeService;
@Lazy
@Autowired
private UfaceDevMapper ufaceDevMapper;
@Lazy
@Autowired
private ICompanyService companyService;
@Lazy
@Autowired
private WorkerInfoMapper workerInfoMapper;
@Lazy
@Autowired
private WorkerSafeEducationWorkerMapper workerSafeEducationWorkerMapper;
@Lazy
@Autowired
private IProjectUfaceConfigService projectUfaceConfigService;
@Lazy
@Autowired
private CompanyMapper companyMapper;
@Lazy
@Autowired
private ProjectMapper projectMapper;
@Lazy
@Autowired
private TeamInfoMapper teamInfoMapper;
@Lazy
@Autowired
private WorkerAttendanceMapper workerAttendanceMapper;
@Lazy
@Autowired
private WorkerSafeEducationMapper workerSafeEducationMapper;
@Lazy
@Autowired
private IWorkerMonthAttendanceStatisticsService workerMonthAttendanceStatisticsService;
@Lazy
@Autowired
private IWorkerContractService workerContractService;
@Lazy
@Autowired
private IWorkerInsuranceService workerInsuranceService;
@Lazy
@Autowired
private IWorkerEvaluateService workerEvaluateService;
@Lazy
@Autowired
private IWorkerPhysicalsService workerPhysicalsService;
@Lazy
@Autowired
private IWorkerCertificateService workerCertificateService;
@Lazy
@Autowired
private EnterpriseInfoMapper enterpriseInfoMapper;
@Lazy
@Autowired
private ProjectEnterpriseMapper projectEnterpriseMapper;
@Lazy
@Autowired
private EnterpriseTypeMapper enterpriseTypeMapper;
@Lazy
@Autowired
private DepartmentInfoMapper departmentInfoMapper;
@Lazy
@Autowired
private WorkerTypeMapper workerTypeMapper;
@Lazy
@Autowired
private UploadFileService uploadFileService;
@Lazy
@Autowired
private AsyncWorker asyncWorker;
@Lazy
@Autowired
private AsyncHikvision asyncHikvision;
@Lazy
@Autowired
private IWorkerPhotoFeaturesService workerPhotoFeaturesService;
@Lazy
@Autowired
private GovtOpenApiService govtOpenApiService;
@Lazy
@Autowired
private EnvironmentUtil environmentUtil;
@Lazy
@Autowired
private SystemUserMapper systemUserMapper;
@Lazy
@Autowired
private WorkerInfoDeleteMapper workerInfoDeleteMapper;
@Lazy
@Autowired
private SystemUserServiceImpl systemUserService;
@Lazy
@Autowired
private EnterpriseInfoServiceImpl enterpriseInfoService;
@Value("${serverUrl}")
private String serverUrl;
@Value("${basePath}")
private String basePath;
@Value("${isGetFaceFeatureDate}")
private boolean isGetFaceFeatureDate;
@Autowired
private SystemUserServiceImpl systemUserService;
@Autowired
private EnterpriseInfoServiceImpl enterpriseInfoService;
/**
* 人员管理分页
@ -2412,17 +2455,19 @@ public class WorkerInfoServiceImpl extends ServiceImpl<WorkerInfoMapper, WorkerI
}
/**
* 同步的不删除同步的记录
* 不删除同步的记录
*
* @param workerInfo
*/
@Override
public void editWorkerForSendBatchAuth(WorkerInfo workerInfo) {
@Async("workerHkExecutor")
public Future editWorkerAsyncForSendBatchAuth(WorkerInfo workerInfo) {
xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(1).setOperate(2).setWhoId(workerInfo.getId()).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId())));
if (StrUtil.isNotBlank(workerInfo.getFieldAcquisitionUrl())) {
xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(2).setOperate(2).setWhoId(workerInfo.getId()).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId())));
}
asyncHikvision.editWorker(workerInfo, true, true);
return null;
}
@Override

View File

@ -20,6 +20,6 @@
) t2 on
t1.create_date=t2.create_date and t1.who_id=t2.who_id
left join uface_dev ud on t1.device_sn = ud.dev_sn
order by t1.type
order by t1.type,t1.id
</select>
</mapper>

View File

@ -6,7 +6,7 @@
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%green(%d{yyyy-MM-dd HH:mm:ss} [%X{requestId}][%thread] %-5level %logger{0}.%method:%L) - %highlight(%msg) %X{stackInfo} %n
<pattern>%green(%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}][%thread] %-5level %logger{0}.%method:%L) - %highlight(%msg) %X{stackInfo} %n
</pattern>
</encoder>
<filter class="com.zhgd.config.LogPrintFilter">
@ -19,7 +19,7 @@
<file>${log.path}/zhgd-debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
@ -46,7 +46,7 @@
<file>${log.path}/zhgd-info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
@ -72,7 +72,7 @@
<file>${log.path}/zhgd-error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
@ -98,7 +98,7 @@
<file>${log.path}/zhgd-all.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->