From 8f2c65a45ddffd154b40a3c99e86464d8233ccb0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 24 Nov 2025 19:21:54 +0800 Subject: [PATCH 01/12] =?UTF-8?q?feat=EF=BC=9A=E3=80=90iot=E3=80=91tdengin?= =?UTF-8?q?e=20=E8=B0=83=E6=95=B4=E6=88=90=20WS=20=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20decimal=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-server/src/main/resources/application-local.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 2185548b55..83be0582b9 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -69,8 +69,8 @@ spring: username: root password: 123456 # tdengine: # IoT 数据库(需要 IoT 物联网再开启噢!) -# url: jdbc:TAOS-RS://127.0.0.1:6041/ruoyi_vue_pro -# driver-class-name: com.taosdata.jdbc.rs.RestfulDriver +# url: jdbc:TAOS-WS://127.0.0.1:6041/ruoyi_vue_pro +# driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver # username: root # password: taosdata # druid: From 27a0aca516fb1cc6250bceae9cce2731cc30a798 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 24 Nov 2025 19:36:16 +0800 Subject: [PATCH 02/12] =?UTF-8?q?fix=EF=BC=9A=E3=80=90iot=E3=80=91IotScene?= =?UTF-8?q?RuleServiceImpl=20=E7=BC=93=E5=AD=98=E5=A4=84=E7=90=86=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=EF=BC=8C=E5=AF=BC=E8=87=B4=20getSelf=20NPE?= =?UTF-8?q?=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/service/rule/scene/IotSceneRuleServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleServiceImpl.java index 0de5107acd..41052289a6 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleServiceImpl.java @@ -241,13 +241,13 @@ public class IotSceneRuleServiceImpl implements IotSceneRuleService { */ private List getMatchedSceneRuleListByMessage(IotDeviceMessage message) { // 1.1 通过 deviceId 获取设备信息 - IotDeviceDO device = getSelf().deviceService.getDeviceFromCache(message.getDeviceId()); + IotDeviceDO device = deviceService.getDeviceFromCache(message.getDeviceId()); if (device == null) { log.warn("[getMatchedSceneRuleListByMessage][设备({}) 不存在]", message.getDeviceId()); return ListUtil.of(); } // 1.2 通过 productId 获取产品信息 - IotProductDO product = getSelf().productService.getProductFromCache(device.getProductId()); + IotProductDO product = productService.getProductFromCache(device.getProductId()); if (product == null) { log.warn("[getMatchedSceneRuleListByMessage][产品({}) 不存在]", device.getProductId()); return ListUtil.of(); From 94780ebcf3478eb85e733c3f39fa603fbe0236c1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 24 Nov 2025 19:44:02 +0800 Subject: [PATCH 03/12] =?UTF-8?q?fix=EF=BC=9A=E3=80=90iot=E3=80=91IotDevic?= =?UTF-8?q?eEventPostTriggerMatcher=20=E5=BA=94=E8=AF=A5=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20params=20=E5=88=A4=E6=96=AD=EF=BC=8C=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matcher/trigger/IotDeviceEventPostTriggerMatcher.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceEventPostTriggerMatcher.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceEventPostTriggerMatcher.java index 825b5eae1d..c8c08831e0 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceEventPostTriggerMatcher.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceEventPostTriggerMatcher.java @@ -48,13 +48,13 @@ public class IotDeviceEventPostTriggerMatcher implements IotSceneRuleTriggerMatc // 2. 对于事件触发器,通常不需要检查操作符和值,只要事件发生即匹配 // 但如果配置了操作符和值,则需要进行条件匹配 if (StrUtil.isNotBlank(trigger.getOperator()) && StrUtil.isNotBlank(trigger.getValue())) { - Object eventData = message.getData(); - if (eventData == null) { - IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "消息中事件数据为空"); + Object eventParams = message.getParams(); + if (eventParams == null) { + IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "消息中事件参数为空"); return false; } - boolean matched = IotSceneRuleMatcherHelper.evaluateCondition(eventData, trigger.getOperator(), trigger.getValue()); + boolean matched = IotSceneRuleMatcherHelper.evaluateCondition(eventParams, trigger.getOperator(), trigger.getValue()); if (!matched) { IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "事件数据条件不匹配"); return false; From 490e91d0ca6ec5d09ccb7189146a86bfeebae635 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 24 Nov 2025 19:51:20 +0800 Subject: [PATCH 04/12] =?UTF-8?q?fix=EF=BC=9A=E3=80=90iot=E3=80=91?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E7=B2=BE=E7=AE=80=E5=88=97=E8=A1=A8=EF=BC=8C?= =?UTF-8?q?=E6=9C=AA=E8=BF=94=E5=9B=9E=E8=AE=BE=E5=A4=87=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/controller/admin/product/IotProductController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java index 39eec84442..3acf928245 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java @@ -146,7 +146,7 @@ public class IotProductController { public CommonResult> getProductSimpleList() { List list = productService.getProductList(); return success(convertList(list, product -> // 只返回 id、name 字段 - new IotProductRespVO().setId(product.getId()).setName(product.getName()) + new IotProductRespVO().setId(product.getId()).setName(product.getName()).setStatus(product.getStatus()) .setDeviceType(product.getDeviceType()).setLocationType(product.getLocationType()))); } From d1b8e03b5b2451eef18c4523c4e02fd384373bf3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 24 Nov 2025 20:19:58 +0800 Subject: [PATCH 05/12] =?UTF-8?q?!221=20feat(pay):=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=94=AF=E4=BB=98=E8=AE=A2=E5=8D=95=E5=8F=B7?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=94=AF=E4=BB=98=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/order/AppPayOrderController.java | 19 ++++++++++++++----- .../pay/dal/mysql/order/PayOrderMapper.java | 4 ++++ .../pay/service/order/PayOrderService.java | 8 ++++++++ .../service/order/PayOrderServiceImpl.java | 5 +++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java index 4f57163841..1de6ca9159 100644 --- a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java +++ b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.pay.controller.app.order; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -46,13 +47,21 @@ public class AppPayOrderController { @GetMapping("/get") @Operation(summary = "获得支付订单") @Parameters({ - @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "id", description = "编号", example = "1024"), + @Parameter(name = "no", description = "支付订单号", example = "Pxxx"), @Parameter(name = "sync", description = "是否同步", example = "true") }) - public CommonResult getOrder(@RequestParam("id") Long id, + public CommonResult getOrder(@RequestParam(value = "id", required = false) Long id, + @RequestParam(value = "no", required = false) String no, @RequestParam(value = "sync", required = false) Boolean sync) { - PayOrderDO order = payOrderService.getOrder(id); - if (order== null) { + PayOrderDO order = null; + if (CharSequenceUtil.isNotEmpty(no)) { + order = payOrderService.getOrder(no); + } + if (ObjUtil.isNull(order) && ObjUtil.isNotNull(id)) { + order = payOrderService.getOrder(id); + } + if (order == null) { return success(null); } // 重要:校验订单是否是当前用户,避免越权 @@ -65,7 +74,7 @@ public class AppPayOrderController { if (Boolean.TRUE.equals(sync) && PayOrderStatusEnum.isWaiting(order.getStatus())) { payOrderService.syncOrderQuietly(order.getId()); // 重新查询,因为同步后,可能会有变化 - order = payOrderService.getOrder(id); + order = payOrderService.getOrder(order.getId()); } return success(BeanUtils.toBean(order, PayOrderRespVO.class)); } diff --git a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java index 95510d5f7e..e83d0387c8 100755 --- a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java +++ b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java @@ -48,6 +48,10 @@ public interface PayOrderMapper extends BaseMapperX { PayOrderDO::getMerchantOrderId, merchantOrderId); } + default PayOrderDO selectByNo(String no) { + return selectOne(PayOrderDO::getNo, no); + } + default int updateByIdAndStatus(Long id, Integer status, PayOrderDO update) { return update(update, new LambdaQueryWrapper() .eq(PayOrderDO::getId, id).eq(PayOrderDO::getStatus, status)); diff --git a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java index c4496f829d..fcce1f5a9c 100755 --- a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java +++ b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java @@ -31,6 +31,14 @@ public interface PayOrderService { */ PayOrderDO getOrder(Long id); + /** + * 获得支付订单 + * + * @param no 支付订单号 + * @return 支付订单 + */ + PayOrderDO getOrder(String no); + /** * 获得支付订单 * diff --git a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java index b7f18abd65..8a9bebde8f 100755 --- a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java +++ b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java @@ -79,6 +79,11 @@ public class PayOrderServiceImpl implements PayOrderService { return orderMapper.selectById(id); } + @Override + public PayOrderDO getOrder(String no) { + return orderMapper.selectByNo(no); + } + @Override public PayOrderDO getOrder(Long appId, String merchantOrderId) { return orderMapper.selectByAppIdAndMerchantOrderId(appId, merchantOrderId); From a1a695a033b5c424af3ee690cd69d8208aac33e1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 24 Nov 2025 20:53:51 +0800 Subject: [PATCH 06/12] =?UTF-8?q?fix=EF=BC=9A=E3=80=90framework=E3=80=91?= =?UTF-8?q?=E9=99=84=E4=BB=B6=E8=BF=94=E5=9B=9E=E6=97=B6=EF=BC=8CiOS=20?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=AF=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/infra/framework/file/core/utils/FileTypeUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/utils/FileTypeUtils.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/utils/FileTypeUtils.java index 28d6a9fa16..f8cd1c45cd 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/utils/FileTypeUtils.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/utils/FileTypeUtils.java @@ -91,9 +91,8 @@ public class FileTypeUtils { } // 针对 video 的特殊处理,解决视频地址在移动端播放的兼容性问题 if (StrUtil.containsIgnoreCase(mineType, "video")) { - response.setHeader("Content-Length", String.valueOf(content.length)); - response.setHeader("Content-Range", "bytes 0-" + (content.length - 1) + "/" + content.length); response.setHeader("Accept-Ranges", "bytes"); + response.setHeader("Content-Length", String.valueOf(content.length)); } // 输出附件 IoUtil.write(response.getOutputStream(), false, content); From bdb4e3fadc5c5cdfd860028184efe9a77cee0d6d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 25 Nov 2025 08:55:59 +0800 Subject: [PATCH 07/12] =?UTF-8?q?fix=EF=BC=9A=E3=80=90bpm=E3=80=91flowable?= =?UTF-8?q?=207.2.0=20=E9=A9=B3=E5=9B=9E=E5=8F=AF=E4=BD=BF=E7=94=A8=20move?= =?UTF-8?q?ActivityIdsToSingleActivityId=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/service/task/BpmTaskServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 0d3d27834f..acd437b570 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -949,11 +949,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { Set needSimulateTaskDefinitionKeys = getNeedSimulateTaskDefinitionKeys(bpmnModel, currentTask, targetElement); // 4. 执行驳回 - // 使用 moveExecutionsToSingleActivityId 替换 moveActivityIdsToSingleActivityId 原因: - // 当多实例任务回退的时候有问题。相关 issue: https://github.com/flowable/flowable-engine/issues/3944 + // ① 使用 moveExecutionsToSingleActivityId 替换 moveActivityIdsToSingleActivityId。原因:当多实例任务回退的时候有问题。 + // 相关 issue: https://github.com/flowable/flowable-engine/issues/3944 + // ② flowable 7.2.0 版本后,继续使用 moveActivityIdsToSingleActivityId 方法。原因:flowable 7.2.0 版本修复了该问题。 + // 相关 issue:https://github.com/YunaiV/ruoyi-vue-pro/issues/1018 runtimeService.createChangeActivityStateBuilder() .processInstanceId(currentTask.getProcessInstanceId()) - .moveExecutionsToSingleActivityId(runExecutionIds, reqVO.getTargetTaskDefinitionKey()) + .moveActivityIdsToSingleActivityId(runExecutionIds, reqVO.getTargetTaskDefinitionKey()) // 设置需要预测的任务 ids 的流程变量,用于辅助预测 .processVariable(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_TASK_IDS, needSimulateTaskDefinitionKeys) // 设置流程变量(local)节点退回标记, 用于退回到节点,不执行 BpmUserTaskAssignStartUserHandlerTypeEnum 策略,导致自动通过 From 6ac6cddbc707d14c49ba67fdaa8a8c4a1b7f3e64 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 25 Nov 2025 10:58:22 +0800 Subject: [PATCH 08/12] =?UTF-8?q?feat=EF=BC=9A=E3=80=90infra=E3=80=91vben5?= =?UTF-8?q?=20+=20antd=20=E7=9A=84=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=E6=A8=A1=E7=89=88=E7=9A=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vue3_vben5_antd/general/views/form.vue.vm | 6 +- .../general/views/index.vue.vm | 63 ++++++++-------- .../general/views/modules/form_sub_erp.vue.vm | 5 +- .../views/modules/form_sub_normal.vue.vm | 55 +++++++------- .../general/views/modules/list_sub_erp.vue.vm | 72 +++++++++---------- .../views/modules/form_sub_normal.vue.vm | 29 ++++---- .../schema/views/modules/list_sub_erp.vue.vm | 4 +- 7 files changed, 116 insertions(+), 118 deletions(-) diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm index 06dc0c86c1..581eae041c 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm @@ -1,6 +1,6 @@