From a861cad96f062a6a9cd29e6665f5b8d5e9e557f3 Mon Sep 17 00:00:00 2001 From: ovo Date: Wed, 23 Oct 2024 15:37:01 +0800 Subject: [PATCH] =?UTF-8?q?=E9=95=BF=E5=BA=86=E9=A1=B9=E7=9B=AE10.23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/shapelight/AdminApplication.java | 11 +- .../net/shapelight/common/utils/SslUtils.java | 49 ++ .../modules/face/entity/UserCompareInfo.java | 1 + .../modules/face/rtsp/RtspFrameGrabber.java | 120 +++-- .../service/impl/FaceEngineServiceImpl.java | 4 +- .../iCq/controller/DemoController.java | 83 ++++ .../controller/enter/CqEnterController.java | 20 + .../video/CqSafeVideoController.java | 8 +- .../iCq/controller/video/vo/FaceVideoVo.java | 29 ++ .../job/task/PersonSynchronousTask.java | 454 +++++++++++++----- .../modules/sys/entity/SysUserEntity.java | 1 + .../ten/controller/TenPersonController.java | 82 +++- .../modules/ten/entity/TenPersonEntity.java | 4 + .../impl/TenPersonCertServiceImpl.java | 2 + .../service/impl/TenPersonServiceImpl.java | 14 + .../resources/mapper/ten/TenPersonDao.xml | 14 +- 16 files changed, 722 insertions(+), 174 deletions(-) create mode 100644 shapelight-admin/src/main/java/net/shapelight/common/utils/SslUtils.java create mode 100644 shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/DemoController.java create mode 100644 shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/vo/FaceVideoVo.java diff --git a/shapelight-admin/src/main/java/net/shapelight/AdminApplication.java b/shapelight-admin/src/main/java/net/shapelight/AdminApplication.java index c1c56f4..d65eb85 100644 --- a/shapelight-admin/src/main/java/net/shapelight/AdminApplication.java +++ b/shapelight-admin/src/main/java/net/shapelight/AdminApplication.java @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; //import org.bytedeco.opencv.opencv_core.CvPoint; //import org.bytedeco.opencv.opencv_imgproc.CvFont; import net.shapelight.common.config.CxFeignConfig; +import net.shapelight.common.utils.SslUtils; import net.shapelight.modules.feignClient.CxFeignClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -31,8 +32,8 @@ import javax.annotation.PostConstruct; @EnableFeignClients //@MapperScan("net.shapelight.modules.sys.dao") public class AdminApplication { - @Autowired - CxFeignClient cxFeignClient; + /*@Autowired + CxFeignClient cxFeignClient;*/ public static void main(String[] args) { SpringApplication.run(AdminApplication.class, args); @@ -60,9 +61,9 @@ public class AdminApplication { // }); } -/* @Bean - @PostConstruct - void init(){ + /*@PostConstruct + void init() throws Exception { + SslUtils.ignoreSsl(); String res = cxFeignClient.getToken("5bb50ad0cc40e10565089c35aa61e7f3","k9?8bCqaQ*R1e2Wx0f65AzY4^]LDp@_Z"); CxFeignConfig.token = res; }*/ diff --git a/shapelight-admin/src/main/java/net/shapelight/common/utils/SslUtils.java b/shapelight-admin/src/main/java/net/shapelight/common/utils/SslUtils.java new file mode 100644 index 0000000..9db2123 --- /dev/null +++ b/shapelight-admin/src/main/java/net/shapelight/common/utils/SslUtils.java @@ -0,0 +1,49 @@ +package net.shapelight.common.utils; + +import javax.net.ssl.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class SslUtils { + private static void trustAllHttpsCertificates() throws Exception { + TrustManager[] trustAllCerts = new TrustManager[1]; + TrustManager tm = new miTM(); + trustAllCerts[0] = tm; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + static class miTM implements TrustManager,X509TrustManager { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public boolean isServerTrusted(X509Certificate[] certs) { + return true; + } + public boolean isClientTrusted(X509Certificate[] certs) { + return true; + } + public void checkServerTrusted(X509Certificate[] certs, String authType) + throws CertificateException { + return; + } + public void checkClientTrusted(X509Certificate[] certs, String authType) + throws CertificateException { + return; + } + } + /** + * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用 + * @throws Exception + */ + public static void ignoreSsl() throws Exception{ + HostnameVerifier hv = new HostnameVerifier() { + public boolean verify(String urlHostName, SSLSession session) { + System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost()); + return true; + } + }; + trustAllHttpsCertificates(); + HttpsURLConnection.setDefaultHostnameVerifier(hv); + } +} diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/face/entity/UserCompareInfo.java b/shapelight-admin/src/main/java/net/shapelight/modules/face/entity/UserCompareInfo.java index 3499821..955b9eb 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/face/entity/UserCompareInfo.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/face/entity/UserCompareInfo.java @@ -8,4 +8,5 @@ import net.shapelight.modules.face.util.UserRamCache; @Data public class UserCompareInfo extends UserInfo { private Float similar; + private Integer isHeadOnView; //0否1是 } diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/face/rtsp/RtspFrameGrabber.java b/shapelight-admin/src/main/java/net/shapelight/modules/face/rtsp/RtspFrameGrabber.java index 1f4f347..0772f07 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/face/rtsp/RtspFrameGrabber.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/face/rtsp/RtspFrameGrabber.java @@ -10,6 +10,7 @@ import com.arcsoft.face.enums.ExtractType; import com.arcsoft.face.toolkit.ImageFactory; import com.arcsoft.face.toolkit.ImageInfo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.extern.slf4j.Slf4j; import net.shapelight.common.config.GlobalValue; @@ -24,6 +25,9 @@ import net.shapelight.modules.face.service.impl.FaceEngineServiceImpl; import net.shapelight.modules.face.util.UserInfo; import net.shapelight.modules.face.util.UserRamGroup; import net.shapelight.modules.feignClient.CxFeignClient; +import net.shapelight.modules.iCq.controller.video.vo.FaceVideoVo; +import net.shapelight.modules.ten.dao.TenCellDao; +import net.shapelight.modules.ten.entity.TenCellEntity; import net.shapelight.modules.ten.entity.TenPersonEntity; import net.shapelight.modules.ten.service.TenPersonService; import net.shapelight.modules.ten.service.impl.TenPersonServiceImpl; @@ -96,6 +100,10 @@ public class RtspFrameGrabber { @Autowired private TenPersonServiceImpl tenPersonService; + @Autowired + private TenCellDao tenCellDao; + + private void createGrabber() { try { @@ -198,56 +206,102 @@ public class RtspFrameGrabber { } - public void recognition(MultipartFile file,String cellId) { + public List recognition(MultipartFile file,String cellId) { try { byte[] bytes = file.getBytes(); - imageRecognition(bytes,cellId); + return imageRecognition(bytes, cellId); + } catch (IOException e) { throw new RuntimeException(e); } } - private void imageRecognition(byte[] bytes,String cellId) { + private List imageRecognition(byte[] bytes,String cellId) { + List temp = new ArrayList<>(); if (bytes != null && bytes.length > 0) { ImageInfo imageInfo = ImageFactory.getRGBData(bytes); List faceInfoList = faceEngineService.detectFaces(imageInfo); + + + /* for (FaceInfo faceInfo : faceInfoList) { + System.out.println(faceInfo.getFace3DAngle()); + //Yaw上下 Pitch左右 + if (faceInfo.getFace3DAngle().getYaw() > 20 || faceInfo.getFace3DAngle().getYaw() < -20) { + System.out.println("没在好好看!!!"); + // faceInfoList.remove(faceInfo); + } + if (faceInfo.getFace3DAngle().getPitch() > 20 || faceInfo.getFace3DAngle().getPitch() < -20) { + System.out.println("没在好好看!!!"); + } + }*/ + + if (CollectionUtil.isNotEmpty(faceInfoList)) { faceInfoList.forEach(faceInfo -> { - FaceRecognitionResDTO faceRecognitionResDTO = new FaceRecognitionResDTO(); - faceRecognitionResDTO.setRect(faceInfo.getRect()); - byte[] featureBytes = faceEngineService.extractFaceFeature(imageInfo, faceInfo, ExtractType.REGISTER); + /* FaceRecognitionResDTO faceRecognitionResDTO = new FaceRecognitionResDTO(); + faceRecognitionResDTO.setRect(faceInfo.getRect());*/ + + byte[] featureBytes = faceEngineService.extractFaceFeature(imageInfo, + faceInfo, ExtractType.REGISTER); if (featureBytes != null) { + //底库 List userInfoList = UserRamGroup.getUserList(cellId); - List userCompareInfoList = faceEngineService.faceRecognition(featureBytes,userInfoList,Float.parseFloat(globalValue.getRecFaceThd())); - if(!userCompareInfoList.isEmpty()) { - UserCompareInfo userCompareInfo = userCompareInfoList.get(0); - TenPersonEntity tenPerson = personService.getOne(new LambdaQueryWrapper() - .eq(TenPersonEntity::getPersonId,userCompareInfo.getFaceId())); - Map personnelTypeMap = new HashMap<>(); - personnelTypeMap.put(Constant.PERSON_TYPE_OWNER,"2");//内部人员 - personnelTypeMap.put(Constant.PERSON_TYPE_MEMBER,"1");//承包商 - personnelTypeMap.put(Constant.PERSON_TYPE_TENANT,"3");//长期供应商 - Map params = new HashMap<>(); - params.put("pmWatchVideoRecordId",""); - params.put("orgId",tenPerson.getOrgId()); - params.put("orgName",""); - params.put("personnelName",tenPerson.getName()); - params.put("personnelId",tenPerson.getOpenId()); - params.put("personnelCardId",tenPerson.getIdCard()); - params.put("personnelType",personnelTypeMap.get(tenPerson.getPersonType())); - params.put("dictSex",tenPerson.getGender()==0?"女":"男"); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - params.put("watchVideoTime",sdf.format(System.currentTimeMillis())); - tenPerson.setIsWatchSafeVideo(1); - JSONObject jsonObject = feignClient.savePmWatchVideoRecord(params); - if(jsonObject.getBool("success")!=null&&jsonObject.getBool("success")) { - personService.update(new LambdaUpdateWrapper() - .set(TenPersonEntity::getIsWatchSafeVideo,1) - .eq(TenPersonEntity::getPersonId,userCompareInfo.getFaceId())); + //人脸对比 这里长度永远为1 + List userCompareInfoList = faceEngineService + .faceRecognition(featureBytes, userInfoList, Float.parseFloat(globalValue.getRecFaceThd())); + + for (UserCompareInfo userCompareInfo : userCompareInfoList) { + FaceVideoVo faceVideoVo = new FaceVideoVo(); + if (faceInfo.getFace3DAngle().getYaw() > 20 || faceInfo.getFace3DAngle().getYaw() < -20) { + faceVideoVo.setIsHeadOnView(0); + }else if (faceInfo.getFace3DAngle().getPitch() > 20 || faceInfo.getFace3DAngle().getPitch() < -20) { + faceVideoVo.setIsHeadOnView(0); + }else { + faceVideoVo.setIsHeadOnView(1); } + + faceVideoVo.setPersonId(userCompareInfo.getFaceId()).setName(userCompareInfo.getName()); + + temp.add(faceVideoVo); } + if (!userCompareInfoList.isEmpty()) { + + for (UserCompareInfo userCompareInfo : userCompareInfoList) { + TenPersonEntity tenPerson = personService.getOne(new LambdaQueryWrapper() + .eq(TenPersonEntity::getPersonId, userCompareInfo.getFaceId())); + Map personnelTypeMap = new HashMap<>(); + personnelTypeMap.put(Constant.PERSON_TYPE_OWNER, "2");//内部人员 + personnelTypeMap.put(Constant.PERSON_TYPE_MEMBER, "1");//承包商 + personnelTypeMap.put(Constant.PERSON_TYPE_TENANT, "3");//长期供应商 + personnelTypeMap.put(Constant.PERSON_TYPE_GUEST, "4");//访客 + + // + Map params = new HashMap<>(); + params.put("pmWatchVideoRecordId", ""); + params.put("orgId", tenPerson.getOrgId()); + params.put("orgName", tenCellDao.selectOne(new QueryWrapper().eq("cell_id", tenPerson.getCellId()))); + params.put("personnelName", tenPerson.getName()); + params.put("personnelId", tenPerson.getOpenId()); + params.put("personnelCardId", tenPerson.getIdCard()); + params.put("personnelType", personnelTypeMap.get(tenPerson.getPersonType())); + params.put("dictSex", tenPerson.getGender() == 0 ? "女" : "男"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + params.put("watchVideoTime", sdf.format(System.currentTimeMillis())); + tenPerson.setIsWatchSafeVideo(1); + tenPersonService.updateById(tenPerson); + + System.out.println("params = " + params); + + /* JSONObject jsonObject = feignClient.savePmWatchVideoRecord(params); + if (jsonObject.getBool("success") != null && jsonObject.getBool("success")) { + personService.update(new LambdaUpdateWrapper() + .set(TenPersonEntity::getIsWatchSafeVideo, 1) + .eq(TenPersonEntity::getPersonId, userCompareInfo.getFaceId())); + }*/ + } + } } else { log.error("图片不合格,未检测到人脸"); } @@ -257,7 +311,9 @@ public class RtspFrameGrabber { log.error("图片不合格,未检测到人脸"); } + } else { } + return temp; } /** diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/face/service/impl/FaceEngineServiceImpl.java b/shapelight-admin/src/main/java/net/shapelight/modules/face/service/impl/FaceEngineServiceImpl.java index 20dd6b0..60ef4d1 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/face/service/impl/FaceEngineServiceImpl.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/face/service/impl/FaceEngineServiceImpl.java @@ -113,7 +113,9 @@ public class FaceEngineServiceImpl implements FaceEngineService { //人脸检测得到人脸列表 List faceInfoList = new ArrayList(); //人脸检测 - int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList); + int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), + imageInfo.getWidth(), imageInfo.getHeight(), + imageInfo.getImageFormat(), faceInfoList); if (errorCode == 0) { return faceInfoList; } else { diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/DemoController.java b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/DemoController.java new file mode 100644 index 0000000..2b91eea --- /dev/null +++ b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/DemoController.java @@ -0,0 +1,83 @@ +package net.shapelight.modules.iCq.controller; + +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import net.shapelight.common.utils.R; +import net.shapelight.modules.iCq.dal.mysql.enter.CqEnterConfigCellMapper; +import net.shapelight.modules.iCq.dal.mysql.enter.CqEnterConfigMapper; +import net.shapelight.modules.iCq.dal.mysql.enter.CqEnterConfigTypeMapper; +import net.shapelight.modules.iCq.service.enter.CqEnterServiceImpl; +import net.shapelight.modules.job.task.PersonSynchronousTask; +import net.shapelight.modules.ten.dao.TenCellDao; +import net.shapelight.modules.ten.entity.TenCellEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +@RestController +@RequestMapping("cq/demo") +@Api(value = "入场校验", tags = {"入场校验"}) +@RequiredArgsConstructor +public class DemoController { + + private final CqEnterServiceImpl cqEnterService; + + + @Autowired + private PersonSynchronousTask task; + + @Autowired + private TenCellDao tenCellDao; + + @GetMapping("/save1") + public void saveSupplier(){ + /* System.out.println("测试开始"); + + TenCellEntity tenCellEntity = tenCellDao.selectOne(new QueryWrapper().eq("cell_id", "1255898969448382468")); + + + String jsonString = "{\n" + + " \"success\": true,\n" + + " \"message\": null,\n" + + " \"errCode\": \"0\",\n" + + " \"resCode\": 1,\n" + + " \"apiVersion\": \"1\",\n" + + " \"timestamp\": 1726651858,\n" + + " \"data\": {\n" + + " \"apiVersion\": null,\n" + + " \"list\": [\n" + + " {\n" + + " \"pmSupplierId\": \"75c0fd40bbda47528917898a69957683\",\n" + + " \"orgId\": \"ORGACQ100005358\",\n" + + " \"orgName\": \"油田开发事业部\",\n" + + " \"userName\": \"姓名\",\n" + + " \"supplierName\": \"23\",\n" + + " \"supplierCardId\": \"412345676543456765\",\n" + + " \"mobile\": \"13567543546\",\n" + + " \"enterValidPeriod\": \"2024-08-13 00:00:00\",\n" + + " \"enterValidPeriodEnd\": \"2024-09-26 00:00:00\",\n" + + " \"isEnterSulfurArea\": \"否\",\n" + + " \"isProtectDevice\": \"是\",\n" + + " \"isBlackList\": \"否\",\n" + + " \"isWatchVideo\": \"未观看\",\n" + + " \"attachment\": null\n" + + " }\n" + + " ],\n" + + " \"total\": 1\n" + + " }\n" + + "}"; + + + JSONObject jsonObject = new JSONObject(jsonString); + + task.save(jsonObject, tenCellEntity);*/ + + task.getPmInternalPersonnelList2(); + } + + + +} \ No newline at end of file diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/enter/CqEnterController.java b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/enter/CqEnterController.java index ee7ad17..e68f4f7 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/enter/CqEnterController.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/enter/CqEnterController.java @@ -8,6 +8,7 @@ import net.shapelight.modules.iCq.dal.mysql.enter.CqEnterConfigCellMapper; import net.shapelight.modules.iCq.dal.mysql.enter.CqEnterConfigMapper; import net.shapelight.modules.iCq.dal.mysql.enter.CqEnterConfigTypeMapper; import net.shapelight.modules.iCq.service.enter.CqEnterServiceImpl; +import net.shapelight.modules.job.task.PersonSynchronousTask; import org.springframework.web.bind.annotation.*; @@ -20,6 +21,10 @@ public class CqEnterController { private final CqEnterServiceImpl cqEnterService; + + + + @GetMapping("list") @ApiOperation(value = "配置首页列表查询") public R list(String operator, Long cellId){ @@ -49,4 +54,19 @@ public class CqEnterController { return R.error(); } } + + + @GetMapping("demo") + public R demo(String operator, Long cellId){ + + + + + + return R.ok() + .put("data", cqEnterService.list(operator, cellId)) + .put("total", cqEnterService.list(operator, cellId).size()); + } + + } \ No newline at end of file diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/CqSafeVideoController.java b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/CqSafeVideoController.java index 0fe17bd..34f72bc 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/CqSafeVideoController.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/CqSafeVideoController.java @@ -4,9 +4,12 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import net.shapelight.common.utils.R; +import net.shapelight.modules.face.dto.FaceRecognitionResDTO; +import net.shapelight.modules.face.entity.UserCompareInfo; import net.shapelight.modules.face.rtsp.RtspFrameGrabber; import net.shapelight.modules.iCq.controller.video.dto.UpdateVideoDto; import net.shapelight.modules.iCq.controller.video.dto.UploadVideoDto; +import net.shapelight.modules.iCq.controller.video.vo.FaceVideoVo; import net.shapelight.modules.iCq.dal.dataobject.video.TenSafeVideoEntity; import net.shapelight.modules.iCq.dal.mysql.video.CqFileMapper; import net.shapelight.modules.iCq.dal.mysql.video.CqSafeVideoMapper; @@ -17,6 +20,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.util.ArrayList; import java.util.List; /** @@ -95,8 +99,8 @@ public class CqSafeVideoController { @PostMapping("/face/recognition") public R aWatchStart(@RequestParam("image") MultipartFile image, @RequestParam String cellId) { - rtspFrameGrabber.recognition(image,cellId); - return R.ok(); + List recognition = rtspFrameGrabber.recognition(image, cellId); + return R.ok().put("data", recognition); } diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/vo/FaceVideoVo.java b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/vo/FaceVideoVo.java new file mode 100644 index 0000000..c86e28d --- /dev/null +++ b/shapelight-admin/src/main/java/net/shapelight/modules/iCq/controller/video/vo/FaceVideoVo.java @@ -0,0 +1,29 @@ +package net.shapelight.modules.iCq.controller.video.vo; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class FaceVideoVo { + /** + * 人员id + */ + private String personId; + /** + * 人员name + */ + private String name; + /** + * 是否正脸 + */ + + private Integer isHeadOnView; //0否1是 + + +} diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/job/task/PersonSynchronousTask.java b/shapelight-admin/src/main/java/net/shapelight/modules/job/task/PersonSynchronousTask.java index 4798df4..fba46eb 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/job/task/PersonSynchronousTask.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/job/task/PersonSynchronousTask.java @@ -7,6 +7,7 @@ import com.arcsoft.face.FaceInfo; import com.arcsoft.face.enums.ExtractType; import com.arcsoft.face.toolkit.ImageFactory; import com.arcsoft.face.toolkit.ImageInfo; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.minio.MinioClient; import io.minio.PutObjectOptions; import lombok.extern.slf4j.Slf4j; @@ -36,7 +37,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.logging.SimpleFormatter; -@Component +@Component("personSynchronousTask") @Slf4j public class PersonSynchronousTask extends AbstractController implements ITask { @Resource @@ -81,32 +82,38 @@ public class PersonSynchronousTask extends AbstractController implements ITask { params.put("pageSize", 1000); params.put("orgName", item.getName()); params.put("orgId", item.getCellId()); - JSONObject jsonOne = null; - if(type.equals("Person")) { + JSONObject jsonOne; + if (type.equals("Person")) { jsonOne = cxFeignClient.getPmInternalPersonnelList(params); - } else if(type.equals("Contractor")) { + } else if (type.equals("Contractor")) { jsonOne = cxFeignClient.getPmContractorDataList(params); } else { jsonOne = cxFeignClient.getPmSupplierDataList(params); } - int total = jsonOne.getInt("total"); - if(total>0){ - for(int i = 0;i 0) { + for (int i = 0; i < total / 20; i++) { Map params2 = new HashMap<>(); params2.put("pageIndex", i); params2.put("pageSize", 20); params2.put("orgName", item.getName()); params2.put("orgId", item.getCellId()); JSONObject json = null; - if(type.equals("Person")) { + if (type.equals("Person")) { json = cxFeignClient.getPmInternalPersonnelList(params); - } else if(type.equals("Contractor")) { + } else if (type.equals("Contractor")) { json = cxFeignClient.getPmContractorDataList(params); } else { json = cxFeignClient.getPmSupplierDataList(params); } - if (json.getBool("success")!=null&&json.getBool("success")) { + if (json.getBool("success") != null && json.getBool("success")) { JSONObject data = json.getJSONObject("data"); JSONArray dataList = data.getJSONArray("list"); List list1 = dataList.toList(JSONObject.class); @@ -120,8 +127,8 @@ public class PersonSynchronousTask extends AbstractController implements ITask { try (FileWriter writer = new FileWriter(file)) { // 写入数据 list1.forEach(person -> { - String msg = save(person,item); - if(!msg.isEmpty()) { + String msg = save(person, item); + if (!msg.isEmpty()) { try { writer.write(msg); writer.write(System.getProperty("line.separator")); @@ -133,11 +140,11 @@ public class PersonSynchronousTask extends AbstractController implements ITask { } catch (IOException e) { e.printStackTrace(); } - log.debug("获取人员信息成功"+type); + log.debug("获取人员信息成功" + type); } else { - log.debug("获取人员信息失败"+json.getStr("message")); + log.debug("获取人员信息失败" + json.getStr("message")); } - log.debug("同步inxex:"+(i+1)); + log.debug("同步inxex:" + (i + 1)); } } @@ -145,7 +152,176 @@ public class PersonSynchronousTask extends AbstractController implements ITask { } - private String save(JSONObject person,TenCellEntity cellEntity) { + + public void getPmInternalPersonnelList2() { + List list = tenCellService.list(); + list.forEach(item -> { + int pageIndex = 1; + Map params = new HashMap<>(); + params.put("pageIndex", pageIndex); + params.put("pageSize", 1000); + params.put("orgName", item.getName()); + params.put("orgId", item.getOrgId()); + + // + + /*String jsonString = "{\n" + + " \"success\": true,\n" + + " \"message\": null,\n" + + " \"errCode\": \"0\",\n" + + " \"resCode\": 1,\n" + + " \"apiVersion\": \"1\",\n" + + " \"timestamp\": 1726651858,\n" + + " \"data\": {\n" + + " \"apiVersion\": null,\n" + + " \"list\": [\n" + + " {\n" + + " \"pmSupplierId\": \"75c0fd40bbda47528917898a69957683\",\n" + + " \"orgId\": \"ORGACQ100008461\",\n" + + " \"orgName\": \"油田开发事业部\",\n" + + " \"userName\": \"姓名\",\n" + + " \"supplierName\": \"23\",\n" + + " \"supplierCardId\": \"412345676543456765\",\n" + + " \"mobile\": \"13567543546\",\n" + + " \"enterValidPeriod\": \"2024-08-13 00:00:00\",\n" + + " \"enterValidPeriodEnd\": \"2024-09-26 00:00:00\",\n" + + " \"isEnterSulfurArea\": \"否\",\n" + + " \"isProtectDevice\": \"是\",\n" + + " \"isBlackList\": \"否\",\n" + + " \"isWatchVideo\": \"未观看\",\n" + + " \"attachment\": null\n" + + " }\n" + + " ],\n" + + " \"total\": 1\n" + + " }\n" + + "}";*/ + + + + /* String jsonString = " {\n" + + " \"success\": true,\n" + + " \"message\": null,\n" + + " \"errCode\": \"0\",\n" + + " \"resCode\": 1,\n" + + " \"apiVersion\": \"1\",\n" + + " \"timestamp\": 1726651264,\n" + + " \"data\": {\n" + + " \"apiVersion\": null,\n" + + " \"list\": [\n" + + " {\n" + + " \"pmPersonnelId\": \"984ce15b7f3d4367a2589a724a7f3374\", \n" + + " \"orgId\": \"ORGACQ100008461\", \n" + + " \"orgName\": \"第三输油处\\\\生产保障大队\",\n" + + " \"personnelName\": \"梁宗强\", \n" + + " \"dictSexName\": null, \n" + + " \"personnelCardId\": null, \n" + + " \"mobile\": null, \n" + + " \"isEnterSulfurArea\": \"否\", \n" + + " \"isProtectDevice\": \"否\",\n" + + " \"isCheckCert\": \"否\",\n" + + " \"enterValidPeriod\": null, \n" + + " \"enterValidPeriodEnd\": null, \n" + + " \"attachment\": null \n" + + " }\n" + + " ],\n" + + " \"total\": 1\n" + + " }\n" + + "}\n";*/ + + + String jsonString = "{\n" + + " \"data\": {\n" + + " \"list\": [\n" + + " {\n" + + " \"supplierName\": \"测试数据\",\n" + + " \"supplierCardId\": \"411325199909083542\",\n" + + " \"orgName\": \"第一采气厂\\\\第一净化厂\",\n" + + " \"isWatchVideo\": \"未观看\",\n" + + " \"mobile\": \"15345263546\",\n" + + " \"pmSupplierId\": \"402da1cf0db540649bcf8fa619a02f59\",\n" + + " \"userName\": \"测试数据\",\n" + + " \"orgId\": \"ORGACQ10000222\",\n" + + " \"isProtectDevice\": \"是\",\n" + + " \"isBlackList\": \"否\",\n" + + " \"enterValidPeriodEnd\": \"2024-10-16 23:59:59\",\n" + + " \"isEnterSulfurArea\": \"否\",\n" + + " \"enterValidPeriod\": \"2024-09-02 00:00:00\",\n" + + " \"attachment\": \"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\"\n" + + " }\n" + + " ],\n" + + " \"total\": 1\n" + + " },\n" + + " \"apiVersion\": \"1\",\n" + + " \"success\": true,\n" + + " \"errCode\": \"0\",\n" + + " \"resCode\": 1,\n" + + " \"timestamp\": 1729497503\n" + + "}"; + + JSONObject jsonOne = new JSONObject(jsonString); + + // int total = jsonOne.getInt("total"); + + // 获取data对象 + JSONObject dataObject = jsonOne.getJSONObject("data"); + // 获取total字段 + int total = dataObject.getInt("total"); + + System.out.println("total = " + total); + + if (total > 0) { + System.out.println("total = " + total/20); + for (int i = 0; i <= total / 20; i++) {//重大逻辑 + Map params2 = new HashMap<>(); + params2.put("pageIndex", i); + params2.put("pageSize", 20); + params2.put("orgName", item.getName()); + params2.put("orgId", item.getOrgId()); + JSONObject json = null; + json = jsonOne; + + if (json.getBool("success") != null && json.getBool("success")) { + JSONObject data = json.getJSONObject("data"); + JSONArray dataList = data.getJSONArray("list"); + List list1 = dataList.toList(JSONObject.class); + String filePath = "C:\\zhihuiyuanqu\\firePerson.txt"; + // 创建一个File对象 + File file = new File(filePath); + // 确保父目录存在 + if (file.getParentFile() != null) { + file.getParentFile().mkdirs(); + } + try (FileWriter writer = new FileWriter(file)) { + // 写入数据 + list1.forEach(person -> { + System.out.println("开始保存"); + String msg = save(person, item); + if (!msg.isEmpty()) { + try { + writer.write(msg); + writer.write(System.getProperty("line.separator")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + // log.debug("获取人员信息成功" + type); + } else { + log.debug("获取人员信息失败" + json.getStr("message")); + } + log.debug("同步inxex:" + (i + 1)); + } + } + + }); + } + + + + public String save(JSONObject person, TenCellEntity cellEntity) { TenPersonEntity tenPerson = new TenPersonEntity(); Date now = new Date(); long id = new SnowflakeIdWorker().nextId(); @@ -157,173 +333,217 @@ public class PersonSynchronousTask extends AbstractController implements ITask { tenPerson.setStatus(Constant.PESON_SUATUS_NOMOR); tenPerson.setCreateTime(now); tenPerson.setLastUpdateTime(now); - tenPerson.setCellId(person.getStr("orgId")!=null?Long.parseLong(UserRamGroup.getOrgCellMap(person.getStr("orgId"))):null); - tenPerson.setOrgId(person.getStr("orgId")!=null?person.getStr("orgId"):null); - tenPerson.setName(person.getStr("personnelName")!=null?person.getStr("personnelName"):null); - tenPerson.setGender(person.getInt("dictSex")!=null?person.getInt("dictSex"):0); - tenPerson.setMobile(person.getStr("mobile")!=null?person.getStr("mobile"):null); - tenPerson.setIdCard(person.getStr("personnelCardId")!=null?person.getStr("personnelCardId"):null); - tenPerson.setNation(person.getStr("dictNation")!=null?Integer.parseInt(person.getStr("dictNation")):1); + + //tenPerson.setCellId(person.getStr("orgId") != null ? Long.parseLong(UserRamGroup.getOrgCellMap(person.getStr("orgId"))) : null); + /* tenPerson.setCellId(person.getStr("orgId") != null ? + tenCellService.getOne(new QueryWrapper().eq("org_id", person.getStr("orgId"))).getCellId() : null);*/ + tenPerson.setCellId(tenCellService + .getOne(new QueryWrapper() + .eq("org_id", cellEntity.getOrgId())).getCellId()); + tenPerson.setOrgId(cellEntity.getOrgId()); + + + if(person.getStr("supplierName") != null){ + tenPerson.setName(person.getStr("supplierName")); + } + if (person.getStr("contractorName") != null){ + tenPerson.setName(person.getStr("contractorName")); + } + if (person.getStr("personnelName") != null){ + tenPerson.setName(person.getStr("personnelName")); + } + + tenPerson.setGender(person.getInt("dictSex") != null ? person.getInt("dictSex") : 0); + tenPerson.setMobile(person.getStr("mobile") != null ? person.getStr("mobile") : null); + tenPerson.setIdCard(person.getStr("personnelCardId") != null ? person.getStr("personnelCardId") : null); + tenPerson.setNation(person.getStr("dictNation") != null ? Integer.parseInt(person.getStr("dictNation")) : 1); tenPerson.setCellId(cellEntity.getCellId()); tenPerson.setTenantId(getUser().getTenantId()); tenPerson.setRegisterType(Constant.RESGISTER_TYPE_Device); tenPerson.setStatus(Constant.PESON_SUATUS_NOMOR); - if(person.getStr("pmPersonnelId")!=null) { + if (person.getStr("pmPersonnelId") != null) { tenPerson.setOpenId(person.getStr("pmPersonnelId")); } - if(person.getStr("pmContractorId")!=null) { + if (person.getStr("pmContractorId") != null) { tenPerson.setOpenId(person.getStr("pmContractorId")); } - if(person.getStr("pmSupplierId")!=null) { + if (person.getStr("pmSupplierId") != null) { tenPerson.setOpenId(person.getStr("pmSupplierId")); } - tenPerson.setOrgId(person.getStr("orgId")!=null?person.getStr("orgId"):null); - SimpleDateFormat sfm = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss"); + tenPerson.setOrgId(person.getStr("orgId") != null ? person.getStr("orgId") : null); + SimpleDateFormat sfm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + SimpleDateFormat sfm1 = new SimpleDateFormat("yyyy-MM-dd"); try { - if(person.getStr("enterValidPeriod") != null) { + if (person.getStr("enterValidPeriod") != null) { tenPerson.setLiveStart(sfm.parse(person.getStr("enterValidPeriod"))); - } else if(person.getStr("validPeriodSta")!=null) { + } else if (person.getStr("validPeriodSta") != null) { tenPerson.setLiveStart(sfm.parse(person.getStr("validPeriodSta"))); } - if(person.getStr("enterValidPeriodEnd") != null) { + if (person.getStr("enterValidPeriodEnd") != null) { tenPerson.setLiveEnd(sfm.parse(person.getStr("enterValidPeriodEnd"))); - } else if(person.getStr("validPeriodEnd")!=null) { - tenPerson.setLiveStart(sfm.parse(person.getStr("validPeriodEnd"))); + } else if (person.getStr("validPeriodEnd") != null) { + tenPerson.setLiveEnd(sfm.parse(person.getStr("validPeriodEnd"))); } } catch (ParseException e) { throw new RuntimeException(e); } - if(person.getStr("isEnterSulfurArea")!=null) { - tenPerson.setIsEnterSulfurArea(person.getStr("isEnterSulfurArea").equals("是")?1:0); + if (person.getStr("isEnterSulfurArea") != null) { + tenPerson.setIsEnterSulfurArea(person.getStr("isEnterSulfurArea").equals("是") ? 1 : 0); } - if(person.getStr("isProtectDevice")!=null) { - tenPerson.setIsProtectDevice(person.getStr("isProtectDevice").equals("是")?1:0); + if (person.getStr("isProtectDevice") != null) { + tenPerson.setIsProtectDevice(person.getStr("isProtectDevice").equals("是") ? 1 : 0); } - if(person.getStr("isWatchSafeVideo")!=null) { - tenPerson.setIsWatchSafeVideo(person.getStr("isWatchSafeVideo").equals("是")?1:0); + if (person.getStr("isWatchSafeVideo") != null) { + tenPerson.setIsWatchSafeVideo(person.getStr("isWatchSafeVideo").equals("是") ? 1 : 0); } - if(person.getStr("belongContractorName")!=null) { + if (person.getStr("isWatchVideo") != null) { + tenPerson.setIsWatchSafeVideo(person.getStr("isWatchVideo").equals("是") ? 1 : 0); + } + if (person.getStr("belongContractorName") != null) { tenPerson.setBelongContractorName(person.getStr("belongContractorName")); } - tenPerson.setIsBlacklistPersonnel(person.getStr("isBlacklistPersonnel").equals("是")?1:0); - if(person.getJSONArray("pmContractorCertDatas")!=null) { + if(person.getStr("isBlacklistPersonnel") != null){ + tenPerson.setIsBlacklistPersonnel(person.getStr("isBlacklistPersonnel").equals("是") ? 1 : 0); + } + + if (person.getStr("isBlackList") != null) { + tenPerson.setIsBlacklistPersonnel(person.getStr("isBlackList").equals("是") ? 1 : 0); + } + + if (person.getStr("isCheckCert") != null) { + tenPerson.setIsBlacklistPersonnel(person.getStr("isCheckCert").equals("是") ? 1 : 0); + } + + if (person.getJSONArray("pmContractorCertDatas") != null) { List pmContractorCertDatas = person.getJSONArray("pmContractorCertDatas").toList(JSONObject.class); pmContractorCertDatas.forEach(contractorCert -> { TenPersonCert personCert = new TenPersonCert(); - personCert.setCertName(contractorCert.getStr("certName")!=null?contractorCert.getStr("certName"):null); - personCert.setPmContractorCertId(contractorCert.getStr("pmContractorCertId")!=null?contractorCert.getStr("pmContractorCertId"):null); + personCert.setCertName(contractorCert.getStr("certName") != null ? contractorCert.getStr("certName") : null); + personCert.setPmContractorCertId(contractorCert.getStr("pmContractorCertId") != null ? contractorCert.getStr("pmContractorCertId") : null); personCert.setPerson(id); - personCert.setCertType(contractorCert.getStr("certType")!=null?contractorCert.getStr("certType"):null); - if(contractorCert.getStr("certObtainDate")!=null) { + personCert.setCertType(contractorCert.getStr("certType") != null ? contractorCert.getStr("certType") : null); + if (contractorCert.getStr("certObtainDate") != null) { try { - personCert.setCertObtainDate(sfm.parse(contractorCert.getStr("certObtainDate"))); + personCert.setCertObtainDate(sfm1.parse(contractorCert.getStr("certObtainDate"))); } catch (ParseException e) { throw new RuntimeException(e); } } - if(contractorCert.getStr("effectiveDate")!=null) { + if (contractorCert.getStr("effectiveDate") != null) { try { - personCert.setEffectiveDate(sfm.parse(contractorCert.getStr("effectiveDate"))); + personCert.setEffectiveDate(sfm1.parse(contractorCert.getStr("effectiveDate"))); } catch (ParseException e) { throw new RuntimeException(e); } } - certService.saveOrUpdateByField(personCert,"pmContractorCertId"); + certService.saveOrUpdateByField(personCert, "pm_contractor_cert_id"); }); } - if(person.getJSONArray("pmContractorTrainDatas")!=null) { + if (person.getJSONArray("pmContractorTrainDatas") != null) { List pmContractorTrainDatas = person.getJSONArray("pmContractorTrainDatas").toList(JSONObject.class); pmContractorTrainDatas.forEach(contractorTrain -> { TenPersonTrain personTrain = new TenPersonTrain(); - personTrain.setTrainContent(contractorTrain.getStr("trainContent")!=null?contractorTrain.getStr("trainContent"):null); - personTrain.setPmContractorTrainId(contractorTrain.getStr("pmContractorTrainId")!=null?contractorTrain.getStr("pmContractorTrainId"):null); + personTrain.setTrainContent(contractorTrain.getStr("trainContent") != null ? contractorTrain.getStr("trainContent") : null); + personTrain.setPmContractorTrainId(contractorTrain.getStr("pmContractorTrainId") != null ? contractorTrain.getStr("pmContractorTrainId") : null); personTrain.setPersonId(id); - if(contractorTrain.getStr("isQualified")!=null) { - personTrain.setIsQualified(contractorTrain.getStr("isQualified").equals("是")?1:0); + if (contractorTrain.getStr("isQualified") != null) { + personTrain.setIsQualified(contractorTrain.getStr("isQualified").equals("是") ? 1 : 0); } - if(contractorTrain.getStr("trainStartDate")!=null) { + if (contractorTrain.getStr("trainStartDate") != null) { try { - personTrain.setTrainStartDate(sfm.parse(contractorTrain.getStr("trainStartDate"))); + personTrain.setTrainStartDate(sfm1.parse(contractorTrain.getStr("trainStartDate"))); } catch (ParseException e) { throw new RuntimeException(e); } } - if(contractorTrain.getStr("trainEndDate")!=null) { + if (contractorTrain.getStr("trainEndDate") != null) { try { - personTrain.setTrainEndDate(sfm.parse(contractorTrain.getStr("trainEndDate"))); + personTrain.setTrainEndDate(sfm1.parse(contractorTrain.getStr("trainEndDate"))); } catch (ParseException e) { throw new RuntimeException(e); } } - trainService.saveOrUpdateByField(personTrain,"pmContractorTrainId"); + trainService.saveOrUpdateByField(personTrain, "pm_contractor_train_id"); }); } - try { + if (person.getStr("attachment") != null) { + try { + //保存原始图片 + String userFileUrl = globalValue.getImagesDir() + "/" + + tenPerson.getCellId().toString() + "/" + + tenPerson.getPersonId().toString() + "/"; + String orgImageFileName = userFileUrl + "o_" + UUIDUtil.uuid() + ".jpg"; + byte[] b = Base64.getDecoder().decode(person.getStr("attachment").replace("\n", "")); + ImageInfo rgbData = ImageFactory.getRGBData(b); + List faceInfoList = faceEngineService.detectFaces(rgbData); + if (CollectionUtil.isNotEmpty(faceInfoList)) { + FaceInfo faceInfo = faceInfoList.get(0); + FaceRecognitionResDTO faceRecognitionResDTO = new FaceRecognitionResDTO(); + faceRecognitionResDTO.setRect(faceInfo.getRect()); + byte[] featureBytes = faceEngineService.extractFaceFeature(rgbData, faceInfo, ExtractType.REGISTER); + if (featureBytes != null) { + tenPerson.setFeature(Base64.getEncoder().encodeToString(featureBytes)); + InputStream inputStream = new ByteArrayInputStream(b); + PutObjectOptions putObjectOptions = new PutObjectOptions(inputStream.available(), -1); + putObjectOptions.setContentType("image/jpeg"); + minioClient.putObject( + minioConfig.getBucketName(), orgImageFileName, inputStream, putObjectOptions); + inputStream.close(); + tenPerson.setOrgImage(orgImageFileName); + tenPerson.setFaceImage(orgImageFileName); + String flag = tenPersonService.saveOrUpdateByField(tenPerson, "open_id"); + if (flag.equals("save")) { + //发送设备通知 + List devList = tenDeviceService.findByCellId(tenPerson.getCellId()); + //状态是0正常,发送推送 + if (tenPerson.getStatus().intValue() == Constant.PESON_SUATUS_NOMOR) { + for (TenDeviceVo dev : devList) { + //添加到同步表,下发设备通知 + TenPersonSyncEntity syncEntity = new TenPersonSyncEntity(); + syncEntity.setPersonId(tenPerson.getPersonId()); + syncEntity.setTenantId(tenPerson.getTenantId()); + syncEntity.setDeviceSn(dev.getSn()); + syncEntity.setDeviceId(dev.getDeviceId()); + syncEntity.setState(1); + syncEntity.setLastUpdateTime(tenPerson.getLastUpdateTime()); + tenPersonSyncService.insert(syncEntity); - //保存原始图片 - String userFileUrl = globalValue.getImagesDir() + "/" + - tenPerson.getCellId().toString() + "/" + - tenPerson.getPersonId().toString() + "/"; - String orgImageFileName = userFileUrl + "o_" + UUIDUtil.uuid() + ".jpg"; - byte[] b = Base64.getDecoder().decode(person.getStr("attachment").replace("\n", "")); - ImageInfo rgbData = ImageFactory.getRGBData(b); - List faceInfoList = faceEngineService.detectFaces(rgbData); - if (CollectionUtil.isNotEmpty(faceInfoList)) { - FaceInfo faceInfo = faceInfoList.get(0); - FaceRecognitionResDTO faceRecognitionResDTO = new FaceRecognitionResDTO(); - faceRecognitionResDTO.setRect(faceInfo.getRect()); - byte[] featureBytes = faceEngineService.extractFaceFeature(rgbData, faceInfo, ExtractType.REGISTER); - if (featureBytes != null) { - tenPerson.setFeature(Base64.getEncoder().encodeToString(featureBytes)); - InputStream inputStream = new ByteArrayInputStream(b); - PutObjectOptions putObjectOptions = new PutObjectOptions(inputStream.available(), -1); - putObjectOptions.setContentType("image/jpeg"); - minioClient.putObject( - minioConfig.getBucketName(), orgImageFileName, inputStream, putObjectOptions); - inputStream.close(); - tenPerson.setOrgImage(orgImageFileName); - tenPerson.setFaceImage(orgImageFileName); - String flag = tenPersonService.saveOrUpdateByField(tenPerson,"openId"); - if(flag.equals("save")) { - //发送设备通知 - List devList = tenDeviceService.findByCellId(tenPerson.getCellId()); - //状态是0正常,发送推送 - if (tenPerson.getStatus().intValue() == Constant.PESON_SUATUS_NOMOR) { - for (TenDeviceVo dev : devList) { - //添加到同步表,下发设备通知 - TenPersonSyncEntity syncEntity = new TenPersonSyncEntity(); - syncEntity.setPersonId(tenPerson.getPersonId()); - syncEntity.setTenantId(tenPerson.getTenantId()); - syncEntity.setDeviceSn(dev.getSn()); - syncEntity.setDeviceId(dev.getDeviceId()); - syncEntity.setState(1); - syncEntity.setLastUpdateTime(tenPerson.getLastUpdateTime()); - tenPersonSyncService.insert(syncEntity); - - //下发通知 - List list = new ArrayList<>(); - TenPersonOperationVo vo = new TenPersonOperationVo(); - vo.setUid(syncEntity.getPersonId()); - vo.setOperation(1); - vo.setLast_update_stamp(syncEntity.getLastUpdateTime()); - list.add(vo); - serverApiService.personOperation(dev.getSn(), list); + //下发通知 + List list = new ArrayList<>(); + TenPersonOperationVo vo = new TenPersonOperationVo(); + vo.setUid(syncEntity.getPersonId()); + vo.setOperation(1); + vo.setLast_update_stamp(syncEntity.getLastUpdateTime()); + list.add(vo); + serverApiService.personOperation(dev.getSn(), list); + } } } + UserInfo userInfo = new UserInfo(); + userInfo.setFaceId(tenPerson.getPersonId().toString()); + userInfo.setName(tenPerson.getName()); + userInfo.setFaceFeature(featureBytes); + UserRamGroup.addUser(userInfo, tenCellService + .getOne(new QueryWrapper() + .eq("org_id", cellEntity.getOrgId())).getCellId().toString()); + } else { + log.error(tenPerson.getPersonId() + tenPerson.getName() + "图片不合格,未检测到人脸"); + return tenPerson.getOpenId() + "|" + tenPerson.getName() + "|" + "图片不合格,未检测到人脸"; } - UserInfo userInfo = new UserInfo(); - UserRamGroup.addUser(userInfo,tenPerson.getOrgId()!=null?UserRamGroup.getOrgCellMap(tenPerson.getOrgId()):null); - }else{ - log.error(tenPerson.getPersonId()+tenPerson.getName()+"图片不合格,未检测到人脸"); - return tenPerson.getOpenId()+"|"+tenPerson.getName()+"|"+"图片不合格,未检测到人脸"; } + } catch (Exception e) { + e.printStackTrace(); + return tenPerson.getOpenId() + "|" + tenPerson.getName() + "|" + "保存照片文件失败"; } - } catch (Exception e) { - e.printStackTrace(); - return tenPerson.getOpenId()+"|"+tenPerson.getName()+"|"+"保存照片文件失败"; } + if(tenPerson.getIsWatchSafeVideo() == null){ + tenPerson.setIsWatchSafeVideo(0); + } + + tenPersonService.saveTenPerson(tenPerson); + System.out.println("新增成功" + tenPerson); return ""; } } diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/sys/entity/SysUserEntity.java b/shapelight-admin/src/main/java/net/shapelight/modules/sys/entity/SysUserEntity.java index ce1c903..7fb559e 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/sys/entity/SysUserEntity.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/sys/entity/SysUserEntity.java @@ -97,6 +97,7 @@ public class SysUserEntity extends BaseEntity implements Serializable { * 部门ID */ //@NotNull(message="部门不能为空", groups = {AddGroup.class, UpdateGroup.class}) + @JsonSerialize(using = ToStringSerializer.class) @ApiModelProperty("所属部门ID") private Long deptId; diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/ten/controller/TenPersonController.java b/shapelight-admin/src/main/java/net/shapelight/modules/ten/controller/TenPersonController.java index 22fe0b1..684cd18 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/ten/controller/TenPersonController.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/ten/controller/TenPersonController.java @@ -2,8 +2,11 @@ package net.shapelight.modules.ten.controller; import java.awt.image.BufferedImage; import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; import java.net.URLEncoder; import java.nio.file.Files; +import java.text.SimpleDateFormat; import java.util.*; import java.util.zip.ZipOutputStream; @@ -41,6 +44,7 @@ import net.shapelight.modules.sys.controller.AbstractController; import net.shapelight.modules.sys.entity.SysUserEntity; import net.shapelight.modules.sys.service.SysUserRoleService; import net.shapelight.modules.sys.service.SysUserService; +import net.shapelight.modules.ten.dao.TenCellDao; import net.shapelight.modules.ten.entity.*; import net.shapelight.modules.ten.service.*; import net.shapelight.modules.ten.vo.PersonExcelModel; @@ -106,6 +110,9 @@ public class TenPersonController extends AbstractController { @Autowired private CxFeignClient cxFeignClient; + @Autowired + private TenCellDao tenCellDao; + /** * 查询住户列表 @@ -441,7 +448,7 @@ public class TenPersonController extends AbstractController { @PostMapping("/save") @RequiresPermissions("ten:person") @ApiOperation(value = "保存人员信息") - public R save(@RequestBody TenPersonEntity tenPerson) { + public R save(@RequestBody TenPersonEntity tenPerson) throws IOException { // TenPersonEntity room = tenPersonService.queryByNumberAndLayer(tenRoom.getRoomNumber(), // tenRoom.getLayer(), // tenRoom.getBuildId(), @@ -510,27 +517,70 @@ public class TenPersonController extends AbstractController { tenPerson.setCreateTime(new Date()); tenPerson.setRegisterType(Constant.RESGISTER_TYPE_WEB); tenPerson.setStatus(Constant.PESON_SUATUS_NOMOR); + + //长庆新增 + //setOrgId + tenPerson.setOrgId(tenCellDao.selectOne(new QueryWrapper() + .eq("cell_id", tenPerson.getCellId())).getOrgId()); + + System.out.println("tenPerson = " + tenPerson); + + int res = tenPersonService.saveTenPerson(tenPerson); if (res==2) { return R.error("照片未检测到人脸"); } + /* System.out.println(tenPerson.getPersonType() == Constant.PERSON_TYPE_GUEST);*/ if(tenPerson.getPersonType() == Constant.PERSON_TYPE_GUEST) { - Map params = new HashMap<>(); - params.put("pmVisitorPersonnelId",""); - params.put("orgId",tenPerson.getOrgId()); - params.put("orgName",tenPerson.getCellName()); - params.put("personnelName",tenPerson.getName()); - params.put("personnelId",tenPerson.getOpenId()); - params.put("personnelCardId",tenPerson.getIdCard()); - params.put("enterValidPeriod",tenPerson.getLiveStart().toString()); - params.put("enterValidPeriodEnd",tenPerson.getLiveEnd().toString()); - params.put("mobile",tenPerson.getMobile()); - params.put("isEnterSulfurArea",tenPerson.getIsEnterSulfurArea()==1?"是":"否"); - params.put("isProtectDevice",tenPerson.getIsProtectDevice()==1?"是":"否"); - params.put("isBlacklistPersonnel","否"); - params.put("isWatchSafeVideo",tenPerson.getIsWatchSafeVideo()==1?"是":"否"); - params.put("attachment",tenPerson.getIsWatchSafeVideo()); + + SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + Map params = new HashMap<>(); + params.put("pmVisitorPersonnelId", ""); + params.put("orgId", tenPerson.getOrgId()); + params.put("orgName", tenPerson.getCellName()); + params.put("personnelName", tenPerson.getName()); + //params.put("personnelId",tenPerson.getOpenId()); + params.put("personnelCardId", tenPerson.getIdCard()); + + + params.put("enterValidPeriod", targetFormat.format(tenPerson.getLiveStart())); + params.put("enterValidPeriodEnd", targetFormat.format(tenPerson.getLiveEnd())); + + params.put("mobile", tenPerson.getMobile()); + params.put("isEnterSulfurArea", tenPerson.getIsEnterSulfurArea() == 1 ? "是" : "否"); + params.put("isProtectDevice", tenPerson.getIsProtectDevice() == 1 ? "是" : "否"); + params.put("isBlacklistPersonnel", "否"); + params.put("isWatchSafeVideo", tenPerson.getIsWatchSafeVideo() == 1 ? "已观看" : "未观看"); + + + String base64 = null; + try { + URL url = new URL(globalValue.getMinioEndpoint() + "/" + + globalValue.getMinioBucketName() + "/" + tenPerson.getFaceImage()); + // 从URL获取图片 + try (InputStream is = url.openStream()) { + // 使用ByteArrayOutputStream来收集数据 + ByteArrayOutputStream bao = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int length; + // 循环读取数据直到输入流结束 + while ((length = is.read(buffer)) != -1) { + bao.write(buffer, 0, length); + } + // 将图片数据转换为Base64编码 + base64 = Base64.getEncoder().encodeToString(bao.toByteArray()); + // 打印Base64编码的字符串 + System.out.println("data:image/jpeg;base64," + base64); + } + } catch (IOException e) { + e.printStackTrace(); + } + + params.put("attachment", "data:image/jpeg;base64," + base64); + + System.out.println("params = " + params); //cxFeignClient.savePmVisitorPersonnel(params); } return R.ok(); diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/ten/entity/TenPersonEntity.java b/shapelight-admin/src/main/java/net/shapelight/modules/ten/entity/TenPersonEntity.java index ce193c4..814e731 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/ten/entity/TenPersonEntity.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/ten/entity/TenPersonEntity.java @@ -384,5 +384,9 @@ public class TenPersonEntity extends BaseEntity implements Serializable { private Integer isWatchSafeVideo; private String belongContractorName; private Integer isBlacklistPersonnel; + /** + * 是否核验证书 + */ + private Integer isCheckCert; } diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonCertServiceImpl.java b/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonCertServiceImpl.java index 063b5b3..89f447a 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonCertServiceImpl.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonCertServiceImpl.java @@ -24,6 +24,8 @@ public class TenPersonCertServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq(fieldName, MyBeanUtils.getFieldValueByName(entity,fieldName)); diff --git a/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonServiceImpl.java b/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonServiceImpl.java index bc18cf4..100617a 100644 --- a/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonServiceImpl.java +++ b/shapelight-admin/src/main/java/net/shapelight/modules/ten/service/impl/TenPersonServiceImpl.java @@ -558,6 +558,20 @@ public class TenPersonServiceImpl extends ServiceImpl is_blacklist_personnel, + + org_id, + + + is_check_cert, + @@ -513,7 +519,13 @@ #{isWatchSafeVideo}, - #{is_blacklist_personnel}, + #{isBlacklistPersonnel}, + + + #{orgId}, + + + #{isCheckCert},