k94314517
2023-12-15 a6d6627a6e13aef60941337a270541f507d53ba7
Merge remote-tracking branch 'origin/master'
已添加5个文件
已修改16个文件
424 ■■■■ 文件已修改
server/dmvisit_admin/src/main/java/com/doumee/api/business/CarsController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/DeviceController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CarPictureRequest.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/DevicePictureRequest.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitPictureRequest.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/model/openapi/request/erp/MemberFailRequest.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/FtpUtil.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/join/CarJoinMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/CarsController.java
@@ -69,7 +69,7 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
   // @RequiresPermissions("business:cars:query")
    @RequiresPermissions("business:cars:query")
    public ApiResponse<PageData<Cars>> findPage (@RequestBody PageWrap<Cars> pageWrap) {
        return ApiResponse.success(carsService.findPage(pageWrap));
    }
server/dmvisit_admin/src/main/java/com/doumee/api/business/DeviceController.java
@@ -69,7 +69,7 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:device:query")
    //@RequiresPermissions("business:device:query")
    public ApiResponse<PageData<Device>> findPage (@RequestBody PageWrap<Device> pageWrap) {
        return ApiResponse.success(deviceService.findPage(pageWrap));
    }
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -151,4 +151,12 @@
        return ApiResponse.success(memberService.findVisitPage(pageWrap));
    }
    @ApiOperation("异常人员")
    @PostMapping("/findUnusualPage")
    @RequiresPermissions("business:member:query")
    public ApiResponse<PageData<MemberInfoDTO>> findUnusualPage (@RequestBody PageWrap<MemberQuery> pageWrap) {
        return ApiResponse.success(memberService.findUnusualPage(pageWrap));
    }
}
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -2,6 +2,7 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
@@ -29,9 +30,8 @@
@EnableScheduling
public class ScheduleTool {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    private HkSyncImgServiceImpl hkSyncImgService;
    /**
     * æ˜¯å¦å¼€å‘者
     */
@@ -43,60 +43,10 @@
     * ç¼“存省市区
     * @throws Exception
     */
    @Scheduled(fixedDelay=24*60*60*1000)
    public void cacheCampus() throws Exception {
    }
     /**
     * æ¯å¤©å‡Œæ™¨é‡ç½®æ‰€æœ‰è®¢å•code类初始值
     * @throws Exception
     */
    @Scheduled(cron="0 0 0 * * ?")
    public void resetOrderCodes() throws Exception {
    @Scheduled(fixedDelay= 60*1000)
    public void downloadHkImg() throws Exception {
        hkSyncImgService.downHKImgs(0);
    }
    /**
     * å‘送get请求
     * @param url è¯·æ±‚URL
     * @param param è¯·æ±‚参数 key:value url携带参数 æˆ–者无参可不填
     * @return
     */
    public  String doGet(String url, Map<String, String> param) {
        // åˆ›å»ºHttpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // åˆ›å»ºuri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();
            // åˆ›å»ºhttp GET请求
            HttpGet httpGet = new HttpGet(uri);
            // æ‰§è¡Œè¯·æ±‚
            response = httpclient.execute(httpGet);
            // åˆ¤æ–­è¿”回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -53,6 +53,9 @@
        String eventSub= "/api/eventService/v1/eventSubscriptionByEventTypes";//事件订阅
        String doorSearch= "/api/resource/v2/door/search";//查询门禁点列表v2
        String cancelEventSub= "/api/eventService/v1/eventUnSubscriptionByEventTypes";//取消事件订阅
        String visitPicture= "/api/visitor/v1/record/pictures";//获取访客记录中的图片
        String devicePicture= "/api/acs/v1/event/pictures";//获取门禁事件的图片
        String carPicture= "/api/pms/v1/image";//查询车辆抓拍图片
    }
    /**
@@ -78,7 +81,6 @@
            this.name = name;
            this.key = key;
        }
        // get set æ–¹æ³•
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -291,6 +291,60 @@
        }
    }
    /**
     * èŽ·å–è®¿å®¢è®°å½•ä¸­çš„å›¾ç‰‡
     * @param body
     * @return
     */
    public static InputStream getVisitPicture(String body)  throws  Exception{
        Map<String, String> path = getPath(HKConstants.InterfacePath.visitPicture);
        //参数根据接口实际情况设置
        HttpResponse resp = ArtemisHttpUtil.doPostStringImgArtemis( path, body, null, null,"application/json",null);
        if (200==resp.getStatusLine().getStatusCode()) {
            HttpEntity entity = resp.getEntity();
            InputStream in = entity.getContent();
            return  in;
        }else{
            throw  new Exception("获取访客记录中的图片下载出错");
        }
    }
    /**
     * èŽ·å–é—¨ç¦äº‹ä»¶çš„å›¾ç‰‡
     * @param body
     * @return
     */
    public static InputStream getDevicePicture(String body)  throws  Exception{
        Map<String, String> path = getPath(HKConstants.InterfacePath.devicePicture);
        //参数根据接口实际情况设置
        HttpResponse resp = ArtemisHttpUtil.doPostStringImgArtemis( path, body, null, null,"application/json",null);
        if (200==resp.getStatusLine().getStatusCode()) {
            HttpEntity entity = resp.getEntity();
            InputStream in = entity.getContent();
            return  in;
        }else{
            throw  new Exception("获取门禁事件的图片下载出错");
        }
    }
    /**
     * æŸ¥è¯¢è½¦è¾†æŠ“拍图片
     * @param body
     * @return
     */
    public static InputStream getCarPicture(String body)  throws  Exception{
        Map<String, String> path = getPath(HKConstants.InterfacePath.carPicture);
        //参数根据接口实际情况设置
        HttpResponse resp = ArtemisHttpUtil.doPostStringImgArtemis( path, body, null, null,"application/json",null);
        if (200==resp.getStatusLine().getStatusCode()) {
            HttpEntity entity = resp.getEntity();
            InputStream in = entity.getContent();
            return  in;
        }else{
            throw  new Exception("查询车辆抓拍图片下载出错");
        }
    }
    /**
     *    èŽ·å–é—¨ç¦ç‚¹åˆ—è¡¨
     * @param body
     * @return
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CarPictureRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class CarPictureRequest {
    private String  aswSyscode;//    string    True    å›¾ç‰‡æœåŠ¡å”¯ä¸€æ ‡è¯†ç ï¼ˆæœ€å¤§é•¿åº¦64)  ä»Žå…¶ä»–返回图片Uri接口处获取
    private String  picUri    ;//string    True    å›¾ç‰‡Uri(最大长度256)
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/DevicePictureRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class DevicePictureRequest {
    private String  svrIndexCode    ;//    string    True    æä¾›picUri处会提供此字段
    private String  picUri    ;//    string    True    å›¾ç‰‡ç›¸å¯¹åœ°å€
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitPictureRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class VisitPictureRequest {
    private String  svrIndexCode    ;//    string    True    æä¾›picUri处会提供此字段
    private String  picUri    ;//    string    True    å›¾ç‰‡ç›¸å¯¹åœ°å€
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -1,29 +1,19 @@
package com.doumee.core.haikang.service;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.utils.Constants;
import com.alibaba.fastjson.TypeReference;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.HKTools;
import com.doumee.core.haikang.model.param.BaseRequst;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.dao.business.model.InterfaceLog;
import com.doumee.service.business.InterfaceLogService;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import com.alibaba.fastjson.TypeReference;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
@Slf4j
@@ -244,6 +234,51 @@
        }
        return  null;
    }
    /**
     * èŽ·å–è®¿å®¢è®°å½•ä¸­çš„å›¾ç‰‡
     * @return
     */
    public static InputStream getVisitPicture(VisitPictureRequest param) {
        log.info("【海康访客图片流】================开始===="+JSONObject.toJSONString(param));
        try {
            InputStream res = HKTools.getVisitPicture(JSONObject.toJSONString(param));
            log.error("【海康访客图片流】================成功====\n");
            return  res;
        }catch (Exception e){
            log.error("【海康访客图片流】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     * èŽ·å–é—¨ç¦äº‹ä»¶çš„å›¾ç‰‡
     * @return
     */
    public static InputStream getDevicePicture(DevicePictureRequest param) {
        log.info("【海康门禁事件图片流】================开始===="+JSONObject.toJSONString(param));
        try {
            InputStream res = HKTools.getDevicePicture(JSONObject.toJSONString(param));
            log.error("【海康门禁事件图片流】================成功====\n");
            return  res;
        }catch (Exception e){
            log.error("【海康门禁事件图片流】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     * æŸ¥è¯¢è½¦è¾†æŠ“拍图片
     * @return
     */
    public static InputStream getCarPicture(CarPictureRequest param) {
        log.info("【海康车辆抓拍图片图片流】================开始===="+JSONObject.toJSONString(param));
        try {
            InputStream res = HKTools.getCarPicture(JSONObject.toJSONString(param));
            log.error("【海康车辆抓拍图片图片流】================成功====\n");
            return  res;
        }catch (Exception e){
            log.error("【海康车辆抓拍图片图片流】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *获取车库列表数据(全量)
server/dmvisit_service/src/main/java/com/doumee/core/model/openapi/request/erp/MemberFailRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.core.model.openapi.request.erp;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/23 14:03
 */
@Data
@ApiModel(value = "员工同步失败推送请求参数" )
public class MemberFailRequest {
    @ApiModelProperty(value = "员工id"  )
    private  String userId;
    @ApiModelProperty(value = "失败类型 0人员同步失败 1权限下发失败 "  )
    private  Integer type;
    @ApiModelProperty(value = "备注信息,描述失败原因")
    private String info;
}
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -49,6 +49,11 @@
    public static final String VISIT_EVENT_IMG = "VISIT_EVENT_IMG";
    public static final String CAR_EVENT_IMG = "CAR_EVENT_IMG";
    public static final String DEVICE_EVENT_IMG = "DEVICE_EVENT_IMG";
    public static final String FTP ="FTP" ;
    public static final String FTP_HOST ="FTP_HOST" ;
    public static final String FTP_PORT ="FTP_PORT" ;
    public static final String FTP_USERNAME ="FTP_USERNAME" ;
    public static final String FTP_PWD ="FTP_PWD" ;
    public static  boolean DEALING_HK_IMG = false;
    // ERP接口配置
    public static final String ERP_CONFIG = "ERP_CONFIG";
@@ -249,7 +254,8 @@
        /** ç”¨æˆ·å¯ç”¨ç¦ç”¨æžšä¸¾å€¼*/
        ENABLE(0,"正常"),
        DISABLE(1,"禁用");
        DISABLE(1,"禁用"),
        FREEZE(2,"拉黑/冻结");
        private  Integer value;
        private  String des;
server/dmvisit_service/src/main/java/com/doumee/core/utils/FtpUtil.java
@@ -233,6 +233,39 @@
        }
        return result;
    }
    public boolean uploadInputstream(InputStream inputStream, String remote)  {
        // è®¾ç½®PassiveMode传输
        try {
            ftpClient.enterLocalPassiveMode();
            // è®¾ç½®ä»¥äºŒè¿›åˆ¶æµçš„æ–¹å¼ä¼ è¾“
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.setControlEncoding("GBK");
            // å¯¹è¿œç¨‹ç›®å½•的处理
            String remoteFileName = remote;
            if (remote.contains(File.separator)) {
                remoteFileName = remote.substring(remote.lastIndexOf(File.separator) + 1);
                // åˆ›å»ºæœåŠ¡å™¨è¿œç¨‹ç›®å½•ç»“æž„ï¼Œåˆ›å»ºå¤±è´¥ç›´æŽ¥è¿”å›ž
                if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) {
                    log.error("创建ftp目录失败======================="+remote);
                    return false;
                }
            }
            boolean result = ftpClient.storeFile(remoteFileName, inputStream);
            inputStream.close();
            ftpClient.logout();
            if(result){
                log.info("上传文件成功======================"+remote);
            }else{
                log.error("上传文件失败======================="+remote);
            }
            return result;
        }catch (Exception e){
            e.printStackTrace();
            log.error("上传文件失败======================="+remote);
        }
        return false;
    }
    public int getNumFromStr(String str,char searchstr) {
        int count = 0;
        char[] charArray = str.toCharArray();
@@ -599,8 +632,6 @@
        File src = new File(localDirectory);
        try {
            remoteDirectoryPath =  remoteDirectoryPath  + File.separator;
//            System.out.println(remoteDirectoryPath+":===============创建目录=================");
            boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath);
        }catch (IOException e) {
            e.printStackTrace();
@@ -611,11 +642,9 @@
        for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
            File f =allFile[currentFile];
            String srcName=    f.getPath().toString();
//            System.out.println(srcName+":====================读取文件======================");
            String tPath = remoteDirectoryPath+f.getName();
            if (!f.isDirectory()) {
//                System.out.println(srcName+":====================开始传输文件======================");
                int dNum = getNumFromStr(tPath,File.separator.toCharArray()[0]);
                uploadFile(f, tPath);
                if(dNum -2>=0){
@@ -624,11 +653,9 @@
                    }
                }
            }else{
//                System.out.println(srcName+":====================创建子目录======================");
                uploadDirectory(srcName,
                        tPath+File.separator);
            }
//            System.out.println(srcName+":====================上传完毕======================");
        }
        return true;
    }
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
@@ -42,5 +42,8 @@
    @ApiModelProperty(value = "身份证号")
    private String idcardNo;
    @ApiModelProperty(value = " 0劳务访客 1普通访客  2内部人员")
    private Integer type;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/join/CarJoinMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.doumee.dao.business.join;
import com.doumee.dao.business.model.Cars;
import com.github.yulichang.base.mapper.MPJJoinMapper;
public interface CarJoinMapper extends MPJJoinMapper<Cars> {
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
@@ -52,8 +52,8 @@
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "设别名")
    @ExcelColumn(name="设别名")
    @ApiModelProperty(value = "设备名称")
    @ExcelColumn(name="设备名称")
    private String name;
    @ApiModelProperty(value = "海康标识", example = "1")
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -153,6 +153,8 @@
    PageData<MemberInfoDTO> findVisitPage(PageWrap<MemberQuery> pageWrap);
    PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap);
    /********************************************公众号接口***********************************************************************/
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
@@ -1,5 +1,9 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
@@ -11,10 +15,6 @@
import com.doumee.dao.business.join.ParkBookJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.CarsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -99,11 +99,6 @@
    @Override
    public PageData<Cars> findPage(PageWrap<Cars> pageWrap) {
        MPJLambdaWrapper<Cars> visRecord = new MPJLambdaWrapper<>();
        visRecord.selectAll(Cars.class);
        visRecord.eq(Cars::getIsdeleted, Constants.ZERO);
        visRecord.eq(Cars::getId, Constants.ZERO);
        Cars result = carJoinMapper.selectJoinOne(Cars.class,visRecord);
        IPage<Cars> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Cars> queryWrapper = new QueryWrapper<>();
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -516,6 +516,33 @@
                .like(StringUtils.isNotBlank(pageWrap.getModel().getPhone()),Member::getPhone,pageWrap.getModel().getPhone())
                .like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName())
                .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
                .eq(Member::getStatus,Constants.Status.FREEZE)
                .orderByDesc(Member::getCreateDate);
        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
        return PageData.from(memberIPage);
    }
    @Override
    public PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap) {
        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.selectAll(Member.class)
                .selectAs(Company::getName,MemberInfoDTO::getCompanyName)
                .select(" (select count(v.id) from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0) as visitsCount")
                .select(" (select STARTTIME from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 order by CREATE_DATE limit 1) as visitsLastDate");
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Member::getName,pageWrap.getModel().getName())
                .like(StringUtils.isNotBlank(pageWrap.getModel().getPhone()),Member::getPhone,pageWrap.getModel().getPhone())
                .like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName())
                .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
                .eq(Member::getStatus,Constants.Status.ENABLE)
                .orderByDesc(Member::getCreateDate);
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java
@@ -2,28 +2,36 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.AcsDeviceInfoResponse;
import com.doumee.core.haikang.model.param.respose.AcsDeviceListResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.CarEvent;
import com.doumee.dao.business.model.Device;
import com.doumee.dao.business.model.DeviceEvent;
import com.doumee.dao.business.model.VisitEvent;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
 * è®¾å¤‡ä¿¡æ¯è¡¨Service实现
@@ -31,6 +39,7 @@
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncImgServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
@@ -39,7 +48,10 @@
    private DeviceEventMapper deviceEventMapper;
    @Autowired
    private VisitEventMapper visitEventMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    @Async
    public  String downHKImgs(int type){
        if(Constants.DEALING_HK_IMG){
            return null ;
@@ -161,9 +173,46 @@
    }
    private String downHkImgToFtp(String img1, String serverIndex, String visitEventImg) {
        //
    private String downHkImgToFtp(String img1, String serverIndex, String folder) {
        InputStream is = null;
        if(StringUtils.equals(folder,Constants.CAR_EVENT_IMG)){
            //停车场抓拍图
            CarPictureRequest param = new CarPictureRequest();
            param.setPicUri(img1);
            param.setAswSyscode(serverIndex);
            is = HKService.getCarPicture(param);
        }else if(StringUtils.equals(folder,Constants.DEVICE_EVENT_IMG)){
            //门禁事件图片
            DevicePictureRequest param = new DevicePictureRequest();
            param.setPicUri(img1);
            param.setSvrIndexCode(serverIndex);
            is = HKService.getDevicePicture(param);
        }else if(StringUtils.equals(folder,Constants.VISIT_EVENT_IMG)){
            //访客事件图片
            VisitPictureRequest param = new VisitPictureRequest();
            param.setPicUri(img1);
            param.setSvrIndexCode(serverIndex);
            is = HKService.getVisitPicture(param);
        }
        //TODO------jiangping---------
        try {
            FtpUtil ftp = new FtpUtil(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode(),
                    Integer.parseInt(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PORT).getCode()),
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_USERNAME).getCode(),
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PWD).getCode());
            String date = DateUtil.getNowShortDate();
            String fName = File.separator+date+File.separator+ UUID.randomUUID().toString()+".jpg";
            String fileName = folder+fName;
            boolean r = ftp.uploadInputstream(is,fileName);//上传
            if(r){
                log.info("【海康图片下载上传FTP失败】======================" );
                return  fName;
            }else{
                log.error("【海康图片下载上传FTP失败】======================" );
            }
        } catch (Exception e) {
            log.error("【海康图片下载上传FTP失败】======================"+e.getMessage());
        }
        return  null;
    }
}
server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java
@@ -5,6 +5,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.openapi.request.erp.ApproveAddRequest;
import com.doumee.core.model.openapi.request.erp.MemberFailRequest;
import com.doumee.core.model.openapi.request.erp.OrgListRequest;
import com.doumee.core.model.openapi.request.erp.UserListRequest;
import com.doumee.core.model.openapi.response.erp.ApproveInfoResponse;
@@ -16,6 +17,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.UUID;
/**
@@ -27,32 +29,37 @@
@Api(tags = "2、【ERP】端提供接口(向访客端提供或提交数据信息)")
@RestController
@RequestMapping("/erp")
@RequestMapping("/erp/resource")
@Slf4j
public class ErpResourceController extends ApiController{
    @ApiOperation(value = "全量组织信息接口", notes = "ERP端提供,供访客端拉取全部组织信息,用于初始化及周期性数据核查")
    @PostMapping("/resource/org/list")
    @PostMapping("/org/list")
    public ApiResponse<PageData<OrgListResponse>> orgList (@RequestBody PageWrap<OrgListRequest> pageWrap) {
        return ApiResponse.success(null);
    }
    @ApiOperation(value = "全量人员信息接口", notes = "ERP端提供,供访客端拉取全部人员信息,用于初始化及周期性数据核查")
    @PostMapping("/resource/user/list")
    @PostMapping("/user/list")
    public ApiResponse<PageData<UserListRespone>> userList (@RequestBody PageWrap<UserListRequest> pageWrap) {
        return ApiResponse.success(null);
    }
    @ApiOperation(value = "访客申请提交审批接口", notes = "ERP端提供,供访客端调用,提交访客申请信息,接口提交成功,ERP端返回审批记录编码")
    @PostMapping("/event/approve/apply")
    public ApiResponse<String> approveApply(@RequestBody ApproveAddRequest account ) {
    public ApiResponse<String> approveApply(@RequestBody ApproveAddRequest param ) {
        return  ApiResponse.success(UUID.randomUUID().toString());
    }
    @ApiOperation(value = "访客申请审批结果查询接口", notes = "ERP端提供,供访客端调用,查询访客申请审批结果")
    @GetMapping("/resource/approve/info")
    @GetMapping("/approve/info")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "id", value = "审批记录唯一标识", required = true)
    })
    public ApiResponse<ApproveInfoResponse> approveInfo(@RequestParam String id ) {
        return  ApiResponse.success(null );
    }
    @ApiOperation(value = "员工同步失败推送接口", notes = "ERP端提供,供访客端调用,告知erp员工信息同步失败的数据")
    @PostMapping("/member/fail")
    public ApiResponse<ApproveInfoResponse> memberFail(@RequestBody List<MemberFailRequest> param) {
        return  ApiResponse.success(null );
    }
}