Merge pull request '口门接口' (#4) from koumen into dev

Reviewed-on: #4
koumen
zhangxiongfeng 2026-07-27 10:24:06 +08:00
commit 8509c92af8
38 changed files with 1224 additions and 54 deletions

View File

@ -0,0 +1,3 @@
2026-07-23 00:09:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-176] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-23 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-176] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-23 00:09:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-23 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-177] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-23 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-177] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-23 00:13:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-23 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-178] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-23 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-178] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-23 00:19:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-23 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-179] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-23 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-179] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-23 00:24:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-23 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-180] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-23 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-180] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-23 00:59:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-25 00:09:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-179] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-25 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-179] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-25 00:09:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-25 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-180] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-25 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-180] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-25 00:13:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-25 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-181] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-25 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-181] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-25 00:19:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-25 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-182] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-25 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-182] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-25 00:24:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-25 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-183] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-25 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-183] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-25 00:59:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-26 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-184] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-26 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-184] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-26 00:09:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-26 00:13:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-185] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-26 00:13:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-185] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-26 00:13:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-26 00:19:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-186] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-26 00:19:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-186] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-26 00:19:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-26 00:24:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-187] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-26 00:24:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-187] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-26 00:24:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-26 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-188] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-26 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-188] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-26 00:59:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-27 00:09:54 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-189] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-27 00:09:54 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-189] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-27 00:09:54 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-27 00:13:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-190] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-27 00:13:53 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-190] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-27 00:13:53 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-27 00:19:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-191] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-27 00:19:53 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-191] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-27 00:19:53 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-27 00:24:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-192] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-27 00:24:53 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-192] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-27 00:24:53 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,3 @@
2026-07-27 00:59:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-193] <br>----------- xxl-job job execute start -----------<br>----------- Param:null
2026-07-27 00:59:54 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-193] <br>----------- xxl-job job execute end(finish) -----------<br>----------- Result: handleCode=200, handleMsg = null
2026-07-27 00:59:54 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread] <br>----------- xxl-job job callback finish.

View File

@ -0,0 +1,9 @@
dahua:
oauth:
host: 123.183.159.35
client-id: 123.183.159.35
client-secret: 4edfdcd2-67e6-41db-a1ae-b98d47a70266
username: system
password: zcloud88888
http: false
port: 4443

View File

@ -15,7 +15,7 @@ spring:
name: ${application.name}${application.version}
profiles:
# 环境配置
active: test
active: test,local
cloud:
nacos:
config:
@ -41,5 +41,4 @@ spring:
- config-flyway.yml
discovery:
server-addr: ${spring.cloud.nacos.config.server-addr}
namespace: ${spring.cloud.nacos.config.namespace}
namespace: ${spring.cloud.nacos.config.namespace}

View File

@ -2,13 +2,20 @@ package com.zcloud.primeport.web;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.primeport.api.DaHuaServiceI;
import com.zcloud.primeport.domain.model.DaHuaAccessRecordCmd;
import com.zcloud.primeport.domain.model.DaHuaCarAddCmd;
import com.zcloud.primeport.domain.model.DaHuaCarPageCmd;
import com.zcloud.primeport.domain.model.DaHuaPersonSyncCmd;
import com.zcloud.primeport.dto.DaHuaCarDeleteCmd;
import com.zcloud.primeport.dto.DaHuaPersonDeleteCmd;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@Api(tags = "大华平台对接")
@RequestMapping("/${application.gateway}/dahua")
@RestController
@ -17,6 +24,15 @@ public class DaHuaController {
@Autowired(required = false)
private DaHuaServiceI daHuaService;
@ApiOperation("生成人员全局ID")
@GetMapping("/person/generate-id")
public SingleResponse<Long> generatePersonId() {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.generatePersonId();
}
@ApiOperation("同步人员到大华平台-新增")
@PostMapping("/person/sync")
public SingleResponse<Boolean> syncPerson(@Validated @RequestBody DaHuaPersonSyncCmd cmd) {
@ -26,4 +42,67 @@ public class DaHuaController {
}
return daHuaService.syncPerson(cmd);
}
@ApiOperation("修改人员")
@PutMapping("/person/update")
public SingleResponse<Boolean> updatePerson(@Validated @RequestBody DaHuaPersonSyncCmd cmd) {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.updatePerson(cmd);
}
@ApiOperation("新增车辆")
@PostMapping("/car/add")
public SingleResponse<Boolean> addCar(@Validated @RequestBody DaHuaCarAddCmd cmd) {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.addCar(cmd);
}
@ApiOperation("修改车辆")
@PutMapping("/car/update")
public SingleResponse<Boolean> updateCar(@Validated @RequestBody DaHuaCarAddCmd cmd) {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.updateCar(cmd);
}
@ApiOperation("车辆分页查询根据车牌查carCode")
@PostMapping("/car/page")
public SingleResponse<Map<String, Object>> pageCar(@Validated @RequestBody DaHuaCarPageCmd cmd) {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.pageCar(cmd);
}
@ApiOperation("删除车辆")
@PostMapping("/car/delete")
public SingleResponse<Boolean> deleteCar(@Validated @RequestBody DaHuaCarDeleteCmd cmd) {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.deleteCar(cmd);
}
@ApiOperation("门禁事件查询(刷卡记录分页)")
@PostMapping("/access/record")
public SingleResponse<Map<String, Object>> queryAccessRecord(@Validated @RequestBody DaHuaAccessRecordCmd cmd) {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.queryAccessRecord(cmd);
}
@ApiOperation("删除人员")
@PostMapping("/person/delete")
public SingleResponse<Boolean> deletePerson(@Validated @RequestBody DaHuaPersonDeleteCmd cmd) {
if (daHuaService == null) {
throw new RuntimeException("大华服务未配置");
}
return daHuaService.deletePerson(cmd);
}
}

