9b208eb3947358169df8f46472a246eb6ea8ca32..0cd9d911b8e8634ec04cb82ea07696bb09260b03
2023-12-26 zhanghua
Merge branch 'master' of http://42.193.1.25:9521/r/sccg_server
0cd9d9 对比 | 目录
2023-12-26 zhanghua
bug修改
041862 对比 | 目录
2个文件已修改
1个文件已添加
227 ■■■■■ 已修改文件
ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/util/DingUtil.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java
@@ -23,6 +23,7 @@
import com.ycl.exception.ApiException;
import com.ycl.service.depart.UmsDepartService;
import com.ycl.service.user.UmsRoleService;
import com.ycl.util.DingUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
@@ -51,6 +52,8 @@
    @Autowired
    private UmsDepartService umsDepartService;
    @Autowired
    private DingUtil dingUtil;
    /**
     * 获取用户信息
@@ -61,38 +64,37 @@
    public DingUserInfo getDingUserInfo(String code) {
//        判断ding 信息是否存在
        boolean hasDing = redisTemplate.hasKey("ding");
        String getToken = "";
        if (hasDing) {
            log.info("redis正常有消息");
            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);
            log.info("resObj--------------->{}",resObj);
            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));
                String employeeCode = resObj.getString("employeeCode");
                JSONArray users = getAccountId(Arrays.asList(employeeCode));
                JSONObject jsonObject = users.getJSONObject(0);
                String accountId = jsonObject.getString("accountId");
                dingUserInfo.setAccountId(Long.parseLong(accountId));
            getToken = dingObj.getString("token");
                return dingUserInfo;
        } else {
            getToken = dingUtil.getToken();
        }
        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);
        log.info("resObj--------------->{}", resObj);
        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));
            return dingUserInfo;
        }
        return null;
    }
@@ -101,7 +103,7 @@
     * 根据员工Code查询详情
     *
     * @param employeeCode 员工code列表
     * @param tenantId    租户id
     * @param tenantId     租户id
     * @return
     */
    public JSONObject getEmpByCode(String employeeCode, String tenantId) {
@@ -133,34 +135,36 @@
        postClient.addParameter("tenantId", dingConfig.getTenantId());
        postClient.addParameter("msg", getJsonStringText(content));
        String apiResult = postClient.post();
        log.info("apiResult------>{}",apiResult);
        log.info("apiResult------>{}", apiResult);
        JSONObject resObj = parsingJson(apiResult);
        if (null != resObj) {
            resObj = resObj.getJSONObject("data");
        }
        return resObj;
    }
    /**
     * 发送markdown消息
     *
     * @param receiverIds 接收人用户ID(accountId), 多个人时使用半角逗号分隔,
     * @param text     消息,最好500字以内
     * @param text        消息,最好500字以内
     * @return
     */
    public JSONObject sendDingMsgMarkDown(String receiverIds, String title,String text) {
    public JSONObject sendDingMsgMarkDown(String receiverIds, String title, String text) {
        //获取用户信息
        PostClient postClient = executableClient.newPostClient(POST_SEND_NOTIFY);
        postClient.addParameter("receiverIds", receiverIds);
        postClient.addParameter("tenantId", dingConfig.getTenantId());
        postClient.addParameter("msg", getJsonMarkDown(title,text));
        postClient.addParameter("msg", getJsonMarkDown(title, text));
        String apiResult = postClient.post();
        log.info("apiResult------>{}",apiResult);
        log.info("apiResult------>{}", apiResult);
        JSONObject resObj = parsingJson(apiResult);
        if (null != resObj) {
            resObj = resObj.getJSONObject("data");
        }
        return resObj;
    }
    /**
     * 发送链接消息
     *
@@ -217,7 +221,7 @@
     */
    public List<UmsDepart> getOrgInfo(JSONArray deptTopArr) {
        List<UmsDepart> orgList = new ArrayList<>();
        if(CollectionUtils.isEmpty(deptTopArr)){
        if (CollectionUtils.isEmpty(deptTopArr)) {
            return null;
        }
        //获取全部部门code
@@ -318,64 +322,30 @@
                } while (isHasPage);
            }
        }
        //补充accountId
        dingAccoutId(employeeCodes,dingUserInfoList);
        JSONArray arr = new JSONArray(Collections.singletonList(dingUserInfoList));
        redisTemplate.opsForValue().set("userJsonList", arr.toJSONString());
        return dingUserInfoList;
    }
    //补充DingUserInfo中的accountId
    private void insertAccoutId(Set<DingUserInfo> dingUserInfoList, List<String> employeeCodes) {
        if(CollectionUtils.isNotEmpty(employeeCodes)) {
        if (CollectionUtils.isNotEmpty(employeeCodes)) {
            log.info("开始补充accountId");
            JSONArray users = getAccountId(employeeCodes);
            if(CollectionUtils.isNotEmpty(users)) {
            if (CollectionUtils.isNotEmpty(users)) {
                for (int i = 0; i < users.size(); i++) {
                    JSONObject jsonObject = users.getJSONObject(i);
                    String employeeCode = jsonObject.getString("employeeCode");
                    String accountId = jsonObject.getString("accountId");
                    Optional<DingUserInfo> first = dingUserInfoList.stream().filter(dingUserInfo -> dingUserInfo.getEmployeeCode().equals(employeeCode))
                            .findFirst();
                    if(first.isPresent()){
                    if (first.isPresent()) {
                        DingUserInfo dingUserInfo = first.get();
                        dingUserInfo.setAccountId(Long.parseLong(accountId));
                    }
                }
            }
        }
        JSONArray arr = new JSONArray(Collections.singletonList(dingUserInfoList));
        redisTemplate.opsForValue().set("userJsonList", arr.toJSONString());
        return dingUserInfoList;
    }
    //分批执行
    private void dingAccoutId(List<String> employeeCodes,Set<DingUserInfo> dingUserInfoList) {
        // 每次插入的数量
        int batchSize = 99;
        // 计算需要分多少批
        int batch = employeeCodes.size() / batchSize;
        // 计算最后一批的大小
        int lastSize = employeeCodes.size() % batchSize;
        log.info("插入数量{},分多少批{},最后一批的大小{}", batchSize, batch, lastSize);
        // 将筛选出的结果分批次添加
        int num = 1;
        for (int i = batchSize; i <= batch * batchSize; i = i + batchSize) {
            log.info("开始");
            // 截取本次要添加的数据
            List<String> insertList = employeeCodes.subList(i - batchSize, i);
            // 添加本批次数据
            log.info("批量导入数据第{}次", num);
            insertAccoutId(dingUserInfoList, insertList);
            num++;
        }
        // 最后一批元素的大小是否为0
        if (lastSize != 0) {
            // 如果元素有剩余则将所有元素一次性插入
            List<String> lastList = employeeCodes.subList(batchSize * batch, employeeCodes.size());
            log.info("最后一次导入数据");
            insertAccoutId(dingUserInfoList, lastList);
        }
    }
    /**
     * 根据员工code 获取员工accountId
     *
@@ -383,14 +353,13 @@
     * @return 钉钉用户体系实体对象
     */
    private JSONArray getAccountId(List<String> employeeCodes) {
        log.info("Code参数集合------>{}",employeeCodes);
        log.info("Code参数集合------>{}", employeeCodes);
        PostClient postClient = executableClient.newPostClient(POST_ACCOUNTID_BY_EMPLOYEECODE);
        for (String code : employeeCodes) {
            postClient.addParameter("employeeCodes",code);
            postClient.addParameter("employeeCodes", code);
        }
        postClient.addParameter("tenantId", dingConfig.getTenantId());
        String apiResult = postClient.post();
        log.info("获取员工accountId接口返回------>{}",apiResult);
        JSONObject resObj = parsingJson(apiResult);
        if (null != resObj) {
            return resObj.getJSONArray("data");
@@ -432,8 +401,8 @@
//                            if (null != orgDetail) {
//                                String orgId = orgDetail.getString("organizationCode");
//                                String orgName = orgDetail.getString("organizationName");
                                Long orgId = Long.parseLong(DingEncodeUtil.getMD5(orgCode.getBytes()));
                                empCodeObj.put("orgId", orgId);
                            Long orgId = Long.parseLong(DingEncodeUtil.getMD5(orgCode.getBytes()));
                            empCodeObj.put("orgId", orgId);
//                                empCodeObj.put("orgName", orgName);
//                            }
                        }
@@ -449,7 +418,7 @@
                    String code = DingEncodeUtil.getMD5(posName.getBytes());
                    //查询是否有重复的
                    LambdaQueryWrapper<UmsRole> posLambdaQueryWrapper = new LambdaQueryWrapper<>();
                   // posLambdaQueryWrapper.eq(UmsRole::getCode, code);
                    // posLambdaQueryWrapper.eq(UmsRole::getCode, code);
                    posLambdaQueryWrapper.eq(UmsRole::getName, posName);
                    posLambdaQueryWrapper.last("LIMIT 1");
                    UmsRole posOne = userRoleService.getOne(posLambdaQueryWrapper);
@@ -461,7 +430,7 @@
                        posOne.setCode(code);
                        posOne.setStatus(1);
                        userRoleService.save(posOne);
                    }else {
                    } else {
                        posOne.setCode(code);
                        userRoleService.updateById(posOne);
                    }
@@ -651,22 +620,24 @@
        String jsonStr = JSONObject.toJSONString(jsonObject);
        return jsonStr;
    }
    /**
     * 拼接要发送的消息  markdown消息
     * json对象 必须 {"msgtype":"markdown","markdown":{"title":"首屏会话透出的展示内容","text":"消息内容"}}
     *
     * @param title 首屏会话透出的展示内容
     */
    private String getJsonMarkDown(String title,String text) {
    private String getJsonMarkDown(String title, String text) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msgtype", "markdown");//消息类型,此时固定为:markdown
        JSONObject markdown = new JSONObject();
        markdown.put("title", title);//首屏会话透出的展示内容
        markdown.put("text",text);//消息内容,建议500字符以内
        markdown.put("text", text);//消息内容,建议500字符以内
        jsonObject.put("markdown", markdown);
        String jsonStr = JSONObject.toJSONString(jsonObject);
        return jsonStr;
    }
    /**
     * 拼接要发送的消息   链接消息
     *
ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java
@@ -6,6 +6,8 @@
import com.alibaba.xxpt.gateway.shared.client.http.GetClient;
import com.alibaba.xxpt.gateway.shared.client.http.PostClient;
import com.ycl.config.DingConfig;
import com.ycl.util.DingUtil;
import com.ycl.util.VideoUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -36,7 +38,8 @@
    @Resource
    private DingConfig dingConfig;
    @Autowired
    private DingUtil dingUtil;
    private String getToken() {
        //调用API
@@ -102,9 +105,9 @@
//        System.out.println("环境:" + env);
        if ("online".equals(env)) {
            //gettoken
            String getToken = getToken();
            String getToken = dingUtil.getToken();
            //jsApi
            String jsapiToken = getTiker(getToken);
            String jsapiToken = dingUtil.getTiker(getToken);
            //存储到redis
            JSONObject dingObj = new JSONObject();
            dingObj.put("token", getToken);
ycl-platform/src/main/java/com/ycl/util/DingUtil.java
New file
@@ -0,0 +1,79 @@
package com.ycl.util;
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.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import static com.ycl.common.constant.DingConst.GET_TIKER;
import static com.ycl.common.constant.DingConst.GET_TOKEN;
@Slf4j
@Component
public class DingUtil {
    private static GetClient getTokenClient;
    @Resource
    private ExecutableClient executableClient;
    @Resource
    private DingConfig dingConfig;
    public 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);
    }
    public 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;
    }
    /**
     * 解析返回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;
    }
}