update 优化 使用 record 简化实体类编码

This commit is contained in:
疯狂的狮子Li
2026-03-17 19:52:46 +08:00
parent 13aae27579
commit fcfa5eb767
30 changed files with 148 additions and 370 deletions

View File

@@ -33,7 +33,6 @@ import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.service.ISysClientService; import org.dromara.system.service.ISysClientService;
import org.dromara.system.service.ISysConfigService; import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysSocialService; import org.dromara.system.service.ISysSocialService;
import org.dromara.web.domain.vo.LoginTenantVo;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
import org.dromara.web.service.IAuthStrategy; import org.dromara.web.service.IAuthStrategy;
import org.dromara.web.service.SysLoginService; import org.dromara.web.service.SysLoginService;
@@ -94,9 +93,10 @@ public class AuthController {
Long userId = LoginHelper.getUserId(); Long userId = LoginHelper.getUserId();
scheduledExecutorService.schedule(() -> { scheduledExecutorService.schedule(() -> {
SseMessageDTO dto = new SseMessageDTO(); SseMessageDTO dto = new SseMessageDTO(
dto.setMessage(DateUtils.getTodayHour(new Date()) + "好,欢迎登录 RuoYi-Vue-Plus 后台管理系统"); List.of(userId),
dto.setUserIds(List.of(userId)); DateUtils.getTodayHour(new Date()) + "好,欢迎登录 RuoYi-Vue-Plus 后台管理系统"
);
SseMessageUtils.publishMessage(dto); SseMessageUtils.publishMessage(dto);
}, 5, TimeUnit.SECONDS); }, 5, TimeUnit.SECONDS);
return R.ok(loginVo); return R.ok(loginVo);
@@ -194,9 +194,14 @@ public class AuthController {
@GetMapping("/tenant/list") @GetMapping("/tenant/list")
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception { public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
// 暂时预留给前端使用 后续删除 // 暂时预留给前端使用 后续删除
LoginTenantVo result = new LoginTenantVo(); return R.ok(new LoginTenantVo(false));
result.setTenantEnabled(false);
return R.ok(result);
} }
/**
* 登录租户列表响应对象。
*
* @param tenantEnabled 是否启用租户
*/
public record LoginTenantVo(Boolean tenantEnabled) {
}
} }

View File

@@ -25,7 +25,6 @@ import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.web.domain.vo.CaptchaVo;
import org.springframework.expression.Expression; import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser; import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser;
@@ -119,9 +118,7 @@ public class CaptchaController {
public R<CaptchaVo> getCode() { public R<CaptchaVo> getCode() {
boolean captchaEnabled = captchaProperties.getEnable(); boolean captchaEnabled = captchaProperties.getEnable();
if (!captchaEnabled) { if (!captchaEnabled) {
CaptchaVo captchaVo = new CaptchaVo(); return R.ok(new CaptchaVo(false, null, null));
captchaVo.setCaptchaEnabled(false);
return R.ok(captchaVo);
} }
return R.ok(SpringUtils.getAopProxy(this).getCodeImpl()); return R.ok(SpringUtils.getAopProxy(this).getCodeImpl());
} }
@@ -157,10 +154,17 @@ public class CaptchaController {
code = exp.getValue(String.class); code = exp.getValue(String.class);
} }
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
CaptchaVo captchaVo = new CaptchaVo(); return new CaptchaVo(true, uuid, captcha.getImageBase64());
captchaVo.setUuid(uuid); }
captchaVo.setImg(captcha.getImageBase64());
return captchaVo; /**
* 图片验证码响应对象。
*
* @param captchaEnabled 是否启用验证码
* @param uuid 验证码标识
* @param img Base64 图片数据
*/
public record CaptchaVo(Boolean captchaEnabled, String uuid, String img) {
} }
} }

View File

@@ -1,28 +0,0 @@
package org.dromara.web.domain.vo;
import lombok.Data;
/**
* 验证码信息
*
* @author Michelle.Chung
*/
@Data
public class CaptchaVo {
/**
* 是否开启验证码
*/
private Boolean captchaEnabled = true;
/**
* 验证码唯一标识。
*/
private String uuid;
/**
* 验证码图片
*/
private String img;
}

