feat(): 优化车辆和人员门禁同步功能
parent
414ad99ed1
commit
6288343378
|
|
@ -11,6 +11,7 @@ import com.zcloud.primeport.dto.ClosedAreaCarApplyAuditCmd;
|
||||||
import com.zcloud.primeport.dto.ClosedAreaCarApplyPageQry;
|
import com.zcloud.primeport.dto.ClosedAreaCarApplyPageQry;
|
||||||
import com.zcloud.primeport.dto.ClosedAreaCarApplyScreenPageQry;
|
import com.zcloud.primeport.dto.ClosedAreaCarApplyScreenPageQry;
|
||||||
import com.zcloud.primeport.dto.ClosedAreaCarApplyUpdateCmd;
|
import com.zcloud.primeport.dto.ClosedAreaCarApplyUpdateCmd;
|
||||||
|
import com.zcloud.primeport.domain.model.DockSyncNoticeHolder;
|
||||||
import com.zcloud.primeport.dto.clientobject.ClosedAreaCarApplyCO;
|
import com.zcloud.primeport.dto.clientobject.ClosedAreaCarApplyCO;
|
||||||
import com.zcloud.primeport.dto.clientobject.ClosedAreaCarApplyScreenCO;
|
import com.zcloud.primeport.dto.clientobject.ClosedAreaCarApplyScreenCO;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
|
|
@ -64,8 +65,17 @@ public class ClosedAreaCarApplyController {
|
||||||
if (!(auditCmd.getAuditFlag().equals(2) || auditCmd.getAuditFlag().equals(3))) {
|
if (!(auditCmd.getAuditFlag().equals(2) || auditCmd.getAuditFlag().equals(3))) {
|
||||||
throw new BizException("只能是通过或者不通过");
|
throw new BizException("只能是通过或者不通过");
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
closedAreaCarApplyService.auditCarApply(auditCmd);
|
closedAreaCarApplyService.auditCarApply(auditCmd);
|
||||||
|
String notice = DockSyncNoticeHolder.getAndClear();
|
||||||
|
if (notice != null) {
|
||||||
|
return SingleResponse.of(notice);
|
||||||
|
}
|
||||||
return Response.buildSuccess();
|
return Response.buildSuccess();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
DockSyncNoticeHolder.clear();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation("可视化大屏-车申请记录")
|
@ApiOperation("可视化大屏-车申请记录")
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import com.zcloud.primeport.dto.clientobject.ClosedAreaPersonApplyCO;
|
||||||
import com.zcloud.primeport.dto.clientobject.ClosedAreaPersonApplyDeptCO;
|
import com.zcloud.primeport.dto.clientobject.ClosedAreaPersonApplyDeptCO;
|
||||||
import com.zcloud.primeport.dto.clientobject.ClosedAreaPersonApplyScreenCO;
|
import com.zcloud.primeport.dto.clientobject.ClosedAreaPersonApplyScreenCO;
|
||||||
import com.zcloud.primeport.dto.clientobject.UserCo;
|
import com.zcloud.primeport.dto.clientobject.UserCo;
|
||||||
|
import com.zcloud.primeport.domain.model.DockSyncNoticeHolder;
|
||||||
import com.zcloud.primeport.persistence.dataobject.UserDto;
|
import com.zcloud.primeport.persistence.dataobject.UserDto;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
|
@ -54,8 +55,17 @@ public class ClosedAreaPersonApplyController {
|
||||||
if (!(auditCmd.getAuditFlag().equals(2) || auditCmd.getAuditFlag().equals(3))) {
|
if (!(auditCmd.getAuditFlag().equals(2) || auditCmd.getAuditFlag().equals(3))) {
|
||||||
throw new BizException("只能是通过或者不通过");
|
throw new BizException("只能是通过或者不通过");
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
closedAreaPersonApplyService.auditPersonApply(auditCmd);
|
closedAreaPersonApplyService.auditPersonApply(auditCmd);
|
||||||
|
String notice = DockSyncNoticeHolder.getAndClear();
|
||||||
|
if (notice != null) {
|
||||||
|
return SingleResponse.of(notice);
|
||||||
|
}
|
||||||
return Response.buildSuccess();
|
return Response.buildSuccess();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
DockSyncNoticeHolder.clear();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation("获取本单位人员信息数据,用于随行人员,企业人员权限列表")
|
@ApiOperation("获取本单位人员信息数据,用于随行人员,企业人员权限列表")
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import com.jjb.saas.framework.auth.model.SSOUser;
|
||||||
import com.jjb.saas.framework.auth.utils.AuthContext;
|
import com.jjb.saas.framework.auth.utils.AuthContext;
|
||||||
import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil;
|
import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil;
|
||||||
import com.zcloud.gbscommon.todolistmq.event.TodoListAddEvent;
|
import com.zcloud.gbscommon.todolistmq.event.TodoListAddEvent;
|
||||||
|
import com.zcloud.gbscommon.utils.Tools;
|
||||||
import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade;
|
import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade;
|
||||||
import com.zcloud.gbscommon.zclouduser.response.ZcloudUserCo;
|
import com.zcloud.gbscommon.zclouduser.response.ZcloudUserCo;
|
||||||
import com.zcloud.primeport.domain.config.MessageTemplateConfig;
|
import com.zcloud.primeport.domain.config.MessageTemplateConfig;
|
||||||
|
|
@ -46,19 +47,21 @@ public class ClosedAreaPersonApplyAddExe {
|
||||||
closedAreaPersonApplyE.setAuditFlag(1);
|
closedAreaPersonApplyE.setAuditFlag(1);
|
||||||
if (!cmd.getPersonBelongType().equals(4)) {
|
if (!cmd.getPersonBelongType().equals(4)) {
|
||||||
SingleResponse<ZcloudUserCo> infoByUserId = zcloudUserFacade.getInfoByUserId(AuthContext.getUserId());
|
SingleResponse<ZcloudUserCo> infoByUserId = zcloudUserFacade.getInfoByUserId(AuthContext.getUserId());
|
||||||
ZcloudUserCo userData = infoByUserId.getData();
|
ZcloudUserCo userData = infoByUserId == null ? null : infoByUserId.getData();
|
||||||
SSOUser currentUser = AuthContext.getCurrentUser();
|
SSOUser currentUser = AuthContext.getCurrentUser();
|
||||||
closedAreaPersonApplyE.setApplyPersonCorpId(currentUser.getTenantId());
|
closedAreaPersonApplyE.setApplyPersonCorpId(currentUser.getTenantId());
|
||||||
closedAreaPersonApplyE.setApplyPersonCorpName(currentUser.getTenantName());
|
closedAreaPersonApplyE.setApplyPersonCorpName(currentUser.getTenantName());
|
||||||
closedAreaPersonApplyE.setApplyPersonDepartmentId(currentUser.getOrgId());
|
closedAreaPersonApplyE.setApplyPersonDepartmentId(currentUser.getOrgId());
|
||||||
closedAreaPersonApplyE.setApplyPersonDepartmentName(currentUser.getOrgName());
|
closedAreaPersonApplyE.setApplyPersonDepartmentName(currentUser.getOrgName());
|
||||||
closedAreaPersonApplyE.setApplyPersonUserId(currentUser.getUserId());
|
closedAreaPersonApplyE.setApplyPersonUserId(currentUser.getUserId());
|
||||||
closedAreaPersonApplyE.setApplyPersonUserName(userData.getName());
|
closedAreaPersonApplyE.setApplyPersonUserName(firstNotEmpty(userData == null ? null : userData.getName(), cmd.getApplyPersonUserName()));
|
||||||
closedAreaPersonApplyE.setUserPhone(userData.getPhone());
|
closedAreaPersonApplyE.setUserPhone(firstNotEmpty(userData == null ? null : userData.getPhone(), cmd.getUserPhone()));
|
||||||
closedAreaPersonApplyE.setUserCard(userData.getUserIdCard());
|
closedAreaPersonApplyE.setUserCard(normalizeUserCard(firstNotEmpty(userData == null ? null : userData.getUserIdCard(), cmd.getUserCard())));
|
||||||
closedAreaPersonApplyE.setUserFaceUrl(userData.getUserAvatarUrl());
|
closedAreaPersonApplyE.setUserFaceUrl(firstNotEmpty(userData == null ? null : userData.getUserAvatarUrl(), cmd.getUserFaceUrl()));
|
||||||
}else {
|
}else {
|
||||||
// closedAreaPersonApplyE.setUserCard(Base64.encodeToString(cmd.getUserCard()));
|
closedAreaPersonApplyE.setUserCard(normalizeUserCard(cmd.getUserCard()));
|
||||||
|
closedAreaPersonApplyE.setUserPhone(cmd.getUserPhone());
|
||||||
|
closedAreaPersonApplyE.setUserFaceUrl(cmd.getUserFaceUrl());
|
||||||
}
|
}
|
||||||
boolean res = closedAreaPersonApplyGateway.add(closedAreaPersonApplyE);
|
boolean res = closedAreaPersonApplyGateway.add(closedAreaPersonApplyE);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
|
@ -78,6 +81,21 @@ public class ClosedAreaPersonApplyAddExe {
|
||||||
return closedAreaPersonApplyE.getId();
|
return closedAreaPersonApplyE.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String firstNotEmpty(String primary, String fallback) {
|
||||||
|
return Tools.notEmpty(primary) ? primary : fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String normalizeUserCard(String userCard) {
|
||||||
|
if (Tools.isEmpty(userCard)) {
|
||||||
|
return userCard;
|
||||||
|
}
|
||||||
|
String trimmed = userCard.trim();
|
||||||
|
if (trimmed.matches("\\d{17}[\\dXx]")) {
|
||||||
|
return Base64.encodeToString(trimmed);
|
||||||
|
}
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.println(Base64.encodeToString("130323199504189999"));
|
System.out.println(Base64.encodeToString("130323199504189999"));
|
||||||
System.out.println(Base64.decodeToString("MTMwMzIzMTk5NTA0MTg5OTk5"));
|
System.out.println(Base64.decodeToString("MTMwMzIzMTk5NTA0MTg5OTk5"));
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.zcloud.primeport.domain.model;
|
||||||
|
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class DockSyncNoticeHolder {
|
||||||
|
private static final ThreadLocal<Set<String>> NOTICES = ThreadLocal.withInitial(LinkedHashSet::new);
|
||||||
|
|
||||||
|
private DockSyncNoticeHolder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void add(String notice) {
|
||||||
|
if (notice != null && !notice.trim().isEmpty()) {
|
||||||
|
NOTICES.get().add(notice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getAndClear() {
|
||||||
|
try {
|
||||||
|
Set<String> notices = NOTICES.get();
|
||||||
|
return notices.isEmpty() ? null : String.join(";", notices);
|
||||||
|
} finally {
|
||||||
|
NOTICES.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clear() {
|
||||||
|
NOTICES.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.zcloud.primeport.persistence.mapper;
|
package com.zcloud.primeport.persistence.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.jjb.saas.framework.datascope.annotation.DataScope;
|
import com.jjb.saas.framework.datascope.annotation.DataScope;
|
||||||
|
|
@ -31,8 +32,10 @@ public interface ClosedAreaCarApplyMapper extends BaseMapper<ClosedAreaCarApplyD
|
||||||
|
|
||||||
IPage<ClosedAreaCarApplyDO> screenList(Page<Map<String, Object>> page, @Param("params") Map<String, Object> params);
|
IPage<ClosedAreaCarApplyDO> screenList(Page<Map<String, Object>> page, @Param("params") Map<String, Object> params);
|
||||||
|
|
||||||
List<TwoLevelCar> getFgsCarToDay(String licenceNo);
|
@InterceptorIgnore(tenantLine = "true")
|
||||||
|
List<TwoLevelCar> getFgsCarToDay(@Param("licenceNo") String licenceNo);
|
||||||
|
|
||||||
List<TwoLevelCar> dockTmpCarLevelTwo(String licenceNo);
|
@InterceptorIgnore(tenantLine = "true")
|
||||||
|
List<TwoLevelCar> dockTmpCarLevelTwo(@Param("licenceNo") String licenceNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.zcloud.primeport.persistence.mapper;
|
package com.zcloud.primeport.persistence.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.jjb.saas.framework.datascope.annotation.DataScope;
|
import com.jjb.saas.framework.datascope.annotation.DataScope;
|
||||||
|
|
@ -35,10 +36,12 @@ public interface ClosedAreaPersonApplyMapper extends BaseMapper<ClosedAreaPerson
|
||||||
|
|
||||||
Integer countDashboardApproval(@Param("params") Map<String, Object> params);
|
Integer countDashboardApproval(@Param("params") Map<String, Object> params);
|
||||||
|
|
||||||
List<TwoLevelUser> getDockAuthInfoById(Long applyId);
|
@InterceptorIgnore(tenantLine = "true")
|
||||||
|
List<TwoLevelUser> getDockAuthInfoById(@Param("applyId") Long applyId);
|
||||||
|
|
||||||
List<ClosedAreaPersonApplyDeptDO> deptList();
|
List<ClosedAreaPersonApplyDeptDO> deptList();
|
||||||
|
|
||||||
List<TwoLevelUser> getDockAuthTmpInfoById(Long applyId);
|
@InterceptorIgnore(tenantLine = "true")
|
||||||
|
List<TwoLevelUser> getDockAuthTmpInfoById(@Param("applyId") Long applyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import com.zcloud.primeport.persistence.repository.VehicleDockLogRepository;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarBlackDto;
|
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarBlackDto;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarRemoveDto;
|
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarRemoveDto;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarSaveDto;
|
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarSaveDto;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
|
@ -16,9 +17,10 @@ import javax.annotation.Resource;
|
||||||
* 一级车辆门禁对接 前缀
|
* 一级车辆门禁对接 前缀
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class OneLevelCarUtil {
|
public class OneLevelCarUtil {
|
||||||
@Value("${kmmj.dockflag:0}")
|
@Value("${kmmj.dockFlag:0}")
|
||||||
private Integer dockFlag;
|
private Integer dockFlag;
|
||||||
@Value("${oneLevelCar.prefix:}")
|
@Value("${oneLevelCar.prefix:}")
|
||||||
private String prefix;
|
private String prefix;
|
||||||
|
|
@ -32,8 +34,14 @@ public class OneLevelCarUtil {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void internalVehicleSave(OneLevelCarSaveDto oneLevelCarSaveDto) {
|
public void internalVehicleSave(OneLevelCarSaveDto oneLevelCarSaveDto) {
|
||||||
|
if (!dockFlag.equals(1)) {
|
||||||
|
log.info("一级车行-内部车辆新增跳过, dockFlag:{}, 车牌号:{}", dockFlag, oneLevelCarSaveDto.getTruckNo());
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (dockFlag.equals(1)) {
|
if (dockFlag.equals(1)) {
|
||||||
|
log.info("一级车行-内部车辆新增请求, url:{}, body:{}", prefix + "HD_QHD_IGATE_1.0/webresources/login/CTruck/qaSaveInternal", new JSONObject(oneLevelCarSaveDto));
|
||||||
String body = HttpRequest.post(prefix + "HD_QHD_IGATE_1.0/webresources/login/CTruck/qaSaveInternal").body(new JSONObject(oneLevelCarSaveDto).toString()).execute().body();
|
String body = HttpRequest.post(prefix + "HD_QHD_IGATE_1.0/webresources/login/CTruck/qaSaveInternal").body(new JSONObject(oneLevelCarSaveDto).toString()).execute().body();
|
||||||
|
log.info("一级车行-内部车辆新增响应, 车牌号:{}, body:{}", oneLevelCarSaveDto.getTruckNo(), body);
|
||||||
JSONObject resJson = new JSONObject(body);
|
JSONObject resJson = new JSONObject(body);
|
||||||
VehicleDockLogDO vehicleDockLogDO = new VehicleDockLogDO();
|
VehicleDockLogDO vehicleDockLogDO = new VehicleDockLogDO();
|
||||||
vehicleDockLogDO.setLevel("1");
|
vehicleDockLogDO.setLevel("1");
|
||||||
|
|
@ -90,9 +98,15 @@ public class OneLevelCarUtil {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void tmpVehicleSave(OneLevelCarSaveDto oneLevelCarSaveDto) {
|
public void tmpVehicleSave(OneLevelCarSaveDto oneLevelCarSaveDto) {
|
||||||
|
if (!dockFlag.equals(1)) {
|
||||||
|
log.info("一级车行-临时车辆新增跳过, dockFlag:{}, 车牌号:{}", dockFlag, oneLevelCarSaveDto.getTruckNo());
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (dockFlag.equals(1)) {
|
if (dockFlag.equals(1)) {
|
||||||
oneLevelCarSaveDto.setIsNeedCheck("0");
|
oneLevelCarSaveDto.setIsNeedCheck("0");
|
||||||
|
log.info("一级车行-临时车辆新增请求, url:{}, body:{}", prefix + "HD_QHD_IGATE_1.0/webresources/login/CTruck/qaSaveTemp", new JSONObject(oneLevelCarSaveDto));
|
||||||
String body = HttpRequest.post(prefix + "HD_QHD_IGATE_1.0/webresources/login/CTruck/qaSaveTemp").body(new JSONObject(oneLevelCarSaveDto).toString()).execute().body();
|
String body = HttpRequest.post(prefix + "HD_QHD_IGATE_1.0/webresources/login/CTruck/qaSaveTemp").body(new JSONObject(oneLevelCarSaveDto).toString()).execute().body();
|
||||||
|
log.info("一级车行-临时车辆新增响应, 车牌号:{}, body:{}", oneLevelCarSaveDto.getTruckNo(), body);
|
||||||
JSONObject resJson = new JSONObject(body);
|
JSONObject resJson = new JSONObject(body);
|
||||||
VehicleDockLogDO vehicleDockLogDO = new VehicleDockLogDO();
|
VehicleDockLogDO vehicleDockLogDO = new VehicleDockLogDO();
|
||||||
vehicleDockLogDO.setLevel("1");
|
vehicleDockLogDO.setLevel("1");
|
||||||
|
|
|
||||||
|
|
@ -3,34 +3,26 @@ package com.zcloud.primeport.plan.mjDevice;
|
||||||
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpRequest;
|
||||||
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONArray;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
|
import com.alibaba.cola.exception.BizException;
|
||||||
import com.zcloud.gbscommon.dahuaDevice.DaHuaDeviceCommon;
|
import com.zcloud.gbscommon.dahuaDevice.DaHuaDeviceCommon;
|
||||||
import com.zcloud.gbscommon.dahuaDevice.DhuaConfig;
|
import com.zcloud.gbscommon.dahuaDevice.DhuaConfig;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.zcloud.gbscommon.hkDevice.HKDeviceUtil;
|
import com.zcloud.gbscommon.hkDevice.HKDeviceUtil;
|
||||||
import com.zcloud.gbscommon.utils.DateUtil;
|
import com.zcloud.gbscommon.utils.DateUtil;
|
||||||
import com.zcloud.gbscommon.utils.Tools;
|
|
||||||
import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade;
|
|
||||||
import com.zcloud.gbscommon.zclouduser.request.ZcloudUserImgQry;
|
|
||||||
import com.zcloud.gbscommon.zclouduser.response.ZcloudUserImgBase64Co;
|
|
||||||
import com.zcloud.primeport.persistence.dataobject.ClosedAreaCarApplyDO;
|
import com.zcloud.primeport.persistence.dataobject.ClosedAreaCarApplyDO;
|
||||||
import com.zcloud.primeport.persistence.dataobject.ClosedAreaPersonApplyDO;
|
|
||||||
import com.zcloud.primeport.persistence.dataobject.VehicleApplyDO;
|
import com.zcloud.primeport.persistence.dataobject.VehicleApplyDO;
|
||||||
import com.zcloud.primeport.persistence.repository.ClosedAreaCarApplyRepository;
|
import com.zcloud.primeport.persistence.repository.ClosedAreaCarApplyRepository;
|
||||||
import com.zcloud.primeport.persistence.repository.ClosedAreaPersonApplyRepository;
|
|
||||||
import com.zcloud.primeport.persistence.repository.VehicleApplyRepository;
|
import com.zcloud.primeport.persistence.repository.VehicleApplyRepository;
|
||||||
|
import com.zcloud.primeport.domain.model.DockSyncNoticeHolder;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.CarEnum;
|
import com.zcloud.primeport.plan.mjDevice.dto.CarEnum;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarSaveDto;
|
import com.zcloud.primeport.plan.mjDevice.dto.OneLevelCarSaveDto;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.TwoLevelCar;
|
import com.zcloud.primeport.plan.mjDevice.dto.TwoLevelCar;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.TwoLevelUser;
|
|
||||||
import jodd.util.Base64;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.dubbo.config.annotation.DubboReference;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 一级人员门禁对接 前缀
|
* 一级人员门禁对接 前缀
|
||||||
|
|
@ -47,8 +39,10 @@ public class TwoCarUtil {
|
||||||
private OneLevelCarUtil oneLevelCarUtil;
|
private OneLevelCarUtil oneLevelCarUtil;
|
||||||
|
|
||||||
|
|
||||||
private static Integer dockFlag = 0;
|
@Value("${kmmj.dockFlag:0}")
|
||||||
private static String prefix;
|
private Integer dockFlag;
|
||||||
|
@Value("${oneLevelCar.prefix:}")
|
||||||
|
private String prefix;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 定时任务对接二级口门车辆
|
* 定时任务对接二级口门车辆
|
||||||
|
|
@ -63,11 +57,12 @@ public class TwoCarUtil {
|
||||||
int fgsSuccess = 0, fgsFail = 0;
|
int fgsSuccess = 0, fgsFail = 0;
|
||||||
for (TwoLevelCar twoLevelCar : fgsCarList) {
|
for (TwoLevelCar twoLevelCar : fgsCarList) {
|
||||||
try {
|
try {
|
||||||
HKDeviceUtil.saveOrUpdCar(twoLevelCar.getLicenceNo(), 0);
|
addVehicleExistsNotice(twoLevelCar.getLicenceNo());
|
||||||
HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0,
|
JSONObject topUpResult = HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0,
|
||||||
twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(),
|
twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(),
|
||||||
DateUtil.date2Str(new Date(), "yyyy-MM-dd"),
|
DateUtil.date2Str(new Date(), "yyyy-MM-dd"),
|
||||||
DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
||||||
|
assertHkSuccess(topUpResult, "海康车辆授权失败,车牌号:" + twoLevelCar.getLicenceNo());
|
||||||
fgsSuccess++;
|
fgsSuccess++;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
fgsFail++;
|
fgsFail++;
|
||||||
|
|
@ -82,11 +77,12 @@ public class TwoCarUtil {
|
||||||
int tmpSuccess = 0, tmpFail = 0;
|
int tmpSuccess = 0, tmpFail = 0;
|
||||||
for (TwoLevelCar twoLevelCar : tmpCarList) {
|
for (TwoLevelCar twoLevelCar : tmpCarList) {
|
||||||
try {
|
try {
|
||||||
HKDeviceUtil.saveOrUpdCar(twoLevelCar.getLicenceNo(), 0);
|
addVehicleExistsNotice(twoLevelCar.getLicenceNo());
|
||||||
HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0,
|
JSONObject topUpResult = HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0,
|
||||||
twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(),
|
twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(),
|
||||||
DateUtil.date2Str(new Date(), "yyyy-MM-dd"),
|
DateUtil.date2Str(new Date(), "yyyy-MM-dd"),
|
||||||
DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
||||||
|
assertHkSuccess(topUpResult, "海康车辆授权失败,车牌号:" + twoLevelCar.getLicenceNo());
|
||||||
tmpSuccess++;
|
tmpSuccess++;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
tmpFail++;
|
tmpFail++;
|
||||||
|
|
@ -217,11 +213,12 @@ public class TwoCarUtil {
|
||||||
List<TwoLevelCar> carList = closedAreaCarApplyRepository.getFgsCarToDay(licence_no);
|
List<TwoLevelCar> carList = closedAreaCarApplyRepository.getFgsCarToDay(licence_no);
|
||||||
log.info("车辆同步-分公司车辆, 车牌号:{}, 查询到记录数:{}", licence_no, carList.size());
|
log.info("车辆同步-分公司车辆, 车牌号:{}, 查询到记录数:{}", licence_no, carList.size());
|
||||||
for (TwoLevelCar twoLevelCar : carList) {
|
for (TwoLevelCar twoLevelCar : carList) {
|
||||||
log.info("车辆同步-保存/更新分公司车辆到海康, 车牌号:{}, hkIndexCode:{}, parkSysCode:{}",
|
log.info("车辆同步-分公司车辆停车场授权, 车牌号:{}, hkIndexCode:{}, parkSysCode:{}",
|
||||||
twoLevelCar.getLicenceNo(), twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode());
|
twoLevelCar.getLicenceNo(), twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode());
|
||||||
// todo 车牌号转一下类型
|
// todo 车牌号转一下类型
|
||||||
HKDeviceUtil.saveOrUpdCar(twoLevelCar.getLicenceNo(), 0);
|
addVehicleExistsNotice(twoLevelCar.getLicenceNo());
|
||||||
HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0, twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(), DateUtil.date2Str(new Date(), "yyyy-MM-dd"), DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
JSONObject topUpResult = HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0, twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(), DateUtil.date2Str(new Date(), "yyyy-MM-dd"), DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
||||||
|
assertHkSuccess(topUpResult, "海康车辆授权失败,车牌号:" + twoLevelCar.getLicenceNo());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -234,14 +231,54 @@ public class TwoCarUtil {
|
||||||
List<TwoLevelCar> carList = closedAreaCarApplyRepository.dockTmpCarLevelTwo(licence_no);
|
List<TwoLevelCar> carList = closedAreaCarApplyRepository.dockTmpCarLevelTwo(licence_no);
|
||||||
log.info("车辆同步-临时车辆, 车牌号:{}, 查询到记录数:{}", licence_no, carList.size());
|
log.info("车辆同步-临时车辆, 车牌号:{}, 查询到记录数:{}", licence_no, carList.size());
|
||||||
for (TwoLevelCar twoLevelCar : carList) {
|
for (TwoLevelCar twoLevelCar : carList) {
|
||||||
log.info("车辆同步-保存/更新临时车辆到海康, 车牌号:{}, hkIndexCode:{}, parkSysCode:{}",
|
log.info("车辆同步-临时车辆停车场授权, 车牌号:{}, hkIndexCode:{}, parkSysCode:{}",
|
||||||
twoLevelCar.getLicenceNo(), twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode());
|
twoLevelCar.getLicenceNo(), twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode());
|
||||||
// todo 车牌号转一下类型
|
// todo 车牌号转一下类型
|
||||||
HKDeviceUtil.saveOrUpdCar(twoLevelCar.getLicenceNo(), 0);
|
addVehicleExistsNotice(twoLevelCar.getLicenceNo());
|
||||||
HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0, twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(), DateUtil.date2Str(new Date(), "yyyy-MM-dd"), DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
JSONObject topUpResult = HKDeviceUtil.vehicleTopUp(twoLevelCar.getLicenceNo(), 0, twoLevelCar.getHkIndexCode(), twoLevelCar.getKhParkSysCode(), DateUtil.date2Str(new Date(), "yyyy-MM-dd"), DateUtil.date2Str(new Date(), "yyyy-MM-dd"));
|
||||||
|
assertHkSuccess(topUpResult, "海康车辆授权失败,车牌号:" + twoLevelCar.getLicenceNo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assertHkSuccess(JSONObject result, String message) {
|
||||||
|
if (result == null) {
|
||||||
|
throw new BizException(message + ",海康返回为空");
|
||||||
|
}
|
||||||
|
String code = result.getStr("code");
|
||||||
|
if (!"0".equals(code)) {
|
||||||
|
throw new BizException(message + ",code:" + code + ",msg:" + result.getStr("msg"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addVehicleExistsNotice(String licenceNo) {
|
||||||
|
if (vehicleExists(licenceNo)) {
|
||||||
|
log.info("当前车辆车牌号已存在系统中,访问期限已更新, 车牌号:{}", licenceNo);
|
||||||
|
DockSyncNoticeHolder.add("当前车辆车牌号已存在系统中,访问期限已更新");
|
||||||
|
} else {
|
||||||
|
log.info("车辆同步-海康未查到车辆基础信息,仅调用车辆充值授权避免默认区域重复建车, 车牌号:{}", licenceNo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean vehicleExists(String licenceNo) {
|
||||||
|
JSONObject result = HKDeviceUtil.getVehiclesByLicenceNoList(licenceNo);
|
||||||
|
assertHkSuccess(result, "海康查询车辆失败,车牌号:" + licenceNo);
|
||||||
|
JSONObject data = result.getJSONObject("data");
|
||||||
|
if (data == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
JSONArray list = data.getJSONArray("list");
|
||||||
|
if (list == null || list.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
JSONObject vehicle = list.getJSONObject(i);
|
||||||
|
if (licenceNo.equals(vehicle.getStr("plateNo"))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static <T> List<List<T>> partition(List<T> list, int size) {
|
private static <T> List<List<T>> partition(List<T> list, int size) {
|
||||||
List<List<T>> partitions = new ArrayList<>();
|
List<List<T>> partitions = new ArrayList<>();
|
||||||
|
|
|
||||||
|
|
@ -2,29 +2,39 @@ package com.zcloud.primeport.plan.mjDevice;
|
||||||
|
|
||||||
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONArray;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
|
import com.alibaba.cola.exception.BizException;
|
||||||
import com.zcloud.gbscommon.dahuaDevice.DaHuaDeviceCommon;
|
import com.zcloud.gbscommon.dahuaDevice.DaHuaDeviceCommon;
|
||||||
import com.zcloud.gbscommon.dahuaDevice.DhuaConfig;
|
import com.zcloud.gbscommon.dahuaDevice.DhuaConfig;
|
||||||
import com.zcloud.gbscommon.hkDevice.HKDeviceUtil;
|
import com.zcloud.gbscommon.hkDevice.HKDeviceUtil;
|
||||||
import com.zcloud.gbscommon.utils.DateUtil;
|
import com.zcloud.gbscommon.utils.DateUtil;
|
||||||
import com.zcloud.gbscommon.utils.Tools;
|
import com.zcloud.gbscommon.utils.Tools;
|
||||||
import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade;
|
|
||||||
import com.zcloud.gbscommon.zclouduser.request.ZcloudUserImgQry;
|
|
||||||
import com.zcloud.gbscommon.zclouduser.response.ZcloudUserImgBase64Co;
|
|
||||||
import com.zcloud.primeport.persistence.dataobject.ClosedAreaPersonApplyDO;
|
import com.zcloud.primeport.persistence.dataobject.ClosedAreaPersonApplyDO;
|
||||||
import com.zcloud.primeport.persistence.dataobject.XgfApplyPersonDO;
|
import com.zcloud.primeport.persistence.dataobject.XgfApplyPersonDO;
|
||||||
import com.zcloud.primeport.persistence.repository.ClosedAreaPersonApplyRepository;
|
import com.zcloud.primeport.persistence.repository.ClosedAreaPersonApplyRepository;
|
||||||
import com.zcloud.primeport.persistence.repository.XgfApplyPersonRepository;
|
import com.zcloud.primeport.persistence.repository.XgfApplyPersonRepository;
|
||||||
|
import com.zcloud.primeport.domain.model.DockSyncNoticeHolder;
|
||||||
import com.zcloud.primeport.plan.mjDevice.dto.TwoLevelUser;
|
import com.zcloud.primeport.plan.mjDevice.dto.TwoLevelUser;
|
||||||
import jodd.util.Base64;
|
import jodd.util.Base64;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.dubbo.config.annotation.DubboReference;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.imageio.IIOImage;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.imageio.ImageWriteParam;
|
||||||
|
import javax.imageio.ImageWriter;
|
||||||
|
import javax.imageio.stream.ImageOutputStream;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.io.File;
|
import java.awt.Color;
|
||||||
import java.io.FileInputStream;
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
@ -39,14 +49,15 @@ public class TwoPersonUtil {
|
||||||
private ClosedAreaPersonApplyRepository closedAreaPersonApplyRepository;
|
private ClosedAreaPersonApplyRepository closedAreaPersonApplyRepository;
|
||||||
@Resource
|
@Resource
|
||||||
private OnePersonUtil onePersonUtil;
|
private OnePersonUtil onePersonUtil;
|
||||||
@DubboReference
|
|
||||||
private ZcloudUserFacade zcloudUserFacade;
|
|
||||||
|
|
||||||
// @Value("${kmmj.dockflag}")
|
@Value("${kmmj.dockFlag:0}")
|
||||||
// private Integer dockFlag;
|
private Integer dockFlag;
|
||||||
|
@Value("${file.upload.url:}")
|
||||||
|
private String fileUrl;
|
||||||
|
@Value("${hk.person.face.max-bytes:15360}")
|
||||||
|
private Integer faceMaxBytes;
|
||||||
// @Value("${oneLevelPerson.prefix}")
|
// @Value("${oneLevelPerson.prefix}")
|
||||||
// private String prefix;
|
// private String prefix;
|
||||||
private static Integer dockFlag = 0;
|
|
||||||
private static String prefix = "https://skqhdg.porthebei.com:9008/yjkmRy/";
|
private static String prefix = "https://skqhdg.porthebei.com:9008/yjkmRy/";
|
||||||
private static String username = "shuangkong";
|
private static String username = "shuangkong";
|
||||||
private static String password = "qinan@202604";
|
private static String password = "qinan@202604";
|
||||||
|
|
@ -254,24 +265,29 @@ public class TwoPersonUtil {
|
||||||
userList.forEach(item -> {
|
userList.forEach(item -> {
|
||||||
List<TwoLevelUser> u = new ArrayList<>();
|
List<TwoLevelUser> u = new ArrayList<>();
|
||||||
List<String> faceUrl = new ArrayList<>();
|
List<String> faceUrl = new ArrayList<>();
|
||||||
ZcloudUserImgQry zcloudUserImgQry = new ZcloudUserImgQry();
|
|
||||||
item.setUserCard(Base64.decodeToString(item.getUserCard()));
|
|
||||||
faceUrl.add(item.getUserFaceImages());
|
|
||||||
if (Tools.notEmpty(item.getEntourage())) {
|
if (Tools.notEmpty(item.getEntourage())) {
|
||||||
List<TwoLevelUser> entourageList = getEntourageList(faceUrl, new JSONArray(item.getEntourage()), item.getHkIndexCode());
|
List<TwoLevelUser> entourageList = getEntourageList(faceUrl, new JSONArray(item.getEntourage()), item.getHkIndexCode());
|
||||||
if (!entourageList.isEmpty()) {
|
if (!entourageList.isEmpty()) {
|
||||||
u.addAll(entourageList);
|
u.addAll(entourageList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
zcloudUserImgQry.setUrlList(faceUrl);
|
if (Tools.notEmpty(item.getUserCard())) {
|
||||||
// todo 提醒下悦哥 上线口门需要刷数据
|
item.setUserCard(decodeUserCard(item.getUserCard()));
|
||||||
List<ZcloudUserImgBase64Co> data = zcloudUserFacade.listBase64ByUrl(zcloudUserImgQry).getData();
|
|
||||||
Map<String, String> collect = data.stream().collect(Collectors.toMap(ZcloudUserImgBase64Co::getUserAvatarUrl, ZcloudUserImgBase64Co::getUserAvatarBase64, (existing, replacement) -> replacement));
|
|
||||||
u.add(item);
|
u.add(item);
|
||||||
|
if (Tools.notEmpty(item.getUserFaceImages())) {
|
||||||
|
faceUrl.add(item.getUserFaceImages());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warn("人员同步-主申请人身份证为空,仅同步有效随行人员, userName:{}, userPhone:{}", item.getUserName(), item.getUserPhone());
|
||||||
|
}
|
||||||
|
if (u.isEmpty()) {
|
||||||
|
log.warn("人员同步-无可同步人员,跳过授权, userName:{}, hkIndexCode:{}", item.getUserName(), item.getHkIndexCode());
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 过滤掉没有人脸base64数据的用户
|
// 过滤掉没有人脸base64数据的用户
|
||||||
List<TwoLevelUser> validUsers = new ArrayList<>();
|
List<TwoLevelUser> validUsers = new ArrayList<>();
|
||||||
for (TwoLevelUser itemUser : u) {
|
for (TwoLevelUser itemUser : u) {
|
||||||
String base64Data = collect.get(itemUser.getUserFaceImages());
|
String base64Data = resolveFaceBase64(itemUser);
|
||||||
if (Tools.notEmpty(base64Data)) {
|
if (Tools.notEmpty(base64Data)) {
|
||||||
itemUser.setUserFaceImagesBase64(base64Data);
|
itemUser.setUserFaceImagesBase64(base64Data);
|
||||||
validUsers.add(itemUser);
|
validUsers.add(itemUser);
|
||||||
|
|
@ -314,17 +330,161 @@ public class TwoPersonUtil {
|
||||||
// "trainingState": "0",
|
// "trainingState": "0",
|
||||||
// "endTrainingTime": "2026-04-11 00:00:00",
|
// "endTrainingTime": "2026-04-11 00:00:00",
|
||||||
// "startTrainingTime": "2026-04-06 00:00:00"},
|
// "startTrainingTime": "2026-04-06 00:00:00"},
|
||||||
|
String userCard = firstNotEmpty(jsonObject.getStr("userCard"), jsonObject.getStr("userIdCard"));
|
||||||
|
if (Tools.isEmpty(userCard)) {
|
||||||
|
log.warn("人员同步-跳过身份证为空的随行人员, name:{}, phone:{}", firstNotEmpty(jsonObject.getStr("name"), jsonObject.getStr("userName")), jsonObject.getStr("phone"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
u.setUserPhone(jsonObject.getStr("phone"));
|
u.setUserPhone(jsonObject.getStr("phone"));
|
||||||
u.setUserCard(Base64.decodeToString(jsonObject.getStr("userCard")));
|
u.setUserCard(decodeUserCard(userCard));
|
||||||
u.setUserFaceImages(jsonObject.getStr("userFaceUrl"));
|
u.setUserFaceImages(jsonObject.getStr("userFaceUrl"));
|
||||||
u.setUserName(jsonObject.getStr("userName"));
|
u.setUserName(firstNotEmpty(jsonObject.getStr("name"), jsonObject.getStr("userName")));
|
||||||
u.setHkIndexCode(hkindecodes);
|
u.setHkIndexCode(hkindecodes);
|
||||||
objects.add(u);
|
objects.add(u);
|
||||||
|
if (Tools.notEmpty(jsonObject.getStr("userFaceUrl"))) {
|
||||||
faceUrl.add(jsonObject.getStr("userFaceUrl"));
|
faceUrl.add(jsonObject.getStr("userFaceUrl"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String firstNotEmpty(String primary, String fallback) {
|
||||||
|
return Tools.notEmpty(primary) ? primary : fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String decodeUserCard(String userCard) {
|
||||||
|
if (Tools.isEmpty(userCard)) {
|
||||||
|
return userCard;
|
||||||
|
}
|
||||||
|
String trimmed = userCard.trim();
|
||||||
|
if (trimmed.matches("\\d{17}[\\dXx]")) {
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
return Base64.decodeToString(trimmed);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String resolveFaceBase64(TwoLevelUser user) {
|
||||||
|
if (Tools.isEmpty(user.getUserFaceImages())) {
|
||||||
|
log.warn("人员同步-跳过头像为空用户, 姓名:{}, 手机号:{}, 身份证:{}", user.getUserName(), user.getUserPhone(), user.getUserCard());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String imageUrl = buildImageUrl(user.getUserFaceImages());
|
||||||
|
try {
|
||||||
|
byte[] imageBytes = downloadImageBytes(imageUrl);
|
||||||
|
byte[] usableBytes = compressImageToLimit(imageBytes, faceMaxBytes == null ? 15360 : faceMaxBytes);
|
||||||
|
String base64 = java.util.Base64.getEncoder().encodeToString(usableBytes);
|
||||||
|
log.info("人员同步-人脸图片转换完成, 姓名:{}, 图片URL:{}, 原始大小:{}字节, 处理后大小:{}字节, base64长度:{}",
|
||||||
|
user.getUserName(), user.getUserFaceImages(), imageBytes.length, usableBytes.length, base64.length());
|
||||||
|
return base64;
|
||||||
|
} catch (BizException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("人员同步-人脸图片转换失败, 姓名:{}, 图片URL:{}", user.getUserName(), imageUrl, e);
|
||||||
|
throw new BizException("人脸图片获取或转换失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildImageUrl(String faceUrl) {
|
||||||
|
String trimmed = faceUrl.trim();
|
||||||
|
if (trimmed.startsWith("http://") || trimmed.startsWith("https://")) {
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
if (Tools.isEmpty(fileUrl)) {
|
||||||
|
throw new BizException("文件访问地址未配置");
|
||||||
|
}
|
||||||
|
String baseUrl = fileUrl.trim();
|
||||||
|
String relativePath = trimmed.startsWith("/") ? trimmed.substring(1) : trimmed;
|
||||||
|
return baseUrl.endsWith("/") ? baseUrl + relativePath : baseUrl + "/" + relativePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] downloadImageBytes(String imageUrl) throws IOException {
|
||||||
|
URLConnection connection = new URL(imageUrl).openConnection();
|
||||||
|
connection.setConnectTimeout(10000);
|
||||||
|
connection.setReadTimeout(15000);
|
||||||
|
try (java.io.InputStream inputStream = connection.getInputStream();
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int length;
|
||||||
|
while ((length = inputStream.read(buffer)) != -1) {
|
||||||
|
outputStream.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
return outputStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] compressImageToLimit(byte[] imageBytes, int maxBytes) throws IOException {
|
||||||
|
if (imageBytes.length <= maxBytes) {
|
||||||
|
return imageBytes;
|
||||||
|
}
|
||||||
|
BufferedImage source = ImageIO.read(new ByteArrayInputStream(imageBytes));
|
||||||
|
if (source == null) {
|
||||||
|
throw new BizException("人脸图片格式不正确");
|
||||||
|
}
|
||||||
|
int[] maxWidths = new int[]{480, 360, 300, 240, 180, 120};
|
||||||
|
float[] qualities = new float[]{0.85f, 0.75f, 0.65f, 0.55f, 0.45f, 0.35f};
|
||||||
|
byte[] best = imageBytes;
|
||||||
|
for (int maxWidth : maxWidths) {
|
||||||
|
BufferedImage scaled = scaleImage(source, maxWidth);
|
||||||
|
for (float quality : qualities) {
|
||||||
|
byte[] compressed = writeJpeg(scaled, quality);
|
||||||
|
if (compressed.length < best.length) {
|
||||||
|
best = compressed;
|
||||||
|
}
|
||||||
|
if (compressed.length <= maxBytes) {
|
||||||
|
return compressed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.warn("人员同步-人脸图片压缩后仍超限, 原始大小:{}字节, 最小大小:{}字节, 限制:{}字节", imageBytes.length, best.length, maxBytes);
|
||||||
|
throw new BizException("人脸图片BASE64数值过大,请控制在15kb以内");
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedImage scaleImage(BufferedImage source, int maxWidth) {
|
||||||
|
int width = source.getWidth();
|
||||||
|
int height = source.getHeight();
|
||||||
|
if (width <= maxWidth) {
|
||||||
|
return toRgbImage(source, width, height);
|
||||||
|
}
|
||||||
|
int targetHeight = Math.max(1, height * maxWidth / width);
|
||||||
|
Image scaledInstance = source.getScaledInstance(maxWidth, targetHeight, Image.SCALE_SMOOTH);
|
||||||
|
BufferedImage target = new BufferedImage(maxWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
|
||||||
|
Graphics2D graphics = target.createGraphics();
|
||||||
|
graphics.setColor(Color.WHITE);
|
||||||
|
graphics.fillRect(0, 0, maxWidth, targetHeight);
|
||||||
|
graphics.drawImage(scaledInstance, 0, 0, null);
|
||||||
|
graphics.dispose();
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedImage toRgbImage(BufferedImage source, int width, int height) {
|
||||||
|
BufferedImage target = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
||||||
|
Graphics2D graphics = target.createGraphics();
|
||||||
|
graphics.setColor(Color.WHITE);
|
||||||
|
graphics.fillRect(0, 0, width, height);
|
||||||
|
graphics.drawImage(source, 0, 0, null);
|
||||||
|
graphics.dispose();
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] writeJpeg(BufferedImage image, float quality) throws IOException {
|
||||||
|
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
|
||||||
|
if (!writers.hasNext()) {
|
||||||
|
throw new BizException("当前环境不支持图片压缩");
|
||||||
|
}
|
||||||
|
ImageWriter writer = writers.next();
|
||||||
|
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(outputStream)) {
|
||||||
|
ImageWriteParam param = writer.getDefaultWriteParam();
|
||||||
|
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||||
|
param.setCompressionQuality(quality);
|
||||||
|
writer.setOutput(imageOutputStream);
|
||||||
|
writer.write(null, new IIOImage(image, null, null), param);
|
||||||
|
return outputStream.toByteArray();
|
||||||
|
} finally {
|
||||||
|
writer.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对接二级口门人:用户不存在则新增,已存在跳过
|
* 对接二级口门人:用户不存在则新增,已存在跳过
|
||||||
|
|
@ -339,6 +499,8 @@ public class TwoPersonUtil {
|
||||||
if (!phoneResult.getJSONObject("data").getJSONArray("list").isEmpty()) {
|
if (!phoneResult.getJSONObject("data").getJSONArray("list").isEmpty()) {
|
||||||
// 手机号查到,用户已存在,无需新增
|
// 手机号查到,用户已存在,无需新增
|
||||||
log.info("人员同步-手机号查到,用户已存在,跳过新增, 姓名:{}, 手机号:{}", towUser.getUserName(), towUser.getUserPhone());
|
log.info("人员同步-手机号查到,用户已存在,跳过新增, 姓名:{}, 手机号:{}", towUser.getUserName(), towUser.getUserPhone());
|
||||||
|
log.info("当前人员手机号已存在系统中,访问期限已更新, 姓名:{}, 手机号:{}", towUser.getUserName(), towUser.getUserPhone());
|
||||||
|
DockSyncNoticeHolder.add("当前人员手机号已存在系统中,访问期限已更新");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 手机号查不到,尝试用身份证号(手机号可能变更了,但身份证号不变)
|
// 手机号查不到,尝试用身份证号(手机号可能变更了,但身份证号不变)
|
||||||
|
|
@ -346,13 +508,16 @@ public class TwoPersonUtil {
|
||||||
if (!idCardResult.getJSONObject("data").getJSONArray("list").isEmpty()) {
|
if (!idCardResult.getJSONObject("data").getJSONArray("list").isEmpty()) {
|
||||||
// 身份证查到 -> 用户存在,只是手机号变了,无需新增
|
// 身份证查到 -> 用户存在,只是手机号变了,无需新增
|
||||||
log.info("人员同步-身份证查到,用户已存在(手机号可能变更),跳过新增, 姓名:{}, 身份证:{}", towUser.getUserName(), towUser.getUserCard());
|
log.info("人员同步-身份证查到,用户已存在(手机号可能变更),跳过新增, 姓名:{}, 身份证:{}", towUser.getUserName(), towUser.getUserCard());
|
||||||
|
log.info("当前人员证件号已存在系统中,访问期限已更新, 姓名:{}, 身份证:{}", towUser.getUserName(), towUser.getUserCard());
|
||||||
|
DockSyncNoticeHolder.add("当前人员证件号已存在系统中,访问期限已更新");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 手机号和身份证都查不到 -> 海康无此用户,新增
|
// 手机号和身份证都查不到 -> 海康无此用户,新增
|
||||||
log.info("人员同步-海康无此用户,开始新增, 姓名:{}, 手机号:{}, 身份证:{}, 人脸长度:{}",
|
log.info("人员同步-海康无此用户,开始新增, 姓名:{}, 手机号:{}, 身份证:{}, 人脸长度:{}",
|
||||||
towUser.getUserName(), towUser.getUserPhone(), towUser.getUserCard(),
|
towUser.getUserName(), towUser.getUserPhone(), towUser.getUserCard(),
|
||||||
towUser.getUserFaceImagesBase64() != null ? towUser.getUserFaceImagesBase64().length() : 0);
|
towUser.getUserFaceImagesBase64() != null ? towUser.getUserFaceImagesBase64().length() : 0);
|
||||||
HKDeviceUtil.saveUser(towUser.getUserName(), towUser.getUserCard(), towUser.getUserFaceImagesBase64(), towUser.getUserPhone());
|
JSONObject saveResult = HKDeviceUtil.saveUser(towUser.getUserName(), towUser.getUserCard(), towUser.getUserFaceImagesBase64(), towUser.getUserPhone());
|
||||||
|
assertHkSuccess(saveResult, "新增海康人员失败,姓名:" + towUser.getUserName() + ",身份证:" + towUser.getUserCard());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> List<List<T>> partition(List<T> list, int size) {
|
private static <T> List<List<T>> partition(List<T> list, int size) {
|
||||||
|
|
@ -414,13 +579,30 @@ public class TwoPersonUtil {
|
||||||
userIds.add(jsonObject.getStr("personId"));
|
userIds.add(jsonObject.getStr("personId"));
|
||||||
}
|
}
|
||||||
List<List<String>> partitionUserIds = partition(userIds, 1000);
|
List<List<String>> partitionUserIds = partition(userIds, 1000);
|
||||||
|
if (userIds.isEmpty()) {
|
||||||
|
throw new BizException("海康门禁授权失败:未查询到可授权的海康人员ID");
|
||||||
|
}
|
||||||
log.info("门禁授权-分批调用海康授权接口, 批次数:{}", partitionUserIds.size());
|
log.info("门禁授权-分批调用海康授权接口, 批次数:{}", partitionUserIds.size());
|
||||||
partitionUserIds.forEach(itemUserPhones -> {
|
partitionUserIds.forEach(itemUserPhones -> {
|
||||||
HKDeviceUtil.authPersonArea(itemUserPhones, objects, time + "T00:00:00+08:00", time + "T23:59:59+08:00");
|
JSONObject authResult = HKDeviceUtil.authPersonArea(itemUserPhones, objects, time + "T00:00:00+08:00", time + "T23:59:59+08:00");
|
||||||
|
assertHkSuccess(authResult, "海康门禁授权失败");
|
||||||
});
|
});
|
||||||
log.info("门禁授权-完成, 授权personId数:{}, 门禁点数:{}", userIds.size(), resourceInfos.size());
|
log.info("门禁授权-完成, 授权personId数:{}, 门禁点数:{}", userIds.size(), resourceInfos.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assertHkSuccess(JSONObject result, String message) {
|
||||||
|
if (result == null) {
|
||||||
|
throw new BizException(message + ",海康返回为空");
|
||||||
|
}
|
||||||
|
String code = result.getStr("code");
|
||||||
|
if (!"0".equals(code)) {
|
||||||
|
if ("0x09a05203".equals(code) || "Picture Size err".equalsIgnoreCase(result.getStr("msg"))) {
|
||||||
|
throw new BizException("人脸图片BASE64数值过大,请控制在15kb以内");
|
||||||
|
}
|
||||||
|
throw new BizException(message + ",code:" + code + ",msg:" + result.getStr("msg"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected DaHuaDeviceCommon getDaHuaDeviceCommon() {
|
protected DaHuaDeviceCommon getDaHuaDeviceCommon() {
|
||||||
return new DaHuaDeviceCommon(new DhuaConfig(dockFlag, prefix, username, password, clientId, clientSecret));
|
return new DaHuaDeviceCommon(new DhuaConfig(dockFlag, prefix, username, password, clientId, clientSecret));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,90 +80,63 @@
|
||||||
<select id="getFgsCarToDay" resultType="com.zcloud.primeport.plan.mjDevice.dto.TwoLevelCar">
|
<select id="getFgsCarToDay" resultType="com.zcloud.primeport.plan.mjDevice.dto.TwoLevelCar">
|
||||||
SELECT
|
SELECT
|
||||||
caca.licence_no,
|
caca.licence_no,
|
||||||
GROUP_CONCAT( caca.licence_type ) licence_type,
|
GROUP_CONCAT( DISTINCT caca.licence_type ) licence_type,
|
||||||
GROUP_CONCAT( areatmp.hk_index_code ) hk_index_code,
|
|
||||||
GROUP_CONCAT( areatmp.kh_park_sys_code ) kh_park_sys_code
|
|
||||||
FROM
|
|
||||||
closed_area_car_apply caca
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT
|
|
||||||
m.closed_area_id,
|
|
||||||
GROUP_CONCAT( tmp.hk_index_code ) hk_index_code,
|
|
||||||
GROUP_CONCAT( tmp.kh_park_sys_code ) kh_park_sys_code
|
|
||||||
FROM
|
|
||||||
mkmj m
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT
|
|
||||||
mg.mkmj_id,
|
|
||||||
GROUP_CONCAT( DISTINCT mg.hk_index_code ) hk_index_code,
|
GROUP_CONCAT( DISTINCT mg.hk_index_code ) hk_index_code,
|
||||||
mg.kh_park_sys_code
|
mg.kh_park_sys_code
|
||||||
FROM
|
FROM
|
||||||
mkmj_gate mg
|
closed_area_car_apply caca
|
||||||
WHERE
|
INNER JOIN mkmj m ON caca.closed_area_id = m.closed_area_id
|
||||||
mg.gate_type = 'HGKM_MKMJ_GATE_TYPE_CAR'
|
INNER JOIN mkmj_gate mg ON m.id = mg.mkmj_id
|
||||||
AND mg.gate_status = 2
|
|
||||||
AND mg.delete_enum = 'FALSE'
|
|
||||||
GROUP BY
|
|
||||||
mg.mkmj_id,
|
|
||||||
mg.kh_park_sys_code
|
|
||||||
) tmp ON m.id = tmp.mkmj_id
|
|
||||||
WHERE
|
|
||||||
m.delete_enum = 'FALSE'
|
|
||||||
AND m.mkmj_status = 2
|
|
||||||
AND m.mkmj_level = 2
|
|
||||||
AND m.mkmj_type = 'HGKM_MKMJ_CKM'
|
|
||||||
GROUP BY
|
|
||||||
m.closed_area_id
|
|
||||||
) areatmp ON caca.closed_area_id = areatmp.closed_area_id
|
|
||||||
WHERE
|
WHERE
|
||||||
caca.delete_enum = 'FALSE'
|
caca.delete_enum = 'FALSE'
|
||||||
AND caca.car_belong_type IN ( 1, 2, 3, 5 )
|
AND caca.car_belong_type IN ( 1, 2, 3, 5 )
|
||||||
AND caca.visit_end_time >= DATE_FORMAT( now(), '%Y-%m-%d' )
|
AND caca.visit_end_time >= DATE_FORMAT( now(), '%Y-%m-%d' )
|
||||||
AND caca.visit_start_time <= DATE_FORMAT( now(), '%Y-%m-%d' )
|
AND caca.visit_start_time <= DATE_FORMAT( now(), '%Y-%m-%d' )
|
||||||
and caca.audit_flag = 2
|
AND caca.audit_flag = 2
|
||||||
|
AND m.delete_enum = 'FALSE'
|
||||||
|
AND m.mkmj_status = 2
|
||||||
|
AND m.mkmj_level = 2
|
||||||
|
AND m.mkmj_type = 'HGKM_MKMJ_CKM'
|
||||||
|
AND mg.gate_type = 'HGKM_MKMJ_GATE_TYPE_CAR'
|
||||||
|
AND mg.gate_status = 2
|
||||||
|
AND mg.delete_enum = 'FALSE'
|
||||||
|
AND mg.hk_index_code IS NOT NULL
|
||||||
|
AND mg.kh_park_sys_code IS NOT NULL
|
||||||
<if test="licenceNo != null and licenceNo != ''">
|
<if test="licenceNo != null and licenceNo != ''">
|
||||||
AND caca.licence_no = #{licenceNo}
|
AND caca.licence_no = #{licenceNo}
|
||||||
</if>
|
</if>
|
||||||
GROUP BY
|
GROUP BY
|
||||||
caca.licence_no,
|
caca.licence_no,
|
||||||
areatmp.kh_park_sys_code
|
mg.kh_park_sys_code
|
||||||
</select>
|
</select>
|
||||||
<select id="dockTmpCarLevelTwo" resultType="com.zcloud.primeport.plan.mjDevice.dto.TwoLevelCar">
|
<select id="dockTmpCarLevelTwo" resultType="com.zcloud.primeport.plan.mjDevice.dto.TwoLevelCar">
|
||||||
SELECT
|
SELECT
|
||||||
caca.licence_no,
|
caca.licence_no,
|
||||||
GROUP_CONCAT( caca.licence_type ) licence_type,
|
GROUP_CONCAT( DISTINCT caca.licence_type ) licence_type,
|
||||||
caca.level_two_mkmj_id,
|
caca.level_two_mkmj_id,
|
||||||
tmp.hk_index_code,
|
|
||||||
tmp.kh_park_sys_code
|
|
||||||
FROM
|
|
||||||
closed_area_car_apply caca
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT
|
|
||||||
mg.mkmj_id,
|
|
||||||
GROUP_CONCAT( DISTINCT mg.hk_index_code ) hk_index_code,
|
GROUP_CONCAT( DISTINCT mg.hk_index_code ) hk_index_code,
|
||||||
mg.kh_park_sys_code
|
mg.kh_park_sys_code
|
||||||
FROM
|
FROM
|
||||||
mkmj_gate mg
|
closed_area_car_apply caca
|
||||||
WHERE
|
INNER JOIN mkmj_gate mg ON caca.level_two_mkmj_id = mg.mkmj_id
|
||||||
mg.gate_type = 'HGKM_MKMJ_GATE_TYPE_CAR'
|
|
||||||
AND mg.gate_status = 2
|
|
||||||
AND mg.delete_enum = 'FALSE'
|
|
||||||
GROUP BY
|
|
||||||
mg.mkmj_id,
|
|
||||||
mg.kh_park_sys_code
|
|
||||||
) tmp ON caca.level_two_mkmj_id = tmp.mkmj_id
|
|
||||||
WHERE
|
WHERE
|
||||||
caca.delete_enum = 'FALSE'
|
caca.delete_enum = 'FALSE'
|
||||||
AND caca.car_belong_type = 4
|
AND caca.car_belong_type = 4
|
||||||
AND caca.visit_end_time >= DATE_FORMAT( now(), '%Y-%m-%d' )
|
AND caca.visit_end_time >= DATE_FORMAT( now(), '%Y-%m-%d' )
|
||||||
AND caca.visit_start_time <= DATE_FORMAT( now(), '%Y-%m-%d' )
|
AND caca.visit_start_time <= DATE_FORMAT( now(), '%Y-%m-%d' )
|
||||||
and caca.audit_flag = 2
|
AND caca.audit_flag = 2
|
||||||
|
AND mg.gate_type = 'HGKM_MKMJ_GATE_TYPE_CAR'
|
||||||
|
AND mg.gate_status = 2
|
||||||
|
AND mg.delete_enum = 'FALSE'
|
||||||
|
AND mg.hk_index_code IS NOT NULL
|
||||||
|
AND mg.kh_park_sys_code IS NOT NULL
|
||||||
<if test="licenceNo != null and licenceNo != ''">
|
<if test="licenceNo != null and licenceNo != ''">
|
||||||
AND caca.licence_no = #{licenceNo}
|
AND caca.licence_no = #{licenceNo}
|
||||||
</if>
|
</if>
|
||||||
GROUP BY
|
GROUP BY
|
||||||
caca.licence_no,
|
caca.licence_no,
|
||||||
caca.level_two_mkmj_id
|
caca.level_two_mkmj_id,
|
||||||
|
mg.kh_park_sys_code
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@
|
||||||
AND u.main_corp_flag = 0
|
AND u.main_corp_flag = 0
|
||||||
AND u.corpinfo_id = #{params.corpinfoId}
|
AND u.corpinfo_id = #{params.corpinfoId}
|
||||||
AND u.rz_flag = 1
|
AND u.rz_flag = 1
|
||||||
|
AND u.user_avatar_url != ''
|
||||||
<if test="params.hasFaceUrl != null and params.hasFaceUrl == 1">
|
<if test="params.hasFaceUrl != null and params.hasFaceUrl == 1">
|
||||||
AND u.user_avatar_url IS NOT NULL
|
AND u.user_avatar_url IS NOT NULL
|
||||||
</if>
|
</if>
|
||||||
|
|
@ -155,7 +155,7 @@
|
||||||
SELECT
|
SELECT
|
||||||
capa.id,
|
capa.id,
|
||||||
capa.closed_area_id,
|
capa.closed_area_id,
|
||||||
GROUP_CONCAT( chvi.hk_index_code ) hk_index_code,
|
GROUP_CONCAT( DISTINCT mg.hk_index_code ) hk_index_code,
|
||||||
capa.visit_start_time,
|
capa.visit_start_time,
|
||||||
capa.visit_end_time,
|
capa.visit_end_time,
|
||||||
capa.user_face_url user_face_images,
|
capa.user_face_url user_face_images,
|
||||||
|
|
@ -165,37 +165,21 @@
|
||||||
capa.entourage
|
capa.entourage
|
||||||
FROM
|
FROM
|
||||||
closed_area_person_apply capa
|
closed_area_person_apply capa
|
||||||
LEFT JOIN (
|
INNER JOIN mkmj m ON capa.closed_area_id = m.closed_area_id
|
||||||
SELECT
|
INNER JOIN mkmj_gate mg ON m.id = mg.mkmj_id
|
||||||
m.closed_area_id,
|
|
||||||
GROUP_CONCAT( DISTINCT tmp.hk_index_code ) hk_index_code
|
|
||||||
FROM
|
|
||||||
mkmj m
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT
|
|
||||||
mg.mkmj_id,
|
|
||||||
mg.hk_index_code
|
|
||||||
FROM
|
|
||||||
mkmj_gate mg
|
|
||||||
WHERE
|
|
||||||
mg.gate_type = 'HGKM_MKMJ_GATE_TYPE_PERSON'
|
|
||||||
AND mg.gate_status = 2
|
|
||||||
AND mg.delete_enum = 'FALSE'
|
|
||||||
) tmp ON m.id = tmp.mkmj_id
|
|
||||||
WHERE
|
|
||||||
m.delete_enum = 'FALSE'
|
|
||||||
AND m.mkmj_status = 2
|
|
||||||
AND m.mkmj_level = 2
|
|
||||||
GROUP BY
|
|
||||||
m.closed_area_id
|
|
||||||
) chvi ON chvi.closed_area_id = capa.closed_area_id
|
|
||||||
WHERE
|
WHERE
|
||||||
capa.delete_enum = 'FALSE'
|
capa.delete_enum = 'FALSE'
|
||||||
AND capa.audit_flag = 2
|
AND capa.audit_flag = 2
|
||||||
AND capa.person_belong_type IN ( 1, 2, 3 )
|
AND capa.person_belong_type IN ( 1, 2, 3 )
|
||||||
AND capa.visit_end_time >= DATE_FORMAT( now(), '%Y-%m-%d' )
|
AND capa.visit_end_time >= DATE_FORMAT( now(), '%Y-%m-%d' )
|
||||||
AND capa.visit_start_time <= DATE_FORMAT( now(), '%Y-%m-%d' )
|
AND capa.visit_start_time <= DATE_FORMAT( now(), '%Y-%m-%d' )
|
||||||
AND chvi.hk_index_code IS NOT NULL
|
AND m.delete_enum = 'FALSE'
|
||||||
|
AND m.mkmj_status = 2
|
||||||
|
AND m.mkmj_level = 2
|
||||||
|
AND mg.gate_type = 'HGKM_MKMJ_GATE_TYPE_PERSON'
|
||||||
|
AND mg.gate_status = 2
|
||||||
|
AND mg.delete_enum = 'FALSE'
|
||||||
|
AND mg.hk_index_code IS NOT NULL
|
||||||
<if test="applyId != null">
|
<if test="applyId != null">
|
||||||
and capa.id = #{applyId}
|
and capa.id = #{applyId}
|
||||||
</if>
|
</if>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue