liukangdong
2024-12-10 8ead63412bbda132ba9404583c1704121dfbcbaf
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit
已添加1个文件
已修改28个文件
527 ■■■■ 文件已修改
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/SmsConstants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/common/PublicController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformJobCloudController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/WebPublicController.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserOpenidSaveRequest.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatConstants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/LargeScreenDataVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
@@ -23,6 +23,7 @@
import org.springframework.web.server.ServerWebExchange;
import javax.annotation.Resource;
import java.util.Objects;
/**
 * JWT获取令牌和刷新令牌接口
@@ -153,12 +154,13 @@
     */
    @PostMapping("/logout")
    @ApiOperation("退出登陆")
    public ApiResponse<String> logout(@RequestHeader(Constants.HEADER_USER_TOKEN) String oldToken){
    public ApiResponse<String> logout(@RequestHeader(Constants.HEADER_USER_TOKEN) String oldToken,Integer isH5){
        try {
             jwtTokenUtil.logout(oldToken);
            if(Objects.nonNull(isH5)){
                jwtTokenUtil.logoutForH5(oldToken);
            }else{
                jwtTokenUtil.logout(oldToken);
            }
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
server/system_gateway/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active:
    active: pro
  application:
    name: system_gateway
  # å®‰å…¨é…ç½®
server/system_service/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -1,10 +1,13 @@
package com.doumee.config.jwt;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
@@ -36,7 +39,8 @@
    private JwtProperties jwtProperties;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz ;
    @Autowired
    private SystemUserMapper systemUserMapper;
    /**
     * ç”Ÿæˆtoken令牌
     *
@@ -136,14 +140,25 @@
//                this.hkLoginOut(url+"?token="+loginUserInfo.getHkMenuToken());
                HttpsUtil.get(url+"?token="+loginUserInfo.getHkMenuToken(),true);
            }
            redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);//删除老的token
            //删除老的token
            redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void logoutForH5(String token) {
        try {
            //登出海康系统数据
            LoginUserInfo loginUserInfo = this.getUserInfoByToken(token);
            //删除老的token
            redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda().set(SystemUser::getOpenid,null).eq(SystemUser::getId,loginUserInfo.getId()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void hkLoginOut(String url){
        try {
            // åˆ›å»ºHttpClient对象
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -57,6 +57,8 @@
    public static final String SIGN_IN_PLACE_LNT ="SIGN_IN_PLACE_LNT" ;
    public static final String SIGN_IN_PLACE_DISTANCE ="SIGN_IN_PLACE_DISTANCE" ;
    public static final String SIGN_IN_QRCODE ="SIGN_IN_QRCODE" ;
    public static final String SIGN_IN_ATTENTION ="SIGN_IN_ATTENTION" ;
    public static final String SIGN_IN_QRCODE_PREFIX ="SIGN_IN_QRCODE_PREFIX" ;
    //被拜访人信息校验方式(0手机号单独校验 1手机号和姓名组合校验)
@@ -80,6 +82,8 @@
    public static final String PLATFORM_EVENT_IMG = "PLATFORM_EVENT_IMG";
    public static final String VISIT_NOTICE = "VISIT_NOTICE";
    public static final String TIME_OUT_CONFIG = "TIME_OUT_CONFIG";
    public static final String VISIT_REPORT_TIME_OUT_MOBILE = "VISIT_REPORT_TIME_OUT_MOBILE";
    public static final String VISIT_TIME_OUT_MOBILE = "VISIT_TIME_OUT_MOBILE";
    //健康证配置
    public static final String LW_HEALTH_CARD = "LW_HEALTH_CARD";
@@ -147,6 +151,7 @@
    public static final String HK_WXTOKEN_CONFIGID ="HK_WXTOKEN_CONFIGID" ;
    public static final String HK_WXTOKEN_TAGID ="HK_WXTOKEN_TAGID" ;
    public static final String WMS_TOTAL_STOCK_NUM ="WMS_TOTAL_STOCK_NUM" ;
    public static final String WX_REDIRECT_URL = "WX_REDIRECT_URL";
    public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
    public static  boolean DEALING_HK_SYNCDEVICE = false;
    public static  boolean DEALING_HK_SYNCPLATFORM = false;
@@ -197,6 +202,18 @@
        return sb.toString();
    }
    /**
     * èŽ·å–å…¬ä¼—å·è·³è½¬é‡å®šå‘ä¸šåŠ¡åœ°å€
     * @param code
     * @param paramCode
     * @param ywid
     * @return
     */
    public static String getWxUrl(String code, WxUrlParams paramCode, String ywid) {
        return  code.replace("${type}",paramCode.type+"").replace("${yw}",paramCode.yw).replace("${ywid}",ywid);
    }
    public interface VisitIccmStatus{
        //访客状态(0:未签到,1:已签到,2:已签退,3:滞留,4:未访问,5:自动签离,6:未签退)
        int waitSign = 0;
@@ -449,6 +466,7 @@
    public interface RedisKeys {
        public static final String IMPORTING_CARS ="IMPORTING_CARS";
        public static final String IMPORTING_MEMBER ="IMPORTING_MEMBER";
        public static final String BIGSCREEN_UUID ="BIGSCREEN_UUID";
        public static final String IMPORTING_GAS ="IMPORTING_GAS";
        public static final String ERP_TOKEN ="ERP_TOKEN";
        public static final long EXPIRE_TIME = 7200;
@@ -1143,6 +1161,57 @@
        }
    }
    public  enum WxUrlParams {
        BISCREEN_CODE(0,0, "0", "门口大屏二维码"),
        MEETING_CODE(1,1, "1","会议室大屏")
        ;
        // æˆå‘˜å˜é‡
        private int key;
        private int type;//用户类型 0员工 1司机
        private String yw;//业务类型
        private String info;//说明
        // æž„造方法
        WxUrlParams(int key,int type, String yw,String  info) {
            this.yw = yw;
            this.key = key;
            this.type = type;
            this.info= info;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
        public int getType() {
            return type;
        }
        public void setType(int type) {
            this.type = type;
        }
        public String getYw() {
            return yw;
        }
        public void setYw(String yw) {
            this.yw = yw;
        }
        public String getInfo() {
            return info;
        }
        public void setInfo(String info) {
            this.info = info;
        }
    }
    public static <T> T toSnakeObject(String json, Class<T> clazz) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
server/system_service/src/main/java/com/doumee/core/utils/SmsConstants.java
@@ -41,7 +41,7 @@
        String visitAuditFail = "visitAuditFail";
        //访客申请-超时未签离-通知(给申请人):
        String visitTimeOutSignOut = "visitTimeOutSignOut";
        //访客申请-未签离数量-通知(给指定接收人) //TODO æ— æ”¶çŸ­ä¿¡äººå‘˜
        //访客申请-未签离数量-通知(给指定接收人)
        String visitTimeOutSignOutNum = "visitTimeOutSignOutNum";
    }
server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java
@@ -92,6 +92,12 @@
    @ApiModelProperty(value = "微信openid", example = "1", hidden = true)
    private String openid;
    @ApiModelProperty(value = "微信openid推送海康状态 0待推送 1已推送 2绑定失败", example = "1", hidden = true)
    private Integer openidHkStatus;
    @ApiModelProperty(value = "微信openid推送海康备注 ", example = "1", hidden = true)
    private String openidHkInfo;
    @ApiModelProperty(value = "微信openid推送海康时间", example = "1", hidden = true)
    private Date openidHkDate;
    //2024å¹´12月6日11:00:30 ç±»åž‹ 0司机人员 1普通访客  2内部人员
    @ApiModelProperty(value = "类型 0平台用户 1访客", example = "0")
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -187,9 +187,16 @@
            //如果openId不为空,绑定该用户openid
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getOpenid,null)
                    .set(SystemUser::getOpenidHkDate,null)
                    .set(SystemUser::getOpenidHkInfo,null)
                    .set(SystemUser::getOpenidHkStatus,Constants.ZERO)
                    .eq(SystemUser::getOpenid,openid)
                    .eq(SystemUser::getType,user.getType()));
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getOpenid,openid)
                    .set(SystemUser::getOpenidHkStatus,Constants.ZERO)
                    .set(SystemUser::getOpenidHkDate,null)
                    .set(SystemUser::getOpenidHkInfo,null)
                    .eq(SystemUser::getId,user.getId()));
        }
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/api/common/PublicController.java
@@ -135,20 +135,32 @@
                             //验证人脸评分
                            //人脸评分
                            FacePictureCheckRequest param = new FacePictureCheckRequest();
                            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode() +
                                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
                            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode();
                            param.setFacePicUrl(prefixUrl + fileName);
                            BaseResponse<FacePictureCheckResponse> responseBaseResponse = HKService.facePictureCheck(param);
                            if(responseBaseResponse == null || !StringUtils.equals(responseBaseResponse.getCode(), HKConstants.RESPONSE_SUCCEE)){
                                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
                                context.put("code", 0);
                                context.put("message", "对不起,人脸评分获取数据失败~");
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                            FacePictureCheckResponse facePictureCheckResponse = responseBaseResponse.getData();
                            if(Objects.isNull(facePictureCheckResponse) || Objects.isNull(facePictureCheckResponse.getCheckResult())){
                                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
                                context.put("code", 0);
                                context.put("message", "对不起,人脸评分获取数据失败~");
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                            if(!facePictureCheckResponse.getCheckResult()){
                                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), facePictureCheckResponse.getStatusMessage());
                                context.put("code", 0);
                                context.put("message", facePictureCheckResponse.getStatusMessage());
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                        }
                        context.put("success", true);
                        context.put("code", 200);
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -23,6 +23,7 @@
import com.doumee.dao.business.model.Device;
import com.doumee.service.business.DeviceService;
import com.doumee.service.business.impl.hksync.*;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -61,6 +62,8 @@
    private HkSyncPrivilegeServiceImpl hkSyncPrivilegeService;
    @Autowired
    private HkSyncPushServiceImpl hkSyncPushService;
    @Autowired
    private HkSyncOrgUserToHKServiceImpl hkSyncOrgUserToHKService;
    @Autowired
    private HkSyncNoticeServiceImpl hkSyncNoticeService;
    @Autowired