View File

@@ -1,18 +0,0 @@
package org.dromara.web.domain.vo;
import lombok.Data;
/**
* 登录页租户信息返回对象。
*
* @author Michelle.Chung
*/
@Data
public class LoginTenantVo {
/**
* 租户开关
*/
private Boolean tenantEnabled;
}

View File

@@ -1,30 +1,14 @@
package org.dromara.common.core.domain.dto; package org.dromara.common.core.domain.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/** /**
* 抄送 * 抄送
* *
* @param userId 抄送用户 ID
* @param nickName 抄送用户昵称
* @author may * @author may
*/ */
@Data public record FlowCopyDTO(
public class FlowCopyDTO implements Serializable { Long userId,
String nickName
@Serial ) {
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
private Long userId;
/**
* 用户昵称
*/
private String nickName;
} }

View File

@@ -1,30 +1,14 @@
package org.dromara.common.core.domain.dto; package org.dromara.common.core.domain.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/** /**
* 启动流程后的返回结果对象。 * 启动流程后的返回结果对象。
* *
* @param processInstanceId 流程实例 ID
* @param taskId 首个任务 ID
* @author Lion Li * @author Lion Li
*/ */
@Data public record StartProcessReturnDTO(
public class StartProcessReturnDTO implements Serializable { Long processInstanceId,
Long taskId
@Serial ) {
private static final long serialVersionUID = 1L;
/**
* 流程实例id
*/
private Long processInstanceId;
/**
* 任务id
*/
private Long taskId;
} }

View File

@@ -162,7 +162,7 @@ public class OssClient {
String eTag = uploadResult.response().eTag(); String eTag = uploadResult.response().eTag();
// 提取上传结果中的 ETag并构建一个自定义的 UploadResult 对象 // 提取上传结果中的 ETag并构建一个自定义的 UploadResult 对象
return UploadResult.builder().url(getUrl() + StringUtils.SLASH + key).filename(key).eTag(eTag).build(); return new UploadResult(getUrl() + StringUtils.SLASH + key, key, eTag);
} catch (Exception e) { } catch (Exception e) {
// 捕获异常并抛出自定义异常 // 捕获异常并抛出自定义异常
throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]"); throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");
@@ -220,7 +220,7 @@ public class OssClient {
String eTag = uploadResult.response().eTag(); String eTag = uploadResult.response().eTag();
// 提取上传结果中的 ETag并构建一个自定义的 UploadResult 对象 // 提取上传结果中的 ETag并构建一个自定义的 UploadResult 对象
return UploadResult.builder().url(getUrl() + StringUtils.SLASH + key).filename(key).eTag(eTag).build(); return new UploadResult(getUrl() + StringUtils.SLASH + key, key, eTag);
} catch (Exception e) { } catch (Exception e) {
throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]"); throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");
} }

View File

@@ -1,30 +1,16 @@
package org.dromara.common.oss.entity; package org.dromara.common.oss.entity;
import lombok.Builder;
import lombok.Data;
/** /**
* 上传返回体 * 上传返回体
* *
* @param url 文件访问地址
* @param filename 文件名
* @param eTag 存储服务返回的 ETag
* @author Lion Li * @author Lion Li
*/ */
@Data public record UploadResult(
@Builder String url,
public class UploadResult { String filename,
String eTag
/** ) {
* 文件路径
*/
private String url;
/**
* 文件名
*/
private String filename;
/**
* 已上传对象的实体标记(用来校验文件)
*/
private String eTag;
} }

View File

