From 8439887c903fa52560af52b40e12a1baa8a123d3 Mon Sep 17 00:00:00 2001
From: zhanghua <314079846@qq.com>
Date: 星期三, 05 七月 2023 10:27:43 +0800
Subject: [PATCH] 代码合并

---
 ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java                               |  106 ++
 ycl-common/src/main/java/com/ycl/service/depart/impl/DepartManagerServiceImpl.java       |   11 
 ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java                                |    2 
 ycl-platform/src/main/java/com/ycl/timer/GetDingUserOrgTimer.java                        |  209 +++++
 ycl-common/src/main/java/com/ycl/service/user/impl/UmsRoleServiceImpl.java               |    6 
 ycl-platform/src/main/java/com/ycl/vo/NewAddressBookVO.java                              |   19 
 ycl-common/src/main/java/com/ycl/entity/user/UmsRole.java                                |    2 
 ycl-platform/pom.xml                                                                     |    7 
 ycl-platform/src/main/java/com/ycl/vo/casePool/ViolationsVO.java                         |    8 
 ycl-platform/src/main/java/com/ycl/vo/AddressBookVO.java                                 |   27 
 ycl-platform/src/main/java/com/ycl/dto/casePool/ViolationParam.java                      |    9 
 ycl-platform/src/main/java/com/ycl/service/message/impl/MessageServiceImpl.java          |   24 
 ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java              |   24 
 ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml                    |   17 
 ycl-platform/src/main/resources/mapper/BookRemarkMapper.xml                              |   47 +
 ycl-platform/src/main/java/com/ycl/common/constant/DingConst.java                        |   90 ++
 ycl-platform/src/main/java/com/ycl/controller/caseHandler/BaseCaseController.java        |  105 ++
 ycl-platform/src/main/java/com/ycl/config/DingConfig.java                                |   32 
 ycl-platform/src/main/java/com/ycl/service/ding/impl/DingServiceImpl.java                |  199 +++++
 ycl-platform/src/main/java/com/ycl/controller/dingding/DingController.java               |   99 ++
 ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java                |    3 
 ycl-platform/src/main/java/com/ycl/service/auth/AuthService.java                         |   12 
 ycl-platform/src/main/java/com/ycl/controller/message/MessageController.java             |   10 
 ycl-platform/src/main/java/com/ycl/entity/caseHandler/DispatchInfo.java                  |    8 
 ycl-platform/src/main/java/com/ycl/dto/casePool/IllegalBuildingParam.java                |   25 
 ycl-common/src/main/java/com/ycl/service/user/UmsAdminService.java                       |    3 
 ycl-platform/src/main/java/com/ycl/service/message/IMessageService.java                  |    2 
 ycl-common/src/main/java/com/ycl/entity/depart/UmsDepart.java                            |   10 
 ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java                       |  618 ++++++++++++++++
 ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCase.java                      |    8 
 ycl-platform/src/main/java/com/ycl/service/ding/impl/BookRemarkServiceImpl.java          |   47 +
 ycl-platform/src/main/java/com/ycl/service/resources/IImageResourcesService.java         |    9 
 ycl-platform/src/main/java/com/ycl/entity/dingding/DingUserInfo.java                     |  111 ++
 ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java             |    5 
 ycl-common/src/main/java/com/ycl/service/user/UmsRoleService.java                        |    4 
 ycl-common/src/main/java/com/ycl/service/depart/IDepartManagerService.java               |   10 
 ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCaseDetail.java                |    1 
 ycl-platform/src/main/java/com/ycl/entity/ding/BookRemark.java                           |   58 +
 ycl-platform/src/main/java/com/ycl/mapper/ding/BookRemarkMapper.java                     |   19 
 ycl-platform/src/main/java/com/ycl/service/ding/DingService.java                         |   20 
 ycl-platform/src/main/java/com/ycl/entity/cockpitManage/TeamIndex.java                   |    1 
 ycl-platform/src/main/java/com/ycl/common/dingding/DingEncodeUtil.java                   |   30 
 ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java     |   43 
 ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java                               |    3 
 ycl-platform/src/main/java/com/ycl/service/auth/impl/AuthService.java                    |   90 ++
 ycl-platform/src/main/java/com/ycl/service/ding/BookRemarkService.java                   |   26 
 ycl-platform/src/main/java/com/ycl/service/resources/impl/ImageResourcesServiceImpl.java |   22 
 ycl-platform/src/main/java/com/ycl/vo/ContactVO.java                                     |   37 
 48 files changed, 2,234 insertions(+), 44 deletions(-)

diff --git a/ycl-common/src/main/java/com/ycl/entity/depart/UmsDepart.java b/ycl-common/src/main/java/com/ycl/entity/depart/UmsDepart.java
index a120182..0ea8787 100644
--- a/ycl-common/src/main/java/com/ycl/entity/depart/UmsDepart.java
+++ b/ycl-common/src/main/java/com/ycl/entity/depart/UmsDepart.java
@@ -32,8 +32,14 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    @ApiModelProperty("閮ㄩ棬缂栫爜")
+    private String code;
+
     @ApiModelProperty("閮ㄩ棬鍚嶇О")
     private String departName;
+
+    @ApiModelProperty("鎺掑簭")
+    private Integer sort;
 
     @ApiModelProperty("閮ㄩ棬鎻忚堪")
     private String departDes;
@@ -64,4 +70,8 @@
     @TableField(exist = false)
     private List<DepartUserDTO> departUserDTOS;
 
+    @TableField(exist = false)
+    private Boolean end;
+
+
 }
diff --git a/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java b/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java
index 79ef1cd..39505fe 100644
--- a/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java
+++ b/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java
@@ -98,6 +98,9 @@
     @ApiModelProperty(value = "鎵嬫満鍙风爜")
     private String mobile;
 
+    @ApiModelProperty(value = "搴旂敤+鐢ㄦ埛鍞�旀爣璇�")
+    private String openid;
+
     @ApiModelProperty(value = "鏄惁涓虹綉鏍肩鐞嗗憳锛�0->涓嶆槸锛�1->鏄�")
     private Integer isGrid;
 
diff --git a/ycl-common/src/main/java/com/ycl/entity/user/UmsRole.java b/ycl-common/src/main/java/com/ycl/entity/user/UmsRole.java
index 4129a88..bf60e0c 100644
--- a/ycl-common/src/main/java/com/ycl/entity/user/UmsRole.java
+++ b/ycl-common/src/main/java/com/ycl/entity/user/UmsRole.java
@@ -53,6 +53,8 @@
 
     private Integer sort;
 
+    private String code;
+
     @ApiModelProperty(value = "瑙掕壊绫诲瀷鏂囨湰")
     @TableField(exist = false)
     private String typeText;
diff --git a/ycl-common/src/main/java/com/ycl/service/depart/IDepartManagerService.java b/ycl-common/src/main/java/com/ycl/service/depart/IDepartManagerService.java
index 0b85a8c..655539c 100644
--- a/ycl-common/src/main/java/com/ycl/service/depart/IDepartManagerService.java
+++ b/ycl-common/src/main/java/com/ycl/service/depart/IDepartManagerService.java
@@ -4,6 +4,9 @@
 import com.ycl.entity.depart.DepartManager;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * <p>
  * 鏈嶅姟绫�
@@ -15,4 +18,11 @@
 public interface IDepartManagerService extends IService<DepartManager> {
 
     void deleteByDepartId(Long departId);
+
+    /**
+     * 鏌ヨ閮ㄩ棬鐨勫憳宸d
+     * @param deptId
+     * @return
+     */
+    Collection<Long> getByDeptId(Long deptId);
 }
diff --git a/ycl-common/src/main/java/com/ycl/service/depart/impl/DepartManagerServiceImpl.java b/ycl-common/src/main/java/com/ycl/service/depart/impl/DepartManagerServiceImpl.java
index cd95e3d..4391977 100644
--- a/ycl-common/src/main/java/com/ycl/service/depart/impl/DepartManagerServiceImpl.java
+++ b/ycl-common/src/main/java/com/ycl/service/depart/impl/DepartManagerServiceImpl.java
@@ -7,6 +7,10 @@
 import com.ycl.service.depart.IDepartManagerService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * 鏈嶅姟瀹炵幇绫�
@@ -24,4 +28,11 @@
         queryWrapper.eq(DepartManager::getDepartId, departId);
         baseMapper.delete(queryWrapper);
     }
+
+    @Override
+    public Collection<Long> getByDeptId(Long deptId) {
+        LambdaQueryWrapper<DepartManager> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DepartManager::getDepartId, deptId);
+        return baseMapper.selectList(queryWrapper).stream().map(DepartManager::getUserId).collect(Collectors.toSet());
+    }
 }
diff --git a/ycl-common/src/main/java/com/ycl/service/user/UmsAdminService.java b/ycl-common/src/main/java/com/ycl/service/user/UmsAdminService.java
index 9fc5d34..11450dd 100644
--- a/ycl-common/src/main/java/com/ycl/service/user/UmsAdminService.java
+++ b/ycl-common/src/main/java/com/ycl/service/user/UmsAdminService.java
@@ -40,6 +40,8 @@
      */
     String login(String username,String password);
 
+    String getOAuthToken(String username);
+
     /**
      * 鍒锋柊token鐨勫姛鑳�
      * @param oldToken 鏃х殑token
@@ -118,4 +120,5 @@
     List<UmsAdmin> getDepartUser(Long departId);
     String getTargetTo(String ids, String sendType);
 
+    UmsAdmin getByOpenid(String openid);
 }
diff --git a/ycl-common/src/main/java/com/ycl/service/user/UmsRoleService.java b/ycl-common/src/main/java/com/ycl/service/user/UmsRoleService.java
index 02a3f4c..e7c46e0 100644
--- a/ycl-common/src/main/java/com/ycl/service/user/UmsRoleService.java
+++ b/ycl-common/src/main/java/com/ycl/service/user/UmsRoleService.java
@@ -9,6 +9,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 鍚庡彴瑙掕壊绠$悊Service
@@ -35,6 +36,9 @@
      */
     List<UmsMenuNode> getMenuList(Long adminId);
 
+
+    List<UmsRole> getRoleListByCodes(List<String> codes);
+
     /**
      * 鑾峰彇瑙掕壊鐩稿叧鑿滃崟
      */
diff --git a/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java b/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
index 868fadd..b2daa9f 100644
--- a/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
+++ b/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
@@ -298,6 +298,25 @@
         }
         return token;
     }
+	
+    @Override
+    public String getOAuthToken(String username) {
+        String token = null;
+        //瀵嗙爜闇�瑕佸鎴风鍔犲瘑鍚庝紶閫�
+        try {
+            AdminUserDetails userDetails = (AdminUserDetails) loadUserByUsername(username);
+            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
+            SecurityContextHolder.getContext().setAuthentication(authentication);
+            //鏍规嵁鐢ㄦ埛id锛岀敤鎴峰鍚�
+            token = jwtTokenUtil.generateToken(userDetails.getUserId(), userDetails.getUsername());
+            redisService.set(RedisKey.PLATFORM_TOKEN_KEY.concat(username), token, LiveTimeMillisecond.s7200.time);
+//            updateLoginTimeByUsername(username);
+            //insertLoginLog(username);
+        } catch (AuthenticationException e) {
+            LOGGER.warn("鐧诲綍寮傚父:{}", e.getMessage());
+        }
+        return token;
+    }
 
     /**
      * 娣诲姞鐧诲綍璁板綍
@@ -596,5 +615,10 @@
         return str;
     }
 
+    @Override
+    public UmsAdmin getByOpenid(String openid) {
+        LambdaQueryWrapper<UmsAdmin> wrapper = new LambdaQueryWrapper<UmsAdmin>().eq(UmsAdmin::getOpenid, openid).last("limit 1");
 
+        return baseMapper.selectOne(wrapper);
+    }
 }
diff --git a/ycl-common/src/main/java/com/ycl/service/user/impl/UmsRoleServiceImpl.java b/ycl-common/src/main/java/com/ycl/service/user/impl/UmsRoleServiceImpl.java
index 70971e2..9f060c4 100644
--- a/ycl-common/src/main/java/com/ycl/service/user/impl/UmsRoleServiceImpl.java
+++ b/ycl-common/src/main/java/com/ycl/service/user/impl/UmsRoleServiceImpl.java
@@ -101,6 +101,12 @@
 
 
     @Override
+    public List<UmsRole> getRoleListByCodes(List<String> codes) {
+        LambdaQueryWrapper<UmsRole> wrapper = new LambdaQueryWrapper<UmsRole>().in(UmsRole::getCode, codes);
+        return baseMapper.selectList(wrapper);
+    }
+
+    @Override
     public List<UmsMenu> listMenu(Long roleId) {
         return umsMenuMapper.getMenuListByRoleId(roleId);
     }
diff --git a/ycl-platform/pom.xml b/ycl-platform/pom.xml
index 78d280f..67a9c94 100644
--- a/ycl-platform/pom.xml
+++ b/ycl-platform/pom.xml
@@ -36,6 +36,13 @@
             <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba.xxpt</groupId>
+            <artifactId>zwdd</artifactId>
+            <version>1.2.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/libs/zwdd-sdk-java-1.2.0.jar</systemPath>
+        </dependency>
     </dependencies>
 
 <!--    <build>-->
diff --git a/ycl-platform/src/main/java/com/ycl/common/constant/DingConst.java b/ycl-platform/src/main/java/com/ycl/common/constant/DingConst.java
new file mode 100644
index 0000000..f6c7ff1
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/common/constant/DingConst.java
@@ -0,0 +1,90 @@
+package com.ycl.common.constant;
+/**
+ * ding 闇�瑕佺殑甯搁噺
+ */
+public interface DingConst {
+    /**
+     * appkey
+     */
+    String APP_KEY = ""; //姝e紡
+    /**
+     * secretKey
+     */
+    String SECRET_KEY = ""; //姝e紡
+
+    /*******鎺ュ彛********/
+    /**
+     * 瓒呯绉熸埛id
+     */
+//    String TENANT_ID = "50245108";//娴嬭瘯
+   // String TENANT_ID = "196729"; //姝e紡
+
+    /**
+     * 閽� 鍩熷悕
+     */
+//    String DOMAIN_NAME = "openplatform.dg-work.cn";// 娴嬭瘯锛氫笓鏈夐拤閽�
+    String DOMAIN_NAME = "openplatform-pro.ding.zj.gov.cn";// 姝e紡锛氭禉鏀块拤
+    /**
+     * 閽� 璇锋眰鍗忚
+     */
+    String PROTOCAL = "https";
+
+    /**
+     * TOKEN 鑾峰彇鎺ュ彛
+     */
+    String GET_TOKEN = "/gettoken.json";
+    /**
+     * TOKEN 鑾峰彇鎺ュ彛
+     */
+    String GET_TIKER = "/get_jsapi_token.json";
+
+    /**
+     * 鑾峰彇鐢ㄦ埛淇℃伅鎺ュ彛
+     */
+    String GET_USER_INFO = "/rpc/oauth2/dingtalk_app_user.json";
+    /**
+     * 鏍规嵁鍛樺伐Code鏌ヨ璇︽儏
+     */
+    String GET_EMP_BY_CODE = "/mozi/employee/getEmployeeByCode";
+
+    /**
+     * 鑾峰彇閫氳褰曟潈闄愯寖鍥�
+     */
+    String GET_BOOK_AUTH = "/auth/scopesV2";
+
+    /**
+     * 鍒嗛〉鑾峰彇涓嬧紑绾х粍缁� Code 鍒楄〃
+     */
+    String POST_ORG_PAGE_CODE_LIST = "/mozi/organization/pageSubOrganizationCodes";
+
+    /**
+     * 鎵归噺鏍规嵁缁勭粐Code鏌ヨ璇︽儏
+     */
+    String POST_ORG_DETIAL_CODE_BATTH = "/mozi/organization/listOrganizationsByCodes";
+
+    /**
+     * 鏌ヨ缁勭粐涓嬩汉鍛樿鎯�
+     */
+    String POST_PERSON_INFO_BY_ORG_CODE = "/mozi/organization/pageOrganizationEmployeePositions";
+
+    /**
+     * 鏌ヨ鍛樺伐浠昏亴
+     */
+    String POST_STAFF_APPOINTMENT = "/mozi/employee/listEmployeePositionsByEmployeeCode";
+
+    /**
+     * 鏍规嵁缁勭粐Code鏌ヨ璇︽儏
+     */
+    String POST_ORG_BY_CODE = "/mozi/organization/getOrganizationByCode";
+
+    /**
+     * 鍙戦�佸伐浣滄秷鎭�氱煡
+     */
+    String POST_SEND_NOTIFY = "/message/workNotification";
+
+    /**
+     * 鍙戦�乨ing 宸ヤ綔娑堟伅閾炬帴
+     */
+    String SEND_DING_WORK_LINK = "dingtalkind://dingtalkclient/page/link?url=";
+
+}
diff --git a/ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java b/ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java
new file mode 100644
index 0000000..fd00a02
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java
@@ -0,0 +1,618 @@
+package com.ycl.common.dingding;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.log.Log;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziOrganizationListOrganizationsByCodesRequest;
+import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziOrganizationPageOrganizationEmployeePositionsRequest;
+import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziOrganizationPageSubOrganizationCodesRequest;
+import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziOrganizationListOrganizationsByCodesResponse;
+import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziOrganizationPageOrganizationEmployeePositionsResponse;
+import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziOrganizationPageSubOrganizationCodesResponse;
+import com.alibaba.xxpt.gateway.shared.client.http.*;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ycl.config.DingConfig;
+import com.ycl.entity.depart.UmsDepart;
+import com.ycl.entity.dingding.DingUserInfo;
+import com.ycl.entity.user.UmsRole;
+import com.ycl.exception.ApiException;
+import com.ycl.service.depart.UmsDepartService;
+import com.ycl.service.user.UmsRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+import static com.ycl.common.constant.DingConst.*;
+
+
+/**
+ * Ding 鑾峰彇鎺ュ彛api鐩稿叧
+ *
+ * @author cjx
+ */
+@Component
+public class DingCommon {
+
+    private static final Log log = Log.get();
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+    @Resource
+    private ExecutableClient executableClient;
+    @Autowired
+    private UmsDepartService umsDepartService;
+
+
+    /**
+     * 鑾峰彇鐢ㄦ埛淇℃伅
+     *
+     * @param code 涓存椂鎺堟潈鐮� 鍓嶅彴鑾峰彇
+     * @return
+     */
+    public DingUserInfo getDingUserInfo(String code) {
+//        鍒ゆ柇ding 淇℃伅鏄惁瀛樺湪
+        boolean hasDing = redisTemplate.hasKey("ding");
+        if (hasDing) {
+            String dingStr = redisTemplate.opsForValue().get("ding");
+            JSONObject dingObj = JSONObject.parseObject(dingStr);
+            String getToken = dingObj.getString("token");
+            if (ObjectUtil.isEmpty(code) || ObjectUtil.isEmpty(getToken)) {
+                throw new ApiException("鐧诲綍寮傚父");
+            }
+            //鑾峰彇鐢ㄦ埛淇℃伅
+            PostClient postClient = executableClient.newPostClient(GET_USER_INFO);
+            postClient.addParameter("access_token", getToken); //token
+            postClient.addParameter("auth_code", code);//涓存椂鎺堟潈鐮�
+            String apiResult = postClient.post();
+            JSONObject resObj = parsingJson(apiResult);
+            if (null != resObj) {
+                resObj = resObj.getJSONObject("data");
+                redisTemplate.opsForValue().set("realmId", resObj.getString("realmId"));
+                JSONObject empCodeObj = getEmpByCode(resObj.getString("employeeCode"), resObj.getString("realmId"));
+                if (ObjectUtil.isNotEmpty(empCodeObj)) {
+                    resObj.putAll(empCodeObj);
+                }
+                DingUserInfo dingUserInfo = BeanUtil.toBean(resObj, DingUserInfo.class);
+                String accId = DingEncodeUtil.getMD5(resObj.getString("employeeCode").getBytes());
+                dingUserInfo.setUserId(Long.parseLong(accId));
+                dingUserInfo.setAccountId(resObj.getLong("accountId"));
+                return dingUserInfo;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鏍规嵁鍛樺伐Code鏌ヨ璇︽儏
+     *
+     * @param employeeCode 鍛樺伐code鍒楄〃
+     * @param TENANT_ID    绉熸埛id
+     * @return
+     */
+    public JSONObject getEmpByCode(String employeeCode, String tenantId) {
+        //鑾峰彇鐢ㄦ埛淇℃伅
+        PostClient postClient = executableClient.newPostClient(GET_EMP_BY_CODE);
+        postClient.addParameter("employeeCode", employeeCode);
+        postClient.addParameter("tenantId", tenantId);
+        String apiResult = postClient.post();
+        JSONObject resObj = parsingJson(apiResult);
+        if (null != resObj) {
+            resObj = resObj.getJSONObject("data");
+        } else {
+            resObj = null;
+        }
+        return resObj;
+    }
+
+    /**
+     * 鍙戦�佹枃鏈秷鎭�
+     *
+     * @param receiverIds 鎺ユ敹浜虹敤鎴稩D(accountId)锛� 澶氫釜浜烘椂浣跨敤鍗婅閫楀彿鍒嗛殧锛�
+     * @param content     娑堟伅锛屾渶濂�500瀛椾互鍐�
+     * @return
+     */
+    public JSONObject sendDingMsgStr(String receiverIds, String content) {
+        //鑾峰彇鐢ㄦ埛淇℃伅
+        PostClient postClient = executableClient.newPostClient(POST_SEND_NOTIFY);
+        postClient.addParameter("receiverIds", receiverIds);
+        postClient.addParameter("tenantId", dingConfig.getTenantId());
+        postClient.addParameter("msg", getJsonStringText(content));
+        String apiResult = postClient.post();
+        JSONObject resObj = parsingJson(apiResult);
+        if (null != resObj) {
+            resObj = resObj.getJSONObject("data");
+        }
+        return resObj;
+    }
+
+    /**
+     * 鍙戦�侀摼鎺ユ秷鎭�
+     *
+     * @param receiverIds 鎺ユ敹浜虹敤鎴稩D(accountId)锛� 澶氫釜浜烘椂浣跨敤鍗婅閫楀彿鍒嗛殧锛�
+     * @param content     娑堟伅锛屾渶濂�500瀛椾互鍐�
+     * @param title       娑堟伅鏍囬
+     * @param picUrl      鍥剧墖鍦板潃
+     * @param urlLink     閾炬帴璺宠浆璺緞
+     * @return
+     */
+    public JSONObject sendDingMsgLink(String receiverIds, String title, String urlLink, String content, String picUrl) {
+        //鑾峰彇鐢ㄦ埛淇℃伅
+        PostClient postClient = executableClient.newPostClient(POST_SEND_NOTIFY);
+        postClient.addParameter("receiverIds", receiverIds);
+        postClient.addParameter("tenantId", dingConfig.getTenantId());
+        postClient.addParameter("msg", getJsonStringLink(urlLink, picUrl, title, content));
+        String apiResult = postClient.post();
+        JSONObject resObj = parsingJson(apiResult);
+        return resObj;
+    }
+
+    public JSONObject sendDingMsgCardLink(String receiverIds, String title, String urlLink, String pcUrlLink, String content) {
+        //鑾峰彇鐢ㄦ埛淇℃伅
+        PostClient postClient = executableClient.newPostClient(POST_SEND_NOTIFY);
+        postClient.addParameter("receiverIds", receiverIds);
+        postClient.addParameter("tenantId", dingConfig.getTenantId());
+        postClient.addParameter("bizMsgId", StrUtil.uuid());
+        postClient.addParameter("msg", getJsonStringCardLink(urlLink, pcUrlLink, title, content));
+
+        String apiResult = postClient.post();
+        JSONObject resObj = parsingJson(apiResult);
+        return resObj;
+    }
+
+    @Resource
+    private DingConfig dingConfig;
+
+    /**
+     * 鑾峰彇閫氳褰曟潈闄愯寖鍥�
+     */
+    public JSONObject getBookAuthority() {
+        //鑾峰彇鐢ㄦ埛淇℃伅
+        GetClient postClient = executableClient.newGetClient(GET_BOOK_AUTH);
+        postClient.addParameter("tenantId", dingConfig.getTenantId());
+        String apiResult = postClient.get();
+        JSONObject resObj = parsingJson(apiResult);
+        return resObj;
+    }
+
+    /**
+     * 鏌ヨ鍏ㄩ儴閮ㄩ棬淇℃伅
+     *
+     * @return
+     */
+    public List<UmsDepart> getOrgInfo(JSONArray deptTopArr) {
+        List<UmsDepart> orgList = new ArrayList<>();
+        //鑾峰彇鍏ㄩ儴閮ㄩ棬code
+        //JSONObject topObj = getBookAuthority();
+        //椤剁骇閮ㄩ棬id
+        // JSONArray deptTopArr = topObj.getJSONArray("deptVisibleScopes");
+        //鏍规嵁鍒嗛〉鑾峰彇涓嬧紑绾х粍缁� Code 鍒楄〃 涓�灞備竴灞傝幏鍙栫粍缁� Code 鍒楄〃
+        String topCode = deptTopArr.getString(0);
+        orgNameList.add(topCode);
+        getPageOrgCode(topCode);
+        //鏍规嵁code鏌ヨ缁勭粐璇︽儏
+        JSONArray resDept = getOrgDetailByCodeList(orgNameList);
+        //瑙f瀽涓虹郴缁熺粍缁囩粨鏋勫疄浣撶被
+        for (int i = 0; i < resDept.size(); i++) {
+            JSONObject orgObj = resDept.getJSONObject(i);
+            UmsDepart depart = new UmsDepart();
+            //鏈骇code缂栫爜
+            String code = orgObj.getString("organizationCode");
+            //鐖剁骇code缂栫爜
+            String pcode = orgObj.getString("parentCode");
+            //鏈骇鍚嶇О
+            String name = orgObj.getString("organizationName");
+            //鎺掑簭
+            Integer sort = orgObj.getInteger("displayOrder");
+            code = DingEncodeUtil.getMD5(code.getBytes());
+            pcode = DingEncodeUtil.getMD5(pcode.getBytes());
+            depart.setParentId(Long.parseLong(pcode));
+            depart.setId(Long.parseLong(code));
+            depart.setCode(orgObj.getString("organizationCode"));
+            depart.setDepartName(name);
+            depart.setSort(sort);
+            orgList.add(depart);
+        }
+        orgNameList = new ArrayList<>();
+        return orgList;
+    }
+
+    /**
+     * 鏍规嵁缁勭粐code 鏌ヨ 閫氳褰曚汉鍛樹俊鎭�
+     * <p>
+     * //     * @return
+     * //
+     */
+    public Set<DingUserInfo> getPersonInfoByOrgCode() {
+        LambdaQueryWrapper<UmsDepart> orgLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        orgLambdaQueryWrapper.select(UmsDepart::getCode);
+        orgLambdaQueryWrapper.likeRight(UmsDepart::getCode, "GO_");
+        List<UmsDepart> orgList = umsDepartService.list(orgLambdaQueryWrapper);
+        Set<DingUserInfo> dingUserInfoList = new HashSet<>();
+        for (UmsDepart org : orgList) {
+            if (ObjectUtil.isNotEmpty(org.getCode())) {
+                IntelligentGetClient intelligentGetClient = executableClient.newIntelligentGetClient(POST_PERSON_INFO_BY_ORG_CODE);
+                OapiMoziOrganizationPageOrganizationEmployeePositionsRequest orgOptions = new OapiMoziOrganizationPageOrganizationEmployeePositionsRequest();
+                //鏄惁璇锋眰鎬绘暟锛岄粯璁ゆ槸false
+//                orgOptions.setReturnTotalSize(true);
+                //鍒嗛〉澶у皬锛岄粯璁ゆ槸20锛屾渶澶�100
+                orgOptions.setPageSize(100);
+                //鍛樺伐鐘舵�侊紝A涓烘湁鏁堬紝F涓烘棤鏁堬紝榛樿鏄墍鏈�
+                orgOptions.setEmployeeStatus("A");
+                //缁勭粐code
+                orgOptions.setOrganizationCode(org.getCode());
+                //璇锋眰璧峰椤碉紝榛樿鏄�1
+//                orgOptions.setPageNo(1);
+                //绉熸埛id
+                orgOptions.setTenantId(Long.valueOf(dingConfig.getTenantId()));
+                //page椤�
+                Integer page = 0;
+                //鏄惁鏈変笅涓�椤�
+                boolean isHasPage;
+                do {
+                    isHasPage = false;
+                    page++;
+//                    postClient.addParameter("pageNo", page.toString());
+//                    String apiResult = postClient.post();
+                    orgOptions.setPageNo(page);
+                    OapiMoziOrganizationPageOrganizationEmployeePositionsResponse apiResult = intelligentGetClient.get(orgOptions);
+                    JSONObject resObj = parsingJson(JSON.toJSONString(apiResult));
+                    if (null != resObj) {
+                        if (resObj.containsKey("data")) {
+                            JSONArray dataArr = resObj.getJSONArray("data");
+                            for (int i = 0; i < dataArr.size(); i++) {
+                                //浜哄憳淇℃伅
+                                JSONObject data = dataArr.getJSONObject(i);
+//                                String empName = data.getString("employeeName");
+                                String employeeCode = data.getString("employeeCode");
+                                //鏍规嵁鍛樺伐code 鑾峰彇鍛樺伐璇︽儏
+                                DingUserInfo dingUserInfo = getEmpInfoByCode(employeeCode);
+                                if (ObjectUtil.isNotEmpty(dingUserInfo)) {
+                                    dingUserInfoList.add(dingUserInfo);
+                                }
+                            }
+                            isHasPage = true;
+                        }
+                    }
+                    //瑙f瀽鏁版嵁锛屽垽鏂槸鍚︾户缁煡璇笅涓�椤�
+                } while (isHasPage);
+            }
+        }
+        JSONArray arr = new JSONArray(Collections.singletonList(dingUserInfoList));
+        redisTemplate.opsForValue().set("userJsonList", arr.toJSONString());
+        return dingUserInfoList;
+    }
+
+    @Resource
+    UmsRoleService userRoleService;
+
+    /**
+     * 鏍规嵁鍛樺伐code 鑾峰彇鍛樺伐璇︽儏
+     *
+     * @param employeeCode 鍛樺伐code
+     * @return 閽夐拤鐢ㄦ埛浣撶郴瀹炰綋瀵硅薄
+     */
+    public DingUserInfo getEmpInfoByCode(String employeeCode) {
+        if (ObjectUtil.isNotEmpty(employeeCode)) {
+            //鏍规嵁鍛樺伐code鑾峰彇鍛樺伐璇︾粏淇℃伅
+            JSONObject empCodeObj = getEmpByCode(employeeCode, dingConfig.getTenantId());
+            if (ObjectUtil.isNotEmpty(empCodeObj)) {
+                empCodeObj.put("userId", DingEncodeUtil.getMD5(employeeCode.getBytes()));
+                //鏌ヨ浠昏亴
+                JSONArray jobArr = getStaffAppointment(employeeCode);
+                assert jobArr != null;
+                //涓存椂淇濆瓨浠昏亴鐨刬ds锛堢郴缁熺殑鐢ㄦ埛浣撶郴锛�
+                List<Long> posIds = new ArrayList<>();
+                //鐢ㄦ埛瑙掕壊code
+                List<String> roleCodeList = new ArrayList<>();
+                for (int j = 0; j < jobArr.size(); j++) {
+                    JSONObject jobPos = jobArr.getJSONObject(j);
+                    //鏄惁涓昏亴
+                    Boolean isMain = jobPos.getBoolean("mainJob");
+                    if (isMain) {
+                        JSONObject holdapost = jobArr.getJSONObject(0);
+                        String orgCode = holdapost.getString("organizationCode");
+                        if (StrUtil.isNotBlank(orgCode)) {
+                            JSONObject orgDetail = getOrgDetailByCode(orgCode);
+                            if (null != orgDetail) {
+                                String orgId = orgDetail.getString("organizationCode");
+                                String orgName = orgDetail.getString("organizationName");
+                                orgId = DingEncodeUtil.getMD5(orgId.getBytes());
+                                empCodeObj.put("orgId", orgId);
+                                empCodeObj.put("orgName", orgName);
+                            }
+                        }
+                    }
+                    //鑱屼綅淇℃伅
+                    String posName = jobPos.getString("govEmpPosJob");
+                    if (StrUtil.isBlank(posName)) {
+                        posName = "鏈~鍐欒亴浣嶅悕绉�";
+                    }
+                    //瑙掕壊
+                    String roleCode = jobPos.getString("empPosEmployeeRoleCode");
+                    roleCodeList.add(roleCode);
+                    String code = DingEncodeUtil.getMD5(posName.getBytes());
+                    //鏌ヨ鏄惁鏈夐噸澶嶇殑
+                    LambdaQueryWrapper<UmsRole> posLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                   // posLambdaQueryWrapper.eq(UmsRole::getCode, code);
+                    posLambdaQueryWrapper.eq(UmsRole::getName, posName);
+                    posLambdaQueryWrapper.last("LIMIT 1");
+                    UmsRole posOne = userRoleService.getOne(posLambdaQueryWrapper);
+                    //浠昏亴鍚嶇О涓嶅瓨鍦紝鑷姩娣诲姞
+                    if (ObjectUtil.isEmpty(posOne)) {
+                        posOne = new UmsRole();
+                        posOne.setSort(100);
+                        posOne.setName(posName);
+                        posOne.setCode(code);
+                        posOne.setStatus(1);
+                        userRoleService.save(posOne);
+                    }else {
+                        posOne.setCode(code);
+                        userRoleService.updateById(posOne);
+                    }
+                    posIds.add(posOne.getId());
+                }
+                //杞崲涓哄疄浣撶被
+                DingUserInfo dingUserInfo = BeanUtil.toBean(empCodeObj, DingUserInfo.class);
+                Long orgId = dingUserInfo.getOrgId();
+                if (ObjectUtil.isNotEmpty(orgId)) {
+                    dingUserInfo.setPosIdList(posIds);
+                    dingUserInfo.setRoleCodeList(roleCodeList);
+                }
+                return dingUserInfo;
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 鏍规嵁鍛樺伐Code鑾峰彇鍛樺伐鐨勪换鑱�
+     */
+    private JSONArray getStaffAppointment(String empCode) {
+        PostClient postClient = executableClient.newPostClient(POST_STAFF_APPOINTMENT);
+        postClient.addParameter("tenantId", dingConfig.getTenantId());
+        postClient.addParameter("employeeCode", empCode);
+        String apiResult = postClient.post();
+        JSONObject dataObj = parsingJson(apiResult);
+        if (null != dataObj) {
+            return dataObj.getJSONArray("data");
+        }
+        return null;
+    }
+
+    /**
+     * 鏍规嵁缁勭粐code鑾峰彇缁勭粐璇︽儏
+     */
+    private JSONObject getOrgDetailByCode(String orgCode) {
+        PostClient postClient = executableClient.newPostClient(POST_ORG_BY_CODE);
+        postClient.addParameter("tenantId", dingConfig.getTenantId());
+        postClient.addParameter("organizationCode", orgCode);
+        String apiResult = postClient.post();
+        JSONObject dataObj = parsingJson(apiResult);
+        if (null != dataObj) {
+            return dataObj.getJSONObject("data");
+        }
+        return dataObj;
+    }
+
+
+    /**
+     * 鎵归噺鏍规嵁缁勭粐Code鏌ヨ璇︽儏
+     */
+    private JSONArray getOrgDetailByCodeList(List<String> codeList) {
+        JSONArray resultArr = new JSONArray();
+        if (ObjectUtil.isNotEmpty(codeList)) {
+            int codeIndexSize = codeList.size() % 100 == 0 ? codeList.size() / 100 : codeList.size() / 100 + 1;
+            List<String> result;
+            int start = 0;
+            int end = 0;
+            for (int i = 1; i <= codeIndexSize; i++) {
+                if (codeList.size() >= 100) {
+                    end += 100;
+                    if (i == codeIndexSize) {
+                        end = codeList.size();
+                    }
+                    result = codeList.subList(start, end);
+                    start = end;
+                } else {
+                    result = codeList;
+                }
+                //executableClient淇濊瘉鍗曚緥
+                IntelligentPostClient intelligentPostClient = executableClient.newIntelligentPostClient(POST_ORG_DETIAL_CODE_BATTH);
+                OapiMoziOrganizationListOrganizationsByCodesRequest oapiMoziOrganizationListOrganizationsByCodesRequest = new OapiMoziOrganizationListOrganizationsByCodesRequest();
+                oapiMoziOrganizationListOrganizationsByCodesRequest.setOrganizationCodes(result);
+                oapiMoziOrganizationListOrganizationsByCodesRequest.setTenantId(Long.parseLong(dingConfig.getTenantId()));
+                //鑾峰彇缁撴灉
+                OapiMoziOrganizationListOrganizationsByCodesResponse apiResult = intelligentPostClient.post(oapiMoziOrganizationListOrganizationsByCodesRequest);
+                if (apiResult.getSuccess()) {
+                    JSONArray obj = JSONArray.parseArray(apiResult.getContent().getData());
+                    resultArr.addAll(obj);
+                }
+            }
+        }
+        return resultArr;
+    }
+
+    /**
+     * 鏍规嵁鍒嗛〉鑾峰彇涓嬧紑绾х粍缁� Code 鍒楄〃
+     *
+     * @return
+     */
+    private List<String> orgNameList = new ArrayList<>();
+
+    /**
+     * 鍒嗛〉鑾峰彇涓嬧紑绾х粍缁� Code 鍒楄〃
+     *
+     * @param partCode
+     */
+    private void getPageOrgCode(String partCode) {
+        //涓存椂瀛樻斁褰撳墠缁勭粐
+        List<String> currTempOrgList = new ArrayList<>();
+//        PostClient postClient = executableClient.newPostClient(POST_ORG_PAGE_CODE_LIST);
+//        postClient.addParameter("tenantId", TENANT_ID);
+//        postClient.addParameter("organizationCode", partCode);
+        //鍙煡璇㈡湁鏁堟暟鎹�
+//        postClient.addParameter("status", "A");
+//        postClient.addParameter("pageSize", "100");
+        IntelligentGetClient intelligentGetClient = executableClient.newIntelligentGetClient(POST_ORG_PAGE_CODE_LIST);
+        OapiMoziOrganizationPageSubOrganizationCodesRequest options = new OapiMoziOrganizationPageSubOrganizationCodesRequest();
+//        options.setReturnTotalSize(true);
+        options.setOrganizationCode(partCode);
+        options.setPageSize(100);
+        options.setStatus("A");
+        options.setTenantId(Long.valueOf(dingConfig.getTenantId()));
+        //page椤�
+        Integer page = 0;
+        //鏄惁鏈変笅涓�椤�
+        boolean isHasPage;
+        do {
+            isHasPage = false;
+            page++;
+//            postClient.addParameter("pageNo", page.toString());
+//            String apiResult = postClient.post();
+            options.setPageNo(page);
+            OapiMoziOrganizationPageSubOrganizationCodesResponse apiResult = intelligentGetClient.get(options);
+            JSONObject resObj = parsingJson(JSON.toJSONString(apiResult));
+            if (null != resObj) {
+                if (resObj.containsKey("data")) {
+                    JSONArray dataArr = resObj.getJSONArray("data");
+                    for (int i = 0; i < dataArr.size(); i++) {
+                        String deptCode = dataArr.getString(i);
+                        currTempOrgList.add(deptCode);
+                        orgNameList.add(deptCode);
+                    }
+                    isHasPage = true;
+                }
+            }
+            //瑙f瀽鏁版嵁锛屽垽鏂槸鍚︾户缁煡璇笅涓�椤�
+        } while (isHasPage);
+        for (String str : currTempOrgList) {
+            getPageOrgCode(str);
+        }
+    }
+
+
+    /**
+     * 瑙f瀽杩斿洖鍊�
+     *
+     * @param apiResult
+     */
+    private JSONObject parsingJson(String apiResult) {
+        try {
+            if (ObjectUtil.isNotNull(apiResult)) {
+                JSONObject resJson = JSONObject.parseObject(apiResult);
+                if (resJson.getBoolean("success")) {
+                    JSONObject data = resJson.getJSONObject("content");
+                    if (ObjectUtil.isNotEmpty(data)) {
+                        return data;
+                    }
+                } else if (!ObjectUtil.equals("OPF-B001-05-16-0006", resJson.getString("bizErrorCode"))) {
+                    log.error("DING_ERROR锛�" + resJson.toJSONString());
+                    return resJson;
+                }
+            }
+        } catch (Exception e) {
+            redisTemplate.opsForValue().set("error_" + System.currentTimeMillis(), apiResult, 10, TimeUnit.MINUTES);
+            return null;
+        }
+        return null;
+    }
+
+
+    /**
+     * 鎷兼帴瑕佸彂閫佺殑娑堟伅  鏂囨湰娑堟伅
+     * json瀵硅薄 蹇呴』 {"msgtype":"text","text":{"content":"娑堟伅鍐呭"}}
+     * 娑堟伅鍐呭锛岀洰鍓嶆敮鎸侊細鏂囨湰娑堟伅锛歵ext, 閾炬帴娑堟伅锛歭ink, OA娑堟伅锛歰a, 鍗$墖娑堟伅锛歛ction_card銆傛渶闀夸笉瓒呰繃2048涓瓧鑺�
+     *
+     * @param content
+     */
+    private String getJsonStringText(String content) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("msgtype", "text");//娑堟伅绫诲瀷锛屾鏃跺浐瀹氫负锛歵ext
+        JSONObject text = new JSONObject();
+        text.put("content", content);//娑堟伅鍐呭锛屽缓璁�500瀛楃浠ュ唴
+        jsonObject.put("text", text);
+        String jsonStr = JSONObject.toJSONString(jsonObject);
+        return jsonStr;
+    }
+
+    /**
+     * 鎷兼帴瑕佸彂閫佺殑娑堟伅   閾炬帴娑堟伅
+     *
+     * @param messageUrl 娑堟伅鐐瑰嚮閾炬帴鍦板潃锛屽綋鍙戦�佹秷鎭负灏忕▼搴忔椂鏀寔灏忕▼搴忚烦杞摼鎺�
+     * @param picUrl     鍥剧墖鍦板潃
+     * @param title      娑堟伅鏍囬锛屽缓璁�100瀛楃浠ュ唴
+     * @param text       娑堟伅鎻忚堪锛屽缓璁�500瀛楃浠ュ唴
+     */
+    private String getJsonStringLink(String messageUrl, String picUrl, String title, String text) {
+        JSONObject jsonObject = new JSONObject();
+        //娑堟伅绫诲瀷锛屾鏃跺浐瀹氫负锛歵ext
+        jsonObject.put("msgtype", "link");
+        JSONObject link = new JSONObject();
+        link.put("messageUrl", messageUrl);
+        link.put("picUrl", picUrl);
+        link.put("title", title);
+        link.put("text", text);
+        jsonObject.put("link", link);
+        String jsonStr = JSONObject.toJSONString(jsonObject);
+        return jsonStr;
+    }
+
+    /**
+     * 鎷兼帴瑕佸彂閫佺殑娑堟伅   鍗$墖閾炬帴娑堟伅
+     *
+     * @param messageUrl 娑堟伅鐐瑰嚮閾炬帴鍦板潃锛屽綋鍙戦�佹秷鎭负灏忕▼搴忔椂鏀寔灏忕▼搴忚烦杞摼鎺�
+     * @param title      娑堟伅鏍囬锛屽缓璁�100瀛楃浠ュ唴
+     * @param text       娑堟伅鎻忚堪锛屽缓璁�500瀛楃浠ュ唴
+     */
+    private String getJsonStringCardLink(String messageUrl, String messagePcUrl, String title, String text) {
+        JSONObject jsonObject = new JSONObject();
+        //娑堟伅绫诲瀷锛屾鏃跺浐瀹氫负锛歵ext
+        jsonObject.put("msgtype", "action_card");
+        JSONObject link = new JSONObject();
+        link.put("title", title);
+        link.put("markdown", text);
+        link.put("single_title", "鏌ョ湅璇︽儏");
+        link.put("single_url", messageUrl);
+        link.put("single_pc_url", messagePcUrl);
+        jsonObject.put("action_card", link);
+        String jsonStr = JSONObject.toJSONString(jsonObject);
+        return jsonStr;
+    }
+//
+//    /**
+//     * 涓嬭浇鍛樺伐澶村儚
+//     *
+//     * @param mediaId 濯掍綋澶村儚id
+//     */
+//    public void downloadEmployeeAvatar(String mediaId) {
+//        try {
+//            String api = "/media/download";
+//            GetClient getClient = executableClient.newGetClient(api);
+//            //璁剧疆鍙傛暟
+//            String dingStr = redisTemplate.opsForValue().get("ding");
+//            JSONObject dingObj = JSONObject.parseObject(dingStr);
+//            String getToken = dingObj.getString("token");
+//            getClient.addParameter("access_token", getToken);
+//            getClient.addParameter("media_id", mediaId.replace("$", ""));
+//            CloseableHttpResponse response = getClient.getB();
+//            //璋冪敤API
+//            String fileName = mediaId + ".jpg";
+//            String path = ConstantContextHolder.getSysConfig("SNOWY_FILE_UPLOAD_PATH_FOR_WINDOWS", String.class, null) + "/Avatar/";
+//            File voice = new File(path + fileName);
+//            FileUtil.writeFromStream(response.getEntity().getContent(), voice);
+//        } catch (Exception e) {
+//            log.error("DING_ERROR锛�" + e.getMessage());
+//            System.out.println(e);
+//        }
+//    }
+
+}
diff --git a/ycl-platform/src/main/java/com/ycl/common/dingding/DingEncodeUtil.java b/ycl-platform/src/main/java/com/ycl/common/dingding/DingEncodeUtil.java
new file mode 100644
index 0000000..4219da4
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/common/dingding/DingEncodeUtil.java
@@ -0,0 +1,30 @@
+package com.ycl.common.dingding;
+
+import java.security.MessageDigest;
+
+/**
+ * 瀛楃鍔犲瘑杞箟
+ */
+public class DingEncodeUtil {
+    public static String getMD5(byte[] source) {
+        String s = null;
+        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.update(source);
+            byte[] tmp = md.digest();
+            char[] str = new char[16];
+            int k = 0;
+            for (int i = 0; i < 16; i++) {
+                byte byte0 = tmp[i];
+                //鍙彇楂樹綅
+                str[k++] = hexDigits[(byte0 >>> 4 & 0xf) % 10];
+            }
+            // 鎹㈠悗鐨勭粨鏋滆浆鎹负瀛楃涓�
+            s = new String(str);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return s;
+    }
+}
diff --git a/ycl-platform/src/main/java/com/ycl/config/DingConfig.java b/ycl-platform/src/main/java/com/ycl/config/DingConfig.java
new file mode 100644
index 0000000..88630e5
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/config/DingConfig.java
@@ -0,0 +1,32 @@
+package com.ycl.config;
+
+import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import static com.ycl.common.constant.DingConst.*;
+
+@Data
+@Component
+@ConfigurationProperties("zzding")
+public class DingConfig {
+    private String appKey;
+    private String appSecret;
+    private String domainName;
+    private String protocal;
+    private String tenantId;
+
+    @Bean
+    public ExecutableClient executableClient() {
+        ExecutableClient executableClient = ExecutableClient.getInstance();
+        executableClient.setAccessKey(appKey);
+        executableClient.setSecretKey(appSecret);
+        executableClient.setDomainName(domainName);
+        executableClient.setProtocal(protocal);
+        //executableClient瑕佸崟渚嬶紝骞朵笖浣跨敤鍓嶈鍒濆鍖栵紝鍙渶瑕佸垵濮嬪寲涓�娆�
+        executableClient.init();
+        return executableClient;
+    }
+}
diff --git a/ycl-platform/src/main/java/com/ycl/controller/caseHandler/BaseCaseController.java b/ycl-platform/src/main/java/com/ycl/controller/caseHandler/BaseCaseController.java
index cc301dc..4922fec 100644
--- a/ycl-platform/src/main/java/com/ycl/controller/caseHandler/BaseCaseController.java
+++ b/ycl-platform/src/main/java/com/ycl/controller/caseHandler/BaseCaseController.java
@@ -1,5 +1,6 @@
 package com.ycl.controller.caseHandler;
 
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -20,11 +21,13 @@
 import com.ycl.entity.caseHandler.BaseCaseDetail;
 import com.ycl.entity.caseHandler.DisposeRecord;
 import com.ycl.entity.resources.ImageResources;
+import com.ycl.entity.resources.VideoResources;
 import com.ycl.service.caseHandler.IBaseCaseService;
 import com.ycl.service.caseHandler.IDisposeRecordService;
 import com.ycl.service.caseHandler.IIllegalBuildingService;
 import com.ycl.service.caseHandler.IViolationsService;
 import com.ycl.service.resources.IImageResourcesService;
+import com.ycl.service.resources.IVideoResourcesService;
 import com.ycl.utils.EasyExcelUtils;
 import com.ycl.vo.casePool.QueryForViolationVO;
 import io.swagger.annotations.Api;
@@ -72,6 +75,9 @@
 
     @Autowired
     IImageResourcesService iImageResourcesService;
+
+    @Autowired
+    IVideoResourcesService iVideoResourcesService;
 
 
     @Autowired
@@ -233,19 +239,34 @@
         baseCase.setAlarmTime(LocalDateTime.parse(violationParam.getAlarmTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         baseCase.setCreateTime(LocalDateTime.now());
         baseCaseService.save(baseCase);
-        JSONArray arr = JSON.parseArray(baseCase.getPic());
+        // JSONArray arr = JSON.parseArray(baseCase.getPic());
         AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
 
-        for (int i = 0; i < arr.size(); i++) {
-            ImageResources imageResources = new ImageResources();
-            imageResources.setType("01");
-            imageResources.setBelongToId(baseCase.getId());
-            imageResources.setUrl(arr.getString(i));
-            imageResources.setCreateTime(LocalDateTime.now());
-            imageResources.setCreateUser(user.getUserId());
-            iImageResourcesService.save(imageResources);
+        if (CollUtil.isNotEmpty(violationParam.getImageUrls())) {
+            for (int i = 0; i < violationParam.getImageUrls().size(); i++) {
+                ImageResources imageResources = new ImageResources();
+                imageResources.setType("01");
+                imageResources.setBelongToId(baseCase.getId());
+                imageResources.setUrl(violationParam.getImageUrls().get(i));
+                imageResources.setCreateTime(LocalDateTime.now());
+                imageResources.setCreateUser(user.getUserId());
+                iImageResourcesService.save(imageResources);
+            }
         }
 
+        if (CollUtil.isNotEmpty(violationParam.getVideoUrls())) {
+            VideoResources videoResources = new VideoResources();
+            videoResources.setCreateTime(LocalDateTime.now());
+            videoResources.setType("1");
+            videoResources.setCreateUser(user.getUserId());
+            videoResources.setBelongToId(baseCase.getId().intValue());
+            StringBuilder sb1 = new StringBuilder("");
+            violationParam.getImageUrls().forEach(item -> {
+                sb1.append(",").append(item);
+            });
+            videoResources.setUrl(sb1.substring(1, sb1.length() - 1));
+            iVideoResourcesService.save(videoResources);
+        }
         return CommonResult.success(baseCaseService.saveViolationCase(violationParam, baseCase.getId()));
     }
 
@@ -269,6 +290,49 @@
         baseCase.setAlarmTime(LocalDateTime.parse(illegalBuildingParam.getAlarmTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         baseCase.setCreateTime(LocalDateTime.now());
         baseCaseService.save(baseCase);
+
+        // if (CollUtil.isNotEmpty(illegalBuildingParam.getImageUrls())) {
+        //     ImageResources imageResources = new ImageResources();
+        //     imageResources.setCreateTime(LocalDateTime.now());
+        //     imageResources.setType("1");
+        //     AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        //     imageResources.setCreateUser(user.getUserId());
+        //     imageResources.setBelongToId(baseCase.getId());
+        //     StringBuilder sb1 = new StringBuilder("");
+        //     illegalBuildingParam.getImageUrls().forEach(item -> {
+        //         sb1.append(",").append(item);
+        //     });
+        //     imageResources.setUrl(sb1.substring(1, sb1.length() - 1));
+        //     imageResourcesService.save(imageResources);
+        // }
+
+        AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        if (CollUtil.isNotEmpty(illegalBuildingParam.getImageUrls())) {
+            for (int i = 0; i < illegalBuildingParam.getImageUrls().size(); i++) {
+                ImageResources imageResources = new ImageResources();
+                imageResources.setType("01");
+                imageResources.setBelongToId(baseCase.getId());
+                imageResources.setUrl(illegalBuildingParam.getImageUrls().get(i));
+                imageResources.setCreateTime(LocalDateTime.now());
+                imageResources.setCreateUser(user.getUserId());
+                iImageResourcesService.save(imageResources);
+            }
+        }
+
+        if (CollUtil.isNotEmpty(illegalBuildingParam.getVideoUrls())) {
+            VideoResources videoResources = new VideoResources();
+            videoResources.setCreateTime(LocalDateTime.now());
+            videoResources.setType("01");
+            user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+            videoResources.setCreateUser(user.getUserId());
+            videoResources.setBelongToId(baseCase.getId().intValue());
+            StringBuilder sb2 = new StringBuilder("");
+            illegalBuildingParam.getImageUrls().forEach(item -> {
+                sb2.append(",").append(item);
+            });
+            videoResources.setUrl(sb2.substring(1, sb2.length() - 1));
+            iVideoResourcesService.save(videoResources);
+        }
         return CommonResult.success(baseCaseService.saveIllegalBuildingCase(illegalBuildingParam, baseCase.getId()));
     }
 
@@ -363,7 +427,7 @@
         Integer state = iDisposeRecordService
                 .list(new LambdaQueryWrapper<DisposeRecord>()
                         .eq(DisposeRecord::getBaseCaseId, caseId).
-                        orderByDesc(DisposeRecord::getCreateTime)).get(firstNum).getState();
+                                orderByDesc(DisposeRecord::getCreateTime)).get(firstNum).getState();
         return CommonResult.success(baseCaseService
                 .update(new LambdaUpdateWrapper<BaseCase>()
                         .eq(BaseCase::getId, caseId)
@@ -380,15 +444,18 @@
 
     @ApiOperation(value = "鏌ヨ妗堝嵎")
     @GetMapping("/query_case")
-    public CommonResult queryCase(@RequestParam Integer pageSize,
-                                  @RequestParam Integer current,
-                                  @RequestParam(required = false) String number,
-                                  @RequestParam(required = false) Integer communityId,
-                                  @RequestParam(required = false) Integer categories,
-                                  @RequestParam(required = false) String startTime,
-                                  @RequestParam(required = false) String endTime,
-                                  @RequestParam(required = false) String site) {
-        return CommonResult.success(baseCaseService.selectPage(new Page<BaseCase>().setCurrent(current).setSize(pageSize), number, communityId, categories, startTime, endTime, site));
+    public CommonResult<Page<BaseCase>> queryCase(@RequestParam Integer pageSize,
+                                                  @RequestParam Integer current,
+                                                  @RequestParam(required = false) String number,
+                                                  @RequestParam(required = false) Integer communityId,
+                                                  @RequestParam(required = false) Integer categories,
+                                                  @RequestParam(required = false) String startTime,
+                                                  @RequestParam(required = false) String endTime,
+                                                  @RequestParam(required = false) Integer state,
+                                                  @RequestParam(required = false) Integer time,
+                                                  @RequestParam(required = false) Integer streetId,
+                                                  @RequestParam(required = false) String site) {
+        return CommonResult.success(baseCaseService.selectPage(new Page<BaseCase>().setCurrent(current).setSize(pageSize), number, communityId, categories, startTime, endTime, site, state, streetId, time));
     }
 
     @GetMapping("/query_for_violation")
diff --git a/ycl-platform/src/main/java/com/ycl/controller/dingding/DingController.java b/ycl-platform/src/main/java/com/ycl/controller/dingding/DingController.java
new file mode 100644
index 0000000..2110dbf
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/controller/dingding/DingController.java
@@ -0,0 +1,99 @@
+package com.ycl.controller.dingding;
+
+import com.ycl.api.CommonResult;
+import com.ycl.bo.AdminUserDetails;
+import com.ycl.common.dingding.DingCommon;
+import com.ycl.controller.BaseController;
+import com.ycl.entity.dingding.DingUserInfo;
+import com.ycl.service.auth.AuthService;
+import com.ycl.service.ding.BookRemarkService;
+import com.ycl.service.ding.DingService;
+import com.ycl.vo.AddressBookVO;
+import com.ycl.vo.NewAddressBookVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/ding")
+@Api(tags = "閽夐拤")
+public class DingController extends BaseController {
+
+    @Autowired
+    private DingCommon dingCommon;
+    @Value("${jwt.tokenHead}")
+    private String tokenHead;
+    /**
+     * DING 鍏嶇櫥
+     * 鏍规嵁涓存椂鎺堟潈鐮佸拰access_token鑾峰彇鐢ㄦ埛淇℃伅
+     *
+     * @author cjx
+     */
+
+    @Autowired
+    private AuthService authService;
+
+    @Autowired
+    private DingService dingService;
+
+    @Autowired
+    private BookRemarkService bookRemarkService;
+
+    @ApiOperation(value = "鏍规嵁閽夐拤鎺堟潈鐮佽幏鍙杢oken")
+    @GetMapping("/dingLogin")
+    public CommonResult<Map> dingLogin(@RequestParam String code) {
+        HashMap<String, Object> map = new HashMap<>();
+        //鑾峰彇鐢ㄦ埛淇℃伅
+        DingUserInfo dingUser = dingCommon.getDingUserInfo(code);
+        //鎸塪ing鐧诲綍
+        String token = authService.dingLogin(dingUser);
+        map.put("token", token);
+        map.put("tokenHead", tokenHead);
+        map.put("accountId", dingUser.getAccountId());
+        return CommonResult.success(map);
+    }
+
+    @ApiOperation(value = "閫氳褰�")
+    @GetMapping("/addressBook")
+    public CommonResult<List<AddressBookVO>> getAddressBook() {
+        AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+
+        return CommonResult.success(dingService.getAddressBook(user.getUserId()));
+    }
+
+
+    @ApiOperation(value = "閫氳褰曢�掑綊")
+    @GetMapping("/addressBookById")
+    public CommonResult<List<AddressBookVO>> getAddressBook(@RequestParam("id") Long id) {
+        AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        return CommonResult.success(dingService.getAddressBookByParentId(id, user.getUserId()));
+    }
+
+
+
+
+    @ApiOperation(value = "閫氳褰曢�掑綊")
+    @GetMapping("/getDddressBook")
+    public CommonResult<NewAddressBookVO> getNewAddressBook(@RequestParam("id") Long id) {
+        AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        return CommonResult.success(dingService.getAddressBookById(id, user.getUserId()));
+    }
+
+
+
+    @ApiOperation(value = "淇敼閫氳褰曞娉�")
+    @PutMapping("/remark")
+    public CommonResult updateRemark(@RequestParam("userId") Long userId, @RequestParam("remark") String remark) {
+        AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        return CommonResult.success(bookRemarkService.updateRemark(user, userId, remark));
+    }
+
+
+}
diff --git a/ycl-platform/src/main/java/com/ycl/controller/message/MessageController.java b/ycl-platform/src/main/java/com/ycl/controller/message/MessageController.java
index 46cb904..5e40526 100644
--- a/ycl-platform/src/main/java/com/ycl/controller/message/MessageController.java
+++ b/ycl-platform/src/main/java/com/ycl/controller/message/MessageController.java
@@ -2,10 +2,12 @@
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ycl.annotation.LogSave;
 import com.ycl.api.CommonResult;
 import com.ycl.bo.AdminUserDetails;
 import com.ycl.dto.message.MessageParam;
+import com.ycl.entity.caseHandler.BaseCase;
 import com.ycl.entity.message.Message;
 import com.ycl.mapper.user.UmsAdminMapper;
 import com.ycl.service.message.IMessageService;
@@ -110,6 +112,14 @@
         return CommonResult.failed();
     }
 
+    @ApiOperation(value = "鏌ヨ鎴戠殑娑堟伅")
+    @GetMapping("/queryMyMessage")
+    public CommonResult<Page<Message>> queryMyMessage(@RequestParam Integer pageSize,
+                                                  @RequestParam Integer current){
+                               AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        return CommonResult.success(iMessageService.queryMyMessage(new Page<Message>().setCurrent(current).setSize(pageSize), user.getUserId()));
+    }
+
 
     @ApiOperation("娑堟伅宸叉煡鐪�")
     @PostMapping("/modification_batch")
diff --git a/ycl-platform/src/main/java/com/ycl/dto/casePool/IllegalBuildingParam.java b/ycl-platform/src/main/java/com/ycl/dto/casePool/IllegalBuildingParam.java
index 750f380..553090f 100644
--- a/ycl-platform/src/main/java/com/ycl/dto/casePool/IllegalBuildingParam.java
+++ b/ycl-platform/src/main/java/com/ycl/dto/casePool/IllegalBuildingParam.java
@@ -8,6 +8,7 @@
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 @ApiModel(value = "娣诲姞杩濆缓妗堜欢")
@@ -24,12 +25,14 @@
     /**
      * 鎶ヨ鏃堕棿
      */
+    @ApiModelProperty(value = "鎶ヨ鏃堕棿")
     @TableField("alarm_time")
     private String alarmTime;
 
     /**
      * 璋冨害鏃堕檺
      */
+    @ApiModelProperty(value = "璋冨害鏃堕檺")
     @TableField("limit_time")
     private String limitTime;
 
@@ -39,6 +42,13 @@
     @ApiModelProperty(value = "鎵�灞炵ぞ鍖�")
     @NotNull(message = "涓嶅厑璁告墍灞炵ぞ鍖轰负绌�")
     private Integer communityId;
+
+    /**
+     * 鎵�灞炶閬�
+     */
+    @ApiModelProperty(value = "鎵�灞炶閬�")
+    @NotNull(message = "涓嶅厑璁告墍灞炶閬撲负绌�")
+    private Integer streetId;
 
 
     /**
@@ -65,22 +75,22 @@
     /**
      * 褰撲簨浜鸿仈绯荤數璇�
      */
-    @ApiModelProperty(value = "浜嬪彂鍦扮偣")
-    @NotBlank(message = "涓嶅厑璁镐簨鍙戝湴鐐逛负绌�")
+    @ApiModelProperty(value = "褰撲簨浜鸿仈绯荤數璇�")
+    @NotBlank(message = "涓嶅厑璁稿綋浜嬩汉鑱旂郴鐢佃瘽")
     private String partyPhone;
 
     /**
      * 韬唤璇佹闈�
      */
     @ApiModelProperty(value = "韬唤璇佹闈�")
-    @NotBlank(message = "涓嶅厑璁歌韩浠借瘉姝i潰涓虹┖")
+   // @NotBlank(message = "涓嶅厑璁歌韩浠借瘉姝i潰涓虹┖")
     private String positive;
 
     /**
      * 韬唤璇佸弽闈�
      */
     @ApiModelProperty(value = "韬唤璇佸弽闈�")
-    @NotBlank(message = "涓嶅厑璁歌韩浠借瘉鍙嶉潰涓虹┖")
+   // @NotBlank(message = "涓嶅厑璁歌韩浠借瘉鍙嶉潰涓虹┖")
     private String negative;
 
     /**
@@ -124,4 +134,11 @@
     @ApiModelProperty(value = "杩濆缓鏉愭枡")
     @NotBlank(message = "涓嶅厑璁歌繚寤烘潗鏂欎负绌�")
     private String materials;
+
+
+    @ApiModelProperty(value = "鍥剧墖")
+    private List<String> imageUrls;
+
+    @ApiModelProperty(value = "瑙嗛")
+    private List<String> videoUrls;
 }
diff --git a/ycl-platform/src/main/java/com/ycl/dto/casePool/ViolationParam.java b/ycl-platform/src/main/java/com/ycl/dto/casePool/ViolationParam.java
index db538f0..949eaae 100644
--- a/ycl-platform/src/main/java/com/ycl/dto/casePool/ViolationParam.java
+++ b/ycl-platform/src/main/java/com/ycl/dto/casePool/ViolationParam.java
@@ -8,6 +8,7 @@
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @Data
 @ApiModel(value = "娣诲姞杩濊妗堜欢")
@@ -27,12 +28,14 @@
     /**
      * 鎶ヨ鏃堕棿
      */
+    @ApiModelProperty(value = "鎶ヨ鏃堕棿")
     @TableField("alarm_time")
     private String alarmTime;
 
     /**
      * 璋冨害鏃堕檺
      */
+    @ApiModelProperty(value = "璋冨害鏃堕檺")
     @TableField("limit_time")
     private String limitTime;
 
@@ -123,11 +126,9 @@
     @ApiModelProperty(value = "韬唤璇佸彿鐮�")
     private String informantIdCard;
 
-
     @ApiModelProperty(value = "鍥剧墖")
-    private String pic;
-
+    private List<String> imageUrls;
 
     @ApiModelProperty(value = "瑙嗛")
-    private String media;
+    private List<String> videoUrls;
 }
diff --git a/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCase.java b/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCase.java
index 18a22b4..fe4001a 100644
--- a/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCase.java
+++ b/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCase.java
@@ -184,6 +184,14 @@
     @ApiModelProperty(value = "甯傚钩鍙扮紪鐮�")
     private String taskCode;
 
+
+    /**
+     * 甯傚钩鍙扮紪鐮�
+     */
+    @TableField("pic")
+    @ApiModelProperty(value = "妗堜欢涓婃姤鍥剧墖")
+    private String url;
+
     /**
      * 缁撴潫鏃堕棿
      */
diff --git a/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCaseDetail.java b/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCaseDetail.java
index 53c07ac..3c90cc1 100644
--- a/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCaseDetail.java
+++ b/ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCaseDetail.java
@@ -3,6 +3,7 @@
 import com.ycl.vo.casePool.CurrentSitVo;
 import com.ycl.vo.casePool.FilesPictureVo;
 import com.ycl.vo.casePool.HandlePassVo;
+import com.ycl.vo.casePool.ProblemProVo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
diff --git a/ycl-platform/src/main/java/com/ycl/entity/caseHandler/DispatchInfo.java b/ycl-platform/src/main/java/com/ycl/entity/caseHandler/DispatchInfo.java
index bc3a179..de1900b 100644
--- a/ycl-platform/src/main/java/com/ycl/entity/caseHandler/DispatchInfo.java
+++ b/ycl-platform/src/main/java/com/ycl/entity/caseHandler/DispatchInfo.java
@@ -10,6 +10,7 @@
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -82,6 +83,13 @@
     @TableField("dispose_date")
     @ApiModelProperty(value = "璋冨害闄愭椂")
     private Date disposeDate;
+
+    /**
+     * 闄愬埗鏃堕檺
+     */
+    @TableField("limit_time")
+    @ApiModelProperty(value = "璋冨害鏃堕檺")
+    private LocalDateTime limitTime;
     /**
      * 娲鹃仯鎰忚
      */
diff --git a/ycl-platform/src/main/java/com/ycl/entity/cockpitManage/TeamIndex.java b/ycl-platform/src/main/java/com/ycl/entity/cockpitManage/TeamIndex.java
index 0f3b569..9f15fc2 100644
--- a/ycl-platform/src/main/java/com/ycl/entity/cockpitManage/TeamIndex.java
+++ b/ycl-platform/src/main/java/com/ycl/entity/cockpitManage/TeamIndex.java
@@ -22,6 +22,7 @@
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
+@TableName("ums_team_construction")
 public class TeamIndex extends TeamConstruction implements Serializable {
 
     private Double stepTimely;
diff --git a/ycl-platform/src/main/java/com/ycl/entity/ding/BookRemark.java b/ycl-platform/src/main/java/com/ycl/entity/ding/BookRemark.java
new file mode 100644
index 0000000..886783b
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/entity/ding/BookRemark.java
@@ -0,0 +1,58 @@
+package com.ycl.entity.ding;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.io.Serializable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+    * 鍚庡彴鐢ㄦ埛琛�
+    */
+@Schema(description="鍚庡彴鐢ㄦ埛琛�")
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "ums_book_remark")
+public class BookRemark implements Serializable {
+    @TableId(value = "id", type = IdType.INPUT)
+    @Schema(description="")
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    @TableField(value = "user_id")
+    @Schema(description="鐢ㄦ埛id")
+    private Long userId;
+
+    /**
+     * 澶囨敞浜篿d
+     */
+    @TableField(value = "remark_user_id")
+    @Schema(description="澶囨敞浜篿d")
+    private Long remarkUserId;
+
+    /**
+     * 澶囨敞鍐呭
+     */
+    @TableField(value = "remark")
+    @Schema(description="澶囨敞鍐呭")
+    private String remark;
+
+    private static final long serialVersionUID = 1L;
+
+    public static final String COL_ID = "id";
+
+    public static final String COL_USER_ID = "user_id";
+
+    public static final String COL_REMARK_USER_ID = "remark_user_id";
+
+    public static final String COL_REMARK = "remark";
+}
\ No newline at end of file
diff --git a/ycl-platform/src/main/java/com/ycl/entity/dingding/DingUserInfo.java b/ycl-platform/src/main/java/com/ycl/entity/dingding/DingUserInfo.java
new file mode 100644
index 0000000..3f30892
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/entity/dingding/DingUserInfo.java
@@ -0,0 +1,111 @@
+package com.ycl.entity.dingding;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>閽夐拤鐢ㄦ埛淇℃伅</p>
+ *
+ * @author: cjx
+ * @Date: 2021/8/19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DingUserInfo implements Serializable {
+    /**
+     * 璐﹀彿鍚�
+     */
+    private String account;
+    /**
+     * 璐﹀彿ID
+     */
+    private Long userId;
+
+    private Long accountId;
+    /**
+     * 搴旂敤鍚�
+     */
+    private String clientId;
+    /**
+     * 绉熸埛涓嬩汉鍛樼紪鐮�
+     */
+    private String employeeCode;
+    /**
+     * 濮撳悕
+     */
+    private String employeeName;
+
+    /**
+     * 澶村儚
+     */
+    private String govEmpAvatar;
+
+    /**
+     * 浜哄憳鎬у埆 Code
+     */
+    private Integer empGender;
+    /**
+     * 璐﹀彿绫诲瀷
+     */
+    private String namespace;
+    /**
+     * 鏄电О
+     */
+    private String nickNameCn;
+    /**
+     * 绉熸埛id
+     */
+    private Long realmId;
+    /**
+     * 绉熸埛鍚嶇О
+     */
+    private String realmName;
+    /**
+     * 绉熸埛+鐢ㄦ埛鍞�旀爣璇�
+     */
+    private String tenantUserId;
+    /**
+     * 搴旂敤+鐢ㄦ埛鍞�旀爣璇�
+     */
+    private String openid;
+
+    /**
+     * 鏀挎不闈㈣矊
+     */
+    private String empPoliticalStatusCode;
+    /**
+     * 鑱岀骇
+     */
+    private String empJobLevelCode;
+    /**
+     * 浜哄憳缂栧埗Code
+     */
+    private String empBudgetedPostCode;
+
+    /**
+     * 缁勭粐id
+     */
+    private Long orgId;
+    /**
+     * 缁勭粐鍚嶇О
+     */
+    private String orgName;
+
+    /**
+     * 闄勫睘鏈烘瀯id鍜岄檮灞炶亴浣峣d闆嗗悎
+     */
+//    private List<Dict> extIds;
+
+    /**
+     * 鑱屼綅id闆嗗悎
+     */
+    private List<Long> posIdList;
+
+    /**
+     * 瑙掕壊code闆嗗悎
+     */
+    private List<String> roleCodeList;
+}
diff --git a/ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java b/ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java
index a5d9330..4b64c17 100644
--- a/ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java
+++ b/ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java
@@ -14,6 +14,7 @@
 import com.ycl.vo.cockpit.enforcementEvents.VideoAndAreaVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -32,7 +33,7 @@
 
     BaseCase selectCondMap(Map map);
 
-    Page<BaseCase> selectBaseCasePage(Page<BaseCase> page, @Param("code") String number, @Param("streetId") Integer streetId, @Param("categories") Integer categories, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("site") String site);
+    Page<BaseCase> selectBaseCasePage(Page<BaseCase> page, @Param("code") String number, @Param("communityId") Integer communityId, @Param("categories") Integer categories, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("site") String site, @Param("state") Integer state, @Param("streetId")Integer streetId);
 
     Page<QueryForViolationVO> selectViolationPage(Page<QueryForViolationVO> setCurrent, @Param(value = "queryForViolationParam") QueryForViolationParam queryForViolationParam);
 
diff --git a/ycl-platform/src/main/java/com/ycl/mapper/ding/BookRemarkMapper.java b/ycl-platform/src/main/java/com/ycl/mapper/ding/BookRemarkMapper.java
new file mode 100644
index 0000000..5be3146
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/mapper/ding/BookRemarkMapper.java
@@ -0,0 +1,19 @@
+package com.ycl.mapper.ding;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ycl.entity.ding.BookRemark;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BookRemarkMapper extends BaseMapper<BookRemark> {
+    List<BookRemark> getAllByUserId(Long userId);
+
+    int updateRemark(@Param("remark") String remark, @Param("id") Long id);
+
+    BookRemark findByUserIdAndRemarkUserId(@Param("userId") Long userId, @Param("remarkUserId") Long remarkUserId);
+
+
+}
\ No newline at end of file
diff --git a/ycl-platform/src/main/java/com/ycl/service/auth/AuthService.java b/ycl-platform/src/main/java/com/ycl/service/auth/AuthService.java
new file mode 100644
index 0000000..74ed2e1
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/service/auth/AuthService.java
@@ -0,0 +1,12 @@
+package com.ycl.service.auth;
+
+import com.ycl.entity.dingding.DingUserInfo;
+
+public interface AuthService {
+    /**
+     * 閽夐拤鐧诲綍
+     * @param dingUser
+     * @return
+     */
+    String dingLogin(DingUserInfo dingUser);
+}
diff --git a/ycl-platform/src/main/java/com/ycl/service/auth/impl/AuthService.java b/ycl-platform/src/main/java/com/ycl/service/auth/impl/AuthService.java
new file mode 100644
index 0000000..811aebb
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/service/auth/impl/AuthService.java
@@ -0,0 +1,90 @@
+package com.ycl.service.auth.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ycl.common.dingding.DingCommon;
+import com.ycl.entity.depart.UmsDepart;
+import com.ycl.entity.dingding.DingUserInfo;
+import com.ycl.entity.user.UmsAdmin;
+import com.ycl.entity.user.UmsDepartManage;
+import com.ycl.exception.ApiException;
+import com.ycl.service.depart.UmsDepartService;
+import com.ycl.service.user.UmsAdminService;
+import com.ycl.service.user.UmsDepartManageService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class AuthService implements com.ycl.service.auth.AuthService {
+
+    @Autowired
+    private UmsAdminService adminService;
+    @Autowired
+    private PasswordEncoder passwordEncoder;
+    @Autowired
+    private UmsDepartService departService;
+    @Autowired
+    private DingCommon dingCommon;
+    @Autowired
+    private UmsDepartManageService departManageService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String dingLogin(DingUserInfo dingUserInfo) {
+        String openid = dingUserInfo.getOpenid();   //openid
+        UmsAdmin dingUser = adminService.getByOpenid(openid); //鏍规嵁openid鏌ヨ
+        UmsAdmin byId = adminService.getById(dingUserInfo.getUserId());
+        String token = null;
+        if (ObjectUtil.isNotEmpty(dingUser)) {       //閽夐拤宸茬粦瀹�
+            token = adminService.getOAuthToken(dingUser.getUsername()); //璋冪敤绯荤粺鐧诲綍鎺ュ彛
+        } else if (Objects.nonNull(byId)) {
+            byId.setOpenid(openid);
+            adminService.updateById(byId);
+            token = adminService.getOAuthToken(byId.getUsername()); //璋冪敤绯荤粺鐧诲綍鎺ュ彛
+        } else { //閽夐拤鏈粦瀹�
+            //鎸夌収id鏌ヨ
+            UmsAdmin userParam = new UmsAdmin();
+            userParam.setId(dingUserInfo.getUserId());
+            userParam.setNickName(dingUserInfo.getNickNameCn()); //鏄电О
+            userParam.setUsername(dingUserInfo.getEmployeeName());  //濮撳悕
+            userParam.setSex(dingUserInfo.getEmpGender().byteValue()); //鎬у埆
+            userParam.setOpenid(openid); //openid
+            userParam.setIsDy(Byte.parseByte("0"));
+            userParam.setMobile("");
+            String encodePassword = passwordEncoder.encode("123456");
+            userParam.setPassword(encodePassword); //瀵嗙爜
+            userParam.setStatus(1); //鐘舵��
+            adminService.save(userParam);
+            dingCommon.getEmpInfoByCode(dingUserInfo.getEmployeeCode());
+            //鏌ヨ閮ㄩ棬鏄惁瀛樺湪锛�
+            UmsDepart depart = departService.getById(dingUserInfo.getOrgId());
+            //鍛樺伐淇℃伅锛屽叧鑱旂粍缁�
+            if (Objects.nonNull(depart)) {
+                UmsDepartManage departManage = new UmsDepartManage();
+                departManage.setDepartId(depart.getId());
+                departManage.setUserId(dingUserInfo.getUserId());
+                departManage.setIsLeader(0);
+                departManageService.save(departManage);
+            }
+            //鏍规嵁openid鏌ヨ
+            dingUser = adminService.getByOpenid(openid);
+            if (ObjectUtil.isEmpty(dingUser)) {
+                log.info("銆恆uth鐢ㄦ埛璁よ瘉锛氥�慱AUTH_DING_USER_" + JSONObject.toJSONString(userParam));
+                throw new ApiException("auth鐢ㄦ埛璁よ瘉澶辫触");
+            }
+            token = null;
+            //閽夐拤宸茬粦瀹�
+            if (ObjectUtil.isNotEmpty(dingUser)) {
+                token = adminService.getOAuthToken(dingUser.getUsername()); //璋冪敤绯荤粺鐧诲綍鎺ュ彛
+            }
+        }
+        return token;
+    }
+}
diff --git a/ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java b/ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java
index 36dc778..6288ec9 100644
--- a/ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java
+++ b/ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java
@@ -63,7 +63,8 @@
 
     void endCase(Long caseId, String result, String opinion);
 
-    Page<BaseCase> selectPage(Page<BaseCase> setSize, String number, Integer streetId, Integer categories, String startTime, String endTime, String site);
+    Page<BaseCase> selectPage(Page<BaseCase> setSize, String number, Integer communityId, Integer categories, String startTime, String endTime, String site, Integer state, Integer streetId, Integer time);
+
 
     Page<QueryForViolationVO> selectViolation(QueryForViolationParam queryForViolationParam);
 
@@ -90,4 +91,4 @@
     List<DelayVO> selectDelayList();
 
     Map<String, Object> statistics();
-}
\ No newline at end of file
+}
diff --git a/ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java b/ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java
index 64011a0..684cf46 100644
--- a/ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java
+++ b/ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ycl.service.caseHandler.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.druid.util.StringUtils;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -32,6 +33,7 @@
 import com.ycl.service.caseHandler.IBaseCaseService;
 import com.ycl.service.caseHandler.IDispatchHandleService;
 import com.ycl.service.caseHandler.IViolationsService;
+import com.ycl.service.resources.IImageResourcesService;
 import com.ycl.service.video.IVideoAlarmReportService;
 import com.ycl.vo.casePool.*;
 import com.ycl.vo.cockpit.enforcementEvents.DelayVO;
@@ -50,10 +52,8 @@
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -126,7 +126,8 @@
 
     @Resource
     IBaseCaseService baseCaseService;
-
+    @Autowired
+    IImageResourcesService imageResourcesService;
 
     @Override
     public String uploadEvent(Long caseId) {
@@ -397,11 +398,39 @@
         disposeRecordMapper.update(disposeRecord, updateWrapper);
     }
 
+
     @Override
-    public Page<BaseCase> selectPage(Page<BaseCase> page, String number, Integer streetId, Integer categories, String startTime, String endTime, String site) {
-        return baseCaseMapper.selectBaseCasePage(page, number, streetId, categories, startTime, endTime, site);
+    public Page<BaseCase> selectPage(Page<BaseCase> page, String number, Integer communityId, Integer categories, String startTime, String endTime, String site, Integer state, Integer streetId, Integer time) {
+        LocalDateTime start = null;
+        LocalDateTime end = null;
+        LocalDateTime now = LocalDateTime.now();
+        if (Objects.nonNull(time) && time == 0) {
+            end = now;
+            start = now.plusWeeks(1);
+
+        }
+        if (Objects.nonNull(time) && time == 1) {
+            end = now;
+            start = now.plusMonths(1);
+
+        }
+        if (Objects.nonNull(time) && time == 2) {
+            end = now;
+            start = now.plusMonths(3);
+        }
+        Page<BaseCase> baseCasePage = baseCaseMapper.selectBaseCasePage(page, number, communityId, categories, start, end, site, state, streetId);
+        if (Objects.isNull(baseCasePage) && CollUtil.isNotEmpty(baseCasePage.getRecords())) {
+            List<BaseCase> records = baseCasePage.getRecords();
+            Set<Long> caseIds = records.stream().map(BaseCase::getId).collect(Collectors.toSet());
+            Map<Long, String> urlMap = imageResourcesService.getUrlMap(caseIds, "01");
+            records.stream().forEach(item -> {
+                item.setUrl(urlMap.get(item.getId()));
+            });
+        }
+        return baseCasePage;
     }
 
+
     @Override
     public Page<QueryForViolationVO> selectViolation(QueryForViolationParam queryForViolationParam) {
         return baseCaseMapper.selectViolationPage(
diff --git a/ycl-platform/src/main/java/com/ycl/service/ding/BookRemarkService.java b/ycl-platform/src/main/java/com/ycl/service/ding/BookRemarkService.java
new file mode 100644
index 0000000..0a0370e
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/service/ding/BookRemarkService.java
@@ -0,0 +1,26 @@
+package com.ycl.service.ding;
+
+import com.ycl.bo.AdminUserDetails;
+import com.ycl.entity.ding.BookRemark;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+public interface BookRemarkService extends IService<BookRemark>{
+
+    /**
+     * 淇敼澶囨敞
+     * @param user
+     * @param userId
+     * @param remark
+     * @return
+     */
+    Boolean updateRemark(AdminUserDetails user, Long userId, String remark);
+
+    /**
+     * 鏌ヨ鐢ㄦ埛鎵�鏈夎仈绯诲娉�
+     * @param userId
+     * @return
+     */
+    Map<Long,String> findByUserId(Long userId);
+}
diff --git a/ycl-platform/src/main/java/com/ycl/service/ding/DingService.java b/ycl-platform/src/main/java/com/ycl/service/ding/DingService.java
new file mode 100644
index 0000000..68fc818
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/service/ding/DingService.java
@@ -0,0 +1,20 @@
+package com.ycl.service.ding;
+
+import com.ycl.vo.AddressBookVO;
+import com.ycl.vo.NewAddressBookVO;
+
+import java.util.List;
+
+public interface DingService {
+
+    /**
+     * 鏌ヨ閫氳褰�
+     *
+     * @return
+     */
+    List<AddressBookVO> getAddressBook(Long userId);
+
+    List<AddressBookVO> getAddressBookByParentId(Long id, Long userId);
+
+    NewAddressBookVO getAddressBookById(Long id, Long userId);
+}
diff --git a/ycl-platform/src/main/java/com/ycl/service/ding/impl/BookRemarkServiceImpl.java b/ycl-platform/src/main/java/com/ycl/service/ding/impl/BookRemarkServiceImpl.java
new file mode 100644
index 0000000..65fa6c1
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/service/ding/impl/BookRemarkServiceImpl.java
@@ -0,0 +1,47 @@
+package com.ycl.service.ding.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.ycl.bo.AdminUserDetails;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ycl.entity.ding.BookRemark;
+import com.ycl.mapper.ding.BookRemarkMapper;
+import com.ycl.service.ding.BookRemarkService;
+
+@Service
+public class BookRemarkServiceImpl extends ServiceImpl<BookRemarkMapper, BookRemark> implements BookRemarkService {
+
+
+    @Override
+    public Boolean updateRemark(AdminUserDetails user, Long userId, String remark) {
+        //瀛樺湪淇敼 娌℃湁 灏变繚瀛�
+        BookRemark bookRemark = baseMapper.findByUserIdAndRemarkUserId(user.getUserId(), userId);
+        if (Objects.nonNull(bookRemark)) {
+            return baseMapper.updateRemark(remark, bookRemark.getId()) > 0;
+
+        }
+        BookRemark remark1 = new BookRemark();
+        remark1.setRemark(remark);
+        remark1.setRemarkUserId(userId);
+        remark1.setUserId(user.getUserId());
+        return save(remark1);
+    }
+
+
+    @Override
+    public Map<Long, String> findByUserId(Long userId) {
+        List<BookRemark> list = baseMapper.getAllByUserId(userId);
+        if (CollUtil.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(BookRemark::getRemarkUserId, BookRemark::getRemark));
+    }
+}
diff --git a/ycl-platform/src/main/java/com/ycl/service/ding/impl/DingServiceImpl.java b/ycl-platform/src/main/java/com/ycl/service/ding/impl/DingServiceImpl.java
new file mode 100644
index 0000000..b9c2eed
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/service/ding/impl/DingServiceImpl.java
@@ -0,0 +1,199 @@
+package com.ycl.service.ding.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ycl.entity.depart.UmsDepart;
+import com.ycl.entity.user.UmsAdmin;
+import com.ycl.entity.user.UmsAdminRoleRelation;
+import com.ycl.entity.user.UmsRole;
+import com.ycl.service.depart.IDepartManagerService;
+import com.ycl.service.depart.UmsDepartService;
+import com.ycl.service.ding.BookRemarkService;
+import com.ycl.service.ding.DingService;
+import com.ycl.service.user.UmsAdminRoleRelationService;
+import com.ycl.service.user.UmsAdminService;
+import com.ycl.service.user.UmsRoleService;
+import com.ycl.vo.AddressBookVO;
+import com.ycl.vo.ContactVO;
+import com.ycl.vo.NewAddressBookVO;
+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.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Service
+@Slf4j
+public class DingServiceImpl implements DingService {
+
+    @Autowired
+    private UmsDepartService departService;
+    @Autowired
+    private IDepartManagerService departManagerService;
+
+    @Autowired
+    private UmsAdminService umsAdminService;
+
+    @Autowired
+    private UmsRoleService umsRoleService;
+
+    @Autowired
+    private UmsAdminRoleRelationService umsAdminRoleRelationService;
+
+    @Autowired
+    private BookRemarkService bookRemarkService;
+
+    @Override
+    public List<AddressBookVO> getAddressBook(Long userId) {
+        List<UmsAdmin> users = umsAdminService.list();
+        Map<Long, UmsAdmin> userMap = users.stream().collect(Collectors.toMap(UmsAdmin::getId, Function.identity()));
+        List<AddressBookVO> addressBookVOS = new ArrayList<>();
+
+        List<UmsDepart> list = departService.list(new QueryWrapper<UmsDepart>().lambda().eq(UmsDepart::getStatus, 1).eq(UmsDepart::getIsDeleted, 0));
+        //鏌ヨ澶囨敞淇℃伅
+        Map<Long, String> remarkMap = bookRemarkService.findByUserId(userId);
+        list.forEach(item -> {
+            //鏋勫缓閮ㄩ棬淇℃伅
+            extracted(userMap, addressBookVOS, item, remarkMap);
+        });
+        log.info(JSON.toJSONString(addressBookVOS));
+
+        return buildTreeUseStream(addressBookVOS, 0);
+    }
+
+    @Override
+    public List<AddressBookVO> getAddressBookByParentId(Long id, Long userId) {
+        List<UmsAdmin> users = umsAdminService.list();
+        Map<Long, UmsAdmin> userMap = users.stream().collect(Collectors.toMap(UmsAdmin::getId, Function.identity()));
+        List<AddressBookVO> addressBookVOS = new ArrayList<>();
+
+        List<UmsDepart> list = departService.list(new QueryWrapper<UmsDepart>().lambda().eq(UmsDepart::getStatus, 1).eq(UmsDepart::getParentId, id).eq(UmsDepart::getIsDeleted, 0));
+        //鏌ヨ澶囨敞淇℃伅
+        Map<Long, String> remarkMap = bookRemarkService.findByUserId(userId);
+        list.forEach(item -> {
+            //鏋勫缓閮ㄩ棬淇℃伅
+            extracted(userMap, addressBookVOS, item, remarkMap);
+        });
+        log.info(JSON.toJSONString(addressBookVOS));
+
+        return addressBookVOS;
+    }
+
+    @Override
+    public NewAddressBookVO getAddressBookById(Long id, Long userId) {
+        List<UmsAdmin> users = umsAdminService.list();
+        Map<Long, UmsAdmin> userMap = users.stream().collect(Collectors.toMap(UmsAdmin::getId, Function.identity()));
+        NewAddressBookVO newAddressBookVO = new NewAddressBookVO();
+        List<UmsDepart> departs = departService.list(new QueryWrapper<UmsDepart>().lambda().eq(UmsDepart::getStatus, 1).eq(UmsDepart::getParentId, id).eq(UmsDepart::getIsDeleted, 0));
+        Set<Long> deptIds = departs.stream().map(UmsDepart::getParentId).collect(Collectors.toSet());
+         //閮ㄩ棬淇℃伅
+        newAddressBookVO.setDeparts(departs);
+        Map<Long, String> remarkMap = bookRemarkService.findByUserId(userId);
+        Collection<Long> userIds = departManagerService.getByDeptId(id);
+        ArrayList<ContactVO> contacts = new ArrayList<>();
+        //瑙掕壊淇℃伅
+        List<UmsAdminRoleRelation> list = umsAdminRoleRelationService.list();
+        Map<Long, List<UmsAdminRoleRelation>> rolesMap = list.stream().collect(Collectors.groupingBy(UmsAdminRoleRelation::getAdminId));
+        Map<Long, String> roleName = umsRoleService.list().stream().filter(o -> o.getStatus() == 1).collect(Collectors.toMap(UmsRole::getId, UmsRole::getName));
+        //鏋勫缓鐢ㄦ埛淇℃伅
+        if (CollUtil.isNotEmpty(userIds)) {
+            userIds.forEach(u -> {
+                UmsAdmin admin = userMap.get(u);
+                if (Objects.nonNull(admin)) {
+                    ContactVO contactVO = new ContactVO();
+                    contactVO.setUserId(admin.getId());
+                    contactVO.setSex(admin.getSex());
+                    contactVO.setUsername(admin.getUsername());
+                    contactVO.setNickName(admin.getNickName());
+                    contactVO.setIcon(admin.getIcon());
+                    contactVO.setMobile(admin.getMobile());
+                    contactVO.setRemark(remarkMap.get(admin.getId()));
+                    //娣诲姞鐢ㄦ埛瑙掕壊淇℃伅
+                    List<UmsAdminRoleRelation> roleRelations = rolesMap.get(admin.getId());
+                    if (CollUtil.isNotEmpty(roleRelations)) {
+                        ArrayList<String> roles = new ArrayList<>();
+                        Set<Long> roleId = roleRelations.stream().map(UmsAdminRoleRelation::getRoleId).collect(Collectors.toSet());
+                        for (Long o : roleId) {
+                            String s = roleName.get(o);
+                            if (StringUtils.isNotBlank(s)) {
+                                roles.add(s);
+                            }
+                        }
+                        contactVO.setRoles(roles);
+                    }
+                    contacts.add(contactVO);
+                }
+            });
+            newAddressBookVO.setContacts(contacts);
+        }
+        return newAddressBookVO;
+    }
+
+    // 浣跨敤stream娴佽浆鎹�
+    public static List<AddressBookVO> buildTreeUseStream(List<AddressBookVO> treeList, long id) {
+        List<AddressBookVO> list = treeList.stream()
+                //杩囨护鐖惰妭鐐逛笌浼犻�掔殑id鐩稿悓鐨凾reeNode瀵硅薄
+                .filter(treeNode -> treeNode.getParentId() == id)
+                .map(treeNode -> {
+                    //閫掑綊璁剧疆瀛╁瓙鑺傜偣
+                    treeNode.setChildren(buildTreeUseStream(treeList, treeNode.getDeptId()));
+                    return treeNode;
+                })
+                .collect(Collectors.toList());
+        return list;
+    }
+
+
+    private void extracted(Map<Long, UmsAdmin> userMap, List<AddressBookVO> addressBookVOS, UmsDepart depart, Map<Long, String> remarkMap) {
+
+
+        AddressBookVO books = new AddressBookVO();
+        books.setDeptId(depart.getId());
+        books.setParentId(depart.getParentId());
+        books.setDeptName(depart.getDepartName());
+        books.setDeptCode(depart.getCode());
+        ArrayList<ContactVO> contacts = new ArrayList<>();
+        Collection<Long> userIds = departManagerService.getByDeptId(depart.getId());
+        //瑙掕壊淇℃伅
+        List<UmsAdminRoleRelation> list = umsAdminRoleRelationService.list();
+        Map<Long, List<UmsAdminRoleRelation>> rolesMap = list.stream().collect(Collectors.groupingBy(UmsAdminRoleRelation::getAdminId));
+        Map<Long, String> roleName = umsRoleService.list().stream().filter(o -> o.getStatus() == 1).collect(Collectors.toMap(UmsRole::getId, UmsRole::getName));
+        //鏋勫缓鐢ㄦ埛淇℃伅
+        if (CollUtil.isNotEmpty(userIds)) {
+            userIds.forEach(u -> {
+                UmsAdmin admin = userMap.get(u);
+                if (Objects.nonNull(admin)) {
+                    ContactVO contactVO = new ContactVO();
+                    contactVO.setUserId(admin.getId());
+                    contactVO.setSex(admin.getSex());
+                    contactVO.setUsername(admin.getUsername());
+                    contactVO.setNickName(admin.getNickName());
+                    contactVO.setIcon(admin.getIcon());
+                    contactVO.setMobile(admin.getMobile());
+                    contactVO.setRemark(remarkMap.get(admin.getId()));
+                    //娣诲姞鐢ㄦ埛瑙掕壊淇℃伅
+                    List<UmsAdminRoleRelation> roleRelations = rolesMap.get(admin.getId());
+                    if (CollUtil.isNotEmpty(roleRelations)) {
+                        ArrayList<String> roles = new ArrayList<>();
+                        Set<Long> roleId = roleRelations.stream().map(UmsAdminRoleRelation::getRoleId).collect(Collectors.toSet());
+                        for (Long id : roleId) {
+                            String s = roleName.get(id);
+                            if (StringUtils.isNotBlank(s)) {
+                                roles.add(s);
+                            }
+                        }
+                        contactVO.setRoles(roles);
+                    }
+                    contacts.add(contactVO);
+                }
+            });
+            books.setContacts(contacts);
+        }
+        addressBookVOS.add(books);
+    }
+}
diff --git a/ycl-platform/src/main/java/com/ycl/service/message/IMessageService.java b/ycl-platform/src/main/java/com/ycl/service/message/IMessageService.java
index 2554885..3b21fe6 100644
--- a/ycl-platform/src/main/java/com/ycl/service/message/IMessageService.java
+++ b/ycl-platform/src/main/java/com/ycl/service/message/IMessageService.java
@@ -25,4 +25,6 @@
     Boolean deleteMessages(List<Long> ids);
 
     void sendMessageByPhone(Message message);
+
+    Page<Message> queryMyMessage(Page<Message> setSize, Long userId);
 }
diff --git a/ycl-platform/src/main/java/com/ycl/service/message/impl/MessageServiceImpl.java b/ycl-platform/src/main/java/com/ycl/service/message/impl/MessageServiceImpl.java
index 6c5e7e1..3a3f391 100644
--- a/ycl-platform/src/main/java/com/ycl/service/message/impl/MessageServiceImpl.java
+++ b/ycl-platform/src/main/java/com/ycl/service/message/impl/MessageServiceImpl.java
@@ -1,6 +1,8 @@
 package com.ycl.service.message.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -254,6 +256,28 @@
     }
 
     @Override
+    public Page<Message> queryMyMessage(Page<Message> page, Long userId) {
+        List<Message> list = list();
+        ArrayList<Long> ids = new ArrayList<>();
+        list.forEach(item -> {
+            String targetTo = item.getTargetTo();
+            if (StringUtils.isNotBlank(targetTo)) {
+                String[] split = targetTo.split(",");
+                for (String s : split) {
+                    if (userId.equals(Long.getLong(s))) {
+                        ids.add(item.getId());
+                        break;
+                    }
+                }
+            }
+        });
+        if (CollUtil.isEmpty(ids)) {
+            return new Page<>();
+        }
+        return baseMapper.selectPage(page, new QueryWrapper<Message>().lambda().in(Message::getId, ids));
+    }
+
+    @Override
     public Boolean deleteMessages(List<Long> ids) {
         LambdaQueryWrapper<Message> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.in(Message::getId, ids).or().in(Message::getParentId, ids);
diff --git a/ycl-platform/src/main/java/com/ycl/service/resources/IImageResourcesService.java b/ycl-platform/src/main/java/com/ycl/service/resources/IImageResourcesService.java
index 50c8b58..02289a5 100644
--- a/ycl-platform/src/main/java/com/ycl/service/resources/IImageResourcesService.java
+++ b/ycl-platform/src/main/java/com/ycl/service/resources/IImageResourcesService.java
@@ -1,13 +1,17 @@
 package com.ycl.service.resources;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ycl.entity.resources.ImageResources;
 import com.ycl.vo.resources.MediaVO;
 
+import java.util.Collection;
+import java.util.Map;
+
 /**
  * <p>
- *  鏈嶅姟绫�
+ * 鏈嶅姟绫�
  * </p>
  *
  * @author lyq
@@ -16,4 +20,7 @@
 public interface IImageResourcesService extends IService<ImageResources> {
 
     Page<MediaVO> selectImages(String type, String startTime, String endTime, Long size, Long current);
+
+
+    Map<Long, String> getUrlMap(Collection<Long> ids, String type);
 }
diff --git a/ycl-platform/src/main/java/com/ycl/service/resources/impl/ImageResourcesServiceImpl.java b/ycl-platform/src/main/java/com/ycl/service/resources/impl/ImageResourcesServiceImpl.java
index 663bacf..bdd3c93 100644
--- a/ycl-platform/src/main/java/com/ycl/service/resources/impl/ImageResourcesServiceImpl.java
+++ b/ycl-platform/src/main/java/com/ycl/service/resources/impl/ImageResourcesServiceImpl.java
@@ -1,6 +1,9 @@
 package com.ycl.service.resources.impl;
 
 
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ycl.entity.resources.ImageResources;
@@ -10,6 +13,11 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -30,6 +38,18 @@
         Page<MediaVO> imagesVOPage = new Page<>();
         imagesVOPage.setCurrent(current);
         imagesVOPage.setSize(size);
-        return imageResourcesMapper.selectImagePage(imagesVOPage,type,startTime,endTime);
+        return imageResourcesMapper.selectImagePage(imagesVOPage, type, startTime, endTime);
     }
+
+    @Override
+    public Map<Long, String> getUrlMap(Collection<Long> ids, String type) {
+        LambdaQueryWrapper<ImageResources> wrapper = new QueryWrapper<ImageResources>().lambda().in(ImageResources::getBelongToId, ids).eq(ImageResources::getType, type);
+        List<ImageResources> list = imageResourcesMapper.selectList(wrapper);
+        if (CollUtil.isEmpty(list)) {
+            return new HashMap<>();
+
+        }
+        return list.stream().collect(Collectors.toMap(ImageResources::getBelongToId, ImageResources::getUrl, (v1, v2) -> v1));
+    }
+
 }
diff --git a/ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java b/ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java
new file mode 100644
index 0000000..b33b59d
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java
@@ -0,0 +1,106 @@
+package com.ycl.timer;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
+import com.alibaba.xxpt.gateway.shared.client.http.GetClient;
+import com.alibaba.xxpt.gateway.shared.client.http.PostClient;
+import com.ycl.config.DingConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+import static com.ycl.common.constant.DingConst.GET_TIKER;
+import static com.ycl.common.constant.DingConst.GET_TOKEN;
+
+/**
+ * 鑾峰彇閽夐拤 token
+ */
+@Slf4j
+@Component
+public class GetDingToken implements  ApplicationListener<ContextRefreshedEvent> {
+    private static GetClient getTokenClient;
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Resource
+    private ExecutableClient executableClient;
+
+    @Resource
+    private DingConfig dingConfig;
+
+
+    private  String getToken() {
+        //璋冪敤API
+        getTokenClient = executableClient.newGetClient(GET_TOKEN);
+        //璁剧疆鍙傛暟
+        getTokenClient.addParameter("appkey",  dingConfig.getAppKey());
+        getTokenClient.addParameter("appsecret", dingConfig.getAppSecret());
+        String apiResult = getTokenClient.get();
+        return parsingResult(apiResult);
+    }
+
+    private  String getTiker(String accToken) {
+        //璋冪敤API
+        PostClient postClient = executableClient.newPostClient(GET_TIKER);
+        //璁剧疆鍙傛暟
+        if (ObjectUtil.isNotNull(accToken)) {
+            postClient.addParameter("accessToken", accToken);
+            postClient.addParameter("appkey", dingConfig.getAppKey());
+            postClient.addParameter("appsecret", dingConfig.getAppSecret());
+            String apiResult = postClient.post();
+            return parsingResult(apiResult);
+        }
+        return null;
+    }
+
+    /**
+     * 瑙f瀽杩斿洖token
+     *
+     * @param apiResult
+     * @return
+     */
+    private static String parsingResult(String apiResult) {
+        if (ObjectUtil.isNotNull(apiResult)) {
+            JSONObject resJson = JSONObject.parseObject(apiResult);
+            if (resJson.getBoolean("success")) {
+                JSONObject content = resJson.getJSONObject("content");
+                if (content.getBoolean("success")) {
+                    JSONObject dataObj = content.getJSONObject("data");
+                    String accessToken = dataObj.getString("accessToken");
+                    return accessToken;
+                }
+            } else {
+                log.error(resJson.toJSONString());
+            }
+        }
+        return null;
+    }
+
+
+    @Override
+    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
+        if (contextRefreshedEvent.getApplicationContext().getParent() == null) {
+            runAction();
+        }
+    }
+    @Scheduled(cron ="0 0/2 * * * ? ")
+    public void runAction() {
+        // //gettoken
+        // String getToken = getToken();
+        // //jsApi
+        // String jsapiToken = getTiker(getToken);
+        // //瀛樺偍鍒皉edis
+        // JSONObject dingObj = new JSONObject();
+        // dingObj.put("token", getToken);
+        // dingObj.put("jsApiTiker", jsapiToken);
+        // redisTemplate.opsForValue().set("ding", dingObj.toJSONString(), 2L, TimeUnit.HOURS);
+    }
+}
diff --git a/ycl-platform/src/main/java/com/ycl/timer/GetDingUserOrgTimer.java b/ycl-platform/src/main/java/com/ycl/timer/GetDingUserOrgTimer.java
new file mode 100644
index 0000000..92d2be9
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/timer/GetDingUserOrgTimer.java
@@ -0,0 +1,209 @@
+package com.ycl.timer;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.TimeInterval;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.util.StringUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ycl.common.dingding.DingCommon;
+import com.ycl.entity.depart.UmsDepart;
+import com.ycl.entity.dingding.DingUserInfo;
+import com.ycl.entity.user.UmsAdmin;
+import com.ycl.entity.user.UmsAdminRoleRelation;
+import com.ycl.entity.user.UmsDepartManage;
+import com.ycl.entity.user.UmsRole;
+import com.ycl.service.depart.UmsDepartService;
+import com.ycl.service.user.UmsAdminRoleRelationService;
+import com.ycl.service.user.UmsAdminService;
+import com.ycl.service.user.UmsDepartManageService;
+import com.ycl.service.user.UmsRoleService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+
+@Slf4j
+@Component
+public class GetDingUserOrgTimer implements ApplicationRunner, ApplicationListener<ContextRefreshedEvent> {
+
+    @Autowired
+    private DingCommon dingCommon;
+
+    private static final String TAG = "銆愭禉鏀块拤銆戠敤鎴蜂綋绯伙細";
+    protected Thread.UncaughtExceptionHandler handler = (t, e) -> log.error("ding token parse events has an error", e);
+
+
+    @Override
+    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
+        // if (contextRefreshedEvent.getApplicationContext().getParent() == null) {
+        //     Thread thread = new Thread(this::run);
+        //     thread.setUncaughtExceptionHandler(handler);
+        //     thread.start();
+        // }
+    }
+
+    @Autowired
+    private UmsDepartService umsDepartService;
+    @Autowired
+    private UmsAdminService umsAdminService;
+    @Autowired
+    private UmsDepartManageService departManageService;
+    @Autowired
+    private UmsRoleService roleService;
+    @Autowired
+    private PasswordEncoder passwordEncoder;
+    @Autowired
+    private UmsAdminRoleRelationService umsAdminRoleRelationService;
+
+    // @Scheduled(cron = "0 0 00 * * ?")
+    @Transactional(rollbackFor = Exception.class)
+    public void run() {
+        //鑾峰彇鍏ㄩ儴閮ㄩ棬code
+        JSONObject topObj = dingCommon.getBookAuthority();
+        //椤剁骇閮ㄩ棬id
+        JSONArray deptTopArr = topObj.getJSONArray("deptVisibleScopes");
+        List<UmsDepart> dingOrgList = dingCommon.getOrgInfo(deptTopArr);
+        //鏌ヨ鏁版嵁搴撲腑鐨勯儴闂�
+        List<UmsDepart> dataOrgList = umsDepartService.list();
+        Iterator<UmsDepart> removeIterOrg = dingOrgList.iterator();
+        while (removeIterOrg.hasNext()) {
+            UmsDepart dingOrg = removeIterOrg.next();
+            if (dingOrg.getCode().equals(deptTopArr.getString(0))) {
+                dingOrg.setParentId(0L);
+            }
+            //鍒ゆ柇
+            for (UmsDepart org : dataOrgList) {
+                if (ObjectUtil.equals(org.getId(), dingOrg.getId()) && ObjectUtil.equals(org.getDepartName(), dingOrg.getDepartName()) && ObjectUtil.equals(org.getParentId(), dingOrg.getParentId())) {
+                    removeIterOrg.remove();
+                }
+            }
+        }
+        //姝ゆ椂 dingOrgList 涓墿涓嬬殑灏辨槸鏂扮殑缁勭粐鏈烘瀯浜嗐��
+        dingOrgList.forEach(dingOrg -> {
+            if (dingOrg.getCode().equals(deptTopArr.getString(0))) {
+                dingOrg.setParentId(0L);
+            }
+            //umsDepartService.fillPids(dingOrg);
+            dingOrg.setStatus((short) 1);
+            umsDepartService.saveOrUpdate(dingOrg);
+        });
+
+        log.info(TAG + "update organization size " + dingOrgList.size());
+        TimeInterval timer = DateUtil.timer();
+        /**
+         //         * 鏍规嵁缁勭粐code 鏌ヨ 閫氳褰曚汉鍛樹俊鎭�
+         //         */
+        Set<DingUserInfo> dingList = dingCommon.getPersonInfoByOrgCode();
+        //鏌ヨ鎵�鏈夌敤鎴�
+        List<UmsAdmin> userList = umsAdminService.list();
+        //鏌ヨ鐢ㄦ埛缁勭粐鍏宠仈琛�
+        List<UmsDepartManage> empOrgList = departManageService.list();
+        Iterator<DingUserInfo> iterator = dingList.iterator();
+        while (iterator.hasNext()) {
+            DingUserInfo dingUserInfo = iterator.next();
+            //鍒ゆ柇鐢ㄦ埛鏄惁瀛樺湪锛岃緭鍑烘柊鐢ㄦ埛
+            for (UmsAdmin user : userList) {
+                //鍒ゆ柇濮撳悕
+                if (ObjectUtil.equals(user.getId(), dingUserInfo.getUserId()) ) {
+                    iterator.remove();
+                    //鍒ゆ柇缁勭粐
+//                    for (UmsDepartManage emp : empOrgList) {
+//                        if (ObjectUtil.equals(user.getId(), emp.getUserId()) && ObjectUtil.equals(dingUserInfo.getOrgId(), emp.getDepartId())) {
+//                            iterator.remove();
+//                            break;
+//                        }
+//                    }
+                }
+            }
+        }
+        ArrayList<UmsAdminRoleRelation> relations = new ArrayList<>();
+        log.info(TAG + " elapsed time:" + timer.interval());
+        for (DingUserInfo dingUserInfo : dingList) {
+            //1.娣诲姞鐢ㄦ埛
+            UmsAdmin user = new UmsAdmin();
+            //璐﹀彿
+            user.setUsername(dingUserInfo.getEmployeeName());
+            //鏄电О
+            if (StringUtils.isNotBlank(dingUserInfo.getNickNameCn())) {
+                user.setNickName(dingUserInfo.getNickNameCn());
+            } else {
+                user.setNickName(dingUserInfo.getEmployeeName());
+            }
+            //code
+            //澶村儚
+            user.setIcon(dingUserInfo.getGovEmpAvatar());
+            //濮撳悕
+            //鎬у埆
+            user.setSex(dingUserInfo.getEmpGender().byteValue());
+            //瀵嗙爜 鑾峰彇鍒濆瀵嗙爜
+            //灏嗗瘑鐮佽繘琛屽姞瀵嗘搷浣�
+            String encodePassword = passwordEncoder.encode("123456");
+            user.setPassword(encodePassword);
+            user.setIsDy(Byte.parseByte("0"));
+            user.setMobile("");
+            user.setOpenid(dingUserInfo.getOpenid());
+            //id
+            user.setId(dingUserInfo.getUserId());
+            //鐘舵�佷负鍋滅敤锛堜笉鍙敤鐘舵�侊級鐐瑰嚮鐧诲綍鍚庢墠鑳戒娇鐢�
+            user.setStatus(1);
+            umsAdminService.save(user);
+            //鍛樺伐淇℃伅锛屽叧鑱旂粍缁�
+            UmsDepartManage departManage = new UmsDepartManage();
+            departManage.setDepartId(dingUserInfo.getOrgId());
+            departManage.setIsLeader(0);
+            departManage.setUserId(dingUserInfo.getUserId());
+            departManageService.saveOrUpdate(departManage);
+            //瑙掕壊淇℃伅
+            List<String> roleCode = dingUserInfo.getRoleCodeList();
+            if (CollectionUtils.isNotEmpty(roleCode)) {
+                List<UmsRole> roleList = roleService.getRoleListByCodes(roleCode);
+                roleList.forEach(item -> {
+                    UmsAdminRoleRelation relation = new UmsAdminRoleRelation();
+                    relation.setAdminId(dingUserInfo.getUserId());
+                    relation.setRoleId(item.getId());
+                    relations.add(relation);
+                });
+            }
+        }
+        if (CollUtil.isNotEmpty(relations)) {
+            umsAdminRoleRelationService.saveBatch(relations, IService.DEFAULT_BATCH_SIZE);
+        }
+        log.info(TAG + "update user size " + dingList.size());
+//        getEmployeeAvatar();
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛澶村儚
+     */
+    private void getEmployeeAvatar() {
+//        List<SysUser> users = sysUserService.list();
+//        for (SysUser user : users) {
+//            String mediaId = user.getDingAvatar();
+//            if (StrUtil.isNotBlank(mediaId)) {
+//                dingCommon.downloadEmployeeAvatar(mediaId);
+//            }
+//        }
+    }
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        // run();
+    }
+}
diff --git a/ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java b/ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java
index bd4f1df..37cc520 100644
--- a/ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java
+++ b/ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java
@@ -50,7 +50,7 @@
             sb.append("&pageSize=");
             sb.append(params.getPageSize());
         }
-        // result = MD5Util.md5Encrypt32Lower(sb.toString());
+        result = MD5Util.md5Encrypt32Lower(sb.toString());
         // if (!params.getSign().equals(result)) {
         //     throw new ApiException(ResultCode.SIGN_ERROR);
         // }
diff --git a/ycl-platform/src/main/java/com/ycl/vo/AddressBookVO.java b/ycl-platform/src/main/java/com/ycl/vo/AddressBookVO.java
new file mode 100644
index 0000000..0eadeed
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/vo/AddressBookVO.java
@@ -0,0 +1,27 @@
+package com.ycl.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("閫氳褰�")
+public class AddressBookVO {
+
+
+    @ApiModelProperty("鐖剁骇id,榛樿0")
+    private Long parentId;
+    @ApiModelProperty("閮ㄩ棬id")
+    private Long deptId;
+    @ApiModelProperty("閮ㄩ棬code")
+    private String deptCode;
+    @ApiModelProperty("閮ㄩ棬鍚嶇О")
+    private String deptName;
+    @ApiModelProperty("閮ㄩ棬涓嬭仈绯讳汉")
+    private List<ContactVO> contacts;
+    @ApiModelProperty("瀛愰泦")
+    private List<AddressBookVO> children;
+
+}
diff --git a/ycl-platform/src/main/java/com/ycl/vo/ContactVO.java b/ycl-platform/src/main/java/com/ycl/vo/ContactVO.java
new file mode 100644
index 0000000..deb282e
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/vo/ContactVO.java
@@ -0,0 +1,37 @@
+package com.ycl.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("鑱旂郴浜�")
+public class ContactVO {
+    @ApiModelProperty(value = "userId")
+    private Long userId;
+
+    @ApiModelProperty(value = "鐢ㄦ埛濮撳悕")
+    private String username;
+
+    @ApiModelProperty(value = "澶村儚")
+    private String icon;
+
+    @ApiModelProperty(value = "鐪熷疄濮撳悕")
+    private String nickName;
+
+
+    @ApiModelProperty(value = "鎬у埆")
+    private Byte sex;
+
+    @ApiModelProperty(value = "鎵嬫満鍙风爜")
+    private String mobile;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "瑙掕壊鍒楄〃")
+    private List<String> roles;
+}
diff --git a/ycl-platform/src/main/java/com/ycl/vo/NewAddressBookVO.java b/ycl-platform/src/main/java/com/ycl/vo/NewAddressBookVO.java
new file mode 100644
index 0000000..c4e7225
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/vo/NewAddressBookVO.java
@@ -0,0 +1,19 @@
+package com.ycl.vo;
+
+import com.ycl.entity.depart.UmsDepart;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("閫氳褰�")
+public class NewAddressBookVO {
+
+    @ApiModelProperty("閮ㄩ棬")
+    private List<UmsDepart> departs;
+    @ApiModelProperty("閮ㄩ棬涓嬭仈绯讳汉")
+    private List<ContactVO> contacts;
+
+}
diff --git a/ycl-platform/src/main/java/com/ycl/vo/casePool/ViolationsVO.java b/ycl-platform/src/main/java/com/ycl/vo/casePool/ViolationsVO.java
index a519604..3ad1d4c 100644
--- a/ycl-platform/src/main/java/com/ycl/vo/casePool/ViolationsVO.java
+++ b/ycl-platform/src/main/java/com/ycl/vo/casePool/ViolationsVO.java
@@ -117,6 +117,14 @@
     @ApiModelProperty(value = "瑙嗛鐐逛綅")
     private Integer videoPointId;
 
+
+    /**
+     * 璋冨害鏃堕檺
+     */
+    @ApiModelProperty(value = "璋冨害鏃堕檺")
+    @TableField("limit_time")
+    private String limitTime;
+
     /**
      * 澶х被鏂囨湰
      */
diff --git a/ycl-platform/src/main/resources/mapper/BookRemarkMapper.xml b/ycl-platform/src/main/resources/mapper/BookRemarkMapper.xml
new file mode 100644
index 0000000..95ffec3
--- /dev/null
+++ b/ycl-platform/src/main/resources/mapper/BookRemarkMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ycl.mapper.ding.BookRemarkMapper">
+    <resultMap id="BaseResultMap" type="com.ycl.entity.ding.BookRemark">
+        <!--@mbg.generated-->
+        <!--@Table ums_book_remark-->
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="user_id" jdbcType="BIGINT" property="userId"/>
+        <result column="remark_user_id" jdbcType="BIGINT" property="remarkUserId"/>
+        <result column="remark" jdbcType="VARCHAR" property="remark"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--@mbg.generated-->
+        id,
+        user_id,
+        remark_user_id,
+        remark
+    </sql>
+    <!--auto generated by MybatisCodeHelper on 2023-06-09-->
+    <update id="updateRemark">
+        update ums_book_remark
+        <set>
+            <if test="remark != null">
+                remark= #{remark,jdbcType=VARCHAR},
+            </if>
+        </set>
+        where id = #{id,jdbcType=BIGINT}
+    </update>
+
+    <!--auto generated by MybatisCodeHelper on 2023-06-09-->
+    <select id="getAllByUserId" resultType="com.ycl.entity.ding.BookRemark">
+        select
+        <include refid="Base_Column_List"/>
+        from ums_book_remark
+        where user_id = #{userid,jdbcType=BIGINT}
+    </select>
+
+    <!--auto generated by MybatisCodeHelper on 2023-06-09-->
+    <select id="findByUserIdAndRemarkUserId" resultType="com.ycl.entity.ding.BookRemark">
+        select
+        <include refid="Base_Column_List"/>
+        from ums_book_remark
+        where user_id = #{userId,jdbcType=BIGINT}
+          and remark_user_id = #{remarkUserId,jdbcType=BIGINT}
+        limit 1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml b/ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml
index 664393c..ed746d4 100644
--- a/ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml
+++ b/ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml
@@ -162,16 +162,25 @@
             <if test="categories != null">
                 t1.category = #{categories}
             </if>
-            <if test="streetId != null">
-                and t1.community_id = #{streetId}
+            <if test="communityId != null">
+                and t1.community_id = #{communityId}
+            </if>
+            <if test=" streetId != null">
+                and t1.street_id = #{streetId}
             </if>
             <if test="code != null and code !=''">
                 and t1.code like concat('%',#{code},'%')
             </if>
-            <if test="site != null and site!=''">
+            <if test="code != null and code !=''">
+                and t1.code like concat('%',#{code},'%')
+            </if>
+            <if test="state != null and state!=''">
+                and t1.state =#{state}
+            </if>
+	     <if test="site != null and site!=''">
                 and t1.site like concat('%',#{site},'%')
             </if>
-            <if test="startTime !='' and endTime !='' and startTime!=null and endTime !=null">
+            <if test="startTime!=null and endTime !=null">
                 and t1.create_time between #{startTime} and #{endTime}
             </if>
         </where>

--
Gitblit v1.8.0