feat(system): 新增通过昵称获取用户列表接口- 在 ApiAdminUserApiImpl 中实现 getUserListByNickname 方法

- 在 IApiAdminUserApi 接口中定义 getUserListByNickname 方法
- 优化 RiskServiceImpl 中的风险隐患待办推送逻辑- 新增 PortalTodoService 实现待办系统接口- 新增 PortalTodoController 提供待办相关接口- 引入 PortalRequest 进行待办信息推送- 使用 Base64 编码待办流程ID
- 添加待办状态和查看类型的常量定义
- 实现风险隐患待办完成推送功能
- 重构 sendNotify2Corrective 方法以支持待办推送- 移除旧的通知发送服务依赖
- 添加空实现 sendNotify2Check 方法注释说明
- 优化用户信息获取逻辑
- 增强风险隐患数据查询方法
- 添加必要的工具类导入和集合操作支持
This commit is contained in:
2025-10-17 15:48:56 +08:00
parent af08e91a45
commit 5dadac1a55
6 changed files with 270 additions and 59 deletions

View File

@@ -0,0 +1,42 @@
package com.jeelowcode.module.biz.controller;
import com.jeelowcode.core.framework.controller.BaseController;
import com.jeelowcode.framework.global.JeeLowCodeBaseConstant;
import com.jeelowcode.framework.tenant.annotation.JeeLowCodeTenantIgnore;
import com.jeelowcode.module.biz.service.IPortalTodoService;
import com.jeelowcode.tool.framework.common.pojo.CommonResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* 门户待办有关接口
*
* @author yangchenjj
*/
@JeeLowCodeTenantIgnore
@Tag(name = "低代码框架 - 门户待办有关接口")
@RestController
@AllArgsConstructor
@RequestMapping(JeeLowCodeBaseConstant.REQUEST_URL_START + "/portal-to-do/push-done")
public class PortalTodoController extends BaseController {
private final IPortalTodoService portalTodoService;
/**
* 风险隐患推送待办完成
*
* @param workflowId 待办id
* @return boolean 推送结果
*/
@Operation(summary = "风险隐患推送待办完成")
@RequestMapping(value = "/risk-hazard/{workflowId}", method = RequestMethod.POST)
public CommonResult<Boolean> pushDoneRiskHazardWorkflow(@PathVariable("workflowId") Long workflowId) {
return CommonResult.success(portalTodoService.pushDoneRiskHazardWorkflow(workflowId));
}
}

View File

@@ -0,0 +1,18 @@
package com.jeelowcode.module.biz.service;
/**
* 待办系统接口
*
* @author yangchenjj
*/
public interface IPortalTodoService {
/**
* 风险隐患推送待办完成
*
* @param workflowId 流程id
* @return boolean 推送结果
*/
boolean pushDoneRiskHazardWorkflow(Long workflowId);
}

View File

@@ -0,0 +1,112 @@
package com.jeelowcode.module.biz.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.jeelowcode.framework.plus.core.toolkit.StringUtils;
import com.jeelowcode.framework.utils.tool.spring.SpringUtils;
import com.jeelowcode.module.biz.service.IPortalTodoService;
import com.jeelowcode.module.biz.service.IRiskService;
import com.jeelowcode.service.bpm.config.framework.portal.core.PortalRequest;
import com.jeelowcode.service.bpm.config.framework.portal.core.dto.ReceiveRequestInfoDTO;
import com.jeelowcode.service.system.api.IApiAdminUserApi;
import com.jeelowcode.service.system.dto.AdminUserRespDTO;
import com.jeelowcode.tool.framework.common.util.object.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import static com.jeelowcode.tool.framework.common.util.collection.CollectionUtils.getFirst;
/**
* 待办系统接口实现类
*
* @author yangchenjj
*/
@Slf4j
@Service
public class PortalTodoServiceImpl implements IPortalTodoService {
private static final String SPACE = " ";
private static final String WORK_NODE_NAME = "整改风险隐患";
private static final String WORK_FLOW_NAME = "风险隐患信息";
// TODO 待办跳转链接,这个以后需要优化,通过配置去取这个链接,不能写死在这里
private static final String RISK_PC_URL = "/fx/table/view/1963446160885366786";
private static final String WORK_STATUS_TODO = "0";
private static final String WORK_STATUS_DONE = "2";
private static final String WORK_STATUS_COMPLETE = "4";
private static final String VIEW_TYPE_UNREAD = "0";
private static final String VIEW_TYPE_READ = "1";
@Resource
private IRiskService riskService;
@Resource
private IApiAdminUserApi apiAdminUserApi;
@Override
public boolean pushDoneRiskHazardWorkflow(Long id) {
// 0.1.查找风险隐患数据,如果查不到则放弃推送
Map<String, Object> risk = riskService.getRiskById(id);
if (MapUtil.isEmpty(risk)) return false;
// 0.2.从容器中获取 PortalRequest 对象,如果没有配置则放弃通知
PortalRequest portalRequest = SpringUtils.getBean(PortalRequest.class);
if (ObjectUtil.isNull(portalRequest)) return false;
// 1.构建请求参数,准备推送待办信息
// 1.1.拼接标题
String requestName = DateUtil.formatDate((Date) risk.getOrDefault("check_date", new Date())) + SPACE +
risk.getOrDefault("parkName", "") + SPACE +
risk.getOrDefault("check_area", "") + SPACE +
risk.getOrDefault("check_content", "") + SPACE +
risk.getOrDefault("check_problem", "") + SPACE +
risk.getOrDefault("check_people", "");
// 1.2.暂时先使用创建人当作发送人 TODO 需要升级存储检查人的username
Long createUserId = Objects.isNull(risk.get("create_user")) ? null : (Long) risk.get("create_user");
AdminUserRespDTO createUser = Optional.ofNullable(createUserId)
.map(userId -> apiAdminUserApi.getUser(userId))
.orElse(new AdminUserRespDTO());
Date createDateTime = Objects.isNull(risk.get("create_time")) ? new Date() : (Date) risk.get("create_time");
// 1.3.从风险隐患数据中获取整改确认人 TODO 需要升级存储整改确认人的username
String corrective_confirm_people = Objects.isNull(risk.get("corrective_confirm_people")) ? null : (String) risk.get("corrective_confirm_people");
List<AdminUserRespDTO> confirmUserList = Optional.ofNullable(corrective_confirm_people)
.map(userName -> apiAdminUserApi.getUserListByNickname(userName))
.orElse(Collections.emptyList());
// 如果没有整改确认人则放弃通知
if (confirmUserList.isEmpty()) return false;
String receiver = Optional.ofNullable(getFirst(confirmUserList))
.map(AdminUserRespDTO::getUsername).orElse(null);
if (StringUtils.isEmpty(receiver)) return false;
// 1.2.组织请求数据
ReceiveRequestInfoDTO todoRequestDTO = new ReceiveRequestInfoDTO()
.setFlowId(Base64.encode(String.valueOf(id)))
.setRequestName(requestName)
.setWorkflowName(WORK_FLOW_NAME)
.setNodeName(WORK_NODE_NAME)
.setPcUrl(RISK_PC_URL)
.setIsRemark(WORK_STATUS_DONE)
.setViewType(VIEW_TYPE_READ)
.setCreator(createUser.getUsername())
.setCreateDateTime(createDateTime)
.setReceiver(receiver)
.setReceiveDateTime(new Date())
.setReceiveTs(String.valueOf(System.currentTimeMillis()));
ReceiveRequestInfoDTO completeRequestDTO = BeanUtils.toBean(todoRequestDTO, ReceiveRequestInfoDTO.class);
completeRequestDTO.setIsRemark(WORK_STATUS_COMPLETE);
// 2.推送待办信息使用try-catch避免影响上层调用方法的事务回滚
try {
portalRequest.receiveRequestInfo(todoRequestDTO);
portalRequest.receiveRequestInfo(completeRequestDTO);
} catch (Exception e) {
log.error("推送待办信息失败", e);
return false;
}
return true;
}
}

View File