@@ -205,12 +205,10 @@ public class SseEmitterManager {
* @param sseMessageDTO 要发布的SSE消息对象 * @param sseMessageDTO 要发布的SSE消息对象
*/ */
public void publishMessage(SseMessageDTO sseMessageDTO) { public void publishMessage(SseMessageDTO sseMessageDTO) {
SseMessageDTO broadcastMessage = new SseMessageDTO(); SseMessageDTO broadcastMessage = new SseMessageDTO(sseMessageDTO.userIds(), sseMessageDTO.message());
broadcastMessage.setMessage(sseMessageDTO.getMessage());
broadcastMessage.setUserIds(sseMessageDTO.getUserIds());
RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> {
log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}", log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}",
SSE_TOPIC, sseMessageDTO.getUserIds(), sseMessageDTO.getMessage()); SSE_TOPIC, sseMessageDTO.userIds(), sseMessageDTO.message());
}); });
} }
@@ -220,8 +218,7 @@ public class SseEmitterManager {
* @param message 要发布的消息内容 * @param message 要发布的消息内容
*/ */
public void publishAll(String message) { public void publishAll(String message) {
SseMessageDTO broadcastMessage = new SseMessageDTO(); SseMessageDTO broadcastMessage = new SseMessageDTO(null, message);
broadcastMessage.setMessage(message);
RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> {
log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message); log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message);
}); });

View File

@@ -1,29 +1,16 @@
package org.dromara.common.sse.dto; package org.dromara.common.sse.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* 消息的DTO * 消息的DTO
* *
* @param userIds 接收消息的用户 ID 列表
* @param message 推送消息内容
* @author zendwang * @author zendwang
*/ */
@Data public record SseMessageDTO(
public class SseMessageDTO implements Serializable { List<Long> userIds,
String message
@Serial ) {
private static final long serialVersionUID = 1L;
/**
* 需要推送到的session key 列表
*/
private List<Long> userIds;
/**
* 需要发送的消息
*/
private String message;
} }

View File

@@ -28,14 +28,14 @@ public class SseTopicListener implements ApplicationRunner, Ordered {
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
sseEmitterManager.subscribeMessage((message) -> { sseEmitterManager.subscribeMessage((message) -> {
log.info("SSE主题订阅收到消息session keys={} message={}", message.getUserIds(), message.getMessage()); log.info("SSE主题订阅收到消息session keys={} message={}", message.userIds(), message.message());
// 如果key不为空就按照key发消息 如果为空就群发 // 如果key不为空就按照key发消息 如果为空就群发
if (CollUtil.isNotEmpty(message.getUserIds())) { if (CollUtil.isNotEmpty(message.userIds())) {
message.getUserIds().forEach(key -> { message.userIds().forEach(key -> {
sseEmitterManager.sendMessage(key, message.getMessage()); sseEmitterManager.sendMessage(key, message.message());
}); });
} else { } else {
sseEmitterManager.sendMessage(message.getMessage()); sseEmitterManager.sendMessage(message.message());
} }
}); });
log.info("初始化SSE主题订阅监听器成功"); log.info("初始化SSE主题订阅监听器成功");

View File

@@ -1,29 +1,16 @@
package org.dromara.common.websocket.dto; package org.dromara.common.websocket.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* 消息的DTO * 消息的DTO
* *
* @param sessionKeys WebSocket 会话标识列表
* @param message 推送消息内容
* @author zendwang * @author zendwang
*/ */
@Data public record WebSocketMessageDTO(
public class WebSocketMessageDTO implements Serializable { List<Long> sessionKeys,
String message
@Serial ) {
private static final long serialVersionUID = 1L;
/**
* 需要推送到的session key 列表
*/
private List<Long> sessionKeys;
/**
* 需要发送的消息
*/
private String message;
} }

View File

@@ -51,9 +51,7 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
// 创建WebSocket消息DTO对象 // 创建WebSocket消息DTO对象
WebSocketMessageDTO messageDTO = new WebSocketMessageDTO(); WebSocketMessageDTO messageDTO = new WebSocketMessageDTO(List.of(loginUser.getUserId()), message.getPayload());
messageDTO.setSessionKeys(List.of(loginUser.getUserId()));
messageDTO.setMessage(message.getPayload());
WebSocketUtils.publishMessage(messageDTO); WebSocketUtils.publishMessage(messageDTO);
} }

View File

