From 3cbc28e17fb340a7ec899b499cf0649746818c8e Mon Sep 17 00:00:00 2001 From: zhangxiongfeng Date: Mon, 27 Jul 2026 08:47:38 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=8F=A3=E9=97=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # start/src/main/resources/bootstrap.yml --- logs/xxl-job/2026-07-23/9245629.log | 3 + logs/xxl-job/2026-07-23/9245741.log | 3 + logs/xxl-job/2026-07-23/9245919.log | 3 + logs/xxl-job/2026-07-23/9246062.log | 3 + logs/xxl-job/2026-07-23/9247146.log | 3 + logs/xxl-job/2026-07-25/9334840.log | 3 + logs/xxl-job/2026-07-25/9334958.log | 3 + logs/xxl-job/2026-07-25/9335140.log | 3 + logs/xxl-job/2026-07-25/9335284.log | 3 + logs/xxl-job/2026-07-25/9336371.log | 3 + logs/xxl-job/2026-07-26/9379682.log | 3 + logs/xxl-job/2026-07-26/9379801.log | 3 + logs/xxl-job/2026-07-26/9379974.log | 3 + logs/xxl-job/2026-07-26/9380119.log | 3 + logs/xxl-job/2026-07-26/9381209.log | 3 + logs/xxl-job/2026-07-27/9424523.log | 3 + logs/xxl-job/2026-07-27/9424639.log | 3 + logs/xxl-job/2026-07-27/9424819.log | 3 + logs/xxl-job/2026-07-27/9424963.log | 3 + logs/xxl-job/2026-07-27/9426051.log | 3 + start/src/main/resources/application.yml | 9 + start/src/main/resources/nacos.yml | 5 +- .../zcloud/primeport/web/DaHuaController.java | 79 +++ .../primeport/service/DaHuaServiceImpl.java | 184 +++++- .../zcloud/primeport/api/DaHuaServiceI.java | 24 + .../primeport/dto/DaHuaCarDeleteCmd.java | 20 + .../zcloud/primeport/dto/DaHuaCarPageCmd.java | 18 + .../primeport/dto/DaHuaPersonDeleteCmd.java | 25 + .../domain/gateway/DaHuaGateway.java | 24 +- .../domain/model/DaHuaAccessRecordCmd.java | 84 +++ .../domain/model/DaHuaCarAddCmd.java | 29 + .../domain/model/DaHuaCarPageCmd.java | 18 + web-infrastructure/pom.xml | 9 +- .../primeport/dahua/api/DaHuaPersonApi.java | 101 +++- .../dahua/config/DaHuaAutoConfig.java | 16 +- .../gatewayimpl/DaHuaGatewayImpl.java | 540 +++++++++++++++++- .../primeport/plan/mjDevice/DaHuaSdkUtil.java | 29 +- .../src/test/resources/application.yml | 4 +- 38 files changed, 1224 insertions(+), 54 deletions(-) create mode 100644 logs/xxl-job/2026-07-23/9245629.log create mode 100644 logs/xxl-job/2026-07-23/9245741.log create mode 100644 logs/xxl-job/2026-07-23/9245919.log create mode 100644 logs/xxl-job/2026-07-23/9246062.log create mode 100644 logs/xxl-job/2026-07-23/9247146.log create mode 100644 logs/xxl-job/2026-07-25/9334840.log create mode 100644 logs/xxl-job/2026-07-25/9334958.log create mode 100644 logs/xxl-job/2026-07-25/9335140.log create mode 100644 logs/xxl-job/2026-07-25/9335284.log create mode 100644 logs/xxl-job/2026-07-25/9336371.log create mode 100644 logs/xxl-job/2026-07-26/9379682.log create mode 100644 logs/xxl-job/2026-07-26/9379801.log create mode 100644 logs/xxl-job/2026-07-26/9379974.log create mode 100644 logs/xxl-job/2026-07-26/9380119.log create mode 100644 logs/xxl-job/2026-07-26/9381209.log create mode 100644 logs/xxl-job/2026-07-27/9424523.log create mode 100644 logs/xxl-job/2026-07-27/9424639.log create mode 100644 logs/xxl-job/2026-07-27/9424819.log create mode 100644 logs/xxl-job/2026-07-27/9424963.log create mode 100644 logs/xxl-job/2026-07-27/9426051.log create mode 100644 start/src/main/resources/application.yml create mode 100644 web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarDeleteCmd.java create mode 100644 web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarPageCmd.java create mode 100644 web-client/src/main/java/com/zcloud/primeport/dto/DaHuaPersonDeleteCmd.java create mode 100644 web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaAccessRecordCmd.java create mode 100644 web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarAddCmd.java create mode 100644 web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarPageCmd.java diff --git a/logs/xxl-job/2026-07-23/9245629.log b/logs/xxl-job/2026-07-23/9245629.log new file mode 100644 index 0000000..a1da9a1 --- /dev/null +++ b/logs/xxl-job/2026-07-23/9245629.log @@ -0,0 +1,3 @@ +2026-07-23 00:09:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-176]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-23 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-176]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-23 00:09:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-23/9245741.log b/logs/xxl-job/2026-07-23/9245741.log new file mode 100644 index 0000000..65b1eab --- /dev/null +++ b/logs/xxl-job/2026-07-23/9245741.log @@ -0,0 +1,3 @@ +2026-07-23 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-177]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-23 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-177]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-23 00:13:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-23/9245919.log b/logs/xxl-job/2026-07-23/9245919.log new file mode 100644 index 0000000..5b6787f --- /dev/null +++ b/logs/xxl-job/2026-07-23/9245919.log @@ -0,0 +1,3 @@ +2026-07-23 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-178]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-23 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-178]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-23 00:19:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-23/9246062.log b/logs/xxl-job/2026-07-23/9246062.log new file mode 100644 index 0000000..7dbdc28 --- /dev/null +++ b/logs/xxl-job/2026-07-23/9246062.log @@ -0,0 +1,3 @@ +2026-07-23 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-179]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-23 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-179]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-23 00:24:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-23/9247146.log b/logs/xxl-job/2026-07-23/9247146.log new file mode 100644 index 0000000..aea4f3e --- /dev/null +++ b/logs/xxl-job/2026-07-23/9247146.log @@ -0,0 +1,3 @@ +2026-07-23 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-180]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-23 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-180]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-23 00:59:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-25/9334840.log b/logs/xxl-job/2026-07-25/9334840.log new file mode 100644 index 0000000..5c73076 --- /dev/null +++ b/logs/xxl-job/2026-07-25/9334840.log @@ -0,0 +1,3 @@ +2026-07-25 00:09:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-179]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-25 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-179]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-25 00:09:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-25/9334958.log b/logs/xxl-job/2026-07-25/9334958.log new file mode 100644 index 0000000..0bb9e90 --- /dev/null +++ b/logs/xxl-job/2026-07-25/9334958.log @@ -0,0 +1,3 @@ +2026-07-25 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-180]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-25 00:13:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-180]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-25 00:13:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-25/9335140.log b/logs/xxl-job/2026-07-25/9335140.log new file mode 100644 index 0000000..bb3caba --- /dev/null +++ b/logs/xxl-job/2026-07-25/9335140.log @@ -0,0 +1,3 @@ +2026-07-25 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-181]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-25 00:19:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-181]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-25 00:19:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-25/9335284.log b/logs/xxl-job/2026-07-25/9335284.log new file mode 100644 index 0000000..110ea75 --- /dev/null +++ b/logs/xxl-job/2026-07-25/9335284.log @@ -0,0 +1,3 @@ +2026-07-25 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-182]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-25 00:24:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-182]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-25 00:24:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-25/9336371.log b/logs/xxl-job/2026-07-25/9336371.log new file mode 100644 index 0000000..b4bd8dd --- /dev/null +++ b/logs/xxl-job/2026-07-25/9336371.log @@ -0,0 +1,3 @@ +2026-07-25 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-183]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-25 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-183]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-25 00:59:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-26/9379682.log b/logs/xxl-job/2026-07-26/9379682.log new file mode 100644 index 0000000..d385c27 --- /dev/null +++ b/logs/xxl-job/2026-07-26/9379682.log @@ -0,0 +1,3 @@ +2026-07-26 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-184]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-26 00:09:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-184]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-26 00:09:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-26/9379801.log b/logs/xxl-job/2026-07-26/9379801.log new file mode 100644 index 0000000..0843d24 --- /dev/null +++ b/logs/xxl-job/2026-07-26/9379801.log @@ -0,0 +1,3 @@ +2026-07-26 00:13:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-185]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-26 00:13:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-185]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-26 00:13:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-26/9379974.log b/logs/xxl-job/2026-07-26/9379974.log new file mode 100644 index 0000000..5fd6ecf --- /dev/null +++ b/logs/xxl-job/2026-07-26/9379974.log @@ -0,0 +1,3 @@ +2026-07-26 00:19:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-186]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-26 00:19:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-186]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-26 00:19:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-26/9380119.log b/logs/xxl-job/2026-07-26/9380119.log new file mode 100644 index 0000000..2fe04ae --- /dev/null +++ b/logs/xxl-job/2026-07-26/9380119.log @@ -0,0 +1,3 @@ +2026-07-26 00:24:58 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-187]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-26 00:24:58 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-187]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-26 00:24:58 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-26/9381209.log b/logs/xxl-job/2026-07-26/9381209.log new file mode 100644 index 0000000..24271ab --- /dev/null +++ b/logs/xxl-job/2026-07-26/9381209.log @@ -0,0 +1,3 @@ +2026-07-26 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-188]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-26 00:59:57 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-188]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-26 00:59:57 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-27/9424523.log b/logs/xxl-job/2026-07-27/9424523.log new file mode 100644 index 0000000..9dcd2bf --- /dev/null +++ b/logs/xxl-job/2026-07-27/9424523.log @@ -0,0 +1,3 @@ +2026-07-27 00:09:54 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-189]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-27 00:09:54 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-189]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-27 00:09:54 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-27/9424639.log b/logs/xxl-job/2026-07-27/9424639.log new file mode 100644 index 0000000..8d23882 --- /dev/null +++ b/logs/xxl-job/2026-07-27/9424639.log @@ -0,0 +1,3 @@ +2026-07-27 00:13:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-190]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-27 00:13:53 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-190]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-27 00:13:53 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-27/9424819.log b/logs/xxl-job/2026-07-27/9424819.log new file mode 100644 index 0000000..99dab3b --- /dev/null +++ b/logs/xxl-job/2026-07-27/9424819.log @@ -0,0 +1,3 @@ +2026-07-27 00:19:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-191]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-27 00:19:53 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-191]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-27 00:19:53 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-27/9424963.log b/logs/xxl-job/2026-07-27/9424963.log new file mode 100644 index 0000000..7aebf06 --- /dev/null +++ b/logs/xxl-job/2026-07-27/9424963.log @@ -0,0 +1,3 @@ +2026-07-27 00:24:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-192]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-27 00:24:53 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-192]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-27 00:24:53 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/logs/xxl-job/2026-07-27/9426051.log b/logs/xxl-job/2026-07-27/9426051.log new file mode 100644 index 0000000..cec544a --- /dev/null +++ b/logs/xxl-job/2026-07-27/9426051.log @@ -0,0 +1,3 @@ +2026-07-27 00:59:53 [com.xxl.job.core.thread.JobThread#run]-[130]-[Thread-193]
----------- xxl-job job execute start -----------
----------- Param:null +2026-07-27 00:59:54 [com.xxl.job.core.thread.JobThread#run]-[176]-[Thread-193]
----------- xxl-job job execute end(finish) -----------
----------- Result: handleCode=200, handleMsg = null +2026-07-27 00:59:54 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[197]-[xxl-job, executor TriggerCallbackThread]
----------- xxl-job job callback finish. diff --git a/start/src/main/resources/application.yml b/start/src/main/resources/application.yml new file mode 100644 index 0000000..ccad15a --- /dev/null +++ b/start/src/main/resources/application.yml @@ -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 diff --git a/start/src/main/resources/nacos.yml b/start/src/main/resources/nacos.yml index bd2faca..422392b 100644 --- a/start/src/main/resources/nacos.yml +++ b/start/src/main/resources/nacos.yml @@ -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} \ No newline at end of file diff --git a/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java b/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java index 5fd3e24..dd09935 100644 --- a/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java +++ b/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java @@ -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 generatePersonId() { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.generatePersonId(); + } + @ApiOperation("同步人员到大华平台-新增") @PostMapping("/person/sync") public SingleResponse syncPerson(@Validated @RequestBody DaHuaPersonSyncCmd cmd) { @@ -26,4 +42,67 @@ public class DaHuaController { } return daHuaService.syncPerson(cmd); } + + @ApiOperation("修改人员") + @PutMapping("/person/update") + public SingleResponse updatePerson(@Validated @RequestBody DaHuaPersonSyncCmd cmd) { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.updatePerson(cmd); + } + + @ApiOperation("新增车辆") + @PostMapping("/car/add") + public SingleResponse addCar(@Validated @RequestBody DaHuaCarAddCmd cmd) { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.addCar(cmd); + } + + @ApiOperation("修改车辆") + @PutMapping("/car/update") + public SingleResponse updateCar(@Validated @RequestBody DaHuaCarAddCmd cmd) { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.updateCar(cmd); + } + + @ApiOperation("车辆分页查询(根据车牌查carCode)") + @PostMapping("/car/page") + public SingleResponse> pageCar(@Validated @RequestBody DaHuaCarPageCmd cmd) { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.pageCar(cmd); + } + + @ApiOperation("删除车辆") + @PostMapping("/car/delete") + public SingleResponse deleteCar(@Validated @RequestBody DaHuaCarDeleteCmd cmd) { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.deleteCar(cmd); + } + + @ApiOperation("门禁事件查询(刷卡记录分页)") + @PostMapping("/access/record") + public SingleResponse> queryAccessRecord(@Validated @RequestBody DaHuaAccessRecordCmd cmd) { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.queryAccessRecord(cmd); + } + + @ApiOperation("删除人员") + @PostMapping("/person/delete") + public SingleResponse deletePerson(@Validated @RequestBody DaHuaPersonDeleteCmd cmd) { + if (daHuaService == null) { + throw new RuntimeException("大华服务未配置"); + } + return daHuaService.deletePerson(cmd); + } } \ No newline at end of file diff --git a/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java b/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java index 48c6855..5f7adac 100644 --- a/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java @@ -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 generatePersonId() { + Long id = daHuaGateway.generatePersonId(); + System.out.println("大华生成人员ID返回: " + id); + return SingleResponse.of(id); + } + @Override public SingleResponse syncPerson(DaHuaPersonSyncCmd cmd) { - if (daHuaGateway == null) { - throw new RuntimeException("大华服务未配置"); + Long personId = daHuaGateway.generatePersonId(); + System.out.println("大华自动生成人员ID: " + personId); + cmd.setId(personId); + Map 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 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 updatePerson(DaHuaPersonSyncCmd cmd) { + Map 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 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 deletePerson(DaHuaPersonDeleteCmd cmd) { + Map 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 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 addCar(DaHuaCarAddCmd cmd) { + Map 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 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 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 pageResult = daHuaGateway.pageCar(pageCmd); + Boolean pagePassed = (Boolean) pageResult.get("passed"); + @SuppressWarnings("unchecked") + Map pageDataMap = (Map) 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> pageDataList = (java.util.List>) pageDataObj; + for (Map 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 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 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> pageCar(DaHuaCarPageCmd cmd) { + Map 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 dhData = (Map) pageResult.get("data"); + SingleResponse> 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 deleteCar(DaHuaCarDeleteCmd cmd) { + Map 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 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> queryAccessRecord(DaHuaAccessRecordCmd cmd) { + Map 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 dhData = (Map) queryResult.get("data"); + SingleResponse> 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; } } \ No newline at end of file diff --git a/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java b/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java index bfdf3c1..e1c22a4 100644 --- a/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java +++ b/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java @@ -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 generatePersonId(); + SingleResponse syncPerson(DaHuaPersonSyncCmd cmd); + + SingleResponse updatePerson(DaHuaPersonSyncCmd cmd); + + SingleResponse deletePerson(DaHuaPersonDeleteCmd cmd); + + SingleResponse addCar(DaHuaCarAddCmd cmd); + + SingleResponse updateCar(DaHuaCarAddCmd cmd); + + SingleResponse> pageCar(DaHuaCarPageCmd cmd); + + SingleResponse deleteCar(DaHuaCarDeleteCmd cmd); + + SingleResponse> queryAccessRecord(DaHuaAccessRecordCmd cmd); } \ No newline at end of file diff --git a/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarDeleteCmd.java b/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarDeleteCmd.java new file mode 100644 index 0000000..61a43ba --- /dev/null +++ b/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarDeleteCmd.java @@ -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 carNumList; +} \ No newline at end of file diff --git a/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarPageCmd.java b/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarPageCmd.java new file mode 100644 index 0000000..7606f8e --- /dev/null +++ b/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaCarPageCmd.java @@ -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 carNumList; +} \ No newline at end of file diff --git a/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaPersonDeleteCmd.java b/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaPersonDeleteCmd.java new file mode 100644 index 0000000..5612cf1 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/primeport/dto/DaHuaPersonDeleteCmd.java @@ -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 ids; + + @ApiModelProperty("是否开放删除标识(默认不传:解绑卡片、删除车辆)") + private Integer openDeleteFlag; +} \ No newline at end of file diff --git a/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java b/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java index 3edbc4c..857d4a8 100644 --- a/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java +++ b/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java @@ -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 syncPerson(DaHuaPersonSyncCmd cmd); + + Map updatePerson(DaHuaPersonSyncCmd cmd); + + Map deletePerson(List ids, Integer openDeleteFlag); + + Map addCar(DaHuaCarAddCmd cmd); + + Map updateCar(DaHuaCarAddCmd cmd); + + Map pageCar(DaHuaCarPageCmd cmd); + + Map deleteCar(List carNumList); + + Map queryAccessRecord(DaHuaAccessRecordCmd cmd); } \ No newline at end of file diff --git a/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaAccessRecordCmd.java b/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaAccessRecordCmd.java new file mode 100644 index 0000000..f8b9290 --- /dev/null +++ b/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaAccessRecordCmd.java @@ -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:ss,V1.1.4新增") + private String startCreateTime; + + @ApiModelProperty("入库结束时间,格式yyyy-MM-dd HH:mm:ss,V1.1.4新增") + private String endCreateTime; + + @ApiModelProperty("开门类型") + private Integer openType; + + @ApiModelProperty("开门类型多选") + private List openTypes; + + @ApiModelProperty("卡片类型,不传-全部,0-IC卡,1-有源RFID,2-CPU卡") + private String category; + + @ApiModelProperty("人员名称") + private String personName; + + @ApiModelProperty("人员编号") + private String personCode; + + @ApiModelProperty("通道编码列表,最大500") + private List 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; +} \ No newline at end of file diff --git a/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarAddCmd.java b/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarAddCmd.java new file mode 100644 index 0000000..3ac7952 --- /dev/null +++ b/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarAddCmd.java @@ -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; +} \ No newline at end of file diff --git a/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarPageCmd.java b/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarPageCmd.java new file mode 100644 index 0000000..c14b769 --- /dev/null +++ b/web-domain/src/main/java/com/zcloud/primeport/domain/model/DaHuaCarPageCmd.java @@ -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 carNumList; +} \ No newline at end of file diff --git a/web-infrastructure/pom.xml b/web-infrastructure/pom.xml index 376fde8..46a5433 100644 --- a/web-infrastructure/pom.xml +++ b/web-infrastructure/pom.xml @@ -39,5 +39,12 @@ com.jjb.saas jjb-saas-framework-facade + + + net.bytebuddy + byte-buddy + 1.12.23 + test + - + \ No newline at end of file diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java b/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java index 6d715d9..e9dacb6 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java @@ -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 body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } String token = daHuaApiClient.getToken(); Map headers = new HashMap<>(); headers.put("Authorization", "bearer " + token); return daHuaApiClient.postJson(PERSON_ADD_URL, body, headers); } + + public GeneralResponse updatePerson(Map body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map 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 headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + return daHuaApiClient.getForm(PERSON_GENERATE_ID_URL, null, headers); + } + + public GeneralResponse deletePerson(Map body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + return daHuaApiClient.postJson(PERSON_DELETE_URL, body, headers); + } + + public GeneralResponse addCar(Map body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + return daHuaApiClient.postJson(CAR_ADD_URL, body, headers); + } + + public GeneralResponse updateCar(Map body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + return daHuaApiClient.putJson(CAR_UPDATE_URL, body, headers); + } + + public GeneralResponse pageCar(Map body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + return daHuaApiClient.postJson(CAR_PAGE_URL, body, headers); + } + + public GeneralResponse deleteCar(Map body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + return daHuaApiClient.postJson(CAR_DELETE_URL, body, headers); + } + + public GeneralResponse queryAccessRecord(Map body) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + return daHuaApiClient.postJson(ACCESS_RECORD_URL, body, headers); + } } \ No newline at end of file diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/config/DaHuaAutoConfig.java b/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/config/DaHuaAutoConfig.java index f88d93d..84c5c90 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/config/DaHuaAutoConfig.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/config/DaHuaAutoConfig.java @@ -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); } } \ No newline at end of file diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java index 0884549..940669f 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java @@ -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 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 convertToMap(DaHuaPersonSyncCmd cmd) { + @Override + public Map syncPerson(DaHuaPersonSyncCmd cmd) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + Map body = convertToMap(cmd); + log.info("大华同步人员请求参数: {}", JSONUtil.toJsonStr(body)); + System.out.println("大华同步人员请求参数: " + JSONUtil.toJsonStr(body)); + Map 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 updatePerson(DaHuaPersonSyncCmd cmd) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + if (cmd.getId() == null) { + Map emptyMap = new HashMap<>(); + emptyMap.put("passed", false); + emptyMap.put("success", false); + emptyMap.put("code", "PARAM_ERROR"); + emptyMap.put("errMsg", "id不能为空"); + return emptyMap; + } + Map body = convertToMap(cmd); + log.info("大华修改人员请求参数: {}", JSONUtil.toJsonStr(body)); + System.out.println("大华修改人员请求参数: " + JSONUtil.toJsonStr(body)); + Map 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 convertToMap(Object cmd) { Map map = new HashMap<>(); try { Field[] fields = cmd.getClass().getDeclaredFields(); @@ -48,4 +191,377 @@ public class DaHuaGatewayImpl implements DaHuaGateway { } return map; } + + @Override + public Map deletePerson(List ids, Integer openDeleteFlag) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + if (ids == null || ids.isEmpty()) { + Map emptyMap = new HashMap<>(); + emptyMap.put("passed", false); + emptyMap.put("success", false); + emptyMap.put("code", "PARAM_ERROR"); + emptyMap.put("errMsg", "ids不能为空"); + return emptyMap; + } + Map 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 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 addCar(DaHuaCarAddCmd cmd) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + if (cmd.getCarNum() == null || cmd.getCarNum().trim().isEmpty()) { + Map 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 emptyMap = new HashMap<>(); + emptyMap.put("passed", false); + emptyMap.put("success", false); + emptyMap.put("code", "PARAM_ERROR"); + emptyMap.put("errMsg", "departmentId部门ID不能为空"); + return emptyMap; + } + Map body = convertToMap(cmd); + log.info("大华新增车辆请求参数: {}", JSONUtil.toJsonStr(body)); + System.out.println("大华新增车辆请求参数: " + JSONUtil.toJsonStr(body)); + Map 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 updateCar(DaHuaCarAddCmd cmd) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + if (cmd.getCarCode() == null || cmd.getCarCode().trim().isEmpty()) { + Map 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 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 emptyMap = new HashMap<>(); + emptyMap.put("passed", false); + emptyMap.put("success", false); + emptyMap.put("code", "PARAM_ERROR"); + emptyMap.put("errMsg", "departmentId部门ID不能为空"); + return emptyMap; + } + Map body = convertToMap(cmd); + log.info("大华修改车辆请求参数: {}", JSONUtil.toJsonStr(body)); + System.out.println("大华修改车辆请求参数: " + JSONUtil.toJsonStr(body)); + Map 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 pageCar(DaHuaCarPageCmd cmd) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + Map body = convertToMap(cmd); + log.info("大华车辆分页查询请求参数: {}", JSONUtil.toJsonStr(body)); + System.out.println("大华车辆分页查询请求参数: " + JSONUtil.toJsonStr(body)); + Map 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 deleteCar(List carNumList) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + Map body = new HashMap<>(); + body.put("carNumList", carNumList); + log.info("大华删除车辆请求参数: {}", JSONUtil.toJsonStr(body)); + System.out.println("大华删除车辆请求参数: " + JSONUtil.toJsonStr(body)); + Map 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 queryAccessRecord(DaHuaAccessRecordCmd cmd) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + Map body = convertToMap(cmd); + log.info("大华门禁事件查询请求参数: {}", JSONUtil.toJsonStr(body)); + System.out.println("大华门禁事件查询请求参数: " + JSONUtil.toJsonStr(body)); + Map 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; + } + } } \ No newline at end of file diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/DaHuaSdkUtil.java b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/DaHuaSdkUtil.java index 17c5694..a25e0c4 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/DaHuaSdkUtil.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/DaHuaSdkUtil.java @@ -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注销、销毁连接 } - - // 其他设备查询、回放、抓拍等业务方法 } \ No newline at end of file diff --git a/web-infrastructure/src/test/resources/application.yml b/web-infrastructure/src/test/resources/application.yml index 24e47ee..ba5fcea 100644 --- a/web-infrastructure/src/test/resources/application.yml +++ b/web-infrastructure/src/test/resources/application.yml @@ -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 \ No newline at end of file From 1d8809bbdf4d09d1d7798e43903dce3f17b7d744 Mon Sep 17 00:00:00 2001 From: zhangxiongfeng Date: Mon, 27 Jul 2026 19:08:47 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=BA=E5=91=98id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zcloud/primeport/web/DaHuaController.java | 2 +- .../primeport/service/DaHuaServiceImpl.java | 9 +++--- .../zcloud/primeport/api/DaHuaServiceI.java | 2 +- .../gatewayimpl/DaHuaGatewayImpl.java | 30 +++++++++++++++++-- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java b/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java index dd09935..56beda7 100644 --- a/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java +++ b/web-adapter/src/main/java/com/zcloud/primeport/web/DaHuaController.java @@ -35,7 +35,7 @@ public class DaHuaController { @ApiOperation("同步人员到大华平台-新增") @PostMapping("/person/sync") - public SingleResponse syncPerson(@Validated @RequestBody DaHuaPersonSyncCmd cmd) { + public SingleResponse syncPerson(@Validated @RequestBody DaHuaPersonSyncCmd cmd) { if (daHuaService == null) { throw new RuntimeException("大华服务未配置"); diff --git a/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java b/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java index 5f7adac..7e29ce8 100644 --- a/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/primeport/service/DaHuaServiceImpl.java @@ -28,7 +28,7 @@ public class DaHuaServiceImpl implements DaHuaServiceI { } @Override - public SingleResponse syncPerson(DaHuaPersonSyncCmd cmd) { + public SingleResponse syncPerson(DaHuaPersonSyncCmd cmd) { Long personId = daHuaGateway.generatePersonId(); System.out.println("大华自动生成人员ID: " + personId); cmd.setId(personId); @@ -37,12 +37,13 @@ public class DaHuaServiceImpl implements DaHuaServiceI { Boolean dhSuccess = (Boolean) syncResult.get("success"); String dhCode = (String) syncResult.get("code"); String dhErrMsg = (String) syncResult.get("errMsg"); - SingleResponse resp = new SingleResponse<>(); + Object dhData = syncResult.get("dhData"); + SingleResponse 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()); + resp.setData(dhData); + System.out.println("大华同步人员最终返回 - success:" + resp.isSuccess() + ", errCode:" + resp.getErrCode() + ", errMessage:" + resp.getErrMessage() + ", data(dhData):" + dhData); return resp; } diff --git a/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java b/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java index e1c22a4..af2ef8a 100644 --- a/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java +++ b/web-client/src/main/java/com/zcloud/primeport/api/DaHuaServiceI.java @@ -15,7 +15,7 @@ public interface DaHuaServiceI { SingleResponse generatePersonId(); - SingleResponse syncPerson(DaHuaPersonSyncCmd cmd); + SingleResponse syncPerson(DaHuaPersonSyncCmd cmd); SingleResponse updatePerson(DaHuaPersonSyncCmd cmd); diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java index 940669f..70d0c4f 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java @@ -91,19 +91,44 @@ public class DaHuaGatewayImpl implements DaHuaGateway { resultMap.put("success", false); resultMap.put("code", "SYSTEM_ERROR"); resultMap.put("errMsg", "response为null"); + resultMap.put("dhData", 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", ""); + Object dhResultObj = jsonObject.get("result"); + Object dhData = jsonObject.get("data"); + if (dhResultObj != null) { + try { + JSONObject bizObj; + if (dhResultObj instanceof String) { + bizObj = JSONUtil.parseObj((String) dhResultObj); + } else if (dhResultObj instanceof JSONObject) { + bizObj = (JSONObject) dhResultObj; + } else { + bizObj = JSONUtil.parseObj(JSONUtil.toJsonStr(dhResultObj)); + } + 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; + } + } catch (Exception e) { + log.warn("大华同步人员解析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("result", dhResult); + resultMap.put("result", dhResultObj); + resultMap.put("dhData", dhData); + System.out.println("大华同步人员返回dhData: " + dhData); if (!passed) { log.error("大华同步人员失败: code={}, errMsg={}, response={}", dhCode, dhErrMsg, responseJson); System.out.println("大华同步人员失败: code=" + dhCode + ", errMsg=" + dhErrMsg); @@ -115,6 +140,7 @@ public class DaHuaGatewayImpl implements DaHuaGateway { resultMap.put("success", false); resultMap.put("code", "CLIENT_EXCEPTION"); resultMap.put("errMsg", e.getMessage()); + resultMap.put("dhData", null); return resultMap; } } From 946a0aa2a55f1ca0fefc01211f4fd3a1a4741144 Mon Sep 17 00:00:00 2001 From: zhangxiongfeng Date: Tue, 28 Jul 2026 10:26:33 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BA=BA=E8=84=B8=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- start/src/main/resources/bootstrap.yml | 4 +- .../domain/gateway/DaHuaGateway.java | 2 + .../primeport/dahua/api/DaHuaPersonApi.java | 13 + .../gatewayimpl/DaHuaGatewayImpl.java | 345 +++++++++++++++++- 4 files changed, 360 insertions(+), 4 deletions(-) diff --git a/start/src/main/resources/bootstrap.yml b/start/src/main/resources/bootstrap.yml index c0bc004..62d008f 100644 --- a/start/src/main/resources/bootstrap.yml +++ b/start/src/main/resources/bootstrap.yml @@ -1,8 +1,8 @@ spring: config: import: -# - classpath:nacos.yml - - classpath:prodnacos.yml + - classpath:nacos.yml +# - classpath:prodnacos.yml - classpath:sdk.yml - classpath:swagger.yml # - classpath:ds.yml diff --git a/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java b/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java index 857d4a8..08b43d0 100644 --- a/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java +++ b/web-domain/src/main/java/com/zcloud/primeport/domain/gateway/DaHuaGateway.java @@ -27,4 +27,6 @@ public interface DaHuaGateway { Map deleteCar(List carNumList); Map queryAccessRecord(DaHuaAccessRecordCmd cmd); + + String uploadPersonImg(String imageBase64); } \ No newline at end of file diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java b/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java index e9dacb6..8ab4cbc 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/dahua/api/DaHuaPersonApi.java @@ -24,6 +24,7 @@ public class DaHuaPersonApi { 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"; + private static final String PERSON_UPLOAD_IMG_URL = "/evo-apigw/evo-brm/1.0.0/person/subsystem/third/upload/img"; public boolean isConfigured() { return daHuaApiClient != null; @@ -118,4 +119,16 @@ public class DaHuaPersonApi { headers.put("Authorization", "bearer " + token); return daHuaApiClient.postJson(ACCESS_RECORD_URL, body, headers); } + + public GeneralResponse uploadPersonImg(String imageBase64) throws ClientException { + if (daHuaApiClient == null) { + return null; + } + String token = daHuaApiClient.getToken(); + Map headers = new HashMap<>(); + headers.put("Authorization", "bearer " + token); + Map body = new HashMap<>(); + body.put("imageBase64", imageBase64); + return daHuaApiClient.postJson(PERSON_UPLOAD_IMG_URL, body, headers); + } } \ No newline at end of file diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java index 70d0c4f..9a76f66 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/gatewayimpl/DaHuaGatewayImpl.java @@ -1,5 +1,6 @@ package com.zcloud.primeport.gatewayimpl; +import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.dahuatech.icc.exception.ClientException; @@ -15,7 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -76,9 +79,17 @@ public class DaHuaGatewayImpl implements DaHuaGateway { if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { throw new RuntimeException("大华服务未配置"); } + Map uploadResult = uploadAndSetPersonBiosignaturePaths(cmd); + if (uploadResult != null) { + return uploadResult; + } Map body = convertToMap(cmd); + processDaHuaPersonBiosignatures(body); + System.out.println("==========[syncPerson 完整请求参数 START]=========="); + System.out.println(JSONUtil.toJsonPrettyStr(body)); + debugPrintPersonBiosignatures(body); + System.out.println("==========[syncPerson 完整请求参数 END]============"); log.info("大华同步人员请求参数: {}", JSONUtil.toJsonStr(body)); - System.out.println("大华同步人员请求参数: " + JSONUtil.toJsonStr(body)); Map resultMap = new HashMap<>(); try { GeneralResponse response = daHuaPersonApi.addPerson(body); @@ -158,9 +169,17 @@ public class DaHuaGatewayImpl implements DaHuaGateway { emptyMap.put("errMsg", "id不能为空"); return emptyMap; } + Map uploadResult = uploadAndSetPersonBiosignaturePaths(cmd); + if (uploadResult != null) { + return uploadResult; + } Map body = convertToMap(cmd); + processDaHuaPersonBiosignatures(body); + System.out.println("==========[updatePerson 完整请求参数 START]=========="); + System.out.println(JSONUtil.toJsonPrettyStr(body)); + debugPrintPersonBiosignatures(body); + System.out.println("==========[updatePerson 完整请求参数 END]============"); log.info("大华修改人员请求参数: {}", JSONUtil.toJsonStr(body)); - System.out.println("大华修改人员请求参数: " + JSONUtil.toJsonStr(body)); Map resultMap = new HashMap<>(); try { GeneralResponse response = daHuaPersonApi.updatePerson(body); @@ -218,6 +237,215 @@ public class DaHuaGatewayImpl implements DaHuaGateway { return map; } + private static String getStr(Map m, String key) { + Object v = m.get(key); + return v == null ? null : v.toString(); + } + + private static String onlyPureBase64(String raw) { + if (raw == null) return null; + String s = raw.trim(); + if (s.isEmpty()) return s; + int comma = s.indexOf(','); + if (comma > 0 && comma < 100) { + String prefix = s.substring(0, comma).toLowerCase(); + if (prefix.startsWith("data:") && prefix.contains("base64")) { + s = s.substring(comma + 1).trim(); + } + } + return s.replaceAll("\\s+", ""); + } + + private static boolean isHttpUrl(String s) { + if (s == null) return false; + String low = s.toLowerCase().trim(); + return low.startsWith("http://") || low.startsWith("https://"); + } + + private static boolean looksLikeBase64(String s) { + if (s == null || s.length() < 50) return false; + String t = s.trim(); + if (t.startsWith("data:")) return true; + int ok = 0; + int check = Math.min(t.length(), 200); + for (int i = 0; i < check; i++) { + char c = t.charAt(i); + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') + || c == '+' || c == '/' || c == '=') ok++; + } + return ((double) ok / check) > 0.95; + } + + private static byte[] downloadUrlBytes(String url) { + return HttpRequest.get(url).timeout(15000).execute().bodyBytes(); + } + + private static String detectMimePrefix(byte[] bytes) { + if (bytes == null || bytes.length < 4) return "data:image/jpeg;base64,"; + if (bytes[0] == (byte) 0xFF && bytes[1] == (byte) 0xD8 && bytes[2] == (byte) 0xFF) { + return "data:image/jpeg;base64,"; + } + if (bytes.length >= 8 + && bytes[0] == (byte) 0x89 + && bytes[1] == (byte) 0x50 + && bytes[2] == (byte) 0x4E + && bytes[3] == (byte) 0x47 + && bytes[4] == (byte) 0x0D + && bytes[5] == (byte) 0x0A + && bytes[6] == (byte) 0x1A + && bytes[7] == (byte) 0x0A) { + return "data:image/png;base64,"; + } + return "data:image/jpeg;base64,"; + } + + @SuppressWarnings("unchecked") + private static void debugPrintPersonBiosignatures(Map body) { + Object bios = body.get("personBiosignatures"); + if (bios == null || !(bios instanceof List)) { + System.out.println("[DEBUG] personBiosignatures 字段: 不存在或不是List"); + return; + } + List list = (List) bios; + System.out.println("[DEBUG] personBiosignatures 数量: " + list.size()); + for (int i = 0; i < list.size(); i++) { + Object item = list.get(i); + System.out.println("[DEBUG] --- 第 " + (i + 1) + " 条 ---"); + if (item instanceof Map) { + Map m = (Map) item; + System.out.println("[DEBUG] 所有字段 keys: " + String.join(", ", m.keySet())); + for (Map.Entry e : m.entrySet()) { + Object v = e.getValue(); + if (v == null) { + System.out.println("[DEBUG] " + e.getKey() + " = null"); + } else { + String s = v.toString(); + String show = s.length() > 120 ? s.substring(0, 120) + "...(len=" + s.length() + ")" : s; + System.out.println("[DEBUG] " + e.getKey() + " = " + show); + } + } + } else { + System.out.println("[DEBUG] 类型不是Map, 是: " + (item == null ? "null" : item.getClass().getName())); + } + } + } + + @SuppressWarnings("unchecked") + private void processDaHuaPersonBiosignatures(Map body) { + Object bios = body.get("personBiosignatures"); + if (bios == null || !(bios instanceof List)) return; + List inList = (List) bios; + List> outList = new ArrayList<>(); + int seq = 0; + for (Object item : inList) { + seq++; + Object rawType = null; + Object rawIndex = null; + String path = null; + String rawBase64 = null; + + if (item instanceof Map) { + Map mm = (Map) item; + rawType = mm.get("type"); + rawIndex = mm.get("index"); + path = getStr(mm, "path"); + rawBase64 = getStr(mm, "base64Data"); + if (rawBase64 == null) rawBase64 = getStr(mm, "data"); + } else if (item instanceof DaHuaPersonSyncCmd.PersonBiosignature) { + DaHuaPersonSyncCmd.PersonBiosignature b = (DaHuaPersonSyncCmd.PersonBiosignature) item; + rawType = b.getType(); + rawIndex = b.getIndex(); + path = b.getPath(); + rawBase64 = b.getBase64Data(); + } else { + continue; + } + + Map out = new HashMap<>(); + if (rawType != null) out.put("type", rawType); + if (rawIndex != null) out.put("index", rawIndex); + + String finalBase64WithPrefix = null; + boolean pathAlreadyUploaded = false; + + if (path != null && !path.trim().isEmpty() && !looksLikeBase64(path) && !isHttpUrl(path)) { + pathAlreadyUploaded = true; + out.put("path", path.trim()); + System.out.println("[大华人员同步] seq=" + seq + " path已通过上传接口获取, 直接使用fileUrl=" + path.trim()); + log.info("[大华人员同步] seq={} 使用已上传的图片路径: {}", seq, path.trim()); + } else { + out.put("path", ""); + + if (rawBase64 != null && !rawBase64.trim().isEmpty()) { + String t = rawBase64.trim(); + if (t.toLowerCase().startsWith("data:")) { + finalBase64WithPrefix = t.replaceAll("\\s+", ""); + System.out.println("[大华人员同步] seq=" + seq + " base64Data已带前缀, 直接使用, len=" + finalBase64WithPrefix.length()); + } else { + String pure = t.replaceAll("\\s+", ""); + if (!pure.isEmpty()) { + finalBase64WithPrefix = "data:image/jpeg;base64," + pure; + System.out.println("[大华人员同步] seq=" + seq + " base64Data无前缀, 默认补jpeg前缀, len=" + finalBase64WithPrefix.length()); + } + } + } + if ((finalBase64WithPrefix == null || finalBase64WithPrefix.isEmpty()) + && path != null && !path.trim().isEmpty()) { + String p = path.trim(); + if (isHttpUrl(p)) { + System.out.println("[大华人员同步] seq=" + seq + " 下载图片URL=" + p); + try { + byte[] bytes = downloadUrlBytes(p); + if (bytes != null && bytes.length > 0) { + String mimePrefix = detectMimePrefix(bytes); + String pure = Base64.getEncoder().encodeToString(bytes); + finalBase64WithPrefix = mimePrefix + pure; + System.out.println("[大华人员同步] seq=" + seq + " 下载成功, mime=" + + (mimePrefix.contains("png") ? "png" : "jpeg") + + ", totalLen=" + finalBase64WithPrefix.length()); + } else { + System.err.println("[大华人员同步] seq=" + seq + " 下载失败(返回空)"); + } + } catch (Exception e) { + System.err.println("[大华人员同步] seq=" + seq + " 下载图片异常: " + e.getMessage()); + log.error("下载人脸图片失败, seq={}, url={}, err={}", seq, p, e.getMessage(), e); + } + } else if (looksLikeBase64(p)) { + String t = p.trim(); + if (t.toLowerCase().startsWith("data:")) { + finalBase64WithPrefix = t.replaceAll("\\s+", ""); + System.out.println("[大华人员同步] seq=" + seq + " path是带前缀base64, 转存base64Data, len=" + finalBase64WithPrefix.length()); + } else { + String pure = onlyPureBase64(t); + if (pure != null && !pure.isEmpty()) { + finalBase64WithPrefix = "data:image/jpeg;base64," + pure; + System.out.println("[大华人员同步] seq=" + seq + " path是纯base64, 转存base64Data并补jpeg前缀, len=" + finalBase64WithPrefix.length()); + } + } + } else { + System.out.println("[大华人员同步] seq=" + seq + " path内容: " + + (p.length() > 100 ? p.substring(0, 100) + "..." : p)); + } + } + + if (finalBase64WithPrefix != null && !finalBase64WithPrefix.isEmpty()) { + out.put("base64Data", finalBase64WithPrefix); + System.out.println("[大华人员同步] seq=" + seq + " 最终字段: type=" + out.get("type") + + ", index=" + out.get("index") + + ", path=\"\"(空字符串)" + + ", base64Data前80=" + finalBase64WithPrefix.substring(0, Math.min(80, finalBase64WithPrefix.length())) + "..."); + log.info("[大华人员同步] seq={} 最终: type={}, index={}, path=空串, base64DataLen={}", + seq, out.get("type"), out.get("index"), finalBase64WithPrefix.length()); + } else { + System.out.println("[大华人员同步] seq=" + seq + " 未得到有效base64,字段: type=" + out.get("type") + + ", index=" + out.get("index") + ", path=\"\"(空字符串), 无base64Data"); + } + } + outList.add(out); + } + body.put("personBiosignatures", outList); + } + @Override public Map deletePerson(List ids, Integer openDeleteFlag) { if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { @@ -590,4 +818,117 @@ public class DaHuaGatewayImpl implements DaHuaGateway { return resultMap; } } + + @Override + public String uploadPersonImg(String imageBase64) { + if (daHuaPersonApi == null || !daHuaPersonApi.isConfigured()) { + throw new RuntimeException("大华服务未配置"); + } + if (imageBase64 == null || imageBase64.trim().isEmpty()) { + throw new RuntimeException("图片base64不能为空"); + } + try { + GeneralResponse response = daHuaPersonApi.uploadPersonImg(imageBase64); + String responseJson = JSONUtil.toJsonStr(response); + log.info("大华上传人员图片返回结果: {}", responseJson); + System.out.println("大华上传人员图片返回结果: " + responseJson); + if (response == null) { + throw new RuntimeException("大华上传人员图片失败: response为null"); + } + JSONObject jsonObject = JSONUtil.parseObj(responseJson); + Boolean outerSuccess = jsonObject.getBool("success", false); + String outerCode = jsonObject.getStr("code", ""); + String outerErrMsg = jsonObject.getStr("errMsg", ""); + + Boolean bizSuccess = outerSuccess; + String resultCode = null; + String fileUrl = null; + String bizErrMsg = outerErrMsg; + + Object resultObj = jsonObject.get("result"); + if (resultObj != null) { + try { + JSONObject bizObj; + if (resultObj instanceof String) { + bizObj = JSONUtil.parseObj((String) resultObj); + } else if (resultObj instanceof JSONObject) { + bizObj = (JSONObject) resultObj; + } else { + bizObj = JSONUtil.parseObj(JSONUtil.toJsonStr(resultObj)); + } + bizSuccess = bizObj.getBool("success", bizSuccess); + bizErrMsg = bizObj.getStr("errMsg", bizErrMsg); + Object bizDataObj = bizObj.get("data"); + if (bizDataObj != null) { + JSONObject bizDataJson = JSONUtil.parseObj(bizDataObj); + resultCode = bizDataJson.getStr("result"); + fileUrl = bizDataJson.getStr("fileUrl"); + System.out.println("大华上传人员图片解析result字段成功: resultCode=" + resultCode + ", fileUrl=" + fileUrl); + } + } catch (Exception e) { + log.warn("大华上传人员图片解析result字段失败: {}", e.getMessage()); + System.out.println("大华上传人员图片解析result字段失败: " + e.getMessage()); + } + } + + boolean resultOk = (resultCode == null || resultCode.isEmpty()) || "0".equals(resultCode); + if (!bizSuccess || !resultOk) { + String msg = "大华上传人员图片失败: success=" + bizSuccess + ", result=" + resultCode + ", outerCode=" + outerCode + ", errMsg=" + bizErrMsg; + log.error(msg); + throw new RuntimeException(msg); + } + if (fileUrl == null || fileUrl.trim().isEmpty()) { + throw new RuntimeException("大华上传人员图片失败: 未返回fileUrl"); + } + System.out.println("大华上传人员图片成功, fileUrl=" + fileUrl); + return fileUrl; + } catch (ClientException e) { + log.error("大华上传人员图片异常: {}", e.getMessage(), e); + throw new RuntimeException("大华上传人员图片异常", e); + } + } + + @SuppressWarnings("unchecked") + private Map uploadAndSetPersonBiosignaturePaths(DaHuaPersonSyncCmd cmd) { + List bios = cmd.getPersonBiosignatures(); + if (bios == null || bios.isEmpty()) { + return null; + } + int seq = 0; + for (DaHuaPersonSyncCmd.PersonBiosignature bio : bios) { + seq++; + String base64Data = bio.getBase64Data(); + if (base64Data == null || base64Data.trim().isEmpty()) { + continue; + } + String finalBase64WithPrefix; + String t = base64Data.trim(); + if (t.toLowerCase().startsWith("data:")) { + finalBase64WithPrefix = t.replaceAll("\\s+", ""); + } else { + String pure = t.replaceAll("\\s+", ""); + if (pure.isEmpty()) { + continue; + } + finalBase64WithPrefix = "data:image/jpeg;base64," + pure; + } + System.out.println("[大华人员图片上传] seq=" + seq + " 开始上传图片, base64长度=" + finalBase64WithPrefix.length()); + try { + String fileUrl = uploadPersonImg(finalBase64WithPrefix); + bio.setPath(fileUrl); + System.out.println("[大华人员图片上传] seq=" + seq + " 上传成功, path=" + fileUrl); + } catch (Exception e) { + log.error("[大华人员图片上传] seq=" + seq + " 上传失败: {}", e.getMessage(), e); + System.err.println("[大华人员图片上传] seq=" + seq + " 上传失败: " + e.getMessage()); + Map resultMap = new HashMap<>(); + resultMap.put("passed", false); + resultMap.put("success", false); + resultMap.put("code", "IMG_UPLOAD_FAIL"); + resultMap.put("errMsg", "第" + seq + "张人脸图片上传失败: " + e.getMessage()); + resultMap.put("dhData", null); + return resultMap; + } + } + return null; + } } \ No newline at end of file