zhanghua
2023-07-05 8439887c903fa52560af52b40e12a1baa8a123d3
代码合并
28个文件已修改
20个文件已添加
2278 ■■■■■ 已修改文件
ycl-common/src/main/java/com/ycl/entity/depart/UmsDepart.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/entity/user/UmsRole.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/service/depart/IDepartManagerService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/service/depart/impl/DepartManagerServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/service/user/UmsAdminService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/service/user/UmsRoleService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/service/user/impl/UmsRoleServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/common/constant/DingConst.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java 618 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/common/dingding/DingEncodeUtil.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/config/DingConfig.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/caseHandler/BaseCaseController.java 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/dingding/DingController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/message/MessageController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/dto/casePool/IllegalBuildingParam.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/dto/casePool/ViolationParam.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCase.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/caseHandler/BaseCaseDetail.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/caseHandler/DispatchInfo.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/cockpitManage/TeamIndex.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/ding/BookRemark.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/dingding/DingUserInfo.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/mapper/ding/BookRemarkMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/auth/AuthService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/auth/impl/AuthService.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/ding/BookRemarkService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/ding/DingService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/ding/impl/BookRemarkServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/ding/impl/DingServiceImpl.java 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/message/IMessageService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/message/impl/MessageServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/resources/IImageResourcesService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/resources/impl/ImageResourcesServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/timer/GetDingUserOrgTimer.java 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/AddressBookVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/ContactVO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/NewAddressBookVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/casePool/ViolationsVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/resources/mapper/BookRemarkMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}
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;
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;
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);
    /**
     * 查询部门的员工id
     * @param deptId
     * @return
     */
    Collection<Long> getByDeptId(Long deptId);
}
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());
    }
}
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);
}
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);
    /**
     * 获取角色相关菜单
     */
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);
    }
}
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);
    }
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>-->
ycl-platform/src/main/java/com/ycl/common/constant/DingConst.java
New file
@@ -0,0 +1,90 @@
package com.ycl.common.constant;
/**
 * ding 需要的常量
 */
public interface DingConst {
    /**
     * appkey
     */
    String APP_KEY = ""; //正式
    /**
     * secretKey
     */
    String SECRET_KEY = ""; //正式
    /*******接口********/
    /**
     * 超管租户id
     */
//    String TENANT_ID = "50245108";//测试
   // String TENANT_ID = "196729"; //正式
    /**
     * 钉 域名
     */
//    String DOMAIN_NAME = "openplatform.dg-work.cn";// 测试:专有钉钉
    String DOMAIN_NAME = "openplatform-pro.ding.zj.gov.cn";// 正式:浙政钉
    /**
     * 钉 请求协议
     */
    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";
    /**
     * 发送ding 工作消息链接
     */
    String SEND_DING_WORK_LINK = "dingtalkind://dingtalkclient/page/link?url=";
}
ycl-platform/src/main/java/com/ycl/common/dingding/DingCommon.java
New file
@@ -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 接收人用户ID(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 接收人用户ID(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);
        //解析为系统组织结构实体类
        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;
                        }
                    }
                    //解析数据,判断是否继续查询下一页
                } 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;
                //临时保存任职的ids(系统的用户体系)
                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;
                }
            }
            //解析数据,判断是否继续查询下一页
        } while (isHasPage);
        for (String str : currTempOrgList) {
            getPageOrgCode(str);
        }
    }
    /**
     * 解析返回值
     *
     * @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":"消息内容"}}
     * 消息内容,目前支持:文本消息:text, 链接消息:link, OA消息:oa, 卡片消息:action_card。最长不超过2048个字节
     *
     * @param content
     */
    private String getJsonStringText(String content) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msgtype", "text");//消息类型,此时固定为:text
        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();
        //消息类型,此时固定为:text
        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();
        //消息类型,此时固定为:text
        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);