@@ -26,17 +26,17 @@ public class WebSocketTopicListener implements ApplicationRunner, Ordered {
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
// 订阅WebSocket消息 // 订阅WebSocket消息
WebSocketUtils.subscribeMessage((message) -> { WebSocketUtils.subscribeMessage((message) -> {
log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage()); log.info("WebSocket主题订阅收到消息session keys={} message={}", message.sessionKeys(), message.message());
// 如果key不为空就按照key发消息 如果为空就群发 // 如果key不为空就按照key发消息 如果为空就群发
if (CollUtil.isNotEmpty(message.getSessionKeys())) { if (CollUtil.isNotEmpty(message.sessionKeys())) {
message.getSessionKeys().forEach(key -> { message.sessionKeys().forEach(key -> {
if (WebSocketSessionHolder.existSession(key)) { if (WebSocketSessionHolder.existSession(key)) {
WebSocketUtils.sendMessage(key, message.getMessage()); WebSocketUtils.sendMessage(key, message.message());
} }
}); });
} else { } else {
WebSocketSessionHolder.getSessionsAll().forEach(key -> { WebSocketSessionHolder.getSessionsAll().forEach(key -> {
WebSocketUtils.sendMessage(key, message.getMessage()); WebSocketUtils.sendMessage(key, message.message());
}); });
} }
}); });

View File

@@ -56,21 +56,19 @@ public class WebSocketUtils {
public static void publishMessage(WebSocketMessageDTO webSocketMessage) { public static void publishMessage(WebSocketMessageDTO webSocketMessage) {
List<Long> unsentSessionKeys = new ArrayList<>(); List<Long> unsentSessionKeys = new ArrayList<>();
// 当前服务内session,直接发送消息 // 当前服务内session,直接发送消息
for (Long sessionKey : webSocketMessage.getSessionKeys()) { for (Long sessionKey : webSocketMessage.sessionKeys()) {
if (WebSocketSessionHolder.existSession(sessionKey)) { if (WebSocketSessionHolder.existSession(sessionKey)) {
WebSocketUtils.sendMessage(sessionKey, webSocketMessage.getMessage()); WebSocketUtils.sendMessage(sessionKey, webSocketMessage.message());
continue; continue;
} }
unsentSessionKeys.add(sessionKey); unsentSessionKeys.add(sessionKey);
} }
// 不在当前服务内session,发布订阅消息 // 不在当前服务内session,发布订阅消息
if (CollUtil.isNotEmpty(unsentSessionKeys)) { if (CollUtil.isNotEmpty(unsentSessionKeys)) {
WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(); WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(unsentSessionKeys, webSocketMessage.message());
broadcastMessage.setMessage(webSocketMessage.getMessage());
broadcastMessage.setSessionKeys(unsentSessionKeys);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}", log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage()); WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.message());
}); });
} }
} }
@@ -81,8 +79,7 @@ public class WebSocketUtils {
* @param message 要发布的消息内容 * @param message 要发布的消息内容
*/ */
public static void publishAll(String message) { public static void publishAll(String message) {
WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(); WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO(null, message);
broadcastMessage.setMessage(message);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message); log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);
}); });

View File

@@ -1,30 +1,19 @@
package org.dromara.job.entity; package org.dromara.job.entity;
import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
@Data /**
public class BillDTO { * 账单数据传输对象。
*
/** * @param billId 账单 ID
* 账单ID * @param billChannel 账单渠道
*/ * @param billDate 账单日期
private Long billId; * @param billAmount 账单金额
*/
/** public record BillDTO(
* 账单渠道 Long billId,
*/ String billChannel,
private String billChannel; String billDate,
BigDecimal billAmount
/** ) {
* 账单日期
*/
private String billDate;
/**
* 账单金额
*/
private BigDecimal billAmount;
} }

View File

