diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java index 4be1ec1..dbf88c8 100644 --- a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java @@ -1,5 +1,7 @@ package org.dromara.system.api; +import java.util.List; + /** * 配置服务 * @@ -21,4 +23,6 @@ public interface RemoteConfigService { */ String selectStreamIp(); + +// List selectStreamType(String deviceSn); } diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java new file mode 100644 index 0000000..af7661f --- /dev/null +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java @@ -0,0 +1,10 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.bo.RemoteNoticeBo; +import org.dromara.system.api.domain.vo.RemotePostVo; + +import java.util.List; + +public interface RemoteNoticeService { + int saveNotice(RemoteNoticeBo bo); +} diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubmailConfigService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubmailConfigService.java new file mode 100644 index 0000000..4bc2563 --- /dev/null +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubmailConfigService.java @@ -0,0 +1,20 @@ +package org.dromara.system.api; + +import org.dromara.common.core.domain.R; +import org.dromara.system.api.domain.vo.RemoteClientVo; + +/** + * 客户端服务 + * + * @author Michelle.Chung + */ +public interface RemoteSubmailConfigService { + + /** + * 根据客户端id获取客户端详情 + * + * @return 客户端对象 + */ + R remoteCmdSend(String code, String multiParam ); + +} diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteNoticeBo.java b/dk-api/api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteNoticeBo.java new file mode 100644 index 0000000..9ff720f --- /dev/null +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteNoticeBo.java @@ -0,0 +1,74 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class RemoteNoticeBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long noticeId; + + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + private Integer isRead; + /** + * 创建部门 + */ + + private Long createDept; + + /** + * 创建者 + */ + + private Long createBy; + private String deviceSn; + + /** + * 创建时间 + */ + private Date createTime; + + private String param; + + +} diff --git a/dk-common/common-bom/pom.xml b/dk-common/common-bom/pom.xml index 7cbb10a..6324395 100644 --- a/dk-common/common-bom/pom.xml +++ b/dk-common/common-bom/pom.xml @@ -257,6 +257,13 @@ ${revision} + + + org.dromara + common-rocketmq + ${revision} + + diff --git a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java index d63bcc3..4c57050 100644 --- a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java +++ b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java @@ -142,4 +142,17 @@ public enum DeviceEnum { return Arrays.stream(values()).filter(device -> device.getDevice().equals(finalKey)) .findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey1)); } + + /* @JsonCreator + public static DeviceEnum findKey(String key) { + if(StringUtils.isEmpty(key)){ + key = DeviceEnum.M3TD.getDevice(); + } + String finalKey = key; + String finalKey1 = key; + return Arrays.stream(values()).filter(device -> device.toString().equals(finalKey)) + .findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey1)); + }*/ + + } diff --git a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java new file mode 100644 index 0000000..f3ce4d4 --- /dev/null +++ b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java @@ -0,0 +1,39 @@ +package org.dromara.common.sdk.cloudapi.device; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.media.Schema; +import org.dromara.common.sdk.exception.CloudSDKException; + +import java.util.Arrays; + +/** + * @author sean + * @version 1.7 + * @date 2023/5/26 + */ +@Schema(description = "DeviceTypeVideoEnum", enumAsRef = true) +public enum DeviceTypeVideoEnum { + + ZERO(0), + SEVEN(7); + + ; + + private final int videoType; + + DeviceTypeVideoEnum(int videoType) { + this.videoType = videoType; + } + + @JsonValue + public int getVideoType() { + return videoType; + } + + @JsonCreator + public static DeviceTypeVideoEnum find(int videoType) { + return Arrays.stream(values()).filter(typeEnum -> typeEnum.videoType == videoType).findAny() + .orElseThrow(() -> new CloudSDKException(DeviceTypeVideoEnum.class, videoType)); + } +} diff --git a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java new file mode 100644 index 0000000..c851c1c --- /dev/null +++ b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java @@ -0,0 +1,80 @@ +package org.dromara.common.sdk.cloudapi.device; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.media.Schema; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.sdk.exception.CloudSDKException; + +import java.util.Arrays; + +/** + * @author sean + * @version 1.7 + * @date 2023/5/19 + */ +@Schema(description = "device model key.", format = "domain-type-subType", enumAsRef = true, example = "0-89-0") +public enum DeviceVideoEnum { + + + DOCK(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN), + + DJIDock2(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN), + + DOCK3(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN), + Matrice30(DeviceTypeEnum.M30_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + Matrice30T(DeviceTypeEnum.M30T_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + M3D(DeviceTypeEnum.M3D_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + M3TD(DeviceTypeEnum.M3TD_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + M4D(DeviceTypeEnum.M4D_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + M4TD(DeviceTypeEnum.M4TD_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + ; + + + @Schema(enumAsRef = true) + private final DeviceTypeEnum type; + + @Schema(enumAsRef = true) + private final DeviceSubTypeEnum subType; + + @Schema(enumAsRef = true) + private final DeviceTypeVideoEnum videoType; + + DeviceVideoEnum(DeviceTypeEnum type, DeviceSubTypeEnum subType, DeviceTypeVideoEnum videoType) { + this.type = type; + this.subType = subType; + this.videoType = videoType; + } + + public DeviceTypeEnum getType() { + return type; + } + + public DeviceSubTypeEnum getSubType() { + return subType; + } + + public DeviceTypeVideoEnum getVideoType() { + return videoType; + } + + @JsonValue + public String getDevice() { + return String.format("%s-%s-%s", type.getType(), subType.getSubType(),videoType.getVideoType()); + } + + + @JsonCreator + public static DeviceVideoEnum find(String key) { + String finalKey = key.replaceAll(" ",""); + return Arrays.stream(values()).filter(device -> device.toString().equals(finalKey)) + .findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey)); + } + + +} diff --git a/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java b/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java index 9f2632f..021800e 100644 --- a/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java +++ b/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java @@ -60,4 +60,7 @@ public interface DictService { * @return dictValue为key,dictLabel为值组成的Map */ Map getAllDictByDictType(String dictType); + + //获取字典下所有的字典值与标签 (key: 字典标签, value:字典键值) + Map getAllDictMapByDictType(String dictType); } diff --git a/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java index dd6ebb1..46bccfd 100644 --- a/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java +++ b/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java @@ -24,6 +24,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { public static final String SLASH = "/"; + public static final String DASH = "-"; + /** * 获取参数不为空值 * diff --git a/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java b/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java index 62a5d45..7453946 100644 --- a/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java +++ b/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java @@ -86,4 +86,9 @@ public class DictServiceImpl implements DictService { return StreamUtils.toMap(list, RemoteDictDataVo::getDictValue, RemoteDictDataVo::getDictLabel); } + @Override + public Map getAllDictMapByDictType(String dictType) { + List list = remoteDictService.selectDictDataByType(dictType); + return StreamUtils.toMap(list, RemoteDictDataVo::getDictLabel, RemoteDictDataVo::getDictValue); + } } diff --git a/dk-common/common-excel/pom.xml b/dk-common/common-excel/pom.xml index 23747b2..efebe1d 100644 --- a/dk-common/common-excel/pom.xml +++ b/dk-common/common-excel/pom.xml @@ -25,6 +25,21 @@ com.alibaba easyexcel + + + + + + + + + + + + + + + diff --git a/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java b/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java index 68548ed..7f2713f 100644 --- a/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java +++ b/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java @@ -19,6 +19,8 @@ public final class RedisConst { public static final Integer WEBSOCKET_ALIVE_SECOND = 60 * 60 * 24; + public static final Integer DEVICE_VIDEO_STATUE_SECOND = 60 * 50; + public static final String DEVICE_ONLINE_PREFIX = "online" + DELIMITER; public static final String WEBSOCKET_PREFIX = "webSocket" + DELIMITER; @@ -62,4 +64,7 @@ public final class RedisConst { public static final String FILE_UPLOADING_PREFIX = "file_uploading" + DELIMITER; public static final String DRONE_CONTROL_PREFiX = "control_source" + DELIMITER; + + + public static final String VIDEO_STATUS = "video_status" + DELIMITER; } diff --git a/dk-common/common-rocketmq/pom.xml b/dk-common/common-rocketmq/pom.xml new file mode 100644 index 0000000..412a96a --- /dev/null +++ b/dk-common/common-rocketmq/pom.xml @@ -0,0 +1,45 @@ + + + + org.dromara + dk-common + ${revision} + + 4.0.0 + + common-rocketmq + + + common-rocketmq 配置中心 + + + + + + org.apache.rocketmq + rocketmq-client + 4.9.0 + + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + + + + org.dromara + common-core + + + + org.dromara + common-nacos + + + + + + diff --git a/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/config/ProducerConfig.java b/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/config/ProducerConfig.java new file mode 100644 index 0000000..4d82415 --- /dev/null +++ b/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/config/ProducerConfig.java @@ -0,0 +1,58 @@ +package org.dromara.common.rocketmq.config; + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.dromara.common.rocketmq.model.ProducerMode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + + +/** + * mq搭建地址连接 + * 生产者初者连接信息 具体看nacos配置 + */ +@AutoConfiguration +@Slf4j +@EnableConfigurationProperties(ProducerMode.class) +public class ProducerConfig { + + /** + * 远程调用连接信息 + */ + public static DefaultMQProducer producer; + + /** + * 连接客户端信息配置 具体看nacos配置 + */ + @Autowired + private ProducerMode producerMode; + + @Bean + public DefaultMQProducer getRocketMQProducer() { + producer = new DefaultMQProducer(producerMode.getGroupName()); + producer.setNamesrvAddr(producerMode.getNameServer()); + //如果需要同一个jvm中不同的producer往不同的mq集群发送消息,需要设置不同的instanceName + if(producerMode.getMaxMessageSize()!=null){ + producer.setMaxMessageSize(producerMode.getMaxMessageSize()); + } + if(producerMode.getSendMsgTimeout()!=null){ + producer.setSendMsgTimeout(producerMode.getSendMsgTimeout()); + } + //如果发送消息失败,设置重试次数,默认为2次 + if(producerMode.getRetryTimesWhenSendFailed()!=null){ + producer.setRetryTimesWhenSendFailed(producerMode.getRetryTimesWhenSendFailed()); + } + producer.setVipChannelEnabled(false); + try { + producer.start(); + log.info("生产者初始化成功:{}",producer.toString()); + } catch (MQClientException e) { + log.error("生产者初始化失败:{}",e.getMessage()); + } + return producer; + } + +} diff --git a/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/model/ProducerMode.java b/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/model/ProducerMode.java new file mode 100644 index 0000000..e255e1e --- /dev/null +++ b/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/model/ProducerMode.java @@ -0,0 +1,25 @@ +package org.dromara.common.rocketmq.model; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 生产者初始化 + */ +@Data +@ConfigurationProperties(prefix = "rocketmq.producer") +public class ProducerMode { + + private String groupName; + + private String nameServer; + + private Integer maxMessageSize; + + private Integer sendMsgTimeout; + + private Integer retryTimesWhenSendFailed; +} diff --git a/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/producer/MessageProducerUtil.java b/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/producer/MessageProducerUtil.java new file mode 100644 index 0000000..14ec0fc --- /dev/null +++ b/dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/producer/MessageProducerUtil.java @@ -0,0 +1,189 @@ +package org.dromara.common.rocketmq.producer; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.exception.MQBrokerException; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.remoting.common.RemotingHelper; +import org.apache.rocketmq.remoting.exception.RemotingException; +import org.springframework.stereotype.Component; + +import java.io.UnsupportedEncodingException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import static org.dromara.common.rocketmq.config.ProducerConfig.producer; + + +/** + * 消息发送 + */ +@Slf4j +public class MessageProducerUtil { + + /** + * 同步发送消息 + * @param topic 主题 + * @param tag 标签 + * @param key 自定义的key,根据业务来定 + * @param value 消息的内容 + * 通过调用 send() 方法发送消息,阻塞等待服务器响应。 + */ + public static SendResult sendSynchronizeMessage(String topic, String tag, String key, String value){ + String body = "topic:【"+topic+"】, tag:【"+tag+"】, key:【"+key+"】, value:【"+value+"】"; + try { + Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET)); + System.out.println("生产者发送消息:"+ JSON.toJSONString(value)); + SendResult result = producer.send(msg); + return result; + } catch (Exception e) { + e.printStackTrace(); + log.error("消息初始化失败!body:{}",body); + + } + return null; + } + + /** + * 单向发送消息 + * @param topic 主题 + * @param tag 标签 + * @param key 自定义的key,根据业务来定 + * @param value 消息的内容 + * 单向发送:通过调用 sendOneway() 方法发送消息,不关心发送结果,适用于对可靠性要求不高的场景。 + */ + public static void sendOnewayMessage(String topic, String tag, String key, String value){ + String body = "topic:【"+topic+"】, tag:【"+tag+"】, key:【"+key+"】, value:【"+value+"】"; + try { + Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET)); + System.out.println("生产者发送消息:"+ JSON.toJSONString(value)); + producer.sendOneway(msg); + } catch (UnsupportedEncodingException e) { + log.error("消息初始化失败!body:{}",body); + + } catch (MQClientException | InterruptedException | RemotingException e) { + log.error("消息发送失败! body:{}",body); + } + } + + + /** + * 批量发送消息 + * @param messages 消息列表 + * 批量发送:通过调用 send() 方法并传入多条消息,实现批量发送消息。 + */ +// public static SendResult sendBatchMessage(List messages){ +// String body = messages.toString(); +// try { +// System.out.println("生产者发送消息:"+ messages); +// // 发送批量消息 +// SendResult sendResult = producer.send(messages); +// return sendResult; +// } catch (MQClientException | InterruptedException | RemotingException e) { +// log.error("消息发送失败! body:{}",body); +// } catch (MQBrokerException e) { +// throw new RuntimeException(e); +// } +// return null; +// } + + + /** + * 发送有序的消息 + * @param messagesList Message集合 + * @param messageQueueNumber 消息队列数量,根据实际情况设定 + * 顺序发送: messageQueueNumber 表示消息的业务标识,可以根据具体需求进行设置来保证消息按顺序发送。 + */ +// public static SendResult sendOrderlyMessage(List messagesList, Integer messageQueueNumber) { +// SendResult result = null; +// for (Message message : messagesList) { +// try { +// result = producer.send(message, (list, msg, arg) -> { +// Integer queueNumber = (Integer) arg; +// //int queueIndex = queueNumber % list.size(); +// return list.get(queueNumber); +// }, messageQueueNumber);//根据编号取模,选择消息队列 +// } catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) { +// log.error("发送有序消息失败"); +// return result; +// } +// } +// return result; +// } + + /** + * 发送延迟消息 + * @param topic 主题 + * @param tag 标签 + * @param key 自定义的key,根据业务来定 + * @param value 消息的内容 + * 延迟发送:通过设置延迟级别来实现延迟发送消息。 + */ + public static SendResult sendDelayMessage(String topic, String tag, String key, String value) + { + SendResult result = null; + try + { + Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET)); + //设置消息延迟级别,我这里设置5,对应就是延时一分钟 + // "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h" + msg.setDelayTimeLevel(4); + // 发送消息到一个Broker + result = producer.send(msg); + // 通过sendResult返回消息是否成功送达 + log.info("发送延迟消息结果:======sendResult:{}", result); + DateFormat format =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + log.info("发送时间:{}", format.format(new Date())); + return result; + } + catch (Exception e) + { + e.printStackTrace(); + log.error("延迟消息队列推送消息异常:{},推送内容:{}", e.getMessage(), result); + } + return result; + } + /** + * 发送异步的消息 + * @param topic 主题 + * @param tag 标签 + * @param key 自定义的key,根据业务来定 + * @param value 消息的内容 + * 通过调用 send() 方法,并传入一个 SendCallback 对象,在发送消息的同时可以继续处理其他逻辑,消息发送结果通过回调函数通知。 + */ + public static SendResult sendAsyncProducerMessage(String topic, String tag, String key, String value){ + + try { + //创建一个消息实例,指定主题、标签和消息体。 + Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET)); + System.out.println("生产者发送消息:"+ JSON.toJSONString(value)); + producer.send(msg,new SendCallback() { + // 异步回调的处理 + @Override + public void onSuccess(SendResult sendResult) { + System.out.printf("%-10d 异步发送消息成功 %s %n", msg, sendResult.getMsgId()); + } + @Override + public void onException(Throwable e) { + System.out.printf("%-10d 异步发送消息失败 %s %n", msg, e); + e.printStackTrace(); + } + }); + } catch (MQClientException e) { + e.printStackTrace(); + } catch (RemotingException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return null; + } + +} diff --git a/dk-common/common-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dk-common/common-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..0d19465 --- /dev/null +++ b/dk-common/common-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.rocketmq.config.ProducerConfig diff --git a/dk-common/pom.xml b/dk-common/pom.xml index a0eb4a7..d1527b3 100644 --- a/dk-common/pom.xml +++ b/dk-common/pom.xml @@ -46,6 +46,7 @@ common-bus common-sse common-cloudsdk + common-rocketmq dk-common diff --git a/dk-modules/business/pom.xml b/dk-modules/business/pom.xml index 78874bb..1b3151d 100644 --- a/dk-modules/business/pom.xml +++ b/dk-modules/business/pom.xml @@ -116,6 +116,10 @@ org.dromara api-workflow + + org.dromara + common-rocketmq + diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java index 229dba3..0eb51ab 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java @@ -1,6 +1,8 @@ package org.dromara.business.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.alibaba.fastjson.JSON; +import com.alibaba.nacos.client.utils.TenantUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -9,17 +11,25 @@ import org.dromara.business.domain.BusinessAlert; import org.dromara.business.domain.bo.BusinessAlertBo; import org.dromara.business.domain.vo.BusinessAlertVo; import org.dromara.business.service.IBusinessAlertService; +import org.dromara.business.utils.MinioUntil; +import org.dromara.business.utils.constants.MinIOConstants; import org.dromara.common.core.domain.R; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.web.core.BaseController; +import org.dromara.system.api.RemoteNoticeService; +import org.dromara.system.api.RemoteSubmailConfigService; +import org.dromara.system.api.domain.bo.RemoteNoticeBo; import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Date; import java.util.List; /** @@ -39,7 +49,23 @@ public class BusinessAlertController extends BaseController { private final IBusinessAlertService businessAlertService; @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; + @DubboReference(timeout = 30000) + private RemoteNoticeService remoteNoticeService; + + @DubboReference(timeout = 30000) + private RemoteSubmailConfigService remoteSubmailConfigService; + /** + * 测试发送调用submail短信服务, + * + * @param code 必须传参:smsMultixsend + * @param multiParam 前台传参 JSON.stringfy( {"jobName":"翟山街道华盛","labelCn":"普通垃圾","labelEn":"garbage","deptName":"翟山街道","lat":"34.20994348014929","lng":"117.2054671683176"}) + * 后台接收json效果 {"jobName":"翟山街道华盛景园违建巡査面状航线(1)2025-05-11 09:32:30","labelCn":"普通垃圾","labelEn":"garbage","deptName":"翟山街道","lat":"34.20994348014929","lng":"117.2054671683176"} + */ + @GetMapping("/demo") + public void demo(@RequestParam("code") String code, @RequestParam("multiParam") String multiParam) { + remoteSubmailConfigService.remoteCmdSend(code, multiParam); + } /** * 查询全部预警/待办/已完成/忽略 */ @@ -75,17 +101,35 @@ public class BusinessAlertController extends BaseController { } /** - * 查询全部预警/待办/已完成/忽略 + * ai实时流预警保存 */ - @Operation(summary ="ai实时流预警保存",description = "ai实时流预警保存") + @Operation(summary ="ai实时流预警保存-用于演示",description = "ai实时流预警保存-用于演示") @PostMapping("/saveAlert") - public void saveAlert(BusinessAlertVo vo) { + public R saveAlert(@RequestBody BusinessAlertVo vo) { vo.setBusinessType(2); BusinessAlert businessAlert = businessAlertService.addBusinessAlert(vo); RemoteStartProcess startProcess = new RemoteStartProcess(); startProcess.setBusinessId(String.valueOf(businessAlert.getId())); startProcess.setFlowCode("alertChz"); remoteWorkflowService.startWorkFlowBatch(List.of(startProcess)); + RemoteNoticeBo remoteNoticeBo = new RemoteNoticeBo(); + remoteNoticeBo.setNoticeTitle(vo.getDeptName()+"产生预警,预警类型["+vo.getLabelCn()+"],请立即查看"); + remoteNoticeBo.setNoticeType("3"); + remoteNoticeBo.setNoticeContent(vo.getDeptName()+"产生预警,预警类型["+vo.getLabelCn()+"],请立即查看"); + remoteNoticeBo.setStatus("0"); + remoteNoticeBo.setIsRead(0); + remoteNoticeBo.setCreateBy(1L); + remoteNoticeBo.setCreateDept(1L); + remoteNoticeBo.setCreateTime(businessAlert.getCreateTime()); + if (businessAlert.getBusinessType() == 2){ + businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, vo.getImages(), 3600).toString()); + } + remoteNoticeBo.setDeviceSn(vo.getDeviceSn()); + businessAlert.setDeviceSn(vo.getDeviceSn()); + remoteNoticeBo.setParam(JSON.toJSONString(businessAlert)); + remoteNoticeService.saveNotice(remoteNoticeBo); + remoteSubmailConfigService.remoteCmdSend("smsMultixsend", JSON.toJSONString(vo)); + return R.ok(); } diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java index d1967dd..01871c7 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java @@ -46,7 +46,6 @@ public class BusinessTaskController extends BaseController { /** * 查询工单预约列表 */ - @ApiEncrypt(response=true) @SaCheckPermission("business:task:list") @GetMapping("/list") public TableDataInfo list(BusinessTaskBo bo, PageQuery pageQuery) { diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java index f6a8bb7..4102743 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java @@ -243,4 +243,7 @@ public class BusinessAlert { */ @TableField(exist = false) private String buttonPermission; + + @TableField(exist = false) + private String deviceSn; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTaskLabel.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTaskLabel.java new file mode 100644 index 0000000..05b5fa6 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTaskLabel.java @@ -0,0 +1,34 @@ +package org.dromara.business.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @auther yq + * @data 2025/2/26 + */ +@Data +@TableName("business_task_label") +public class BusinessTaskLabel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long taskId; + + private String labelCn; + private String labelEn; + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java index d0d8695..8f79a7d 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java @@ -1,10 +1,9 @@ package org.dromara.business.domain.bo; -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; + import org.dromara.business.domain.BusinessTask; +import org.dromara.business.domain.BusinessTaskLabel; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; @@ -13,8 +12,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; -import java.awt.*; + import java.util.Date; +import java.util.List; /** * 工单预约业务对象 business_task @@ -87,4 +87,6 @@ public class BusinessTaskBo extends BaseEntity { private Date flightTime; //飞行说明 private String flightExplain; + + private List taskLabelList; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java index e1c332b..bc23174 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java @@ -205,4 +205,5 @@ public class BusinessAlertVo implements Serializable { private Date createTime; //1:图片比对预警 2:AI实时预警 private Integer businessType; + private String deviceSn; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskLabelVo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskLabelVo.java new file mode 100644 index 0000000..2d3621d --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskLabelVo.java @@ -0,0 +1,35 @@ +package org.dromara.business.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.business.domain.BusinessTask; +import org.dromara.business.domain.BusinessTaskLabel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @auther yq + * @data 2025/2/26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusinessTaskLabel.class) +public class BusinessTaskLabelVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + + private Long id; + + private Long taskId; + + private String labelCn; + private String labelEn; + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java index d74446a..0717344 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java @@ -5,13 +5,14 @@ import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.business.domain.BusinessTask; +import org.dromara.business.domain.BusinessTaskLabel; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import java.io.Serial; import java.io.Serializable; import java.util.Date; - +import java.util.List; /** @@ -91,6 +92,6 @@ public class BusinessTaskVo implements Serializable { private String flightExplain; - + private List taskLabelList; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskLabelMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskLabelMapper.java new file mode 100644 index 0000000..ff11436 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskLabelMapper.java @@ -0,0 +1,27 @@ +package org.dromara.business.mapper; + + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.business.domain.BusinessTask; +import org.dromara.business.domain.BusinessTaskLabel; +import org.dromara.business.domain.bo.BusinessTaskBo; +import org.dromara.business.domain.vo.BusinessTaskLabelVo; +import org.dromara.business.domain.vo.BusinessTaskVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + + +/** + * 工单预约Mapper接口 + * + * @author LionLi + * @date 2025-02-26 + */ +public interface BusinessTaskLabelMapper extends BaseMapperPlus { + List selectTaskLabelList(@Param("taskId") Long taskId); + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java index 30b62c4..6cae035 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java @@ -555,8 +555,14 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { return result; } //不是空的话查看是对应各局的 - businessAlertBo.setAiLabelEnList(List.of(businessAlertBo.getLabelEn())); - List alertList = this.baseMapper.heatList(businessAlertBo,businessAlertBo.getStartTime(), businessAlertBo.getEndTime()); + List postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), null); + + + if (ObjectUtil.isEmpty(postVoList)){ + return result; + } + businessAlertBo.setAiLabelEnList(postVoList.stream().map(RemoteAiLabelPostVo::getLabelEn).distinct().toList()); + List alertList = this.baseMapper.heatList(businessAlertBo, businessAlertBo.getStartTime(), businessAlertBo.getEndTime()); Map> listMap = alertList.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn)); result.putAll(listMap); return result; @@ -578,7 +584,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { infoMap.put("date", startTime + "~" + endTime); //不是空的话查看是对应各局的 - List postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), LoginHelper.getDeptId()); + List postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), null); Map> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName)); @@ -636,7 +642,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { Map infoMap = new HashMap<>(); //不是空的话查看是对应各局的 - List postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), LoginHelper.getDeptId()); + List postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), null); Map> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName)); diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java index 6847651..4068fd9 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java @@ -1,7 +1,9 @@ package org.dromara.business.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; @@ -416,6 +418,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist //查询所有的职能岗位 List postVoList = remotePostService.listPost(); + postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则 if (ObjectUtil.isEmpty(postVoList)) { return ListUtil.empty(); @@ -444,6 +447,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist //查询所有的职能岗位 List postVoList = remotePostService.listPost(); + postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则 List result = new ArrayList<>(); @@ -498,6 +502,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist //查询所有的职能岗位 List postVoList = remotePostService.listPost(); + postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则 List monthList = getLastSixMonths(); @@ -687,7 +692,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist //构建查询数据权限 createPermissions(businessAlertBo); - List postVoList = remoteLabelPostService.selectLabelByList(businessAlertBo.getPostCode(), LoginHelper.getDeptId()); + List postVoList = remoteLabelPostService.selectLabelByList(businessAlertBo.getPostCode(), null); Map> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName)); diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java index 6123802..3fc4f9f 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java @@ -2,12 +2,15 @@ package org.dromara.business.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.business.domain.BusinessTask; +import org.dromara.business.domain.BusinessTaskLabel; import org.dromara.business.domain.bo.BusinessTaskBo; import org.dromara.business.domain.vo.BusinessTaskVo; +import org.dromara.business.mapper.BusinessTaskLabelMapper; import org.dromara.business.mapper.BusinessTaskMapper; import org.dromara.business.service.IBusinessTaskService; import org.dromara.common.core.constant.BusinessConstants; @@ -35,6 +38,7 @@ import java.util.Map; public class BusinessTaskServiceImpl implements IBusinessTaskService { private final BusinessTaskMapper baseMapper; + private final BusinessTaskLabelMapper taskLabelMapper; /** * 查询工单预约 @@ -92,6 +96,9 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService { */ @Override public Boolean insertByBo(BusinessTaskBo bo) { + if(bo.getTaskLabelList().isEmpty()){ + throw new RuntimeException("未获取到识别类型标签"); + } // 获取当前登录用户信息 LoginUser currentUser = LoginHelper.getLoginUser(); bo.setCreateBy(currentUser.getUserId()); @@ -105,6 +112,10 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService { boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); + bo.getTaskLabelList().forEach(labelVo -> { + labelVo.setTaskId(bo.getId()); + }); + taskLabelMapper.insert(bo.getTaskLabelList()); } return flag; } diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml index d044dc9..fd1fdf4 100644 --- a/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml @@ -449,8 +449,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" COUNT(DISTINCT ba.id) AS total from business_alert ba where 1=1 - and = '2024' ]]> - and + and ba.handle_type = 'finish' @@ -891,8 +890,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT temp.label_en AS labelEn, temp.label_cn as labelCn, - bl.lat AS lat, - bl.lng AS lng, + ba.lat AS lat, + ba.lng AS lng, COUNT(*) AS value FROM ( @@ -905,15 +904,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ba.label_en, ba.label_cn ) temp INNER JOIN - business_alert bl ON temp.label_en = bl.label_en - AND bl.lat IS NOT NULL + business_alert ba ON temp.label_en = ba.label_en + AND ba.lat IS NOT NULL GROUP BY - temp.label_en,temp.label_cn, bl.lat, bl.lng + temp.label_en,temp.label_cn, ba.lat, ba.lng HAVING - + diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessTaskLabelMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessTaskLabelMapper.xml new file mode 100644 index 0000000..30fd654 --- /dev/null +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessTaskLabelMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml index 66499c7..10f657c 100644 --- a/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml @@ -28,6 +28,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + +