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>