@@ -111,6 +114,13 @@
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】保持海康用户绑定openid")
    @PostMapping("/saveHkUserOpenid")
    public ApiResponse syncHkUserOpenid( @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        String result     = hkSyncOrgUserToHKService.syncHkUserOpenid(this.getLoginUser(token).getId());
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】获取组件授权登录地址接口")
    @PostMapping("/getServiceUrl")
    public ApiResponse getServiceUrl(@RequestBody HKGetServiceLoginUrlRequest param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformJobCloudController.java
@@ -2,6 +2,7 @@
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
@@ -52,6 +53,13 @@
        return ApiResponse.success(null);
    }
    @ApiOperation("获取当前用户的最近一条待签到的作业信息")
    @GetMapping("/getLastWaitJob")
    @LoginNoRequired
    public ApiResponse<PlatformJob> getLastWaitJob(@RequestParam String uuid,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        return ApiResponse.success( platformJobService.getLastWaitJob(uuid,this.getLoginUser(token)));
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:platformjob:delete")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java
@@ -122,7 +122,7 @@
    @ApiOperation("访客记录 - åˆ†é¡µåˆ—表")
    @PostMapping("/visitPage")
    public ApiResponse<PageData<Visits>> visitPage (@RequestBody PageWrap<Visits> pageWrap) {
        if(Objects.isNull(pageWrap.getModel().getMemberId())){
        if(Objects.isNull(pageWrap.getModel()) || StringUtils.isBlank(pageWrap.getModel().getOpenid())){
            pageWrap.getModel().setMemberId(0);
        }
        return ApiResponse.success(visitsService.findPage(pageWrap));
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/WebPublicController.java
@@ -57,14 +57,14 @@
        @ApiImplicitParam(name = "folder", value = "文件夹", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
    })
    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
    public void uploadMobile(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
    public void uploadMobile(String folder, HttpServletRequest request, HttpServletResponse response,Integer isFace) throws Exception {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        upload(multipartRequest, response, folder + "/",
            systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(),
            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
            systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode(),isFace);
    }
@@ -73,7 +73,7 @@
            @ApiImplicitParam(name = "folder", value = "文件夹", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
    })
    @PostMapping(value = "/uploadPicture", headers = "content-type=multipart/form-data")
    public void uploadPicture(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
    public void uploadPicture(String folder, HttpServletRequest request, HttpServletResponse response,Integer isFace) throws Exception {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Iterator<String> fileNames = multipartRequest.getFileNames();
        Map<String, Object> context = new HashMap<>();
@@ -91,7 +91,7 @@
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode(),isFace);
    }
@@ -136,19 +136,33 @@
                            //验证人脸评分
                            //人脸评分
                            FacePictureCheckRequest param = new FacePictureCheckRequest();
                            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode() +
                                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
                            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode();
                            param.setFacePicUrl(prefixUrl + fileName);
                            BaseResponse<FacePictureCheckResponse> responseBaseResponse = HKService.facePictureCheck(param);
                            if(responseBaseResponse == null || !StringUtils.equals(responseBaseResponse.getCode(), HKConstants.RESPONSE_SUCCEE)){
                                throw  new BusinessException(com.doumee.core.constants.ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//                                throw  new BusinessException(com.doumee.core.constants.ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
                                context.put("code", 0);
                                context.put("message", "对不起,人脸评分获取数据失败~");
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                            FacePictureCheckResponse facePictureCheckResponse = responseBaseResponse.getData();
                            if(Objects.isNull(facePictureCheckResponse) || Objects.isNull(facePictureCheckResponse.getCheckResult())){
                                throw  new BusinessException(com.doumee.core.constants.ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//                                throw  new BusinessException(com.doumee.core.constants.ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
                                context.put("code", 0);
                                context.put("message", "对不起,人脸评分获取数据失败~");
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                            if(!facePictureCheckResponse.getCheckResult()){
                                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), facePictureCheckResponse.getStatusMessage());
//                                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), facePictureCheckResponse.getStatusMessage());
                                context.put("code", 0);
                                context.put("message", facePictureCheckResponse.getStatusMessage());
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                        }
@@ -213,7 +227,7 @@
    public void upload(HttpServletRequest request, HttpServletResponse response, String folder, String bucketName,
        String access_id, String access_key, String resourcePath, String endpoint) throws Exception {
        String access_id, String access_key, String resourcePath, String endpoint,Integer isFace) throws Exception {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        Map<String, Object> context = new HashMap<>();
@@ -253,7 +267,38 @@
                    ALiYunUtil obs = new ALiYunUtil(endpoint,access_id, access_key);
                    if (obs.uploadOnlineObject(file.getInputStream(),bucketName, key,null)) {
                        // ç§»åŠ¨æˆåŠŸ,返回文件名
                        // sendSuccessMessage(response, resourcePath+key);
                        if(Constants.equalsInteger(isFace,Constants.ZERO)){
                            //验证人脸评分
                            //人脸评分
                            FacePictureCheckRequest param = new FacePictureCheckRequest();
                            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode();
                            param.setFacePicUrl(prefixUrl + key);
                            BaseResponse<FacePictureCheckResponse> responseBaseResponse = HKService.facePictureCheck(param);
                            if(responseBaseResponse == null || !StringUtils.equals(responseBaseResponse.getCode(), HKConstants.RESPONSE_SUCCEE)){
                                context.put("code", 0);
                                context.put("message", "对不起,人脸评分获取数据失败~");
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                            FacePictureCheckResponse facePictureCheckResponse = responseBaseResponse.getData();
                            if(Objects.isNull(facePictureCheckResponse) || Objects.isNull(facePictureCheckResponse.getCheckResult())){
                                context.put("code", 0);
                                context.put("message", "对不起,人脸评分获取数据失败~");
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                            if(!facePictureCheckResponse.getCheckResult()){
                                context.put("code", 0);
                                context.put("message", facePictureCheckResponse.getStatusMessage());
                                context.put("errno",0);
                                writerJson(response, context);
                                return;
                            }
                        }
                        context.put("success", true);
                        context.put("code", 200);
                        context.put("errno",0);
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -166,7 +166,8 @@
        String[] findAlarmBaseDataStatistic= new String[]{"/api/v1/alarm/findAlarmBaseDataStatistic","消防看板-4报警信息统计"};//消防看板-4报警信息统计
        String[] findHomeAlarmInfoPage= new String[]{"/api/v1/alarm/findHomeAlarmInfoPage","安防看板-- åˆ†é¡µæŸ¥è¯¢æœªå¤„理报警信息6"};//安防看板-- åˆ†é¡µæŸ¥è¯¢æœªå¤„理报警信息6
        String[] minitorDataSearchV1= new String[]{"/api/fem/v1/minitor/data/search","分页查询设备监测历史数据"};//分页查询设备监测历史数据
        String[] minitorDataSearch= new String[]{"/api/fpms/v2/minitor/data/search"};//分页查询设备监测历史数据
        String[] minitorDataSearch= new String[]{"/api/fpms/v2/minitor/data/search","分页查询设备监测历史数据"};//分页查询设备监测历史数据
        String[] userOpenidSave= new String[]{"/api/v1/oa/userOpenId/saveV2","保存用户及openId绑定信息微信公众号"};//保存用户及openId绑定信息微信公众号
    }
    /**
     * é™„录A.55消防设备类型
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -833,7 +833,7 @@
        return startDoPostStringArtemis(HKConstants.InterfacePath.findAlarmBaseDataStatistic,body);
    }
    /**
     *安防看板-- åˆ†é¡µæŸ¥è¯¢æœªå¤„理报警信息6
     *安防看板-- b
     * @param body
     * @return
     */
@@ -841,6 +841,16 @@
        return startDoPostStringArtemis(HKConstants.InterfacePath.findHomeAlarmInfoPage,body);
    }
    /**
     *保存用户及openId绑定信息微信公众号
     * @param body
     * @return
     */
    public static String userOpenidSave(String body) {
        Map<String,String> header = new HashMap<>();
        header.put("userId","admin");
        return startDoPostStringArtemis(HKConstants.InterfacePath.userOpenidSave,null,header,body);
    }
    /**
     *分页查询设备监测历史数据
     * @param body
     * @return
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserOpenidSaveRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.doumee.core.haikang.model.param.request;
import com.doumee.core.haikang.model.param.BaseListPageRequest;
import lombok.Data;
@Data
public class UserOpenidSaveRequest extends BaseListPageRequest {
 private String openId    ;//String    false    å¾®ä¿¡openId
 private String userName    ;//String    false    å¹³å°ç”¨æˆ·å
 private String appKey    ;//String    false    appKey
 private String oaId;//    String    false    atwl
 private String platformName    ;//String    false    å®‰æ³°ç‰©æµå›­åŒº
 private String operateTime    ;//String    false    2024-12-09T15:49:04-07:00
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -1569,6 +1569,24 @@
        return  null;
    }
    /**
     *保存用户及openId绑定信息微信公众号
     * @return
     */
    public  static  BaseResponse<Integer>   userOpenidSave(UserOpenidSaveRequest param){
        log.info("【海康保存用户及openId绑定信息微信公众号】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.userOpenidSave(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<Integer>>(){};
            BaseResponse<Integer>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康保存用户及openId绑定信息微信公众号");
            return  result;
        }catch (Exception e){
            log.error("【海康保存用户及openId绑定信息微信公众号】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *分页查询设备监测历史数据
     * @return
     */
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatConstants.java
@@ -29,7 +29,7 @@
        // å®¡æ‰¹é€šè¿‡ç»™ç”³è¯·äººï¼šç”³è¯·å·²å®¡æ ¸é€šè¿‡
        String visitAuditSuccess = "visitAuditSuccess";
        //  å®¡æ‰¹é©³å›žç»™ç”³è¯·äººï¼šç”³è¯·å·²è¢«é©³å›ž
        String visitAuditFail = "visitWaitAudit";
        String visitAuditFail = "visitAuditFail";
        // ç»™å®¡æ‰¹äººï¼šç”³è¯·å¾…您审批
        String visitWaitAudit = "visitWaitAudit";
    }
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java
@@ -84,7 +84,8 @@
    public void  sendVisitTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, Visits visits, String objCode, String token, List<String> openIds){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda()
                        .in(WxNoticeConfig::getObjType,WxPlatConstants.visit,WxPlatConstants.visitReport)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
@@ -102,14 +103,14 @@
                Map<String, Object> thing1 = new HashMap<String,Object>();
                thing1.put("value", visits.getName());
                Map<String, Object> car_number7 = new HashMap<String,Object>();
                car_number7.put("value",StringUtils.isNotBlank(visits.getCarNos())?visits.getCarNos():"-");
                car_number7.put("value",StringUtils.isNotBlank(visits.getCarNos())?visits.getCarNos():"无");
                dataMap.put("car_number7",car_number7);
                Map<String, Object> character_string6 = new HashMap<String,Object>();
                character_string6.put("value","1");
                Map<String, Object> thing4 = new HashMap<String,Object>();
                thing4.put("value",visits.getReason());
                dataMap.put("const9",const9);
                dataMap.put("thing1",thing1);
                dataMap.put("car_number7",car_number7);
                dataMap.put("character_string6",character_string6);
                dataMap.put("thing4",thing4);
                paramMap.put("data", dataMap);
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -288,6 +288,10 @@
    @TableField(exist = false)
    private String optRemark;
    @ApiModelProperty(value = "system openid" , hidden = true)
    @TableField(exist = false)
    private String systemOpenid;
    @ApiModelProperty(value = "培训开始时间")
    @TableField(exist = false)
    private Date trainStartTime;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/LargeScreenDataVO.java
@@ -25,5 +25,7 @@
    @ApiModelProperty(value = "二维码值")
    private String qrCode;
    @ApiModelProperty(value = "注意事项")
    private String attention;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java
@@ -243,4 +243,5 @@
     */
    void timeOutWork();
    PlatformJob getLastWaitJob(String uuid, LoginUserInfo loginUser);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -100,4 +100,6 @@
    String dealPlatformStatusEvent(EventPlatformRequest param, HttpServletResponse response);
    String dealPlatformCarsEvent(EventPlatformCarsRequest param, HttpServletResponse response);
    String syncHkUserOpenid(Integer id);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -493,7 +493,13 @@
        for (int i = 0; i < approveParamList.size(); i++) {
            ApproveParam approveParam = approveParamList.get(i);
            List<Integer> ids = this.getApproveUserIds(approveParam,createMember);
            List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().in(Member::getId,ids));
            List<Member> memberList = memberMapper.selectJoinList(Member.class,
                    new MPJLambdaWrapper<Member>()
                            .selectAll(Member.class)
                            .selectAs(SystemUser::getOpenid,Member::getSystemOpenid)
                            .leftJoin(SystemUser.class,SystemUser::getMemberId,Member::getId)
                            .in(Member::getId,ids)
            );
            List<String> memberNameList =memberList.stream().map(m->m.getName()).collect(Collectors.toList());
            String memberNames = String.join(",",memberNameList);
            Integer noticeType = Constants.approveTypeToNoticeType(approveTempl.getType());
@@ -600,11 +606,11 @@
                                null,Arrays.asList(member.getPhone().split(","))
                        );
                        //公众号通知
                        if(StringUtils.isNotBlank(member.getOpenid())){
                        if(StringUtils.isNotBlank(member.getSystemOpenid())){
                            wxPlatNotice.sendVisitTemplateNotice(
                                    wxNoticeConfigMapper,visitsMapper.selectById(businessId), WxPlatConstants.visitContent.visitWaitAudit,
                                    token,
                                    Arrays.asList(member.getOpenid().split(","))
                                    Arrays.asList(member.getSystemOpenid().split(","))
                            );
                        }
                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.visitReporting)){
@@ -615,11 +621,11 @@
                                null,Arrays.asList(member.getPhone().split(","))
                        );
                        //公众号通知
                        if(StringUtils.isNotBlank(member.getOpenid())){
                        if(StringUtils.isNotBlank(member.getSystemOpenid())){
                            wxPlatNotice.sendVisitTemplateNotice(
                                    wxNoticeConfigMapper,visitsMapper.selectById(businessId), WxPlatConstants.visitReportContent.visitReportWaitAudit,
                                    token,
                                    Arrays.asList(member.getOpenid().split(","))
                                    Arrays.asList(member.getSystemOpenid().split(","))
                            );
                        }
                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.useCar)){
@@ -630,13 +636,13 @@
                                null,Arrays.asList(member.getPhone().split(","))
                        );
                        //公众号通知
                        if(StringUtils.isNotBlank(member.getOpenid())){
                        if(StringUtils.isNotBlank(member.getSystemOpenid())){
                            wxPlatNotice.sendCarUseBookTemplateNotice(
                                    wxNoticeConfigMapper,
                                    carUseBookMapper.selectById(businessId),
                                    WxPlatConstants.carUseBookContent.carUseBookWaitAudit,
                                    token,
                                    Arrays.asList(member.getOpenid().split(",")),
                                    Arrays.asList(member.getSystemOpenid().split(",")),
                                    Constants.ONE);
                        }
                    }
@@ -1623,8 +1629,8 @@
                                SmsConstants.visitReportingContent.visitReportingAuditFail,
                        approveDTO.getCheckInfo(),null
                );
                objCode =  Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? WxPlatConstants.visitReportContent.visitReportAuditSuccess:WxPlatConstants.visitReportContent.visitReportAuditFail;
                objCode =  Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)?
                        WxPlatConstants.visitReportContent.visitReportAuditSuccess:WxPlatConstants.visitReportContent.visitReportAuditFail;
            }else{ //访客申请
                //发送短信通知
@@ -1634,17 +1640,17 @@
                                SmsConstants.visitContent.visitAuditFail,
                        approveDTO.getCheckInfo(),null
                );
                objCode =  Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? WxPlatConstants.visitContent.visitAuditSuccess:WxPlatConstants.visitContent.visitAuditFail;
                objCode =  Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? WxPlatConstants.visitContent.visitAuditSuccess:
                        WxPlatConstants.visitContent.visitAuditFail;
            }
            visitsMapper.updateById(visits);
            //发送微信公众号
            if(StringUtils.isNotBlank(objCode)){
                Member member = memberMapper.selectById(visits.getCreateMemberId());
                if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                if(Objects.nonNull(visits) && StringUtils.isNotBlank(visits.getOpenid())){
                    wxPlatNotice.sendVisitTemplateNotice(
                            wxNoticeConfigMapper,visits, objCode,
                            systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                            Arrays.asList(member.getOpenid().split(","))
                            Arrays.asList(visits.getOpenid().split(","))
                    );
                }
            }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -153,6 +153,10 @@
            }else{
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息同步安防平台失败,请稍后重试!");
            }
        }catch (BusinessException e){
            //如果发生异常,删除已经创建的人员信息
            deleteHkUserBiz(new String[]{insert.getHkId()});
            throw  e;
        }catch (Exception e){
            //如果发生异常,删除已经创建的人员信息
            e.printStackTrace();
@@ -243,7 +247,7 @@
     * @return
     */
    private boolean dealHkUserBiz(Member insert) {
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
        UserAddRequest hkAddRequest = HkSyncOrgUserToHKServiceImpl.getUserAddModel(insert,path,Constants.ZERO);
        if(hkAddRequest == null){
@@ -266,7 +270,7 @@
        return false;
    }
    private boolean dealHkUserForUpdateBiz(Member update ) {
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
        UserAddRequest hkAddRequest = HkSyncOrgUserToHKServiceImpl.getUserAddModel(update,path,Constants.ONE);
@@ -418,7 +422,6 @@
                        .ne(Member::getId,member.getId())) >0){
                    throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "身份证号【"+member.getIdcardNoNew()+"】已被使用,不能重复");
                }
                member.setSex(Constants.getSexByCardNo( member.getIdcardNoNew()));//根据身份证号获取性别
                member.setIdcardDecode( Constants.getTuominStr(member.getIdcardNoNew()));
                member.setIdcardNo(encrptNo);