@@ -23,16 +23,12 @@ import java.math.BigDecimal;
public class AlipayBillTask { public class AlipayBillTask {
public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException { public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException {
BillDTO billDTO = new BillDTO();
billDTO.setBillId(23456789L);
billDTO.setBillChannel("alipay");
// 设置清算日期 // 设置清算日期
String settlementDate = (String) jobArgs.getWfContext().get("settlementDate"); String settlementDate = (String) jobArgs.getWfContext().get("settlementDate");
if (StrUtil.equals(settlementDate, "sysdate")) { if (StrUtil.equals(settlementDate, "sysdate")) {
settlementDate = DateUtil.today(); settlementDate = DateUtil.today();
} }
billDTO.setBillDate(settlementDate); BillDTO billDTO = new BillDTO(23456789L, "alipay", settlementDate, new BigDecimal("2345.67"));
billDTO.setBillAmount(new BigDecimal("2345.67"));
// 把billDTO对象放入上下文进行传递 // 把billDTO对象放入上下文进行传递
jobArgs.appendContext("alipay", JsonUtils.toJsonString(billDTO)); jobArgs.appendContext("alipay", JsonUtils.toJsonString(billDTO));
SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext()); SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext());

View File

@@ -27,14 +27,14 @@ public class SummaryBillTask {
String wechat = (String) jobArgs.getWfContext("wechat"); String wechat = (String) jobArgs.getWfContext("wechat");
if (StrUtil.isNotBlank(wechat)) { if (StrUtil.isNotBlank(wechat)) {
BillDTO wechatBillDTO = JsonUtils.parseObject(wechat, BillDTO.class); BillDTO wechatBillDTO = JsonUtils.parseObject(wechat, BillDTO.class);
wechatAmount = wechatBillDTO.getBillAmount(); wechatAmount = wechatBillDTO.billAmount();
} }
// 获得支付宝账单 // 获得支付宝账单
BigDecimal alipayAmount = BigDecimal.valueOf(0); BigDecimal alipayAmount = BigDecimal.valueOf(0);
String alipay = (String) jobArgs.getWfContext("alipay"); String alipay = (String) jobArgs.getWfContext("alipay");
if (StrUtil.isNotBlank(alipay)) { if (StrUtil.isNotBlank(alipay)) {
BillDTO alipayBillDTO = JsonUtils.parseObject(alipay, BillDTO.class); BillDTO alipayBillDTO = JsonUtils.parseObject(alipay, BillDTO.class);
alipayAmount = alipayBillDTO.getBillAmount(); alipayAmount = alipayBillDTO.billAmount();
} }
// 汇总账单 // 汇总账单
BigDecimal totalAmount = wechatAmount.add(alipayAmount); BigDecimal totalAmount = wechatAmount.add(alipayAmount);

View File

@@ -23,17 +23,13 @@ import java.math.BigDecimal;
public class WechatBillTask { public class WechatBillTask {
public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException { public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException {
BillDTO billDTO = new BillDTO();
billDTO.setBillId(123456789L);
billDTO.setBillChannel("wechat");
// 从上下文中获得清算日期并设置,如果上下文中清算日期 // 从上下文中获得清算日期并设置,如果上下文中清算日期
// 是sysdate设置为当前日期否则取管理页面设置的值 // 是sysdate设置为当前日期否则取管理页面设置的值
String settlementDate = (String) jobArgs.getWfContext().get("settlementDate"); String settlementDate = (String) jobArgs.getWfContext().get("settlementDate");
if (StrUtil.equals(settlementDate, "sysdate")) { if (StrUtil.equals(settlementDate, "sysdate")) {
settlementDate = DateUtil.today(); settlementDate = DateUtil.today();
} }
billDTO.setBillDate(settlementDate); BillDTO billDTO = new BillDTO(123456789L, "wechat", settlementDate, new BigDecimal("1234.56"));
billDTO.setBillAmount(new BigDecimal("1234.56"));
// 把billDTO对象放入上下文进行传递 // 把billDTO对象放入上下文进行传递
jobArgs.appendContext("wechat", JsonUtils.toJsonString(billDTO)); jobArgs.appendContext("wechat", JsonUtils.toJsonString(billDTO));
SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext()); SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext());

View File

@@ -13,7 +13,6 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.PageResult; import org.dromara.common.core.domain.PageResult;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.bo.SysOssBo; import org.dromara.system.domain.bo.SysOssBo;
import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.domain.vo.SysOssVo; import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService; import org.dromara.system.service.ISysOssService;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@@ -76,10 +75,7 @@ public class SysOssController extends BaseController {
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<SysOssUploadVo> upload(@RequestPart("file") MultipartFile file) { public R<SysOssUploadVo> upload(@RequestPart("file") MultipartFile file) {
SysOssVo oss = ossService.upload(file); SysOssVo oss = ossService.upload(file);
SysOssUploadVo uploadVo = new SysOssUploadVo(); SysOssUploadVo uploadVo = new SysOssUploadVo(oss.getUrl(), oss.getOriginalName(), oss.getOssId().toString());
uploadVo.setUrl(oss.getUrl());
uploadVo.setFileName(oss.getOriginalName());
uploadVo.setOssId(oss.getOssId().toString());
return R.ok(uploadVo); return R.ok(uploadVo);
} }
@@ -110,4 +106,13 @@ public class SysOssController extends BaseController {
return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true)); return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true));
} }
/**
* OSS 上传响应对象。
*
* @param url 文件访问地址
* @param fileName 原始文件名
* @param ossId OSS 对象 ID
*/
public record SysOssUploadVo(String url, String fileName, String ossId) {
}
} }