@@ -1,25 +1,26 @@
package com.jeelowcode.module.biz.service.impl;
import com.jeelowcode.core.framework.mapper.JeeLowCodeSqlMapper;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.jeelowcode.core.framework.service.IFrameSqlService;
import com.jeelowcode.framework.global.JeeLowCodeBaseConstant;
import com.jeelowcode.framework.plus.SqlHelper;
import com.jeelowcode.framework.plus.build.buildmodel.wrapper.SqlInfoQueryWrapper;
import com.jeelowcode.framework.plus.core.model.SqlFormatModel;
import com.jeelowcode.module.biz.service.IPlanIssusService;
import com.jeelowcode.framework.plus.core.toolkit.StringUtils;
import com.jeelowcode.framework.utils.tool.spring.SpringUtils;
import com.jeelowcode.module.biz.service.IRiskService;
import com.jeelowcode.service.system.controller.vo.notify.template.NotifyTemplateSendReqVO;
import com.jeelowcode.service.system.service.INotifySendService;
import com.jeelowcode.service.bpm.config.framework.portal.core.PortalRequest;
import com.jeelowcode.service.bpm.config.framework.portal.core.dto.ReceiveRequestInfoDTO;
import com.jeelowcode.service.system.api.IApiAdminUserApi;
import com.jeelowcode.service.system.dto.AdminUserRespDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import static com.jeelowcode.tool.framework.common.util.collection.CollectionUtils.getFirst;
/**
@@ -29,40 +30,83 @@ import java.util.Map;
@Service
public class RiskServiceImpl implements IRiskService {
@Autowired
private static final String SPACE = " ";
private static final String WORK_NODE_NAME = "整改风险隐患";
private static final String WORK_FLOW_NAME = "风险隐患信息";
// TODO 待办跳转链接,这个以后需要优化,通过配置去取这个链接,不能写死在这里
private static final String RISK_PC_URL = "/fx/table/view/1963446160885366786";
private static final String WORK_STATUS_TODO = "0";
private static final String WORK_STATUS_DONE = "2";
private static final String VIEW_TYPE_UNREAD = "0";
private static final String VIEW_TYPE_READ = "1";
@Resource
private IFrameSqlService sqlService;
@Resource
private INotifySendService notifySendService;
private IApiAdminUserApi apiAdminUserApi;
/**
* 发生消息给整改人
*/
@Override
public void sendNotify2Corrective(Long id) {
// 根据ID查找风险隐患数据
Map<String, Object> risk = getRiskById(id);
NotifyTemplateSendReqVO sendReqVO=new NotifyTemplateSendReqVO();
// 构建消息参数
List<Long> userIdList = new ArrayList<>();
Map<String, Object> templateParams=new HashMap<>();
userIdList.add( Long.valueOf(risk.get("corrective_charge_people_id").toString()));
userIdList.add( Long.valueOf(risk.get("corrective_confirm_people_id").toString()));
sendReqVO.setUserIdList(userIdList);
// 0.1.查找风险隐患数据,如果查不到任务可以结束了
Map<String, Object> risk = this.getRiskById(id);
if (MapUtil.isEmpty(risk)) return;
templateParams.put("check_date",risk.get("check_date"));
templateParams.put("parkName",risk.get("parkName"));
templateParams.put("check_area",risk.get("check_area"));
templateParams.put("check_content",risk.get("check_content"));
templateParams.put("check_problem",risk.get("check_problem"));
templateParams.put("check_people",risk.get("check_people"));
sendReqVO.setTemplateCode("risk_corrective_notice");
// 0.2.从容器中获取 PortalRequest 对象,如果没有配置则放弃通知
PortalRequest portalRequest = SpringUtils.getBean(PortalRequest.class);
if (ObjectUtil.isNull(portalRequest)) return;
sendReqVO.setTemplateParams(templateParams);
// 发送消息
notifySendService.sendSingleNotifyToAdmin(sendReqVO.getUserIdList(),
sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams());
// 1.构建请求参数,准备推送待办信息
// 1.1.拼接标题
String requestName = DateUtil.formatDate((Date) risk.getOrDefault("check_date", new Date())) + SPACE +
risk.getOrDefault("parkName", "") + SPACE +
risk.getOrDefault("check_area", "") + SPACE +
risk.getOrDefault("check_content", "") + SPACE +
risk.getOrDefault("check_problem", "") + SPACE +
risk.getOrDefault("check_people", "");
// 1.2.暂时先使用创建人当作发送人 TODO 需要升级存储检查人的username
Long createUserId = Objects.isNull(risk.get("create_user")) ? null : (Long) risk.get("create_user");
AdminUserRespDTO createUser = Optional.ofNullable(createUserId)
.map(userId -> apiAdminUserApi.getUser(userId))
.orElse(new AdminUserRespDTO());
Date createDateTime = Objects.isNull(risk.get("create_time")) ? new Date() : (Date) risk.get("create_time");
// 1.3.从风险隐患数据中获取整改确认人 TODO 需要升级存储整改确认人的username
String corrective_confirm_people = Objects.isNull(risk.get("corrective_confirm_people")) ? null : (String) risk.get("corrective_confirm_people");
List<AdminUserRespDTO> confirmUserList = Optional.ofNullable(corrective_confirm_people)
.map(userName -> apiAdminUserApi.getUserListByNickname(userName))
.orElse(Collections.emptyList());
// 如果没有整改确认人则放弃通知
if (confirmUserList.isEmpty()) return;
String receiver = Optional.ofNullable(getFirst(confirmUserList))
.map(AdminUserRespDTO::getUsername).orElse(null);
if (StringUtils.isEmpty(receiver)) return;
// 1.2.组织请求数据
ReceiveRequestInfoDTO requestDTO = new ReceiveRequestInfoDTO()
.setFlowId(Base64.encode(String.valueOf(id)))
.setRequestName(requestName)
.setWorkflowName(WORK_FLOW_NAME)
.setNodeName(WORK_NODE_NAME)
.setPcUrl(RISK_PC_URL)
.setIsRemark(WORK_STATUS_TODO)
.setViewType(VIEW_TYPE_UNREAD)
.setCreator(createUser.getUsername())
.setCreateDateTime(createDateTime)
.setReceiver(receiver)
.setReceiveDateTime(new Date())
.setReceiveTs(String.valueOf(System.currentTimeMillis()));
// 2.将请求包裹在try catch 中,避免异常导致上层调用方法事务回滚
try {
portalRequest.receiveRequestInfo(requestDTO);
} catch (Exception e) {
log.error("发送待办信息失败", e);
}
}
/**
@@ -70,37 +114,17 @@ public class RiskServiceImpl implements IRiskService {
*/
@Override
public void sendNotify2Check(Long id) {
// 根据ID查找风险隐患数据
Map<String, Object> risk = getRiskById(id);
NotifyTemplateSendReqVO sendReqVO=new NotifyTemplateSendReqVO();
// 构建消息参数
List<Long> userIdList = new ArrayList<>();
Map<String, Object> templateParams=new HashMap<>();
userIdList.add( Long.valueOf(risk.get("check_people_id").toString()));
sendReqVO.setUserIdList(userIdList);
templateParams.put("billNo",risk.get("billNo"));
templateParams.put("check_date",risk.get("check_date"));
templateParams.put("parkName",risk.get("parkName"));
templateParams.put("check_area",risk.get("check_area"));
templateParams.put("check_content",risk.get("check_content"));
templateParams.put("check_problem",risk.get("check_problem"));
sendReqVO.setTemplateCode("risk_check_notify");
sendReqVO.setTemplateParams(templateParams);
// 发送消息
notifySendService.sendSingleNotifyToAdmin(sendReqVO.getUserIdList(),
sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams());
// 空实现目前业务需求并不需要发送给检查人
}
@Override
public Map<String, Object> getRiskById(long id) {
SqlInfoQueryWrapper.Wrapper wrapper = SqlHelper.getQueryWrapper();
wrapper.setTableName("lc_risk_hazard_manage");
wrapper.setWhere(where->{
where.eq("id",id);
wrapper.setWhere(where -> {
where.eq("id", id);
});
Map<String, Object> dataMap = sqlService.getDataOneByPlus(wrapper);
return dataMap;
return sqlService.getDataOneByPlus(wrapper);
}
}

View File

@@ -79,4 +79,12 @@ public interface IApiAdminUserApi {
*/
void validateUserList(Collection<Long> ids);
/**
* 通过用户昵称,获得用户列表
*
* @param nickname 昵称
* @return 用户列表
*/
List<AdminUserRespDTO> getUserListByNickname(String nickname);
}

View File

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static com.jeelowcode.tool.framework.common.util.collection.CollectionUtils.convertSet;
@@ -55,4 +56,10 @@ public class ApiAdminUserApiImpl implements IApiAdminUserApi {
userService.validateUserList(ids);
}
@Override
public List<AdminUserRespDTO> getUserListByNickname(String nickname) {
List<AdminUserDO> users = userService.getUserListByNickname(nickname);
return BeanUtils.toBean(users, AdminUserRespDTO.class);
}
}