@@ -970,7 +973,7 @@
        wrapper.lambda().ne(Member::getRemark,"人脸已同步最新");
        List<Member> list =memberMapper.selectList(wrapper);
       if(list!=null){
           String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
           String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                   +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
           for(Member m : list){
             String faceId=  HkSyncOrgUserToHKServiceImpl.dealMemberFace(m,path);
@@ -1715,10 +1718,10 @@
            openId = tokenJson.getString("openid");
        }
        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
        wxAuthorizeVO.setOpenid(openId);
        if(StringUtils.isBlank(openId)){
            return wxAuthorizeVO;
        }
        wxAuthorizeVO.setOpenid(openId);
        if(source==1){
            //根据openId æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
            Member member = memberJoinMapper.selectJoinOne(Member.class,new MPJLambdaWrapper<Member>()
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -49,14 +49,17 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.*;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -116,6 +119,8 @@
    @Autowired
    private EmayService emayService;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private PlatformBroadcastLogMapper platformBroadcastLogMapper;
    @Autowired
@@ -651,11 +656,11 @@
    }
    public void sceneSignIn(SignInDTO signInDTO){
        if( StringUtils.isNotBlank(signInDTO.getQrCodeKey())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(!signInDTO.getQrCodeKey().equals(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_QRCODE).getCode())){
        if(!signInDTO.getQrCodeKey().equals(
                systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_QRCODE_PREFIX).getCode() +  systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_QRCODE).getCode())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"二维码已过期,请刷新重试");
        }
    }
