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查询小区信息