//        }
//    }
}
ycl-platform/src/main/java/com/ycl/common/dingding/DingEncodeUtil.java
New file
@@ -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;
    }
}
ycl-platform/src/main/java/com/ycl/config/DingConfig.java
New file
@@ -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;
    }
}
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")
ycl-platform/src/main/java/com/ycl/controller/dingding/DingController.java
New file
@@ -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 = "根据钉钉授权码获取token")
    @GetMapping("/dingLogin")
    public CommonResult<Map> dingLogin(@RequestParam String code) {
        HashMap<String, Object> map = new HashMap<>();
        //获取用户信息
        DingUserInfo dingUser = dingCommon.getDingUserInfo(code);
        //按ding登录
        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));
    }
}
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")
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 = "不允许身份证正面为空")
   // @NotBlank(message = "不允许身份证正面为空")
    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;
}
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;
}
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;
    /**
     * 结束时间
     */
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;
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;
    /**
     * 派遣意见
     */
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;
ycl-platform/src/main/java/com/ycl/entity/ding/BookRemark.java
New file
@@ -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;
    /**
     * 备注人id
     */
    @TableField(value = "remark_user_id")
    @Schema(description="备注人id")
    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";
}
ycl-platform/src/main/java/com/ycl/entity/dingding/DingUserInfo.java
New file
@@ -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和附属职位id集合
     */
//    private List<Dict> extIds;
    /**
     * 职位id集合
     */
    private List<Long> posIdList;
    /**
     * 角色code集合
     */
    private List<String> roleCodeList;
}
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);
ycl-platform/src/main/java/com/ycl/mapper/ding/BookRemarkMapper.java
New file
@@ -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);
}
ycl-platform/src/main/java/com/ycl/service/auth/AuthService.java
New file
@@ -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);
}
ycl-platform/src/main/java/com/ycl/service/auth/impl/AuthService.java
New file
@@ -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("【auth用户认证:】_AUTH_DING_USER_" + JSONObject.toJSONString(userParam));
                throw new ApiException("auth用户认证失败");
            }
            token = null;
            //钉钉已绑定
            if (ObjectUtil.isNotEmpty(dingUser)) {
                token = adminService.getOAuthToken(dingUser.getUsername()); //调用系统登录接口
            }
        }
        return token;
    }
}
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();
}
}
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(
ycl-platform/src/main/java/com/ycl/service/ding/BookRemarkService.java
New file
@@ -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);
}
ycl-platform/src/main/java/com/ycl/service/ding/DingService.java
New file
@@ -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);
}
ycl-platform/src/main/java/com/ycl/service/ding/impl/BookRemarkServiceImpl.java
New file
@@ -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));
    }
}
ycl-platform/src/main/java/com/ycl/service/ding/impl/DingServiceImpl.java
New file
@@ -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相同的TreeNode对象
                .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);
    }
}
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);
}
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);
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);
}
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));
    }
}
ycl-platform/src/main/java/com/ycl/timer/GetDingToken.java
New file
@@ -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;
    }
    /**
     * 解析返回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);
        // //存储到redis
        // JSONObject dingObj = new JSONObject();
        // dingObj.put("token", getToken);
        // dingObj.put("jsApiTiker", jsapiToken);
        // redisTemplate.opsForValue().set("ding", dingObj.toJSONString(), 2L, TimeUnit.HOURS);
    }
}
ycl-platform/src/main/java/com/ycl/timer/GetDingUserOrgTimer.java
New file
@@ -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();
    }
}
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);
        // }
ycl-platform/src/main/java/com/ycl/vo/AddressBookVO.java
New file
@@ -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;
}
ycl-platform/src/main/java/com/ycl/vo/ContactVO.java
New file
@@ -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;
}
ycl-platform/src/main/java/com/ycl/vo/NewAddressBookVO.java
New file
@@ -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;
}
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;
    /**
     * 大类文本
     */
ycl-platform/src/main/resources/mapper/BookRemarkMapper.xml
New file
@@ -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>
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>