@@ -1431,10 +1436,19 @@
        return platformJob;
    }
    /**
     * å®Œæˆä½œä¸š
     */
    public PlatformJob getLastWaitJob(String uuid, LoginUserInfo loginUser){
        String u = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.BIGSCREEN_UUID);
        if(!StringUtils.equals(u,uuid)){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,二维码已失效!");
        }
        PlatformJob platformJob =  platformJobMapper.selectOne(new QueryWrapper<PlatformJob>().lambda()
                .eq(PlatformJob::getDrivierPhone,loginUser.getMobile())
                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WART_SIGN_IN.getKey())
                .orderByDesc(PlatformJob::getCreateDate)
                .last(" limit 1 ") );
            return platformJob;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public PlatformJob finishWork(JobOperateDTO jobOperateDTO){
@@ -2108,7 +2122,11 @@
            List<PlatformJob> calledList = platformJobList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())).collect(Collectors.toList());
            largeScreenDataVO.setWaitWorkList(calledList);
        }
        largeScreenDataVO.setQrCode(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_QRCODE).getCode());
        String u =  UUID.randomUUID().toString();
        redisTemplate.opsForValue().set(Constants.RedisKeys.BIGSCREEN_UUID,u,3, TimeUnit.MINUTES);
        String url = Constants.getWxUrl(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.WX_REDIRECT_URL).getCode(),Constants.WxUrlParams.BISCREEN_CODE,u);
        largeScreenDataVO.setQrCode(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_QRCODE_PREFIX).getCode().replace( "${param}", url));
        largeScreenDataVO.setAttention(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_ATTENTION).getCode());
        return largeScreenDataVO;
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
@@ -387,6 +387,53 @@
        }
    }
    public static void sendVisitReportTimeOutSms(SystemDictDataBiz systemDictDataBiz, EmayService emayService , com.doumee.dao.business.dao.SmsEmailMapper smsEmailMapper ,
                                                 SmsConfigMapper smsConfigMapper,
                                           String objCode, String msg,List<String> mobiles){
        try{
            SmsConfig smsConfig = smsConfigMapper.selectOne(new QueryWrapper<SmsConfig>().lambda().eq(SmsConfig::getCode,
                    objCode).last(" limit 1 "));
            //开启短信通知
            if(Objects.nonNull(smsConfig) || Constants.equalsInteger(smsConfig.getStatus(),Constants.ZERO)){
                String content = systemDictDataBiz.queryByCode(Constants.SMS,Constants.SMS_COMNAME).getCode() + smsConfig.getContent();
                //超时特殊处理
                if(smsConfig.getCode().equals(SmsConstants.visitReportingContent.visitReportingTimeOutSignOutNum)){
                    //今日还有{未签离数量}个访客报备车辆未离场,请前往PC端查看详细信息。
                    content = content.replace("{未签离数量}",msg);
                    sendBusinessSms(emayService,smsEmailMapper,
                            mobiles,SmsConstants.visitReport,content,0);
                    return;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void sendVisitTimeOutSms(SystemDictDataBiz systemDictDataBiz, EmayService emayService , com.doumee.dao.business.dao.SmsEmailMapper smsEmailMapper ,
                                                 SmsConfigMapper smsConfigMapper,
                                                 String objCode, String msg,List<String> mobiles){
        try{
            SmsConfig smsConfig = smsConfigMapper.selectOne(new QueryWrapper<SmsConfig>().lambda().eq(SmsConfig::getCode,
                    objCode).last(" limit 1 "));
            //开启短信通知
            if(Objects.nonNull(smsConfig) || Constants.equalsInteger(smsConfig.getStatus(),Constants.ZERO)){
                String content = systemDictDataBiz.queryByCode(Constants.SMS,Constants.SMS_COMNAME).getCode() + smsConfig.getContent();
                //超时特殊处理
                if(smsConfig.getCode().equals(SmsConstants.visitContent.visitTimeOutSignOutNum)){
                    //今日还有{未签离数量}个访客报备车辆未离场,请前往PC端查看详细信息。
                    content = content.replace("{未签离数量}",msg);
                    sendBusinessSms(emayService,smsEmailMapper,
                            mobiles,SmsConstants.visit,content,0);
                    return;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * é𐿂£éšæ‰‹æ‹
     * @param systemDictDataBiz
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -253,25 +253,25 @@
        //初始化访客信息
        initVisitInfo(visits,date);
        if(StringUtils.isNotBlank(visits.getFaceImg())&&(Constants.equalsInteger(visits.getType(),Constants.ZERO)|| Constants.equalsInteger(visits.getType(),Constants.TWO))){
            //人脸评分
            FacePictureCheckRequest param = new FacePictureCheckRequest();
            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            param.setFacePicUrl(prefixUrl + visits.getFaceImg());
            BaseResponse<FacePictureCheckResponse> response = HKService.facePictureCheck(param);
            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
            }
            FacePictureCheckResponse facePictureCheckResponse = response.getData();
            if(Objects.isNull(facePictureCheckResponse) || Objects.isNull(facePictureCheckResponse.getCheckResult())){
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
            }
            if(!facePictureCheckResponse.getCheckResult()){
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), facePictureCheckResponse.getStatusMessage());
            }
        }
//        if(StringUtils.isNotBlank(visits.getFaceImg())&&(Constants.equalsInteger(visits.getType(),Constants.ZERO)|| Constants.equalsInteger(visits.getType(),Constants.TWO))){
//            //人脸评分
//            FacePictureCheckRequest param = new FacePictureCheckRequest();
//            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode() +
//                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
//            param.setFacePicUrl(prefixUrl + visits.getFaceImg());
//            BaseResponse<FacePictureCheckResponse> response = HKService.facePictureCheck(param);
//            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//            }
//            FacePictureCheckResponse facePictureCheckResponse = response.getData();
//            if(Objects.isNull(facePictureCheckResponse) || Objects.isNull(facePictureCheckResponse.getCheckResult())){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//            }
//            if(!facePictureCheckResponse.getCheckResult()){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), facePictureCheckResponse.getStatusMessage());
//            }
//        }
        visits.setSendTimeOutNotice(Constants.ZERO);
        visitsMapper.insert(visits);
        //发起ERP审批申请
@@ -1740,6 +1740,8 @@
                .eq(Visits::getSendTimeOutNotice,Constants.ZERO)
                .apply("   now() >=  DATE_ADD(ENDTIME,INTERVAL -"+times+" MINUTE)   ")
        );
        Integer visitTimeCount = 0;
        Integer visitReportTimeCount = 0;
        for (Visits visits:visitsList) {
            if(Constants.equalsInteger(visits.getType(),Constants.TWO)){
                SmsEmailServiceImpl.sendVisitReportSms(systemDictDataBiz,
@@ -1747,17 +1749,40 @@
                        SmsConstants.visitReportingContent.visitReportingTimeOutSignOut,
                        null,Arrays.asList(visits.getPhone().split(","))
                );
                visitReportTimeCount = visitReportTimeCount + 1;
            }else{
                SmsEmailServiceImpl.sendVisitSms(systemDictDataBiz,
                        emayService,smsEmailMapper,smsConfigMapper,visitsMapper,visits.getId(),
                        SmsConstants.visitContent.visitTimeOutSignOut,
                        null,Arrays.asList(visits.getPhone().split(","))
                );
                visitTimeCount = visitTimeCount  + 1 ;
            }
            visits.setSendTimeOutNotice(Constants.ONE);
            visitsMapper.updateById(visits);
        }
        if(visitTimeCount > 0 ){
            String mobile = systemDictDataBiz.queryByCode(Constants.VISIT_CONFIG,Constants.VISIT_TIME_OUT_MOBILE).getCode();
            if(StringUtils.isNotBlank(mobile)){
                SmsEmailServiceImpl.sendVisitTimeOutSms(systemDictDataBiz,
                        emayService,smsEmailMapper,smsConfigMapper,
                        SmsConstants.visitContent.visitTimeOutSignOutNum,
                        visitReportTimeCount.toString(),Arrays.asList(mobile.split(","))
                );
            }
        }
        if(visitReportTimeCount > 0 ){
            String mobile = systemDictDataBiz.queryByCode(Constants.VISIT_CONFIG,Constants.VISIT_REPORT_TIME_OUT_MOBILE).getCode();
            if(StringUtils.isNotBlank(mobile)){
                SmsEmailServiceImpl.sendVisitReportTimeOutSms(systemDictDataBiz,
                        emayService,smsEmailMapper,smsConfigMapper,
                        SmsConstants.visitReportingContent.visitReportingTimeOutSignOutNum,
                        visitReportTimeCount.toString(),Arrays.asList(mobile.split(","))
                );
            }
        }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -101,6 +101,10 @@
        return  null;
    }
    @Override
    public  String syncHkUserOpenid(Integer id){
        return  null;
    }
    @Override
    public String   dealAcsEvent(EventAcsRequest param, HttpServletResponse response){
        return  null;
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java
@@ -19,6 +19,8 @@
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.join.MemberJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
@@ -26,6 +28,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -62,9 +65,47 @@
    @Autowired
    private ERPSyncService erpSyncService;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    /**
     *  ç»‘定海康用户openId
     *  {
     * "openId" : "ovmre6R7w-vEQCHg52-UN2mV_abI",
     * "userName" : "13856591439",
     * "appKey" : "wx173e6caf5abc718a",
     * "oaId" : "atwl",
     * "platformName" : "安泰物流园区",
     *
     * }
     */
    @Override
    public    String syncHkUserOpenid(Integer id){
        SystemUser user = systemUserMapper.selectById(id);
        if(user == null ||StringUtils.isBlank(user.getOpenid()) ||Constants.equalsInteger(user.getOpenidHkStatus(),Constants.ONE)){
            return null;
        }
        UserOpenidSaveRequest request = new UserOpenidSaveRequest();
        request.setUserName(user.getUsername());
        request.setAppKey(systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_APPID).getCode());
        request.setOaId("atwl");
        request.setOpenId(user.getOpenid());
        request.setPlatformName(user.getRealname());
        BaseResponse<Integer>  response = HKService.userOpenidSave(request);
        if(response!=null &&response.getCode().equals(HKConstants.RESPONSE_SUCCEE) && Constants.equalsInteger(response.getData(),Constants.ONE)){
            user.setOpenidHkStatus(Constants.ONE);
            user.setOpenidHkInfo("绑定成功");
        }else{
            user.setOpenidHkStatus(Constants.TWO);
            user.setOpenidHkInfo(response!=null?StringUtils.defaultString(response.getMsg(),"【未知失败原因】"):"绑定失败");
        }
        user.setOpenidHkDate(new Date());
        systemUserMapper.updateById(user);
        return  "成功";
    }
    /**
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
@@ -285,7 +326,7 @@
                return;
            }
            Date date = new Date();
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            for(Member c : list){
                dealMemberInfoBiz(c,date,path) ;