View File

@@ -1,28 +0,0 @@
package org.dromara.system.domain.vo;
import lombok.Data;
/**
* 上传对象信息
*
* @author Michelle.Chung
*/
@Data
public class SysOssUploadVo {
/**
* URL地址
*/
private String url;
/**
* 文件名
*/
private String fileName;
/**
* 对象存储主键
*/
private String ossId;
}

View File

@@ -258,9 +258,9 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
@NotNull @NotNull
private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult, SysOssExt ext1) { private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult, SysOssExt ext1) {
SysOss oss = new SysOss(); SysOss oss = new SysOss();
oss.setUrl(uploadResult.getUrl()); oss.setUrl(uploadResult.url());
oss.setFileSuffix(suffix); oss.setFileSuffix(suffix);
oss.setFileName(uploadResult.getFilename()); oss.setFileName(uploadResult.filename());
oss.setOriginalName(originalfileName); oss.setOriginalName(originalfileName);
oss.setService(configKey); oss.setService(configKey);
oss.setExt1(JsonUtils.toJsonString(ext1)); oss.setExt1(JsonUtils.toJsonString(ext1));

View File

@@ -1,31 +1,18 @@
package org.dromara.workflow.domain.bo; package org.dromara.workflow.domain.bo;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import java.io.Serial;
import java.io.Serializable;
/** /**
* 撤销流程请求对象。 * 撤销流程请求对象。
* *
* @param businessId 业务 ID
* @param message 撤销说明
* @author may * @author may
*/ */
@Data public record FlowCancelBo(
public class FlowCancelBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 任务ID
*/
@NotBlank(message = "业务ID不能为空", groups = AddGroup.class) @NotBlank(message = "业务ID不能为空", groups = AddGroup.class)
private String businessId; String businessId,
String message
/** ) {
* 办理意见
*/
private String message;
} }

View File

@@ -1,31 +1,18 @@
package org.dromara.workflow.domain.bo; package org.dromara.workflow.domain.bo;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import java.io.Serial;
import java.io.Serializable;
/** /**
* 作废流程请求对象。 * 作废流程请求对象。
* *
* @param id 流程实例 ID
* @param comment 作废意见
* @author may * @author may
*/ */
@Data public record FlowInvalidBo(
public class FlowInvalidBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 流程实例id
*/
@NotNull(message = "流程实例id为空", groups = AddGroup.class) @NotNull(message = "流程实例id为空", groups = AddGroup.class)
private Long id; Long id,
String comment
/** ) {
* 审批意见
*/
private String comment;
} }

View File

@@ -1,31 +1,18 @@
package org.dromara.workflow.domain.bo; package org.dromara.workflow.domain.bo;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import java.io.Serial;
import java.io.Serializable;
/** /**
* 终止任务请求对象 * 终止任务请求对象
* *
* @param taskId 任务 ID
* @param comment 终止意见
* @author may * @author may
*/ */
@Data public record FlowTerminationBo(
public class FlowTerminationBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 任务id
*/
@NotNull(message = "任务id为空", groups = AddGroup.class) @NotNull(message = "任务id为空", groups = AddGroup.class)
private Long taskId; Long taskId,
String comment
/** ) {
* 审批意见
*/
private String comment;
} }

