lishuai
2023-12-18 9645ca1ea0ca880eff9bb0ba2138fad2b012f3e1
Merge remote-tracking branch 'origin/master'
已添加5个文件
已修改25个文件
已重命名1个文件
1255 ■■■■ 文件已修改
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/DoorEventListResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/UserListRespone.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserDelRequest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddSuccessResponse.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitAppointmentMDJResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/ImageBase64Util.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/MemberMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/join/EmpowerJoinMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Retention.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/HkSyncService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncEmpowerServiceImpl.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
@@ -87,4 +87,11 @@
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(visitsService.findById(id));
    }
    @ApiOperation("滞留人员")
    @PostMapping("/retentionPage")
  //  @RequiresPermissions("business:visits:query")
    public ApiResponse<PageData<Visits>> retentionPage (@RequestBody PageWrap<Visits> pageWrap) {
        return ApiResponse.success(visitsService.retentionPage(pageWrap));
    }
}
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -3,6 +3,7 @@
import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncOrgUserServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -23,6 +24,8 @@
    private HkSyncImgServiceImpl hkSyncImgService;
    @Autowired
    private HkSyncOrgUserServiceImpl hkSyncOrgUserService;
    @Autowired
    private HkSyncVisitServiceImpl hkSyncVisitService;
    /**
     * æ˜¯å¦å¼€å‘者
     */
@@ -47,6 +50,14 @@
        hkSyncOrgUserService.syncOrgData();
    }
    /**
     * å®šæ—¶åŒæ­¥ç»„织信息到海康系统
     * @throws Exception
     */
    @Scheduled(fixedDelay= 60*1000)
    public void syncVisitData() {
        hkSyncVisitService.syncVisitData();
    }
    /**
     * å®šæ—¶åŒæ­¥ç”¨æˆ·ä¿¡æ¯åˆ°æµ·åº·ç³»ç»Ÿ
     * @throws Exception
     */
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java
@@ -43,5 +43,8 @@
    private List<String> cardList;
    @ApiModelProperty(value = "授权门禁组编码集合,【访客端】唯一标识" )
    private Integer[] roleIds;
    @ApiModelProperty(value = "授权有效期(开始时间),为空时默认长期有效,如2023-11-24 11:39:23"  )
    private Date validStartTime;
    @ApiModelProperty(value = "授权有效期(截止时间),为空时默认长期有效,如2023-11-24 11:39:23"  )
    private Date validEndTime;
}
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/DoorEventListResponse.java
@@ -14,7 +14,7 @@
public class DoorEventListResponse {
    @ApiModelProperty(value = "唯一标识" ,example = "1")
    private Integer eventId;
    private String eventId;
    @ApiModelProperty(value = "事件类型 0-人脸认证通过(196893) 1-刷卡认证通过(198915)" )
    private String eventType;
    @ApiModelProperty(value = "性别 1-男 2-女" ,example = "1")
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/UserListRespone.java
@@ -22,7 +22,7 @@
@ApiModel("人员信息同步返回信息")
public class UserListRespone {
    @ApiModelProperty(value = "唯一标识" ,example = "1")
    private Integer id;
    private String id;
    @ApiModelProperty(value = "姓名" )
    private String name;
    @ApiModelProperty(value = "身份证号" )
@@ -40,12 +40,11 @@
    @ApiModelProperty(value = "更新时间,如2023-11-24 09:47:36")
    private Date editDate;
    @ApiModelProperty(value = "所属组织编码")
    private String orgId;
    private Integer orgId;
    @ApiModelProperty(value = "人脸照片地址,图片公网访问地址")
    private String faceImg;
    @ApiModelProperty(value = "工号")
    private String code;
    @ApiModelProperty(value = "手机号" , required = true)
    private String phone;
    @ApiModelProperty(value = "卡号集合" )
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -9,7 +9,8 @@
public class HKConstants {
    public static final String IMG_INDEX ="HKIMG=" ;
    public static final String IMG_INDEX_ERROR ="HKIMG_ERROR=" ;
    public static final String RES_INDEX = "DM_";
    public static final String RES_ORG_INDEX = "DMO";
    public static final String RES_USER_INDEX = "DMU";
    private Logger logger = LoggerFactory.getLogger(HKConstants.class);
    //海康平台根据现场环境配置http还是https
    public static final String RESPONSE_SUCCEE = "0";
@@ -102,6 +103,39 @@
        }
    }
    public  enum ReturnCode {
        PARK_LINE_IN("0x00072001", "资源信息不存在"  )
        ;
        // æˆå‘˜å˜é‡
        private String name;
        private String key;
        // æž„造方法
        ReturnCode(String key, String name ) {
            this.name = name;
            this.key = key;
        }
        // get set æ–¹æ³•
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
    }
    /**
     * é¡”色枚举
     */
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserDelRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
import java.util.List;
/**
 * ç”¨æˆ·æ–°å¢žè¯·æ±‚参数
 */
@Data
public class UserDelRequest {
    private String[]   personIds;//    string[]    True    äººå‘˜Id,单次操作上限为1000条。    èŽ·å–äººå‘˜åˆ—è¡¨v2 æŽ¥å£èŽ·å–è¿”å›žå‚æ•°personId
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddSuccessResponse.java
@@ -7,4 +7,5 @@
  private String clientId;//    number    False    è°ƒç”¨æ–¹æŒ‡å®šId
  private String  orgIndexCode;//    string    False    æœåŠ¡ç«¯ç”Ÿæˆçš„å”¯ä¸€æ ‡è¯†
  private String personId;//    string    False    æœåŠ¡ç«¯ç”Ÿæˆçš„å”¯ä¸€æ ‡è¯†
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitAppointmentMDJResponse.java
ÎļþÃû´Ó server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitAppointmentVistorResponse.java ÐÞ¸Ä
@@ -3,7 +3,7 @@
import lombok.Data;
@Data
public class VisitAppointmentVistorResponse {
public class VisitAppointmentMDJResponse {
    private String   visitorName        ;//string    False    è®¿å®¢å§“名,支持中英文字符,不能包含 â€™ / \ : * ? " < >
    private String appointRecordId    ;//    string    False é¢„约记录ID
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -151,13 +151,13 @@
     *批量删除人员信息
     * @return
     */
    public  static  BaseResponse<OrgOrUserAddFailureResponse>  delBatchUser(List<UserAddRequest> param){
    public  static  BaseResponse<List<UserDelResponse>>  delBatchUser(UserDelRequest param){
        log.info("【海康批量新增人员】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.delBatchUser(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<OrgOrUserAddFailureResponse>>(){};
            BaseResponse<OrgOrUserAddFailureResponse> result = JSONObject.parseObject(res, typeReference.getType());
            BaseResponse<List<UserDelResponse >> result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康批量新增人员");
            return  result;
        }catch (Exception e){
@@ -446,13 +446,13 @@
     *访客免登记预约
     * @return
     */
    public  static  BaseResponse<VisitAppointmentVistorResponse>   visitAppiontmentMDJ(VisitAppointmentMDJRequest param){
    public  static  BaseResponse<VisitAppointmentMDJResponse>   visitAppiontmentMDJ(VisitAppointmentMDJRequest param){
        log.info("【海康访客免登记预约】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.visitAppiontmentMDJ(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<VisitAppointmentVistorResponse> >(){};
            BaseResponse<VisitAppointmentVistorResponse>   result = JSONObject.parseObject(res, typeReference.getType());
                    new TypeReference< BaseResponse<VisitAppointmentMDJResponse> >(){};
            BaseResponse<VisitAppointmentMDJResponse>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康访客免登记预约");
            return  result;
        }catch (Exception e){
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -66,6 +66,8 @@
    public static  boolean DEALING_HK_IMG = false;
    public static  boolean DEALING_HK_ORG = false;
    public static  boolean DEALING_HK_USER = false;
    public static  boolean DEALING_HK_VISIT = false;
    public static  boolean DEALING_HK_EMPOWER = false;
    // ERP接口配置
    public static final String ERP_CONFIG = "ERP_CONFIG";
    // ERP ACCESS_KEY
server/dmvisit_service/src/main/java/com/doumee/core/utils/ImageBase64Util.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
package com.doumee.core.utils;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class ImageBase64Util {
    /**
     * å°†å›¾ç‰‡è½¬æ¢æˆBase64编码
     * @param imgFile å¾…处理图片
     * @return
     */
    public static String getImgStr(String imgFile) {
        // å°†å›¾ç‰‡æ–‡ä»¶è½¬åŒ–为字节数组字符串,并对其进行Base64编码处理
        InputStream in = null;
        byte[] data = null;
        // è¯»å–图片字节数组
        try {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.encodeBase64String(data);
    }
    /**
     * å¯¹å­—节数组字符串进行Base64解码并生成图片
     * @param imgStr å›¾ç‰‡æ•°æ®
     * @param imgFilePath ä¿å­˜å›¾ç‰‡å…¨è·¯å¾„地址
     * @return
     */
    public static boolean generateImage(String imgStr, String imgFilePath) {
        //
        if (imgStr == null) // å›¾åƒæ•°æ®ä¸ºç©º
            return false;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// è°ƒæ•´å¼‚常数据
                    b[i] += 256;
                }
            }
            // ç”Ÿæˆjpg图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * è¿œç¨‹è¯»å–image转换为Base64字符串
     * @param imgUrl
     * @return
     */
    public static String Image2Base64(String imgUrl) {
        URL url = null;
        InputStream is = null;
        ByteArrayOutputStream outStream = null;
        HttpURLConnection httpUrl = null;
        try{
            url = new URL(imgUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();
            is = httpUrl.getInputStream();
            outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while( (len=is.read(buffer)) != -1 ){
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            // å¯¹å­—节数组Base64编码
            return new BASE64Encoder().encode(outStream.toByteArray());
        }catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(is != null)
            {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outStream != null)
            {
                try {
                    outStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(httpUrl != null)
            {
                httpUrl.disconnect();
            }
        }
        return null;
    }
    public static void main(String[] args) {
        String url= "http://doumeetest.oss-cn-beijing.aliyuncs.com/member/20210515/de923f81-b417-47fc-a702-472d60d7870a.png";// å¾…处理的图片
        String imgbese = Image2Base64(url);
        System.out.println(imgbese);
//        String url= "D:\\1.jpg";// æ–°ç”Ÿæˆçš„图片
//        generateImage(imgbese, url);
    }
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/MemberMapper.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.doumee.dao.admin.response.MemberInfoDTO;
import com.doumee.dao.business.model.CarEvent;
import com.doumee.dao.business.model.Member;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@@ -28,5 +29,5 @@
    IPage<MemberInfoDTO> getPage(IPage<MemberInfoDTO> page, @Param(Constants.WRAPPER) Wrapper wrapper);
    void insertBatchSomeColumn(List<Member> list);
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/join/EmpowerJoinMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.dao.business.join;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Empower;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface EmpowerJoinMapper extends MPJJoinMapper<Empower> {
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -22,95 +23,130 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码")
    @ExcelColumn(name="创建人编码")
    private String creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码")
    @ExcelColumn(name="更新人编码")
    private String edirot;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "预约标识", example = "1")
    @ExcelColumn(name="预约标识")
    private String hkId;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "人员编码", example = "1")
    @ExcelColumn(name="人员编码")
    private Integer memberId;
    @ApiModelProperty(value = "门禁有效期开始")
    @ExcelColumn(name="门禁有效期开始")
    private Date startTime;
    @ApiModelProperty(value = "门禁有效期结束", example = "1")
    @ExcelColumn(name="门禁有效期结束")
    private Date endTime;
    @ApiModelProperty(value = "导入状态", example = "1")
    @ExcelColumn(name="导入状态")
    private Integer importStatus;
    @ApiModelProperty(value = "导入备注")
    @ExcelColumn(name="导入备注")
    private String importInfo;
    @ApiModelProperty(value = "下发状态 0待下发 1已下发 2已取消", example = "1")
    @ExcelColumn(name="下发状态 0待下发 1已下发 2已取消")
    private Integer sendStatus;
    @ApiModelProperty(value = "下发类型 0实时 1定时 ", example = "1")
    @ExcelColumn(name="下发类型 0实时 1定时 ")
    private Integer sendType;
    @ApiModelProperty(value = "下发备注")
    @ExcelColumn(name="下发备注")
    private String sendInfo;
    @ApiModelProperty(value = "下发时间")
    @ExcelColumn(name="下发时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date sendDate;
    @ApiModelProperty(value = "下发人员", example = "1")
    @ExcelColumn(name="下发人员")
    private Integer sendUserId;
    @ApiModelProperty(value = "取消人员", example = "1")
    @ExcelColumn(name="取消人员")
    private Integer cancelUserId;
    @ApiModelProperty(value = "取消时间")
    @ExcelColumn(name="取消时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date cancelDate;
    @ApiModelProperty(value = "取消备注")
    @ExcelColumn(name="取消备注")
    private String cANCElInfo;
    @ApiModelProperty(value = "所属公司编码")
    @TableField(exist = false)
    private String companyId;
    @ApiModelProperty(value = "姓名")
    @ExcelColumn(name="姓名",index = 1)
    @TableField(exist = false)
    private String memberName;
    @ApiModelProperty(value = "手机号")
    @ExcelColumn(name="手机号" ,index = 2)
    @TableField(exist = false)
    private String memberPhone;
    @ApiModelProperty(value = "身份证")
    @ExcelColumn(name="身份证",index= 3)
    @TableField(exist = false)
    private String memberidCard;
    @ApiModelProperty(value = "所属公司")
    @ExcelColumn(name="所属公司",index= 4)
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "门禁有效期开始")
    @ExcelColumn(name="门禁有效期开始",index= 5,dateFormat = "yyyy-MM-dd")
    private Date startTime;
    @ApiModelProperty(value = "门禁有效期结束", example = "1")
    @ExcelColumn(name="门禁有效期结束",index= 6,dateFormat = "yyyy-MM-dd")
    private Date endTime;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间",index= 7,dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "操作人")
    @ExcelColumn(name="操作人",index= 7)
    @TableField(exist = false)
    private String createrName;
    @ApiModelProperty(value = "下发状态 0待下发 1已下发 2已取消", example = "1")
    @ExcelColumn(name="下发状态",index= 8,valueMapping ="0=待下发;1=已下发;2=已取消" )
    private Integer sendStatus;
    @ApiModelProperty(value = "下发类型 0实时 1定时 ", example = "1")
    @ExcelColumn(name="下发类型",index= 9,valueMapping ="0=实时;1=定时" )
    private Integer sendType;
    @ApiModelProperty(value = "下发时间")
    @ExcelColumn(name="下发时间",index= 10,dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date sendDate;
    @ApiModelProperty(value = "下发备注")
    @ExcelColumn(name="下发备注",index= 11)
    private String sendInfo;
    @ApiModelProperty(value = "下发开始时间")
    @TableField(exist = false)
    private String sendStartDate;
    @ApiModelProperty(value = "下发结束时间")
    @TableField(exist = false)
    private String sendEndDate;
    @ApiModelProperty(value = "时间段0,7,30")
    @TableField(exist = false)
    private Integer timeDn;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -106,9 +106,9 @@
    @ExcelColumn(name="工号")
    private String code;
    @ApiModelProperty(value = "班次")
    @ExcelColumn(name="班次")
    private String classes;
    @ApiModelProperty(value = "班次 0白班 1夜班")
    @ExcelColumn(name="班次 0白班 1夜班")
    private Integer classes;
    @ApiModelProperty(value = "状态 0正常 1禁用 2拉黑/冻结", example = "1")
    @ExcelColumn(name="状态 0正常 1禁用 2拉黑/冻结")
@@ -203,5 +203,7 @@
    @ApiModelProperty(value = "组织名称")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "组织海康编码")
    @TableField(exist = false)
    private String companyHkId;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java
@@ -59,4 +59,16 @@
    @ExcelColumn(name="角色编码(关联door_role)")
    private String roleId;
    @ApiModelProperty(value = "海康标识")
    @ExcelColumn(name="海康标识")
    private String hkId;
    @ApiModelProperty(value = "海康同步状态 0未同步 1已同步")
    @ExcelColumn(name="海康同步状态 0未同步 1已同步")
    private Integer hkStatus;
    @ApiModelProperty(value = "海康最近同步时间")
    @ExcelColumn(name="海康最近同步时间")
    private Date hkDate;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Retention.java
@@ -95,7 +95,7 @@
    @ApiModelProperty(value = "班次")
    @ExcelColumn(name="班次")
    private String classes;
    private Integer classes;
    @ApiModelProperty(value = "海康门禁名称")
    @ExcelColumn(name="海康门禁名称")
    private String deviceName;
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -218,8 +218,8 @@
    @ApiModelProperty(value = "普通访客申请随访人员")
    @TableField(exist = false)
    private List<Visits> withUserList;
    @ApiModelProperty(value = "班次")
    private String memberClasses;
//    @ApiModelProperty(value = "班次")
//    private String memberClasses;
    @ApiModelProperty(value = "类型 0劳务访客 1普通访客  2内部人员", example = "1")
    @TableField(exist = false)
@@ -232,6 +232,10 @@
    @ExcelColumn(name="被访人员姓名")
    @TableField(exist = false)
    private String receptMemberName;
    @ApiModelProperty(value = "被访人员海康编码", example = "1")
    @ExcelColumn(name="被访人员姓名")
    @TableField(exist = false)
    private String receptMemberHkId;
    @ApiModelProperty(value = "被访人员部门", example = "1")
    @ExcelColumn(name="被访人员部门")
@@ -248,4 +252,8 @@
    @TableField(exist = false)
    private List<Visits> visitsList;
    @ApiModelProperty(value = "超时时长", example = "1")
    @TableField(exist = false)
    private Integer timeOut;
}
server/dmvisit_service/src/main/java/com/doumee/service/business/HkSyncService.java
@@ -57,4 +57,7 @@
    void syncOrgData();
    void syncUserData();
    void syncVisitData();
    void syncEmpowerData();
}
server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
@@ -19,6 +19,7 @@
     * @return Integer
     */
    Integer create(Visits visits);
    Integer createFk(Visits visits);
    /**
@@ -88,6 +89,8 @@
     */
    PageData<Visits> findPage(PageWrap<Visits> pageWrap);
    PageData<Visits> retentionPage(PageWrap<Visits> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java
@@ -2,19 +2,31 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Date;
import com.doumee.core.utils.Utils;
import com.doumee.dao.admin.response.MemberInfoDTO;
import com.doumee.dao.business.EmpowerMapper;
import com.doumee.dao.business.join.EmpowerJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Empower;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.EmpowerService;
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.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Objects;
/**
 * äººå‘˜æŽˆæƒå¯¼å…¥è®°å½•Service实现
@@ -26,6 +38,10 @@
    @Autowired
    private EmpowerMapper empowerMapper;
    @Autowired
    private EmpowerJoinMapper empowerJoinMapper;
    @Override
    public Integer create(Empower empower) {
@@ -87,86 +103,46 @@
    @Override
    public PageData<Empower> findPage(PageWrap<Empower> pageWrap) {
        IPage<Empower> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Empower> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(Empower::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(Empower::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(Empower::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(Empower::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEdirot() != null) {
            queryWrapper.lambda().eq(Empower::getEdirot, pageWrap.getModel().getEdirot());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(Empower::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(Empower::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(Empower::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(Empower::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getHkId() != null) {
            queryWrapper.lambda().eq(Empower::getHkId, pageWrap.getModel().getHkId());
        }
        if (pageWrap.getModel().getSortnum() != null) {
            queryWrapper.lambda().eq(Empower::getSortnum, pageWrap.getModel().getSortnum());
        }
        if (pageWrap.getModel().getMemberId() != null) {
            queryWrapper.lambda().eq(Empower::getMemberId, pageWrap.getModel().getMemberId());
        }
        if (pageWrap.getModel().getStartTime() != null) {
            queryWrapper.lambda().eq(Empower::getStartTime, pageWrap.getModel().getStartTime());
        }
        if (pageWrap.getModel().getEndTime() != null) {
            queryWrapper.lambda().eq(Empower::getEndTime, pageWrap.getModel().getEndTime());
        }
        if (pageWrap.getModel().getImportStatus() != null) {
            queryWrapper.lambda().eq(Empower::getImportStatus, pageWrap.getModel().getImportStatus());
        }
        if (pageWrap.getModel().getImportInfo() != null) {
            queryWrapper.lambda().eq(Empower::getImportInfo, pageWrap.getModel().getImportInfo());
        }
        if (pageWrap.getModel().getSendStatus() != null) {
            queryWrapper.lambda().eq(Empower::getSendStatus, pageWrap.getModel().getSendStatus());
        }
        if (pageWrap.getModel().getSendType() != null) {
            queryWrapper.lambda().eq(Empower::getSendType, pageWrap.getModel().getSendType());
        }
        if (pageWrap.getModel().getSendInfo() != null) {
            queryWrapper.lambda().eq(Empower::getSendInfo, pageWrap.getModel().getSendInfo());
        }
        if (pageWrap.getModel().getSendDate() != null) {
            queryWrapper.lambda().ge(Empower::getSendDate, Utils.Date.getStart(pageWrap.getModel().getSendDate()));
            queryWrapper.lambda().le(Empower::getSendDate, Utils.Date.getEnd(pageWrap.getModel().getSendDate()));
        }
        if (pageWrap.getModel().getSendUserId() != null) {
            queryWrapper.lambda().eq(Empower::getSendUserId, pageWrap.getModel().getSendUserId());
        }
        if (pageWrap.getModel().getCancelUserId() != null) {
            queryWrapper.lambda().eq(Empower::getCancelUserId, pageWrap.getModel().getCancelUserId());
        }
        if (pageWrap.getModel().getCancelDate() != null) {
            queryWrapper.lambda().ge(Empower::getCancelDate, Utils.Date.getStart(pageWrap.getModel().getCancelDate()));
            queryWrapper.lambda().le(Empower::getCancelDate, Utils.Date.getEnd(pageWrap.getModel().getCancelDate()));
        }
        if (pageWrap.getModel().getCANCElInfo() != null) {
            queryWrapper.lambda().eq(Empower::getCANCElInfo, pageWrap.getModel().getCANCElInfo());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
        MPJLambdaWrapper<Empower> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Empower.class);
        queryWrapper.selectAs(Member::getName,Empower::getMemberName);
        queryWrapper.selectAs(Member::getPhone,Empower::getMemberPhone);
        queryWrapper.selectAs(Member::getIdcardNo,Empower::getMemberidCard);
        queryWrapper.selectAs(Company::getName,Empower::getCompanyName);
        queryWrapper.selectAs(SystemUser::getUsername,Empower::getCreaterName);
        queryWrapper.leftJoin(Member.class,Member::getId,Empower::getMemberId);
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Empower::getCreator);
        queryWrapper.eq(Empower::getIsdeleted, Constants.ZERO)
                .and(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()), ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
                .or().like(Member::getPhone,pageWrap.getModel().getCompanyName()));
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getSendStatus()),Empower::getSendStatus,pageWrap.getModel().getSendStatus());
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCompanyId()),Company::getId,pageWrap.getModel().getCompanyId());
        queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getSendStartDate()),Empower::getSendDate,pageWrap.getModel().getSendStartDate());
        queryWrapper.le(Objects.nonNull(pageWrap.getModel().getSendEndDate()),Empower::getSendDate,pageWrap.getModel().getSendEndDate());
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal=Calendar.getInstance();
        if(Objects.nonNull(pageWrap.getModel().getTimeDn())){
            if(Constants.equalsInteger(pageWrap.getModel().getTimeDn(),0)){
                String now=format.format(cal.getTime())+" :00:00:00";
                queryWrapper.ge(Empower::getSendDate,now);
            }
            if(Constants.equalsInteger(pageWrap.getModel().getTimeDn(),7)){
                cal.add(Calendar.DAY_OF_MONTH,-7);
                queryWrapper.ge(Empower::getSendDate,cal.getTime());
            }
            if(Constants.equalsInteger(pageWrap.getModel().getTimeDn(),30)){
                cal.add(Calendar.DAY_OF_MONTH,-30);
                queryWrapper.ge(Empower::getSendDate,cal.getTime());
            }
        }
        return PageData.from(empowerMapper.selectPage(page, queryWrapper));
        queryWrapper.orderByDesc(Empower::getCreateDate);
        IPage<Empower> result = empowerJoinMapper.selectJoinPage(page, Empower.class,queryWrapper);
        return PageData.from(result);
    }
    @Override
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -524,19 +524,23 @@
        if (!CollectionUtils.isEmpty(memberIPage.getRecords())){
            memberIPage.getRecords().forEach(s->s.setSex(IdcardUtil.getGenderByIdCard(s.getIdcardDecode())));
        }*/
        IPage<MemberInfoDTO> memberIPage = memberMapper.getPage(pageWrap.toPage(),new QueryWrapper<MemberInfoDTO>()
                .in(Objects.nonNull(pageWrap.getModel().getCompanyIds())&&pageWrap.getModel().getCompanyIds().size()>0,"m.COMPANY_ID",pageWrap.getModel().getCompanyIds())
                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyWords()),ms->ms.like("m.ohone",pageWrap.getModel().getKeyWords())
                        .or().like("m.name",pageWrap.getModel().getKeyWords())
                        .or().like("m.code",pageWrap.getModel().getKeyWords()))
                .isNull(Constants.equalsInteger(pageWrap.getModel().getHasFace(),Constants.ZERO),"m.FACE_ID")
                .isNotNull(Constants.equalsInteger(pageWrap.getModel().getHasFace(),Constants.ONE),"m.FACE_ID")
                .eq(Objects.nonNull(pageWrap.getModel().getCanVisit()),"m.CAN_VISIT",pageWrap.getModel().getCanVisit())
                .eq(Objects.nonNull(pageWrap.getModel().getStatus()),"m.CAN_VISIT",pageWrap.getModel().getStatus())
                .eq("m.ISDELETED",0)
                .orderByDesc("m.CREATE_DATE")
        );
        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Member.class);
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.in(Objects.nonNull(pageWrap.getModel().getCompanyIds())&&pageWrap.getModel().getCompanyIds().size()>0,Member::getCompanyId,pageWrap.getModel().getCompanyIds())
                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyWords()),ms->ms.like(Member::getPhone,pageWrap.getModel().getKeyWords())
                        .or().like(Member::getName,pageWrap.getModel().getKeyWords())
                        .or().like(Member::getCode,pageWrap.getModel().getKeyWords()))
                .isNull(Constants.equalsInteger(pageWrap.getModel().getHasFace(),Constants.ZERO),Member::getFaceId)
                .isNotNull(Constants.equalsInteger(pageWrap.getModel().getHasFace(),Constants.ONE),Member::getFaceId)
                .eq(Objects.nonNull(pageWrap.getModel().getCanVisit()),Member::getCanVisit,pageWrap.getModel().getCanVisit())
                .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Member::getCanVisit,pageWrap.getModel().getStatus())
                .eq(Member::getIsdeleted,0)
                .orderByDesc(Member::getCreateDate);
        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
        return PageData.from(memberIPage);
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -3,7 +3,11 @@
import cn.hutool.core.util.IdcardUtil;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.erp.ErpConstants;
import com.doumee.core.erp.ErpTool;
import com.doumee.core.erp.model.openapi.request.erp.ApproveAddRequest;
import com.doumee.core.erp.model.openapi.request.erp.UserInfoRequest;
import com.doumee.core.erp.model.openapi.response.erp.ApproveInfoResponse;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.HKTools;
@@ -32,6 +36,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -40,6 +45,7 @@
import org.springframework.util.DigestUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
 * è®¿å®¢ç”³è¯·ä¿¡æ¯è¡¨Service实现
@@ -86,7 +92,7 @@
        //获取申请的海康访问门禁组信息
        String[] hkIds = getHkDeviceRoles(visits);
        //检验拜访人是否合法
        isValideVisitedUser(visits.getReceptMemberId());
        Member visitMember = isValideVisitedUser(visits.getReceptMemberId());
        if(Constants.equalsInteger(Constants.ZERO, visits.getIdcardType()) &&!IdcardUtil.isValidCard(visits.getIdcardNo())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,身份证号码有误,请核实后重试!");
        }
@@ -96,9 +102,9 @@
        //初始化访客信息
        initVisitInfo(visits,date);
        //发起ERP审批申请
        String erpid = startSendErpCheck(visits);
        if(StringUtils.isNotBlank(erpid)){
            visits.setErpId(erpid);
        String erpId = startSendErpCheck(visits,visitMember);
        if(StringUtils.isNotBlank(erpId)){
            visits.setErpId(erpId);
        }else{
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,发起拜访审批申请失败!");
        }
@@ -196,9 +202,43 @@
        visits.setCreateDate(date);
    }
    private String startSendErpCheck(Visits visits) {
        //TODO ------------RK--------------
//        ErpTool.submitApprove()
    private String startSendErpCheck(Visits visits,Member visitMember) {
        ApproveAddRequest param = new ApproveAddRequest();
        List<Visits> withUserVisitsList = visits.getWithUserList();
        List<UserInfoRequest> withUserList = new ArrayList<>();
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(withUserVisitsList)){
            for (Visits v:withUserVisitsList) {
                UserInfoRequest userInfoRequest = new UserInfoRequest();
                userInfoRequest.setName(v.getName());
                userInfoRequest.setIdNo(v.getIdcardNo());
                userInfoRequest.setSex(v.getSex());
                userInfoRequest.setPhone(v.getPhone());
                userInfoRequest.setFaceImg(v.getFaceImg());
                userInfoRequest.setHealthImg(v.getImgurl());
                withUserList.add(userInfoRequest);
            }
            param.setWithUserList(withUserList);
        }
        param.setId(visits.getId());
        param.setBeVisitedUserId(visitMember.getErpId());
        param.setVisitorWorkUint(visits.getCompanyName());
        param.setPurpose(visits.getReason());
        param.setStartTime(DateUtil.getDate(visits.getStarttime(),"yyyy-MM-dd HH:mm:ss"));
        param.setEndTime(DateUtil.getDate(visits.getEndtime(),"yyyy-MM-dd HH:mm:ss"));
        if(StringUtils.isNotBlank(visits.getCarNos())){
            param.setCarNo(Arrays.asList(visits.getCarNos().split(",")));
        }
        if(StringUtils.isNotBlank(visits.getDoors())){
             List<DeviceRole> deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda().in(DeviceRole::getId,Arrays.asList(visits.getDoors().split(","))));
             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(deviceRoleList)){
                 param.setRoleIds(deviceRoleList.stream().map(m->m.getId()).collect(Collectors.toList()));
                 param.setRoleNames(deviceRoleList.stream().map(m->m.getName()).collect(Collectors.toList()));
             }
        }
        ApproveInfoResponse response = ErpTool.submitApprove(ErpConstants.approveUrl,param);
        if(!Objects.isNull(response)){
            return response.getId().toString();
        }
        return  null;
    }
@@ -525,4 +565,33 @@
        QueryWrapper<Visits> wrapper = new QueryWrapper<>(visits);
        return visitsMapper.selectCount(wrapper);
    }
    @Override
    public PageData<Visits> retentionPage(PageWrap<Visits> pageWrap) {
        IPage<Visits> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Visits.class);
        queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName);
        queryWrapper.select("TIMESTAMPDIFF(MINUTE,t.ENDTIME , NOW()) AS timeOut");
        queryWrapper.selectAs(Member::getType,Visits::getMemberType);
        queryWrapper.selectAs(Company::getName,Visits::getReceptMemberDepartment);
        queryWrapper.leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.eq(Visits::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Visits::getType,pageWrap.getModel().getType());
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Visits::getPhone,pageWrap.getModel().getName())
                .or().like(Visits::getPhone,pageWrap.getModel().getName()))
                .eq(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Visits::getIdcardNo,StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()))
                .eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Visits::getCompanyName,pageWrap.getModel().getCompanyName())
                .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Visits::getStatus,pageWrap.getModel().getStatus());
        queryWrapper.isNull(Visits::getOutDate);
        queryWrapper.orderByDesc(Visits::getEditDate);
        IPage<Visits> result = visitsJoinMapper.selectJoinPage(page, Visits.class,queryWrapper);
        return PageData.from(result);
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -251,17 +251,127 @@
        return  null;
    }
    /**
     * åŒæ­¥ERP人员信息
     * @param param
     * @return
     */
    @Override
    public    String syncUsers(UserListRequest param){
        //TODO----------------RK------------------
        List<UserListRespone>  allList = ErpTool.getErpUserList(ErpConstants.userListUrl,param);
    public  String syncUsers(UserListRequest param){
        List<UserListRespone>  list = ErpTool.getErpUserList(ErpConstants.userListUrl,param);
        if(list !=null && list.size()>0) {
            List<Member> addList = new ArrayList<>();
            List<Member> updateList = new ArrayList<>();
            List<Integer> delIds = new ArrayList<>();
            List<Member> allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .eq(Member::getType, Constants.memberType.internal));
            dealUserChangeList(list,addList,updateList,delIds,allList);
            if(addList.size()>0){
                memberMapper.insertBatchSomeColumn(addList);
            }
            if(updateList.size()>0){
                for(Member c : updateList){
                    memberMapper.updateById(c);
                }
            }
            if(delIds.size()>0){
                //删除所有需要删除的组织信息(逻辑删除)
                memberMapper.update(null,new UpdateWrapper<Member>().lambda().set(Member::getHkStatus,Constants.ZERO)
                        .set(Member::getIsdeleted, Constants.ONE).in(Member::getId,delIds));
            }
        }else{
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步ERP数据为空!");
        }
        return  null;
    }
    private void dealUserChangeList(List<UserListRespone> list, List<Member> addList, List<Member> updateList, List<Integer> delIds, List<Member> allList) {
        Date date = new Date();
        for(UserListRespone response : list){
            //根据 erpId æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯ï¼Œåˆ¤æ–­æ˜¯æ–°å¢žè¿˜æ˜¯æ›´æ–°
            Member member = findUserByERPId(allList,response.getId());
            if(member == null){
                //如果是新增
                if(Constants.formatIntegerNum(response.getIsdeleted()) == Constants.ONE){
                    continue;
                }
                //封装新增组织对象数据
                addList.add(getAddMemberModel(response,date));
            }else{
                //如果是更新
                if(Constants.formatIntegerNum(response.getIsdeleted()) == Constants.ONE){
                    //如果已删除,加入删除集合中
                    delIds.add(member.getId());
                    continue;
                }
                updateList.add(addUpdateMemberModel(response,member,date));
            }
        }
        if(allList!=null && allList.size()>0){
            for(Member  c : allList){
                if(isUserDeleted(c,list)){
                    delIds.add(c.getId());
                }
            }
        }
    }
    private Member getAddMemberModel(UserListRespone param, Date date) {
        Member member = new Member();
        BeanUtils.copyProperties(param,member);
        member.setCreateDate(new Date());
        member.setHkStatus(Constants.ZERO);
        member.setErpStatus(Constants.ONE);
        member.setErpDate(new Date());
        member.setErpId(param.getId());
        member.setFsStatus(Constants.ZERO);
        member.setType(Constants.memberType.internal);
        String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,param.getIdNo());
        member.setIdcardNo(encryptIdNo);
        member.setIdcardDecode(Constants.getTuominStr(param.getIdNo()));
        member.setCompanyId(param.getOrgId());
        member.setHkStatus(Constants.ZERO);
        return  member;
    }
    private Member addUpdateMemberModel(UserListRespone param,Member member,Date date) {
        BeanUtils.copyProperties(param,member);
        String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,param.getIdNo());
        member.setIdcardNo(encryptIdNo);
        member.setIdcardDecode(Constants.getTuominStr(param.getIdNo()));
        member.setCompanyId(param.getOrgId());
        member.setEditDate(new Date());
        member.setErpDate(new Date());
        member.setHkStatus(Constants.ZERO);
        return  member;
    }
    private boolean isUserDeleted(Member c, List<UserListRespone> list) {
        for(UserListRespone m : list){
            if(StringUtils.equals(c.getErpId(),m.getId().toString())){
                return  true;
            }
        }
        return false;
    }
    private Member findUserByERPId(List<Member> allList, String id) {
        if(allList!=null){
            for(Member com :allList){
                if(StringUtils.equals(com.getErpId(),id)){
                    return com;
                }
            }
        }
        return  null;
    }
    /**
@@ -572,21 +682,29 @@
            Company company = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,param.getId()).last("limit 1"));
            if(Objects.isNull(company)){
                company = new Company();
                BeanUtils.copyProperties(param,company);
//                BeanUtils.copyProperties(param,company);
                company.setId(null);
                company.setCreateDate(new Date());
                company.setHkStatus(Constants.ZERO);
                company.setErpStatus(Constants.ONE);
                company.setErpDate(new Date());
                company.setErpId(param.getId());
                company.setErpParentId(param.getParentId());
                company.setFsStatus(Constants.ZERO);
                company.setType(Constants.ONE);
                company.setLinkName(param.getLinkName());
                company.setLinkPhone(param.getLinkPhone());
                companyMapper.insert(company);
                //TODO æµ·åº·æ•°æ®åˆ›å»º
            }else{
                BeanUtils.copyProperties(param,company);
//                BeanUtils.copyProperties(param,company);
                company.setEditDate(new Date());
                company.setErpId(param.getId());
                company.setHkStatus(Constants.ZERO);
                company.setErpDate(new Date());
                company.setErpParentId(param.getParentId());
                company.setLinkName(param.getLinkName());
                company.setLinkPhone(param.getLinkPhone());
                companyMapper.updateById(company);
                //TODO æµ·åº·æ•°æ®æ›´æ–°
            }
@@ -632,7 +750,6 @@
                member.setIdcardDecode(Constants.getTuominStr(param.getIdNo()));
                member.setCompanyId(param.getOrgId());
                memberMapper.insert(member);
                //TODO æµ·åº·æ•°æ®åˆ›å»º
            }else{
                BeanUtils.copyProperties(param,member);
@@ -711,6 +828,7 @@
                visitsList.forEach(i->{
                    i.setStatus(param.getStatus().equals(Constants.ZERO)?Constants.VisitStatus.pass:Constants.VisitStatus.noPass);
                    i.setEndCheckDate(DateUtil.StringToDate(param.getApproveDate(),"yyyy-MM-dd HH:mm:ss"));
                    i.setHkStatus(Constants.ZERO);
                    visitsMapper.updateById(i);
                });
            }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -79,5 +79,11 @@
    @Override
    public  void syncOrgData( ){
    }
    @Override
    public  void  syncVisitData() {
    }
    @Override
    public  void syncEmpowerData() {
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncEmpowerServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.doumee.service.business.impl.hksync;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.VisitAppointmentRequest;
import com.doumee.core.haikang.model.param.respose.VisitAppointmentResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.join.EmpowerJoinMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.Empower;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
 * æµ·åº·é—¨ç¦æŽˆæƒä¸šåŠ¡Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncEmpowerServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private EmpowerJoinMapper empowerJoinMapper;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public  void syncEmpowerData(){
        if(Constants.DEALING_HK_EMPOWER){
            return   ;
        }
        Constants.DEALING_HK_EMPOWER =true;
        try {
            //查询所有需要同步的企业数据
            MPJLambdaWrapper<Empower> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAll(Empower.class);
            queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName)
                        .select("t1.hk_id as receptMemberHkId")
                        .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
            queryWrapper.eq(Visits::getStatus,Constants.VisitStatus.pass)//审批通过
                    .eq(Visits::getHkStatus,Constants.ZERO)//未同步到海康
                    .orderByAsc(Visits::getCreateDate);
            List<Empower> list = empowerJoinMapper.selectJoinList(Empower.class,queryWrapper);
            if(list ==null || list.size()==0){
                return;
            }
            Date date = new Date();
            for(Empower c : list) {
                //删除的数据,进行删除
                VisitAppointmentRequest request = new VisitAppointmentRequest();
                BaseResponse<VisitAppointmentResponse> response = HKService.visitAppiontment(request);
                if (response != null
                        && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)
                        &&response.getData()!=null
                        &&StringUtils.isNotBlank(response.getData().getAppointRecordId())) {
                    //海康下发成功
                    c.setHkId( response.getData().getAppointRecordId());//预约标识
                } else {
                    //海康下发成功
                }
                empowerJoinMapper.updateById(c);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_EMPOWER =false;
        }
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
@@ -4,26 +4,28 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.HKTools;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.OrgAddRequest;
import com.doumee.core.haikang.model.param.request.OrgDelRequest;
import com.doumee.core.haikang.model.param.request.ParkListRequest;
import com.doumee.core.haikang.model.param.respose.OrgOrUserAddResponse;
import com.doumee.core.haikang.model.param.respose.OrgOrUserAddSuccessResponse;
import com.doumee.core.haikang.model.param.respose.OrgUpdateFailureResponse;
import com.doumee.core.haikang.model.param.respose.ParkListResponse;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ImageBase64Util;
import com.doumee.dao.business.CompanyMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ParksMapper;
import com.doumee.dao.business.join.CompanyJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Parks;
import com.doumee.service.business.ERPSyncService;
import com.github.yulichang.query.MPJQueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
@@ -35,21 +37,24 @@
import java.util.UUID;
/**
 * æµ·åº·åœè½¦åº“同步Service实现
 * æµ·åº·ç»„织人员通过步Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncOrgUserServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private ERPSyncService erpSyncService;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息
     * @return
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public   void syncOrgData(){
@@ -64,7 +69,7 @@
                    .select("*,(select b.hk_id from company b where company.erp_parent_id = b.id limit 1) as hkParentId")
                    .lambda()
                    .eq(Company::getHkStatus,Constants.ZERO)
                    .orderByDesc(Company::getErpDate));
                    .orderByAsc(Company::getErpDate));
            if(list ==null || list.size()==0){
                return;
            }
@@ -124,6 +129,7 @@
     */
    private void doHkAddOrg(List<Company> updateList, List<OrgAddRequest> addList) {
        Date date = new Date();
        BaseResponse<OrgOrUserAddResponse> result =  HKService.addBatchOrg(addList);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            OrgOrUserAddResponse data = result.getData();
@@ -156,10 +162,10 @@
    private OrgAddRequest getOrgAddModel(Company c,String rootOrgId) {
        OrgAddRequest model = new OrgAddRequest();
        model.setOrgIndexCode(HKConstants.RES_INDEX+UUID.randomUUID().toString());
        model.setOrgIndexCode(HKConstants.RES_ORG_INDEX+UUID.randomUUID().toString().replace("-",""));
        model.setOrgName(c.getName());
        model.setOrgCode(c.getCode());
        model.setOrgIndexCode(c.getHkParentId());
//        model.setOrgCode(c.getCode());
        model.setParentIndexCode(c.getHkParentId());
        return  model;
    }
@@ -170,14 +176,20 @@
     * @param date
     */
    private void doHkDeleteOrg(List<Integer> delIds,List<String> delHkIds,  Date date) {
       if(delHkIds.size() == 0){
           return;
       }
        OrgDelRequest request = new OrgDelRequest();
        request.setIndexCodes((String[]) delHkIds.toArray());
        request.setIndexCodes( delHkIds.toArray(new String[]{}));
        BaseResponse<List<OrgUpdateFailureResponse>> result =  HKService.delBatchOrg(request);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            List<String> fIds = new ArrayList<>();
            if(result.getData()!=null){
                for(OrgUpdateFailureResponse r : result.getData()){
                    fIds.add(r.getOrgIndexCode());//删除失败的数据集合
                    if(!r.getCode().equals("0x00072001")){
                        //不存在的也算删除成功
                        fIds.add(r.getOrgIndexCode());//删除失败的数据集合
                    }
                }
            }
            //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕)
@@ -195,7 +207,133 @@
     */
    @Override
    public   void syncUserData(){
        if(Constants.DEALING_HK_USER){
            return   ;
        }
        Constants.DEALING_HK_USER =true;
        try {
            //查询所有需要同步的企业数据
            List<Member> list = memberMapper.selectList(new QueryWrapper<Member>()
                    .lambda()
                    .eq(Member::getHkStatus,Constants.ZERO)
                    .orderByAsc(Member::getErpDate));
            if(list ==null || list.size()==0){
                return;
            }
            Date date = new Date();
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            for(Member c : list){
                if( c.getCompanyId() == null){
                    //如果没有组织不做处理
                    continue;
                }
                UserAddRequest  addHkModel = new UserAddRequest();
                if(StringUtils.isBlank(c.getHkId())){
                    //如果新增同步數據
                    if(Constants.equalsInteger(Constants.ONE,c.getIsdeleted())){
                        //删除的组织,不做处理,海康状态更新为不处理,下次不再处理这个记录
                        c.setHkStatus(Constants.TWO);
                        memberMapper.updateById(c);
                        continue ;
                    }
                    addHkModel = getUserAddModel(c,path);
                    c.setHkId(addHkModel.getPersonId());
                }else{
                    //删除海康原有的数据,再新增组织
                    addHkModel = getUserAddModel(c,path);
                    c.setHkId(addHkModel.getPersonId());
                }
                if(addHkModel == null){
                    //如果人脸数据不正确,下载失败等原因
                    noticeErpFail(c,Constants.ZERO,"人脸照片不存在,获取失败!");
                    continue;
                }
                //处理删除数据(删除之前下发的海康人员信息,然后新增)
                doHkDeleteUser(c.getId(),c.getHkId(),date);
                //处理新增数据
                BaseResponse<UserAddResponse> result =  HKService.addUser(addHkModel);
                if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE) && result.getData()!=null){
                    c.setFaceId(result.getData().getFaceId());
                    memberMapper.updateById(c);
                }else{
                    noticeErpFail(c,Constants.ZERO,"人员信息同步安防平台失败,请修正后重试!"+result.getCode()+result.getMsg());
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_USER =false;
        }
    }
    /**
     * é€šçŸ¥erp系统,人员下发同步信息状态失败
     * @param c
     * @param type
     * @param s
     */
    private void noticeErpFail(Member c, int type, String s) {
        UserFailRequest r = new UserFailRequest();
        r.setUserId(c.getErpId());
        r.setInfo(s);
        r.setType(type);
        //通知ERP人脸数据不正确
        erpSyncService.noticeUserFail(r);
    }
    /**
     * å¯¹æµ·åº·åˆ é™¤ç»„织信息
     * @param id
     * @param date
     */
    private void doHkDeleteUser(Integer  id,String delHkIds,  Date date) {
        if(StringUtils.isBlank(delHkIds)){
            return;
        }
        UserDelRequest request = new UserDelRequest();
        request.setPersonIds(new String[]{delHkIds});
        BaseResponse<List<UserDelResponse>> result =  HKService.delBatchUser(request);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            List<String> fIds = new ArrayList<>();
            if(result.getData()!=null && result.getData().size()>0){
                log.info("海康删除用户失败:==============="+result.getData().get(0).getPersonId());
               /*   for(UserDelResponse r : result.getData()){
                  if(!r.getCode().equals("0x00072001")){
                        //不存在的也算删除成功
                         fIds.add(r.getPersonId());//删除失败的数据集合
                    }
                }}*/
            }else{
                //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕)
                companyMapper.update(null,new UpdateWrapper<Company>().lambda()
                        .set(Company::getHkStatus,Constants.ONE)
                        .set(Company::getHkDate,date)
                        .in(Company::getId, id));
            }
        }
    }
    private UserAddRequest getUserAddModel(Member c,String path) {
        UserAddRequest model = new UserAddRequest();
        model.setOrgIndexCode(c.getCompanyHkId());
        model.setPersonId(HKConstants.RES_USER_INDEX+UUID.randomUUID().toString().replace("-", ""));
        model.setGender(Constants.formatIntegerNum(c.getSex())+"");
        model.setPersonName(c.getName());
        if(StringUtils.isNotBlank(c.getFaceImg())){
            model.setFaces(new ArrayList<>());
            UserAddFaceRequest face = new UserAddFaceRequest();
            String imageBase = ImageBase64Util.Image2Base64(path+c.getFaceImg());
            if(face.getFaceData() == null){
                //人脸数据不正确,
                return  null;
            }
            model.getFaces().add(face);
        }
        return  model;
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -368,7 +368,7 @@
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        retention.setClasses(visits.getMemberClasses());
        retention.setClasses(visits.getClasses());
        retention.setCode(visits.getCode());
        retention.setIdcardNo(visits.getIdcardNo());
        retention.setIdcardDecode(visits.getIdcardDecode());
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,220 @@
package com.doumee.service.business.impl.hksync;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ImageBase64Util;
import com.doumee.dao.business.CompanyMapper;
import com.doumee.dao.business.DeviceRoleMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.DeviceRole;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.doumee.service.business.ERPSyncService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
 * æµ·åº·è®¿å®¢ä¸šåŠ¡Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncVisitServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private DeviceRoleMapper deviceRoleMapper;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public  void syncVisitData(){
        if(Constants.DEALING_HK_VISIT){
            return   ;
        }
        Constants.DEALING_HK_VISIT =true;
        List<DeviceRole> roleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                .eq(DeviceRole::getType, Constants.ONE));
        //标记是否走免登记预约
        String applyType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_VISIT_REQUIRED).getCode();
        String applyLwType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_LW_REQUIRED).getCode();
        try {
            //查询所有需要同步的数据
            List<Visits> alllist = getVisitList();
            //按照父级申请分批处理每次申请数据
            List<Visits> list = getParentList(alllist);
            if(list ==null || list.size()==0){
                return;
            }
            Date date = new Date();
            for(Visits c : list) {
                //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段
                String type = Constants.equalsInteger(c.getType(),Constants.ONE)?applyType:applyLwType;
                getUpdateModelByResponse(c,date,type,roleList);
                visitsMapper.updateById(c);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_VISIT =false;
        }
    }
    private List<Visits> getParentList(List<Visits> alllist) {
        if(alllist ==null || alllist.size()==0){
            return null;
        }
        List<Visits> list = new ArrayList<>();
        for (Visits v : alllist){
            if(v.getParentId() == null){
                v.setVisitsList(getChildListByParentId(v.getId(),alllist));
                list.add(v);
            }
        }
        return  list;
    }
    private List<Visits> getChildListByParentId(Integer id, List<Visits> alllist) {
        List<Visits> list = new ArrayList<>();
        for (Visits v : alllist){
            if(Constants.equalsInteger(v.getParentId(),id)){
                list.add(v);
            }
        }
        return  list;
    }
    /**
     * æ ¹æ®é¢„约返回接口封装申请记录更新字段
     * @param c
     * @param date
     * @param type 0需要登记 1免登记
     */
    private void getUpdateModelByResponse(  Visits c,Date date,String type,List<DeviceRole> roleList ) {
        String code = null;
        String id = null;
        //发起海康预约接口
        if(StringUtils.equals(type,"0")){
            //(需要登记)
            BaseResponse<VisitAppointmentResponse> response =  HKService.visitAppiontment(getHkRequestPara(c,roleList));
        }else{
            //免登记
            BaseResponse<VisitAppointmentMDJResponse> response = HKService.visitAppiontmentMDJ(getHkMDJRequestPara(c) );
        }
        if (code!= null && id!=null) {
            //海康下发成功
            c.setHkId( id);//预约标识
            c.setStatus(Constants.VisitStatus.xfSuccess);//下发海康成功
        } else {
            //海康下发成功
            c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败
        }
        c.setHkStatus(Constants.ONE);
        c.setHkDate(date);
    }
    private VisitAppointmentMDJRequest getHkMDJRequestPara(Visits c) {
        return  null;
    }
    private VisitAppointmentRequest getHkRequestPara(Visits c,List<DeviceRole> roleList ) {
        VisitAppointmentRequest request = new VisitAppointmentRequest();
        request.setVisitStartTime(DateUtil.getISO8601Timestamp(c.getStarttime()));
        request.setVisitEndTime(DateUtil.getISO8601Timestamp(c.getEndtime()));
        request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码
        request.setVisitPurpose(c.getReason());
        request.setVisitorPermissionSet(new VisitAppointmentPermissonRequest());
        //获取权限组集合
        String[] roles = getHkRoles(c.getDoors(),roleList);
        if(roles==null || roles.length ==0){
            //使用默认访客权限组
            request.getVisitorPermissionSet().setDefaultPrivilegeGroupFlag(Constants.ONE+"");
        }else{
            //指定有效海康访客权限组数据
            request.getVisitorPermissionSet().setDefaultPrivilegeGroupFlag(Constants.ZERO+"");
            request.getVisitorPermissionSet().setPrivilegeGroupIds(roles);
        }
        List<VisitAppointmentVistorRequest> infolist = new ArrayList<>();
        //申请人
        infolist.add(getRequestInfoByVisit(c));
        if(c.getVisitsList() != null){
            //随访人
            for(Visits v : c.getVisitsList()){
                infolist.add(getRequestInfoByVisit(v));
            }
        }
        request.setVisitorInfoList(infolist);
        return  request;
    }
    private VisitAppointmentVistorRequest getRequestInfoByVisit(Visits c) {
        VisitAppointmentVistorRequest info = new VisitAppointmentVistorRequest();
        info.setVisitorName(c.getName());
        info.setVisitorWorkUnit(c.getCompanyName());
        info.setPhoneNo(c.getPhone());
        return info;
    }
    private String[] getHkRoles(String doors, List<DeviceRole> roleList) {
        if(StringUtils.isBlank(doors) || roleList.size()==0|| roleList.size()==0){
            return null;
        }
        String[] ids = doors.split(",");
        List<String> roles = new ArrayList<>();
        for (String s : ids){
            for(DeviceRole r : roleList){
                if(StringUtils.isNotBlank(r.getHkId()) && StringUtils.equals(s,r.getId().toString())){
                    roles.add(r.getHkId());
                }
            }
        }
        return  roles.toArray(new String[]{});
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰éœ€è¦åŒæ­¥çš„æ•°æ®
     * @return
     */
    private List<Visits> getVisitList() {
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Visits.class);
        queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName)
                .select("t1.hk_id as receptMemberHkId")
                .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
        queryWrapper.eq(Visits::getStatus,Constants.VisitStatus.pass)//审批通过
                .eq(Visits::getHkStatus,Constants.ZERO)//未同步到海康
                .orderByAsc(Visits::getCreateDate);
        List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper);
        return list;
    }
}
server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
@@ -7,11 +7,13 @@
import com.doumee.dao.web.response.MemberVO;
import com.doumee.dao.web.response.WxAuthorizeVO;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.VisitsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -34,6 +36,9 @@
    @Autowired
    private MemberService memberService;
    @Autowired
    private VisitsService visitsService;
    @ApiOperation(value = "访客微信授权", notes = "访客微信授权获取openId")
    @GetMapping("/wxAuthorize")