View File

@ -3,22 +3,196 @@ package com.zcloud.primeport.service;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.primeport.api.DaHuaServiceI;
import com.zcloud.primeport.domain.gateway.DaHuaGateway;
import com.zcloud.primeport.domain.model.DaHuaAccessRecordCmd;
import com.zcloud.primeport.domain.model.DaHuaCarAddCmd;
import com.zcloud.primeport.domain.model.DaHuaCarPageCmd;
import com.zcloud.primeport.domain.model.DaHuaPersonSyncCmd;
import com.zcloud.primeport.dto.DaHuaCarDeleteCmd;
import com.zcloud.primeport.dto.DaHuaPersonDeleteCmd;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class DaHuaServiceImpl implements DaHuaServiceI {
@Autowired(required = false)
@Autowired
private DaHuaGateway daHuaGateway;
@Override
public SingleResponse<Long> generatePersonId() {
Long id = daHuaGateway.generatePersonId();
System.out.println("大华生成人员ID返回: " + id);
return SingleResponse.of(id);
}
@Override
public SingleResponse<Boolean> syncPerson(DaHuaPersonSyncCmd cmd) {
if (daHuaGateway == null) {
throw new RuntimeException("大华服务未配置");
Long personId = daHuaGateway.generatePersonId();
System.out.println("大华自动生成人员ID: " + personId);
cmd.setId(personId);
Map<String, Object> syncResult = daHuaGateway.syncPerson(cmd);
Boolean passed = (Boolean) syncResult.get("passed");
Boolean dhSuccess = (Boolean) syncResult.get("success");
String dhCode = (String) syncResult.get("code");
String dhErrMsg = (String) syncResult.get("errMsg");
SingleResponse<Boolean> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(passed);
System.out.println("大华同步人员最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + resp.getData());
return resp;
}
@Override
public SingleResponse<Boolean> updatePerson(DaHuaPersonSyncCmd cmd) {
Map<String, Object> updateResult = daHuaGateway.updatePerson(cmd);
Boolean passed = (Boolean) updateResult.get("passed");
Boolean dhSuccess = (Boolean) updateResult.get("success");
String dhCode = (String) updateResult.get("code");
String dhErrMsg = (String) updateResult.get("errMsg");
SingleResponse<Boolean> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(passed);
System.out.println("大华修改人员最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + resp.getData());
return resp;
}
@Override
public SingleResponse<Boolean> deletePerson(DaHuaPersonDeleteCmd cmd) {
Map<String, Object> deleteResult = daHuaGateway.deletePerson(cmd.getIds(), cmd.getOpenDeleteFlag());
Boolean passed = (Boolean) deleteResult.get("passed");
Boolean dhSuccess = (Boolean) deleteResult.get("success");
String dhCode = (String) deleteResult.get("code");
String dhErrMsg = (String) deleteResult.get("errMsg");
SingleResponse<Boolean> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(passed);
System.out.println("大华删除人员最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + resp.getData());
return resp;
}
@Override
public SingleResponse<Boolean> addCar(DaHuaCarAddCmd cmd) {
Map<String, Object> addResult = daHuaGateway.addCar(cmd);
Boolean passed = (Boolean) addResult.get("passed");
Boolean dhSuccess = (Boolean) addResult.get("success");
String dhCode = (String) addResult.get("code");
String dhErrMsg = (String) addResult.get("errMsg");
SingleResponse<Boolean> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(passed);
System.out.println("大华新增车辆最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + resp.getData());
return resp;
}
@Override
public SingleResponse<Boolean> updateCar(DaHuaCarAddCmd cmd) {
if ((cmd.getCarCode() == null || cmd.getCarCode().trim().isEmpty())
&& cmd.getCarNum() != null && !cmd.getCarNum().trim().isEmpty()) {
DaHuaCarPageCmd pageCmd = new DaHuaCarPageCmd();
pageCmd.setCarNumList(java.util.Collections.singletonList(cmd.getCarNum()));
System.out.println("大华修改车辆carCode为空尝试根据carNum=" + cmd.getCarNum() + "查询carCode");
Map<String, Object> pageResult = daHuaGateway.pageCar(pageCmd);
Boolean pagePassed = (Boolean) pageResult.get("passed");
@SuppressWarnings("unchecked")
Map<String, Object> pageDataMap = (Map<String, Object>) pageResult.get("data");
if (pagePassed != null && pagePassed && pageDataMap != null) {
Object pageDataObj = pageDataMap.get("pageData");
if (pageDataObj instanceof java.util.List) {
@SuppressWarnings("unchecked")
java.util.List<Map<String, Object>> pageDataList = (java.util.List<Map<String, Object>>) pageDataObj;
for (Map<String, Object> item : pageDataList) {
Object carNumObj = item.get("carNum");
if (carNumObj != null && cmd.getCarNum().equals(carNumObj.toString())) {
Object carCodeObj = item.get("carCode");
if (carCodeObj != null) {
String foundCarCode = carCodeObj.toString();
cmd.setCarCode(foundCarCode);
System.out.println("大华修改车辆根据carNum=" + cmd.getCarNum() + "自动匹配到carCode=" + foundCarCode);
if (cmd.getDepartmentId() == null && item.get("departmentId") != null) {
Long deptId = Long.valueOf(item.get("departmentId").toString());
cmd.setDepartmentId(deptId);
System.out.println("大华修改车辆自动补充departmentId=" + deptId);
}
break;
}
}
}
}
}
}
Boolean result = daHuaGateway.syncPerson(cmd);
return SingleResponse.of(result);
Map<String, Object> updateResult = daHuaGateway.updateCar(cmd);
Boolean passed = (Boolean) updateResult.get("passed");
Boolean dhSuccess = (Boolean) updateResult.get("success");
String dhCode = (String) updateResult.get("code");
String dhErrMsg = (String) updateResult.get("errMsg");
SingleResponse<Boolean> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(passed);
System.out.println("大华修改车辆最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + resp.getData());
return resp;
}
@Override
@SuppressWarnings("unchecked")
public SingleResponse<Map<String, Object>> pageCar(DaHuaCarPageCmd cmd) {
Map<String, Object> pageResult = daHuaGateway.pageCar(cmd);
Boolean passed = (Boolean) pageResult.get("passed");
Boolean dhSuccess = (Boolean) pageResult.get("success");
String dhCode = (String) pageResult.get("code");
String dhErrMsg = (String) pageResult.get("errMsg");
Map<String, Object> dhData = (Map<String, Object>) pageResult.get("data");
SingleResponse<Map<String, Object>> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(dhData);
System.out.println("大华车辆分页查询最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + (dhData != null ? "已返回数据" : "null"));
return resp;
}
@Override
public SingleResponse<Boolean> deleteCar(DaHuaCarDeleteCmd cmd) {
Map<String, Object> deleteResult = daHuaGateway.deleteCar(cmd.getCarNumList());
Boolean passed = (Boolean) deleteResult.get("passed");
Boolean dhSuccess = (Boolean) deleteResult.get("success");
String dhCode = (String) deleteResult.get("code");
String dhErrMsg = (String) deleteResult.get("errMsg");
SingleResponse<Boolean> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(passed);
System.out.println("大华删除车辆最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + resp.getData());
return resp;
}
@Override
@SuppressWarnings("unchecked")
public SingleResponse<Map<String, Object>> queryAccessRecord(DaHuaAccessRecordCmd cmd) {
Map<String, Object> queryResult = daHuaGateway.queryAccessRecord(cmd);
Boolean passed = (Boolean) queryResult.get("passed");
Boolean dhSuccess = (Boolean) queryResult.get("success");
String dhCode = (String) queryResult.get("code");
String dhErrMsg = (String) queryResult.get("errMsg");
Map<String, Object> dhData = (Map<String, Object>) queryResult.get("data");
SingleResponse<Map<String, Object>> resp = new SingleResponse<>();
resp.setSuccess(dhSuccess != null ? dhSuccess : passed);
resp.setErrCode(dhCode);
resp.setErrMessage(dhErrMsg);
resp.setData(dhData);
System.out.println("大华门禁事件查询最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data:" + (dhData != null ? "已返回数据" : "null"));
return resp;
}
}

View File

@ -1,9 +1,33 @@
package com.zcloud.primeport.api;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.primeport.domain.model.DaHuaAccessRecordCmd;
import com.zcloud.primeport.domain.model.DaHuaCarAddCmd;
import com.zcloud.primeport.domain.model.DaHuaCarPageCmd;
import com.zcloud.primeport.domain.model.DaHuaPersonSyncCmd;
import com.zcloud.primeport.dto.DaHuaCarDeleteCmd;
import com.zcloud.primeport.dto.DaHuaPersonDeleteCmd;
import java.util.Map;
public interface DaHuaServiceI {
SingleResponse<Long> generatePersonId();
SingleResponse<Boolean> syncPerson(DaHuaPersonSyncCmd cmd);
SingleResponse<Boolean> updatePerson(DaHuaPersonSyncCmd cmd);
SingleResponse<Boolean> deletePerson(DaHuaPersonDeleteCmd cmd);
SingleResponse<Boolean> addCar(DaHuaCarAddCmd cmd);
SingleResponse<Boolean> updateCar(DaHuaCarAddCmd cmd);
SingleResponse<Map<String, Object>> pageCar(DaHuaCarPageCmd cmd);
SingleResponse<Boolean> deleteCar(DaHuaCarDeleteCmd cmd);
SingleResponse<Map<String, Object>> queryAccessRecord(DaHuaAccessRecordCmd cmd);
}

View File

@ -0,0 +1,20 @@
package com.zcloud.primeport.dto;
import com.alibaba.cola.dto.Command;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class DaHuaCarDeleteCmd extends Command {
@ApiModelProperty(value = "车牌号数组", required = true)
@NotEmpty(message = "carNumList不能为空")
private List<String> carNumList;
}

View File

@ -0,0 +1,18 @@
package com.zcloud.primeport.dto;
import com.alibaba.cola.dto.Command;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class DaHuaCarPageCmd extends Command {
@ApiModelProperty("车牌列表最大支持500")
private List<String> carNumList;
}

View File

@ -0,0 +1,25 @@
package com.zcloud.primeport.dto;
import com.alibaba.cola.dto.Command;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DaHuaPersonDeleteCmd extends Command {
@ApiModelProperty(value = "人员id数组", required = true)
@NotEmpty(message = "ids不能为空")
private List<Long> ids;
@ApiModelProperty("是否开放删除标识(默认不传:解绑卡片、删除车辆)")
private Integer openDeleteFlag;
}

View File

@ -1,8 +1,30 @@
package com.zcloud.primeport.domain.gateway;
import com.zcloud.primeport.domain.model.DaHuaAccessRecordCmd;
import com.zcloud.primeport.domain.model.DaHuaCarAddCmd;
import com.zcloud.primeport.domain.model.DaHuaCarPageCmd;
import com.zcloud.primeport.domain.model.DaHuaPersonSyncCmd;
import java.util.List;
import java.util.Map;
public interface DaHuaGateway {
Boolean syncPerson(DaHuaPersonSyncCmd cmd);
Long generatePersonId();
Map<String, Object> syncPerson(DaHuaPersonSyncCmd cmd);
Map<String, Object> updatePerson(DaHuaPersonSyncCmd cmd);
Map<String, Object> deletePerson(List<Long> ids, Integer openDeleteFlag);
Map<String, Object> addCar(DaHuaCarAddCmd cmd);
Map<String, Object> updateCar(DaHuaCarAddCmd cmd);
Map<String, Object> pageCar(DaHuaCarPageCmd cmd);
Map<String, Object> deleteCar(List<String> carNumList);
Map<String, Object> queryAccessRecord(DaHuaAccessRecordCmd cmd);
}

View File

@ -0,0 +1,84 @@
package com.zcloud.primeport.domain.model;
import com.alibaba.cola.dto.Command;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class DaHuaAccessRecordCmd extends Command {
@ApiModelProperty(value = "页码,正整数", required = true)
@NotNull(message = "pageNum不能为空")
private Integer pageNum;
@ApiModelProperty(value = "分页大小正整数推荐不超过10000", required = true)
@NotNull(message = "pageSize不能为空")
private Integer pageSize;
@ApiModelProperty(value = "刷卡开始时间格式yyyy-MM-dd HH:mm:ss", required = true)
@NotBlank(message = "startSwingTime不能为空")
private String startSwingTime;
@ApiModelProperty(value = "刷卡结束时间格式yyyy-MM-dd HH:mm:ss", required = true)
@NotBlank(message = "endSwingTime不能为空")
private String endSwingTime;
@ApiModelProperty("入库开始时间格式yyyy-MM-dd HH:mm:ssV1.1.4新增")
private String startCreateTime;
@ApiModelProperty("入库结束时间格式yyyy-MM-dd HH:mm:ssV1.1.4新增")
private String endCreateTime;
@ApiModelProperty("开门类型")
private Integer openType;
@ApiModelProperty("开门类型多选")
private List<Integer> openTypes;
@ApiModelProperty("卡片类型,不传-全部0-IC卡1-有源RFID2-CPU卡")
private String category;
@ApiModelProperty("人员名称")
private String personName;
@ApiModelProperty("人员编号")
private String personCode;
@ApiModelProperty("通道编码列表最大500")
private List<String> channelCodes;
@ApiModelProperty("部门ID多个逗号分隔")
private String deptIds;
@ApiModelProperty("卡号,字母或数字")
private String cardNumber;
@ApiModelProperty("事件类型,不传-全部1-进门2-出门3-进/出门")
private Integer enterOrExit;
@ApiModelProperty("开门结果,不传-全部1-成功0-失败")
private Integer openResult;
@ApiModelProperty("是否超温")
private Boolean overTemp;
@ApiModelProperty("体温低限")
private Float curTempStart;
@ApiModelProperty("体温高限")
private Float curTempEnd;
@ApiModelProperty("口罩状态 3-戴口罩2-没戴口罩1-未识别")
private Integer maskState;
@ApiModelProperty("访客筛选1-只查询访客记录2-只查询非访客记录")
private Integer visitorFilter;
}

View File

@ -0,0 +1,29 @@
package com.zcloud.primeport.domain.model;
import lombok.Data;
@Data
public class DaHuaCarAddCmd {
private String carCode;
private String carNum;
private String carNumColor;
private String carType;
private String carBrand;
private String carColor;
private Long departmentId;
private String departmentName;
private Long ownerId;
private String service;
private Object fieldExt;
}

View File

@ -0,0 +1,18 @@
package com.zcloud.primeport.domain.model;
import com.alibaba.cola.dto.Command;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class DaHuaCarPageCmd extends Command {
@ApiModelProperty("车牌列表最大支持500")
private List<String> carNumList;
}

View File

@ -39,5 +39,12 @@
<groupId>com.jjb.saas</groupId>
<artifactId>jjb-saas-framework-facade</artifactId>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.12.23</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
</project>

View File

@ -3,26 +3,119 @@ package com.zcloud.primeport.dahua.api;
import com.dahuatech.icc.exception.ClientException;
import com.dahuatech.icc.oauth.model.v202010.GeneralResponse;
import com.zcloud.primeport.dahua.client.DaHuaApiClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Component
@ConditionalOnBean(DaHuaApiClient.class)
public class DaHuaPersonApi {
@Resource
@Autowired(required = false)
private DaHuaApiClient daHuaApiClient;
private static final String PERSON_ADD_URL = "/evo-apigw/evo-brm/1.2.0/person/subsystem/add";
private static final String PERSON_UPDATE_URL = "/evo-apigw/evo-brm/1.2.0/person/subsystem/update";
private static final String PERSON_GENERATE_ID_URL = "/evo-apigw/evo-brm/1.0.0/person/generate-id";
private static final String PERSON_DELETE_URL = "/evo-apigw/evo-brm/1.0.0/person/delete";
private static final String CAR_ADD_URL = "/evo-apigw/evo-brm/1.0.0/car/add";
private static final String CAR_UPDATE_URL = "/evo-apigw/evo-brm/1.0.0/car/update";
private static final String CAR_PAGE_URL = "/evo-apigw/evo-brm/1.2.0/car/subsystem/page";
private static final String CAR_DELETE_URL = "/evo-apigw/evo-brm/1.0.0/car/delete";
private static final String ACCESS_RECORD_URL = "/evo-apigw/evo-accesscontrol/1.0.0/card/accessControl/swingCardRecord/bycondition/combined";
public boolean isConfigured() {
return daHuaApiClient != null;
}
public GeneralResponse addPerson(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.postJson(PERSON_ADD_URL, body, headers);
}
public GeneralResponse updatePerson(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.putJson(PERSON_UPDATE_URL, body, headers);
}
public GeneralResponse generatePersonId() throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.getForm(PERSON_GENERATE_ID_URL, null, headers);
}
public GeneralResponse deletePerson(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.postJson(PERSON_DELETE_URL, body, headers);
}
public GeneralResponse addCar(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.postJson(CAR_ADD_URL, body, headers);
}
public GeneralResponse updateCar(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.putJson(CAR_UPDATE_URL, body, headers);
}
public GeneralResponse pageCar(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.postJson(CAR_PAGE_URL, body, headers);
}
public GeneralResponse deleteCar(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.postJson(CAR_DELETE_URL, body, headers);
}
public GeneralResponse queryAccessRecord(Map<String, Object> body) throws ClientException {
if (daHuaApiClient == null) {
return null;
}
String token = daHuaApiClient.getToken();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "bearer " + token);
return daHuaApiClient.postJson(ACCESS_RECORD_URL, body, headers);
}
}

View File

@ -3,18 +3,19 @@ package com.zcloud.primeport.dahua.config;
import com.dahuatech.icc.oauth.model.v202010.OauthConfigUserPwdInfo;
import com.zcloud.primeport.dahua.client.DaHuaApiClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(DaHuaProperties.class)
@ConditionalOnProperty(prefix = "dahua.oauth", name = "host")
public class DaHuaAutoConfig {
@Bean("dahuaApiOauthConfig")
public OauthConfigUserPwdInfo dahuaApiOauthConfig(DaHuaProperties properties) {
if (properties.getHost() == null || properties.getHost().trim().isEmpty()) {
return null;
}
OauthConfigUserPwdInfo config = new OauthConfigUserPwdInfo(
properties.getHost(),
properties.getClientId(),
@ -24,13 +25,20 @@ public class DaHuaAutoConfig {
properties.isHttp(),
properties.getPort()
);
config.getHttpConfigInfo().setReadTimeout(properties.getReadTimeout());
config.getHttpConfigInfo().setConnectionTimeout(properties.getConnectionTimeout());
if (properties.getReadTimeout() != null) {
config.getHttpConfigInfo().setReadTimeout(properties.getReadTimeout());
}
if (properties.getConnectionTimeout() != null) {
config.getHttpConfigInfo().setConnectionTimeout(properties.getConnectionTimeout());
}
return config;
}
@Bean
public DaHuaApiClient daHuaApiClient(@Qualifier("dahuaApiOauthConfig") OauthConfigUserPwdInfo oauthConfig) {
if (oauthConfig == null) {
return null;
}
return new DaHuaApiClient(oauthConfig);
}
}

View File

@ -1,38 +1,181 @@
package com.zcloud.primeport.gatewayimpl;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.dahuatech.icc.exception.ClientException;
import com.dahuatech.icc.oauth.model.v202010.GeneralResponse;
import com.zcloud.primeport.dahua.api.DaHuaPersonApi;
import com.zcloud.primeport.domain.gateway.DaHuaGateway;
import com.zcloud.primeport.domain.model.DaHuaAccessRecordCmd;
import com.zcloud.primeport.domain.model.DaHuaCarAddCmd;
import com.zcloud.primeport.domain.model.DaHuaCarPageCmd;
import com.zcloud.primeport.domain.model.DaHuaPersonSyncCmd;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
@AllArgsConstructor
@ConditionalOnBean(DaHuaPersonApi.class)
public class DaHuaGatewayImpl implements DaHuaGateway {
private final DaHuaPersonApi daHuaPersonApi;
@Autowired(required = false)
private DaHuaPersonApi daHuaPersonApi;
@Override
public Boolean syncPerson(DaHuaPersonSyncCmd cmd) {
Map<String, Object> body = convertToMap(cmd);
public Long generatePersonId() {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
try {
GeneralResponse response = daHuaPersonApi.addPerson(body);
return response != null && "0".equals(response.getCode());
GeneralResponse response = daHuaPersonApi.generatePersonId();
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华生成人员ID返回结果: {}", responseJson);
System.out.println("大华生成人员ID返回结果: " + responseJson);
if (response == null) {
throw new RuntimeException("大华生成人员ID失败: response为null");
}
if (!"0".equals(response.getCode())) {
throw new RuntimeException("大华生成人员ID失败: code=" + response.getCode() + ", response=" + responseJson);
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
String bizResult = null;
if (jsonObject.containsKey("result")) {
bizResult = jsonObject.getStr("result");
}
if (bizResult == null || bizResult.isEmpty()) {
throw new RuntimeException("大华生成人员ID失败: 未找到result字段, response=" + responseJson);
}
System.out.println("大华生成人员ID业务结果(result): " + bizResult);
JSONObject bizJson = JSONUtil.parseObj(bizResult);
if (bizJson.containsKey("data")) {
Object dataObj = bizJson.get("data");
if (dataObj != null) {
JSONObject data = JSONUtil.parseObj(dataObj);
if (data.containsKey("id")) {
Long id = data.getLong("id");
System.out.println("大华生成人员ID: " + id);
return id;
}
}
}
throw new RuntimeException("大华生成人员ID失败: 未找到data.id字段, bizResult=" + bizResult);
} catch (ClientException e) {
throw new RuntimeException("同步人员到大华平台失败", e);
log.error("大华生成人员ID异常: {}", e.getMessage(), e);
throw new RuntimeException("大华生成人员ID异常", e);
}
}
private Map<String, Object> convertToMap(DaHuaPersonSyncCmd cmd) {
@Override
public Map<String, Object> syncPerson(DaHuaPersonSyncCmd cmd) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
Map<String, Object> body = convertToMap(cmd);
log.info("大华同步人员请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华同步人员请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.addPerson(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华同步人员返回结果: {}", responseJson);
System.out.println("大华同步人员返回结果: " + responseJson);
if (response == null) {
log.error("大华同步人员失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
String dhResult = jsonObject.getStr("result", "");
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("result", dhResult);
if (!passed) {
log.error("大华同步人员失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华同步人员失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华同步人员异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
@Override
public Map<String, Object> updatePerson(DaHuaPersonSyncCmd cmd) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
if (cmd.getId() == null) {
Map<String, Object> emptyMap = new HashMap<>();
emptyMap.put("passed", false);
emptyMap.put("success", false);
emptyMap.put("code", "PARAM_ERROR");
emptyMap.put("errMsg", "id不能为空");
return emptyMap;
}
Map<String, Object> body = convertToMap(cmd);
log.info("大华修改人员请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华修改人员请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.updatePerson(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华修改人员返回结果: {}", responseJson);
System.out.println("大华修改人员返回结果: " + responseJson);
if (response == null) {
log.error("大华修改人员失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
String dhResult = jsonObject.getStr("result", "");
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("result", dhResult);
if (!passed) {
log.error("大华修改人员失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华修改人员失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华修改人员异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
private Map<String, Object> convertToMap(Object cmd) {
Map<String, Object> map = new HashMap<>();
try {
Field[] fields = cmd.getClass().getDeclaredFields();
@ -48,4 +191,377 @@ public class DaHuaGatewayImpl implements DaHuaGateway {
}
return map;
}
@Override
public Map<String, Object> deletePerson(List<Long> ids, Integer openDeleteFlag) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
if (ids == null || ids.isEmpty()) {
Map<String, Object> emptyMap = new HashMap<>();
emptyMap.put("passed", false);
emptyMap.put("success", false);
emptyMap.put("code", "PARAM_ERROR");
emptyMap.put("errMsg", "ids不能为空");
return emptyMap;
}
Map<String, Object> body = new HashMap<>();
body.put("ids", ids);
if (openDeleteFlag != null) {
body.put("openDeleteFlag", openDeleteFlag);
}
log.info("大华删除人员请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华删除人员请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.deletePerson(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华删除人员返回结果: {}", responseJson);
System.out.println("大华删除人员返回结果: " + responseJson);
if (response == null) {
log.error("大华删除人员失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
String dhResult = jsonObject.getStr("result", "");
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("result", dhResult);
if (!passed) {
log.error("大华删除人员失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华删除人员失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华删除人员异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
@Override
public Map<String, Object> addCar(DaHuaCarAddCmd cmd) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
if (cmd.getCarNum() == null || cmd.getCarNum().trim().isEmpty()) {
Map<String, Object> emptyMap = new HashMap<>();
emptyMap.put("passed", false);
emptyMap.put("success", false);
emptyMap.put("code", "PARAM_ERROR");
emptyMap.put("errMsg", "carNum车牌号码不能为空");
return emptyMap;
}
if (cmd.getDepartmentId() == null) {
Map<String, Object> emptyMap = new HashMap<>();
emptyMap.put("passed", false);
emptyMap.put("success", false);
emptyMap.put("code", "PARAM_ERROR");
emptyMap.put("errMsg", "departmentId部门ID不能为空");
return emptyMap;
}
Map<String, Object> body = convertToMap(cmd);
log.info("大华新增车辆请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华新增车辆请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.addCar(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华新增车辆返回结果: {}", responseJson);
System.out.println("大华新增车辆返回结果: " + responseJson);
if (response == null) {
log.error("大华新增车辆失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
String dhResult = jsonObject.getStr("result", "");
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("result", dhResult);
if (!passed) {
log.error("大华新增车辆失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华新增车辆失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华新增车辆异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
@Override
public Map<String, Object> updateCar(DaHuaCarAddCmd cmd) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
if (cmd.getCarCode() == null || cmd.getCarCode().trim().isEmpty()) {
Map<String, Object> emptyMap = new HashMap<>();
emptyMap.put("passed", false);
emptyMap.put("success", false);
emptyMap.put("code", "PARAM_ERROR");
emptyMap.put("errMsg", "carCode车辆编号不能为空");
return emptyMap;
}
if (cmd.getCarNum() == null || cmd.getCarNum().trim().isEmpty()) {
Map<String, Object> emptyMap = new HashMap<>();
emptyMap.put("passed", false);
emptyMap.put("success", false);
emptyMap.put("code", "PARAM_ERROR");
emptyMap.put("errMsg", "carNum车牌号码不能为空");
return emptyMap;
}
if (cmd.getDepartmentId() == null) {
Map<String, Object> emptyMap = new HashMap<>();
emptyMap.put("passed", false);
emptyMap.put("success", false);
emptyMap.put("code", "PARAM_ERROR");
emptyMap.put("errMsg", "departmentId部门ID不能为空");
return emptyMap;
}
Map<String, Object> body = convertToMap(cmd);
log.info("大华修改车辆请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华修改车辆请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.updateCar(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华修改车辆返回结果: {}", responseJson);
System.out.println("大华修改车辆返回结果: " + responseJson);
if (response == null) {
log.error("大华修改车辆失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
String dhResult = jsonObject.getStr("result", "");
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("result", dhResult);
if (!passed) {
log.error("大华修改车辆失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华修改车辆失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华修改车辆异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
@Override
public Map<String, Object> pageCar(DaHuaCarPageCmd cmd) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
Map<String, Object> body = convertToMap(cmd);
log.info("大华车辆分页查询请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华车辆分页查询请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.pageCar(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华车辆分页查询返回结果: {}", responseJson);
System.out.println("大华车辆分页查询返回结果: " + responseJson);
if (response == null) {
log.error("大华车辆分页查询失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
String bizResult = jsonObject.getStr("result", "");
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
Object dhData = jsonObject.get("data");
if (bizResult != null && !bizResult.trim().isEmpty()) {
try {
JSONObject bizObj = JSONUtil.parseObj(bizResult);
dhSuccess = bizObj.getBool("success", dhSuccess);
dhCode = bizObj.getStr("code", dhCode);
dhErrMsg = bizObj.getStr("errMsg", dhErrMsg);
Object tmpData = bizObj.get("data");
if (tmpData != null) {
dhData = tmpData;
}
System.out.println("大华车辆分页查询解析result字段成功, data=" + (dhData != null ? "已获取" : "null"));
} catch (Exception e) {
System.out.println("大华车辆分页查询解析result字段失败使用外层字段: " + e.getMessage());
}
}
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("data", dhData);
if (!passed) {
log.error("大华车辆分页查询失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华车辆分页查询失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华车辆分页查询异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
@Override
public Map<String, Object> deleteCar(List<String> carNumList) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
Map<String, Object> body = new HashMap<>();
body.put("carNumList", carNumList);
log.info("大华删除车辆请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华删除车辆请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.deleteCar(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华删除车辆返回结果: {}", responseJson);
System.out.println("大华删除车辆返回结果: " + responseJson);
if (response == null) {
log.error("大华删除车辆失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
String dhResult = jsonObject.getStr("result", "");
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("result", dhResult);
if (!passed) {
log.error("大华删除车辆失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华删除车辆失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华删除车辆异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
@Override
public Map<String, Object> queryAccessRecord(DaHuaAccessRecordCmd cmd) {
if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) {
throw new RuntimeException("大华服务未配置");
}
Map<String, Object> body = convertToMap(cmd);
log.info("大华门禁事件查询请求参数: {}", JSONUtil.toJsonStr(body));
System.out.println("大华门禁事件查询请求参数: " + JSONUtil.toJsonStr(body));
Map<String, Object> resultMap = new HashMap<>();
try {
GeneralResponse response = daHuaPersonApi.queryAccessRecord(body);
String responseJson = JSONUtil.toJsonStr(response);
log.info("大华门禁事件查询返回结果: {}", responseJson);
System.out.println("大华门禁事件查询返回结果: " + responseJson);
if (response == null) {
log.error("大华门禁事件查询失败: response为null");
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "SYSTEM_ERROR");
resultMap.put("errMsg", "response为null");
return resultMap;
}
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
String bizResult = jsonObject.getStr("result", "");
Boolean dhSuccess = jsonObject.getBool("success", false);
String dhCode = jsonObject.getStr("code", response.getCode());
String dhErrMsg = jsonObject.getStr("errMsg", "");
Object dhData = jsonObject.get("data");
if (bizResult != null && !bizResult.trim().isEmpty()) {
try {
JSONObject bizObj = JSONUtil.parseObj(bizResult);
dhSuccess = bizObj.getBool("success", dhSuccess);
dhCode = bizObj.getStr("code", dhCode);
dhErrMsg = bizObj.getStr("errMsg", dhErrMsg);
Object tmpData = bizObj.get("data");
if (tmpData != null) {
dhData = tmpData;
}
System.out.println("大华门禁事件查询解析result字段成功, data=" + (dhData != null ? "已获取" : "null"));
} catch (Exception e) {
System.out.println("大华门禁事件查询解析result字段失败使用外层字段: " + e.getMessage());
}
}
boolean passed = "0".equals(dhCode);
resultMap.put("passed", passed);
resultMap.put("success", dhSuccess);
resultMap.put("code", dhCode);
resultMap.put("errMsg", dhErrMsg);
resultMap.put("data", dhData);
if (!passed) {
log.error("大华门禁事件查询失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson);
System.out.println("大华门禁事件查询失败: code=" + dhCode + ", errMsg=" + dhErrMsg);
}
return resultMap;
} catch (ClientException e) {
log.error("大华门禁事件查询异常: {}", e.getMessage(), e);
resultMap.put("passed", false);
resultMap.put("success", false);
resultMap.put("code", "CLIENT_EXCEPTION");
resultMap.put("errMsg", e.getMessage());
return resultMap;
}
}
}

View File

@ -1,39 +1,24 @@
package com.zcloud.primeport.plan.mjDevice;
import com.dahuatech.icc.oauth.model.v202010.OauthConfigUserPwdInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;
/**
* @Description:
* @Date: 2026/7/2
* @User: tianxinlei
*/
@Component
@ConditionalOnBean(name = "dahuaApiOauthConfig")
public class DaHuaSdkUtil {
private final OauthConfigUserPwdInfo oauthConfig;
@Autowired(required = false)
@Qualifier("dahuaApiOauthConfig")
private OauthConfigUserPwdInfo oauthConfig;
public DaHuaSdkUtil(@Qualifier("dahuaApiOauthConfig") OauthConfigUserPwdInfo oauthConfig) {
this.oauthConfig = oauthConfig;
}
/**
*
*/
public String login() {
// 内部使用 oauthConfig 执行登录逻辑返回token
if (oauthConfig == null) {
return null;
}
return null;
}
/**
* SDK
*/
public void logout() {
// SDK注销、销毁连接
}
// 其他设备查询、回放、抓拍等业务方法
}

View File

@ -1,9 +1,9 @@
dahua:
oauth:
host: 123.183.159.35
client-id: 123.183.159.35
client-secret: 4edfdcd2-67e6-41db-a1ae-b98d47a70266
username: system
password: zcloud88888
http: false
port: 4443
port: 4443