View File

@@ -1,39 +1,22 @@
package org.dromara.workflow.domain.bo; package org.dromara.workflow.domain.bo;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import java.io.Serial;
import java.io.Serializable;
/** /**
* 流程变量参数 * 流程变量参数
* *
* @param instanceId 流程实例 ID
* @param key 变量键
* @param value 变量值
* @author may * @author may
*/ */
@Data public record FlowVariableBo(
public class FlowVariableBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 流程实例id
*/
@NotNull(message = "流程实例id为空", groups = AddGroup.class) @NotNull(message = "流程实例id为空", groups = AddGroup.class)
private Long instanceId; Long instanceId,
/**
* 流程变量key
*/
@NotNull(message = "流程变量key为空", groups = AddGroup.class) @NotNull(message = "流程变量key为空", groups = AddGroup.class)
private String key; String key,
/**
* 流程变量value
*/
@NotNull(message = "流程变量value为空", groups = AddGroup.class) @NotNull(message = "流程变量value为空", groups = AddGroup.class)
private String value; String value
) {
} }

View File

@@ -92,9 +92,7 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
try { try {
switch (messageTypeEnum) { switch (messageTypeEnum) {
case SYSTEM_MESSAGE -> { case SYSTEM_MESSAGE -> {
SseMessageDTO dto = new SseMessageDTO(); SseMessageDTO dto = new SseMessageDTO(userIds, message);
dto.setUserIds(userIds);
dto.setMessage(message);
SseMessageUtils.publishMessage(dto); SseMessageUtils.publishMessage(dto);
} }
case EMAIL_MESSAGE -> MailUtils.sendText(emails, subject, message); case EMAIL_MESSAGE -> MailUtils.sendText(emails, subject, message);

View File

@@ -311,7 +311,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean cancelProcessApply(FlowCancelBo bo) { public boolean cancelProcessApply(FlowCancelBo bo) {
Instance instance = selectInstByBusinessId(bo.getBusinessId()); Instance instance = selectInstByBusinessId(bo.businessId());
if (instance == null) { if (instance == null) {
throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE);
} }
@@ -319,7 +319,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
if (definition == null) { if (definition == null) {
throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF);
} }
String message = bo.getMessage(); String message = bo.message();
String userIdStr = LoginHelper.getUserIdStr(); String userIdStr = LoginHelper.getUserIdStr();
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus()); BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
FlowParams flowParams = FlowParams.build() FlowParams flowParams = FlowParams.build()
@@ -445,16 +445,16 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateVariable(FlowVariableBo bo) { public boolean updateVariable(FlowVariableBo bo) {
FlowInstance flowInstance = flowInstanceMapper.selectById(bo.getInstanceId()); FlowInstance flowInstance = flowInstanceMapper.selectById(bo.instanceId());
if (flowInstance == null) { if (flowInstance == null) {
throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE);
} }
Map<String, Object> variableMap = new HashMap<>(Optional.ofNullable(flowInstance.getVariableMap()).orElse(Collections.emptyMap())); Map<String, Object> variableMap = new HashMap<>(Optional.ofNullable(flowInstance.getVariableMap()).orElse(Collections.emptyMap()));
if (!variableMap.containsKey(bo.getKey())) { if (!variableMap.containsKey(bo.key())) {
log.error("变量不存在: {}", bo.getKey()); log.error("变量不存在: {}", bo.key());
return false; return false;
} }
variableMap.put(bo.getKey(), bo.getValue()); variableMap.put(bo.key(), bo.value());
flowInstance.setVariable(FlowEngine.jsonConvert.objToStr(variableMap)); flowInstance.setVariable(FlowEngine.jsonConvert.objToStr(variableMap));
return flowInstanceMapper.updateById(flowInstance) > 0; return flowInstanceMapper.updateById(flowInstance) > 0;
} }
@@ -503,16 +503,16 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean processInvalid(FlowInvalidBo bo) { public boolean processInvalid(FlowInvalidBo bo) {
Instance instance = insService.getById(bo.getId()); Instance instance = insService.getById(bo.id());
if (instance != null) { if (instance != null) {
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
} }
FlowParams flowParams = FlowParams.build() FlowParams flowParams = FlowParams.build()
.message(bo.getComment()) .message(bo.comment())
.flowStatus(BusinessStatusEnum.INVALID.getStatus()) .flowStatus(BusinessStatusEnum.INVALID.getStatus())
.hisStatus(TaskStatusEnum.INVALID.getStatus()) .hisStatus(TaskStatusEnum.INVALID.getStatus())
.ignore(true); .ignore(true);
taskService.terminationByInsId(bo.getId(), flowParams); taskService.terminationByInsId(bo.id(), flowParams);
return true; return true;
} }
} }

