diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/DingUserDetailDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/DingUserDetailDTO.java
new file mode 100644
index 0000000000..4cdbfa02e7
--- /dev/null
+++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/DingUserDetailDTO.java
@@ -0,0 +1,73 @@
+package com.epmet.dto;
+
+import lombok.Data;
+
+/**
+ * @Description
+ * @Author yzm
+ * @Date 2022/9/22 14:16
+ */
+@Data
+public class DingUserDetailDTO {
+ // 接口文档:https://open.dingtalk.com/document/isvapp-server/query-user-details
+ /**
+ * 员工的userId。
+ */
+ private String userid;
+
+ /**
+ * 员工在当前开发者企业账号范围内的唯一标识。
+ */
+ private String unionid;
+
+ /**
+ * 员工姓名。
+ */
+ private String name;
+ /**
+ * 头像。
+ *
+ * 说明 员工使用默认头像,不返回该字段,手动设置头像会返回
+ */
+ private String avatar;
+ /**
+ * 国际电话区号。
+ *
+ * 说明 第三方企业应用不返回该字段;如需获取state_code,可以使用钉钉统一授权套件方式获取。
+ */
+ private String state_code;
+ /**
+ * 手机号码。
+ *
+ * 说明
+ * 企业内部应用,只有应用开通通讯录邮箱等个人信息权限,才会返回该字段。
+ * 第三方企业应用不返回该字段,如需获取mobile,可以使用钉钉统一授权套件方式获取。
+ */
+ private String mobile;
+ /**
+ * 是否号码隐藏:
+ *
+ * true:隐藏
+ *
+ * false:不隐藏
+ *
+ * 说明 隐藏手机号后,手机号在个人资料页隐藏,但仍可对其发DING、发起钉钉免费商务电话。
+ */
+ private String hide_mobile;
+ /**
+ * 分机号。
+ *
+ * 说明 第三方企业应用不返回该参数。
+ */
+ private String telephone;
+
+ /**
+ * 员工的企业邮箱。
+ *
+ * 如果员工的企业邮箱没有开通,返回信息中不包含该数据。
+ *
+ * 说明 第三方企业应用不返回该参数。
+ */
+ private String org_email;
+}
+
diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/V2UserGetuserinfoResDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/V2UserGetuserinfoResDTO.java
new file mode 100644
index 0000000000..61d275df61
--- /dev/null
+++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/V2UserGetuserinfoResDTO.java
@@ -0,0 +1,54 @@
+package com.epmet.dto;
+
+import lombok.Data;
+
+/**
+ * @Description
+ * @Author yzm
+ * @Date 2022/9/22 14:08
+ */
+@Data
+public class V2UserGetuserinfoResDTO {
+ // 接口返参:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free
+ /**
+ * 用户的userid。
+ */
+ private String userid;
+ /**
+ * 设备ID。
+ */
+ private String device_id;
+ /**
+ * 是否是管理员。
+ *
+ * true:是
+ *
+ * false:不是
+ */
+ private Boolean sys;
+ /**
+ * 级别。
+ *
+ * 1:主管理员
+ *
+ * 2:子管理员
+ *
+ * 100:老板
+ *
+ * 0:其他(如普通员工)
+ */
+ private Number sys_level;
+ /**
+ * 用户关联的unionId。
+ */
+ private String associated_unionid;
+ /**
+ * 用户unionId。
+ */
+ private String unionid;
+ /**
+ * 用户名字。
+ */
+ private String name;
+}
+
diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/yt/ChooseGridFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/yt/ChooseGridFormDTO.java
index 29e4de2b75..18ba9812a9 100644
--- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/yt/ChooseGridFormDTO.java
+++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/yt/ChooseGridFormDTO.java
@@ -3,6 +3,8 @@ package com.epmet.dto.form.yt;
import com.epmet.commons.tools.dto.form.PageFormDTO;
import lombok.Data;
+import javax.validation.constraints.NotBlank;
+
/**
* @Description
* @Author yzm
@@ -29,5 +31,22 @@ public class ChooseGridFormDTO extends PageFormDTO {
* 楼栋名
*/
private String buildingName;
+
+ /**
+ * 授权统一后的authCode
+ */
+ @NotBlank(message = "authCode不能为空")
+ private String authCode;
+// /**
+// * 第三方企业应用传应用的SuiteKey
+// */
+// @NotBlank(message = "clientId不能为空")
+// private String clientId;
+ /**
+ * 第三方企业应用传应用的SuiteKey
+ */
+ @NotBlank(message = "miniAppId不能为空")
+ private String miniAppId;
+
}
diff --git a/epmet-module/gov-org/gov-org-server/pom.xml b/epmet-module/gov-org/gov-org-server/pom.xml
index 36dee53ef8..8cd5b6c3b9 100644
--- a/epmet-module/gov-org/gov-org-server/pom.xml
+++ b/epmet-module/gov-org/gov-org-server/pom.xml
@@ -153,6 +153,18 @@
2.0.0
compile
+
+ com.taobao
+ dingtalk-client
+ 1.0.0
+ compile
+
+
+ com.taobao
+ dingtalk-spring-boot-starter
+ 1.0.0
+ compile
+
diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/GovOrgApplication.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/GovOrgApplication.java
index 8fdce3f561..bc61656be2 100644
--- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/GovOrgApplication.java
+++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/GovOrgApplication.java
@@ -8,6 +8,7 @@
package com.epmet;
+import com.taobao.dingtalk.spring.annotations.EnableDingTalk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@@ -21,6 +22,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
+@EnableDingTalk
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java
index 2e39b1f211..7da4bf509b 100644
--- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java
+++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java
@@ -45,6 +45,7 @@ import com.epmet.dto.result.BuildingResultDTO;
import com.epmet.dto.result.ImportTaskCommonResultDTO;
import com.epmet.feign.EpmetCommonServiceOpenFeignClient;
import com.epmet.service.IcNeighborHoodService;
+import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -205,6 +206,22 @@ public class IcNeighborHoodController {
return new Result>().ok(icNeighborHoodService.getNeighborhoodList(dto));
}
+
+ /**
+ * @Description: 获取用户组织下小区列表fordingding
+ * @param tokenDto:
+ * @param dto:
+ * @Return com.epmet.commons.tools.utils.Result>
+ * @Author: lichao
+ * @Date: 2023/5/29 13:31
+ */
+ @PostMapping("neighborhoodlistForDingding")
+ public Result> getNeighborhoodListForDingding(@LoginUser TokenDto tokenDto, @RequestBody ChooseGridFormDTO dto) throws ApiException, IOException {
+ ValidatorUtils.validateEntity(dto, ChooseGridFormDTO.AddUserInternalGroup.class);
+ dto.setCustomerId(tokenDto.getCustomerId());
+ return new Result>().ok(icNeighborHoodService.getNeighborhoodListForDingding(dto));
+ }
+
/**
* @Description 小区信息导入
* @param tokenDTO
diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java
index 5313886414..5399ea6294 100644
--- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java
+++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java
@@ -34,6 +34,7 @@ import com.epmet.dto.result.ImportTaskCommonResultDTO;
import com.epmet.entity.IcNeighborHoodEntity;
import com.epmet.entity.IcNeighborHoodPropertyEntity;
import com.epmet.entity.IcPropertyManagementEntity;
+import com.taobao.api.ApiException;
import java.io.IOException;
import java.io.InputStream;
@@ -130,6 +131,8 @@ public interface IcNeighborHoodService extends BaseService
*/
List getNeighborhoodList(ChooseGridFormDTO dto);
+ List getNeighborhoodListForDingding(ChooseGridFormDTO dto) throws ApiException, IOException;
+
/**
* @Description 通过ID查询小区信息
* @Param ids
@@ -210,4 +213,5 @@ public interface IcNeighborHoodService extends BaseService
* @return
*/
List queryNeighborHoodOptionsYanTai(NeighborHoodOptionFormDTO formDTO);
+
}
diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java
index b465fb99f2..3aa6a159ab 100644
--- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java
+++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java
@@ -24,10 +24,16 @@ import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalk.module.DingTalkResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiDepartmentGetRequest;
+import com.dingtalk.api.response.OapiDepartmentGetResponse;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.commons.tools.constant.NumConstant;
@@ -40,9 +46,11 @@ import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
+import com.epmet.commons.tools.redis.common.CustomerDingDingRedis;
import com.epmet.commons.tools.redis.common.CustomerOrgRedis;
import com.epmet.commons.tools.redis.common.CustomerStaffRedis;
import com.epmet.commons.tools.redis.common.bean.AgencyInfoCache;
+import com.epmet.commons.tools.redis.common.bean.DingMiniInfoCache;
import com.epmet.commons.tools.redis.common.bean.GridInfoCache;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.Result;
@@ -50,10 +58,8 @@ import com.epmet.constant.CustomerGridConstant;
import com.epmet.constants.ImportTaskConstants;
import com.epmet.dao.*;
import com.epmet.dto.*;
-import com.epmet.dto.form.IcNeighborHoodAddFormDTO;
-import com.epmet.dto.form.ImportInfoFormDTO;
-import com.epmet.dto.form.ImportTaskCommonFormDTO;
-import com.epmet.dto.form.NeighborHoodOptionFormDTO;
+import com.epmet.dto.V2UserGetuserinfoResDTO;
+import com.epmet.dto.form.*;
import com.epmet.dto.form.yt.ChooseGridFormDTO;
import com.epmet.dto.result.*;
import com.epmet.entity.*;
@@ -64,8 +70,13 @@ import com.epmet.model.ImportNeighborHoodInfoListener;
import com.epmet.model.NeighborHoodInfoModel;
import com.epmet.redis.IcHouseRedis;
import com.epmet.service.*;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
+import com.taobao.api.ApiException;
+import com.taobao.dingtalk.client.DingTalkClientToken;
+import com.taobao.dingtalk.client.DingTalkClientUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
@@ -134,6 +145,10 @@ public class IcNeighborHoodServiceImpl extends BaseServiceImpl page(Map params) {
@@ -263,6 +278,92 @@ public class IcNeighborHoodServiceImpl extends BaseServiceImpl getNeighborhoodListForDingding(ChooseGridFormDTO dto) throws ApiException, IOException {
+
+ DingMiniInfoCache dingMiniInfo = CustomerDingDingRedis.getDingMiniInfo(dto.getMiniAppId());
+ if (dingMiniInfo == null){
+ throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取钉钉应用配置异常", "获取钉钉应用配置异常");
+ }
+ // 1、获取企业内部应用的accessToken文档地址:https://open.dingtalk.com/document/orgapp-server/obtain-the-access_token-of-an-internal-app
+ String accessToken = "";
+ DingTalkResult dingTalkResult = dingTalkClientToken.getAppAccessTokenToken(dingMiniInfo.getSuiteKey(), dingMiniInfo.getSuiteSecret());
+ if (!dingTalkResult.success() || StringUtils.isBlank(dingTalkResult.getData())) {
+ log.error(String.format("获取企业内部应用的accessToken失败,customKey:%s,customSecret:%s", dingMiniInfo.getSuiteKey(), dingMiniInfo.getSuiteSecret()));
+ throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取企业内部应用的accessToken异常", "获取企业内部应用的accessToken");
+ }
+ accessToken = dingTalkResult.getData();
+ log.info(String.format("1、获取企业内部应用的accessToken返参:%s", accessToken));
+
+
+ // 2、通过免登码获取用户信息,文档地址:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free
+ DingTalkResult v2UserGetuserinfoRes = dingTalkClientToken.getUserInfo(accessToken, dto.getAuthCode());
+ if (!v2UserGetuserinfoRes.success() || StringUtils.isBlank(v2UserGetuserinfoRes.getData())) {
+ throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "通过免登码获取用户信息异常", "通过免登码获取用户信息异常");
+ }
+ log.info(String.format("2、通过免登码获取用户信息返参:%s", v2UserGetuserinfoRes.getData()));
+ V2UserGetuserinfoResDTO v2UserGetuserinfoResDTO = JSON.parseObject(v2UserGetuserinfoRes.getData(), V2UserGetuserinfoResDTO.class);
+ if (null == v2UserGetuserinfoResDTO || StringUtils.isBlank(v2UserGetuserinfoResDTO.getUserid())) {
+ throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取钉钉用户userid为空", "获取钉钉用户userid为空");
+ }
+
+
+ // 3、查询用户详情,文档地址:https://open.dingtalk.com/document/isvapp-server/query-user-details
+ DingTalkResult v2UserGetRes = dingTalkClientToken.getUserDetail(v2UserGetuserinfoResDTO.getUserid(), accessToken);
+ if (!v2UserGetRes.success() || StringUtils.isBlank(v2UserGetRes.getData())) {
+ throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "根据userId查询用户详情失败", "根据userId查询用户详情失败");
+
+ }
+ String meDate = v2UserGetRes.getData();
+
+// String meDate = "{\"boss\":false,\"unionid\":\"VIx9CsJWZkf69QppBXBQgQiEiE\",\"role_list\":[{\"group_name\":\"默认\",\"name\":\"子管理员\",\"id\":3027676245}],\"exclusive_account\":false,\"mobile\":\"15610026580\",\"active\":true,\"admin\":true,\"remark\":\"\",\"telephone\":\"\",\"avatar\":\"\",\"hide_mobile\":false,\"userid\":\"0432130611865705\",\"senior\":false,\"work_place\":\"\",\"dept_order_list\":[{\"dept_id\":721913981,\"order\":177917621779460497}],\"real_authed\":true,\"name\":\"樊平\",\"dept_id_list\":[721913981],\"state_code\":\"86\",\"email\":\"\",\"leader_in_dept\":[{\"leader\":false,\"dept_id\":721913981}]}";
+
+
+ ObjectMapper mapper = new ObjectMapper();
+ JsonNode root = mapper.readTree(meDate);
+
+
+ // 获取 "dept_order_list" 节点
+ JsonNode deptOrderList = root.path("dept_order_list");
+
+ int maxOrder = Integer.MIN_VALUE;
+ String maxDeptId = null;
+
+ // 遍历 "dept_order_list" 节点,找到最大的 "order" 值对应的 "dept_id"
+ for (JsonNode node : deptOrderList) {
+ int order = node.path("order").asInt();
+ String deptId = node.path("dept_id").asText();
+
+ if (order > maxOrder) {
+ maxOrder = order;
+ maxDeptId = deptId;
+ }
+ }
+
+ DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/get");
+ OapiDepartmentGetRequest req = new OapiDepartmentGetRequest();
+ req.setId(maxDeptId);
+ req.setLang("zh_CN");
+ req.setHttpMethod("GET");
+ OapiDepartmentGetResponse rsp = client.execute(req, accessToken);
+ String deptBody = rsp.getBody();
+// String deptBody = "{\"errcode\":0,\"sourceIdentifier\":\"2353453\",\"userPermits\":\"user123\",\"orgDeptOwner\":\"manager4220\",\"outerDept\":true,\"errmsg\":\"ok\",\"deptManagerUseridList\":\"manager4220\",\"parentid\":1,\"groupContainSubDept\":false,\"outerPermitUsers\":\"\",\"outerPermitDepts\":\"420606536\",\"createDeptGroup\":true,\"name\":\"销售一部\",\"deptGroupChatId\":\"chat3d322af37b1d20447cf382add2062dec\",\"id\":420606536,\"autoAddUser\":true,\"deptHiding\":true,\"deptPermits\":\"420682732\",\"order\":2353453}";
+
+ if (StringUtils.isNotBlank(deptBody)) {
+ JSONObject jsonObject = JSON.parseObject(deptBody);
+ if (StringUtils.isNotBlank(jsonObject.getString("name"))) {
+ String agencyName = jsonObject.getString("name");
+ LambdaQueryWrapper customerAgencyEntityLambdaQueryWrapper = new LambdaQueryWrapper().eq(CustomerAgencyEntity::getOrganizationName,agencyName);
+ List agencyEntities= customerAgencyDao.selectList(customerAgencyEntityLambdaQueryWrapper);
+ if (agencyEntities.size()>0){
+ dto.setAgencyId(agencyEntities.get(0).getId());
+ }
+ }
+ }
+ PageHelper.startPage(dto.getPageNo(), dto.getPageSize());
+ List list = icBuildingDao.listBuildingInfo(dto.getCustomerId(), dto.getAgencyId(), dto.getGridId(), dto.getBuildingName());
+ return list;
+ }
+
/**
* @param ids
* @Description 通过ID查询小区信息