View File

@@ -133,9 +133,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
} }
taskService.mergeVariable(flowInstance, variables); taskService.mergeVariable(flowInstance, variables);
insService.updateById(flowInstance); insService.updateById(flowInstance);
StartProcessReturnDTO dto = new StartProcessReturnDTO(); StartProcessReturnDTO dto = new StartProcessReturnDTO(taskList.get(0).getInstanceId(), taskList.get(0).getId());
dto.setProcessInstanceId(taskList.get(0).getInstanceId());
dto.setTaskId(taskList.get(0).getId());
// 保存流程实例业务信息 // 保存流程实例业务信息
this.buildFlowInstanceBizExt(flowInstance, bizExt); this.buildFlowInstanceBizExt(flowInstance, bizExt);
return dto; return dto;
@@ -166,10 +164,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (taskList.size() > 1) { if (taskList.size() > 1) {
throw new ServiceException("请检查流程第一个环节是否为申请人!"); throw new ServiceException("请检查流程第一个环节是否为申请人!");
} }
StartProcessReturnDTO dto = new StartProcessReturnDTO(); return new StartProcessReturnDTO(instance.getId(), taskList.get(0).getId());
dto.setProcessInstanceId(instance.getId());
dto.setTaskId(taskList.get(0).getId());
return dto;
} }
/** /**
@@ -570,7 +565,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean terminationTask(FlowTerminationBo bo) { public boolean terminationTask(FlowTerminationBo bo) {
Long taskId = bo.getTaskId(); Long taskId = bo.taskId();
Task task = taskService.getById(taskId); Task task = taskService.getById(taskId);
if (task == null) { if (task == null) {
throw new ServiceException("任务不存在!"); throw new ServiceException("任务不存在!");
@@ -580,7 +575,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
} }
FlowParams flowParams = FlowParams.build() FlowParams flowParams = FlowParams.build()
.message(bo.getComment()) .message(bo.comment())
.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) .flowStatus(BusinessStatusEnum.TERMINATION.getStatus())
.hisStatus(TaskStatusEnum.TERMINATION.getStatus()); .hisStatus(TaskStatusEnum.TERMINATION.getStatus());
taskService.termination(taskId, flowParams); taskService.termination(taskId, flowParams);

View File

@@ -166,7 +166,7 @@ public class WorkflowServiceImpl implements WorkflowService {
StartProcessReturnDTO result = flwTaskService.startWorkFlow(processBo); StartProcessReturnDTO result = flwTaskService.startWorkFlow(processBo);
CompleteTaskBo taskBo = new CompleteTaskBo(); CompleteTaskBo taskBo = new CompleteTaskBo();
taskBo.setTaskId(result.getTaskId()); taskBo.setTaskId(result.taskId());
taskBo.setMessageType(Collections.singletonList(MessageTypeEnum.SYSTEM_MESSAGE.getCode())); taskBo.setMessageType(Collections.singletonList(MessageTypeEnum.SYSTEM_MESSAGE.getCode()));
taskBo.setVariables(startProcess.getVariables()); taskBo.setVariables(startProcess.getVariables());
taskBo.setHandler(startProcess.getHandler()); taskBo.setHandler(startProcess.getHandler());