diff --git a/jeecg-boot/jeecg-boot-base-core/pom.xml b/jeecg-boot/jeecg-boot-base-core/pom.xml index e2d763c1ddf35dee17d657a8afd8b2972cd09c50..8a8cb52f1f52b693a4f21ec9d137bcf5842f5d4c 100644 --- a/jeecg-boot/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot/jeecg-boot-base-core/pom.xml @@ -10,7 +10,7 @@ jeecg-boot-base-core - 3.1.5 + 3.4.1 @@ -90,6 +90,7 @@ io.micrometer micrometer-registry-prometheus + 1.11.5 @@ -369,4 +370,4 @@ jeecg-boot-starter3-chatgpt - \ No newline at end of file + diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java index c9c4c901d219ff86ee59e1e7e8c20016f68adedd..95a6f9cf195988b51905a3ff9c03e7122de2cd50 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java @@ -20,7 +20,7 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.IpUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; + import org.springframework.core.StandardReflectionParameterNameDiscoverer; import org.springframework.stereotype.Component; import org.springframework.validation.BindingResult; diff --git a/jeecg-boot/jeecg-module-KM/pom.xml b/jeecg-boot/jeecg-module-KM/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..99c6c3de5ce5dea9774db9b6ca7f2bb25ac23014 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/pom.xml @@ -0,0 +1,175 @@ + + + + jeecg-boot-parent + org.jeecgframework.boot + 3.7.1 + + 4.0.0 + + jeecg-module-KM + + + + aliyun + aliyun Repository + http://maven.aliyun.com/nexus/content/groups/public + + false + + + + jeecg + jeecg Repository + http://maven.jeecg.org/nexus/content/repositories/jeecg + + false + + + + + + + org.jeecgframework.boot + jeecg-boot-base-core + + + org.springframework.ai + spring-ai-ollama-spring-boot-starter + + + org.springframework.ai + spring-ai-pgvector-store-spring-boot-starter + + + org.springframework.ai + spring-ai-pdf-document-reader + + + org.springframework.ai + spring-ai-tika-document-reader + + + io.swagger + swagger-annotations + 1.6.10 + + + + org.opensearch.client + spring-data-opensearch-starter + 1.6.0 + + + org.opensearch.client + opensearch-rest-high-level-client + + + + + org.opensearch.client + opensearch-rest-client + 2.18.0 + + + org.opensearch.client + opensearch-java + 2.11.1 + + + org.apache.tika + tika-core + 1.17 + + + org.apache.tika + tika-parsers + 1.17 + + + org.jodd + jodd-all + 4.3.1 + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.jeecgframework.boot + jeecg-system-local-api + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-devtools + true + + + org.springframework.boot + spring-boot-starter-thymeleaf + 2.5.1 + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + + + com.googlecode.json-simple + json-simple + 1.1 + + + com.google.code.gson + gson + 2.8.9 + + + com.inversoft + prime-jwt + 1.3.1 + + + + + + + + + com.fasterxml.jackson.core + jackson-databind + 2.11.3 + + + + org.modelmapper + modelmapper + 2.4.2 + + + org.springframework + spring-test + 5.3.2 + + + + + + + + + + diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmChartVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmChartVO.java new file mode 100644 index 0000000000000000000000000000000000000000..47b2b60f5425b26974ae13affd5733a75f8cd115 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmChartVO.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.KM.VO; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc首页chart对象", description="km_doc") +public class KmChartVO implements Serializable { + + //分类:1 + List categoryChartList; + //标签:4 + List businessChartList; + //专题:5 + List topicChartList; + //热词 + List hotKeywordList; + //热门专题 + List hotTopicList; + //全局数据:知识数,存储空间 + KmDocSummaryVO kmDocSummaryVO; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocCommentsVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocCommentsVO.java new file mode 100644 index 0000000000000000000000000000000000000000..daf4c0ceb985eb0b7e846f3b1de3f2bb05b18af1 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocCommentsVO.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.KM.VO; + + +import lombok.Data; +import org.jeecg.modules.KM.entity.KmDocComments; + +import java.io.Serializable; + +@Data +public class KmDocCommentsVO extends KmDocComments implements Serializable { + private String avatar; + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsFilterParamVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsFilterParamVO.java new file mode 100644 index 0000000000000000000000000000000000000000..109a18b94828a8eac3cf81d643eee32b47c83cc5 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsFilterParamVO.java @@ -0,0 +1,41 @@ +package org.jeecg.modules.KM.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +public class KmDocEsFilterParamVO implements Serializable { + //高级检索标识 0-普通 1-高级 + private Boolean advSearchFlag; + @ApiModelProperty(value = "是否精确检索标识:0-否,1-是") + private Boolean phraseMatchSearchFlag; + + private String title; + + private List keywords; + + private String content; + + private List category; + + private List businessTypes; + + private List topicCodes; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "createTimeStart") + private Date createTimeStart; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "createTimeEnd") + private Date createTimeEnd; + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsParamVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsParamVO.java new file mode 100644 index 0000000000000000000000000000000000000000..7ae8725a90826d011dd209848fe65df9976a66ba --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsParamVO.java @@ -0,0 +1,46 @@ +package org.jeecg.modules.KM.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.RequestParam; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +public class KmDocEsParamVO implements Serializable { + //高级检索标识 0-普通 1-高级 + private Boolean advSearchFlag; + @ApiModelProperty(value = "是否精确检索标识:0-否,1-是") + private Boolean phraseMatchSearchFlag; + private String title; + private List keywords; + private String content; + private List category; + private List businessTypes; + private List topicCodes; + //结果中检索的前置条件 + private List filterParams; + + //结果排序字段 + private String column; + private String order; + private Integer pageNo; + private Integer pageSize; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "createTimeStart") + private Date createTimeStart; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "createTimeEnd") + private Date createTimeEnd; + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsVO.java new file mode 100644 index 0000000000000000000000000000000000000000..7c33cd8861acebfbcff6dcc0c296cf5bbce29a25 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocEsVO.java @@ -0,0 +1,44 @@ +package org.jeecg.modules.KM.VO; + +import lombok.Data; +import lombok.ToString; +import java.io.Serializable; +import java.util.Date; + +@Data +@ToString +public class KmDocEsVO implements Serializable { + + //private String indexId; //todo:考虑是否改名,跟es的_id字段一致 + private String docId; + private String fileNo; + + /* + 状态:0-下架 1-有效 + */ + private Integer releaseFlag; + /* + 状态:0-内部公开 1-对外公开 + */ + private Integer publicRemark; + + private String title; + + private String category; + + private String orgCode; + + private Date createTime; + +// private String pubTimeTxt; +// +// private String[] versions; + + private String[] businessTypes; + + private String[] keywords; + + private String[] topicCodes; + + private String content; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocParamVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocParamVO.java new file mode 100644 index 0000000000000000000000000000000000000000..2eac7b610e48d5bccf1064b8fca511cdb94b23dd --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocParamVO.java @@ -0,0 +1,44 @@ +package org.jeecg.modules.KM.VO; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecg.modules.KM.entity.KmDoc; +import org.springframework.format.annotation.DateTimeFormat; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +public class KmDocParamVO extends KmDoc implements Serializable { + +// private List versionList; +// private List sourceList; +// private List addVersionList; +// private List removeVersionList; +// private String pubTimeStart; +// private String pubTimeEnd; + + //多状态查询 + private List statusList; + private List businessTypeList; + private List depIdList; + private List addBusinessTypeList; + private List removeBusinessTypeList; + private List addTopicIdList; + private List removeTopicIdList; + + private boolean departmentFilterEnabled; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTimeStart") + private Date createTimeStart; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTimeEnd") + private Date createTimeEnd; + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocStatisticsVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocStatisticsVO.java new file mode 100644 index 0000000000000000000000000000000000000000..751b0e80767a172421b02700c2538376b966221f --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocStatisticsVO.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.KM.VO; + +import io.swagger.annotations.ApiModel; +import jodd.madvoc.meta.In; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc统计结果", description="km_doc") +public class KmDocStatisticsVO implements Serializable { + + private String itemText; + private Integer amount; + private Long fileSizeInt; + private String fileSize; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocSummaryVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocSummaryVO.java new file mode 100644 index 0000000000000000000000000000000000000000..2516955df0e0243420ce19da52dd66c06f2ef1a6 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocSummaryVO.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.KM.VO; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc全局计数", description="km_doc") +public class KmDocSummaryVO implements Serializable { + private Integer kmAmount; + private Long fileSizeLong; + private Long viewsLong; + private Long downloadsLong; + private Long commentsLong; + private Long favouritesLong; + private String fileSizeString; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocVO.java new file mode 100644 index 0000000000000000000000000000000000000000..38228814a560b9b99301f15f1b6ccfeffbe1f5e2 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocVO.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.KM.VO; + + +import lombok.Data; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.modules.KM.entity.KmDoc; +import java.io.Serializable; + +@Data +public class KmDocVO extends KmDoc implements Serializable { + private Integer favourite; + @Dict(dicCode = "km_dict_business") + private String businessTypes; + @Dict(dicCode = "km_dict_versions") + private String versions; + @Dict(dicCode="id",dictTable = "sys_category",dicText = "name") + private String topicIds; + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocVisitRecordEsVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocVisitRecordEsVO.java new file mode 100644 index 0000000000000000000000000000000000000000..ce21ccbe7f14a08efc8a94ac664f5429d8b52553 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmDocVisitRecordEsVO.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.KM.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; +import java.io.Serializable; +import java.util.Date; + +@Data +public class KmDocVisitRecordEsVO implements Serializable { + private String docId; + /**1:上传 2:预览 3:下载 4:删除*/ + private Integer visitType; + private String keywords; + private String[] keywordsMax; + private String sourceIp; + private String createBy; + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTime") + private Date createTime; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmSearchRecordEsVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmSearchRecordEsVO.java new file mode 100644 index 0000000000000000000000000000000000000000..49cc0d4695f89c29fbb65694542ea8a857c971e8 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmSearchRecordEsVO.java @@ -0,0 +1,25 @@ +package org.jeecg.modules.KM.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class KmSearchRecordEsVO implements Serializable { + private String keywords; + private String[] keywordsMax; + private String title; + private String content; + private String[] topicCodes; + private String sourceIp; + private String createBy; + /**createTime*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTime") + private Date createTime; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmSearchResultVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmSearchResultVO.java new file mode 100644 index 0000000000000000000000000000000000000000..42563b8fae96153efe561268173dd6cceaa01624 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/VO/KmSearchResultVO.java @@ -0,0 +1,43 @@ +package org.jeecg.modules.KM.VO; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecg.common.aspect.annotation.Dict; +import java.io.Serializable; +import java.math.BigInteger; +import java.util.Date; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc检索对象", description="km_doc") +public class KmSearchResultVO implements Serializable { + + private Integer favourite; + + private String id; + private String fileId; + private String previewFileId; + private Integer downloadFlag; + private Integer publicRemark; + private Long fileSize; + private String content; + private String title; + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "org_code") + private String orgCode; + private String createBy; + private String fileType; + @Dict(dicCode = "km_dict_category") + private String category; + private Date createTime; + @Dict(dicCode = "km_dict_business") + private String businessTypes; + private String keywords; + @Dict(dicCode="code",dictTable = "sys_category",dicText = "name") + private String topicCodes; + private BigInteger downloads; + private BigInteger views; + private String remark; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/OSinfo.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/OSinfo.java new file mode 100644 index 0000000000000000000000000000000000000000..130852eb41915851ace9b66dcc5f4e7f0be4dfdd --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/OSinfo.java @@ -0,0 +1,116 @@ +package org.jeecg.modules.KM.common; + +import org.jeecg.modules.KM.common.enums.EPlatform; + +/** + * 操作系统类: + * 获取System.getProperty("os.name")对应的操作系统 + * @author isea533 + */ +public class OSinfo { + private static String OS = System.getProperty("os.name").toLowerCase(); + private static OSinfo _instance = new OSinfo(); + private EPlatform platform; + private OSinfo(){} + public static boolean isLinux(){ + return OS.indexOf("linux")>=0; + } + public static boolean isMacOS(){ + return OS.indexOf("mac")>=0&&OS.indexOf("os")>0&&OS.indexOf("x")<0; + } + public static boolean isMacOSX(){ + return OS.indexOf("mac")>=0&&OS.indexOf("os")>0&&OS.indexOf("x")>0; + } + public static boolean isWindows(){ + return OS.indexOf("windows")>=0; + } + public static boolean isOS2(){ + return OS.indexOf("os/2")>=0; + } + public static boolean isSolaris(){ + return OS.indexOf("solaris")>=0; + } + public static boolean isSunOS(){ + return OS.indexOf("sunos")>=0; + } + public static boolean isMPEiX(){ + return OS.indexOf("mpe/ix")>=0; + } + public static boolean isHPUX(){ + return OS.indexOf("hp-ux")>=0; + } + public static boolean isAix(){ + return OS.indexOf("aix")>=0; + } + public static boolean isOS390(){ + return OS.indexOf("os/390")>=0; + } + public static boolean isFreeBSD(){ + return OS.indexOf("freebsd")>=0; + } + public static boolean isIrix(){ + return OS.indexOf("irix")>=0; + } + public static boolean isDigitalUnix(){ + return OS.indexOf("digital")>=0&&OS.indexOf("unix")>0; + } + public static boolean isNetWare(){ + return OS.indexOf("netware")>=0; + } + public static boolean isOSF1(){ + return OS.indexOf("osf1")>=0; + } + public static boolean isOpenVMS(){ + return OS.indexOf("openvms")>=0; + } + /** + * 获取操作系统名字 + * @return 操作系统名 + */ + public static EPlatform getOSname(){ + if(isAix()){ + _instance.platform = EPlatform.AIX; + }else if (isDigitalUnix()) { + _instance.platform = EPlatform.Digital_Unix; + }else if (isFreeBSD()) { + _instance.platform = EPlatform.FreeBSD; + }else if (isHPUX()) { + _instance.platform = EPlatform.HP_UX; + }else if (isIrix()) { + _instance.platform = EPlatform.Irix; + }else if (isLinux()) { + _instance.platform = EPlatform.Linux; + }else if (isMacOS()) { + _instance.platform = EPlatform.Mac_OS; + }else if (isMacOSX()) { + _instance.platform = EPlatform.Mac_OS_X; + }else if (isMPEiX()) { + _instance.platform = EPlatform.MPEiX; + }else if (isNetWare()) { + _instance.platform = EPlatform.NetWare_411; + }else if (isOpenVMS()) { + _instance.platform = EPlatform.OpenVMS; + }else if (isOS2()) { + _instance.platform = EPlatform.OS2; + }else if (isOS390()) { + _instance.platform = EPlatform.OS390; + }else if (isOSF1()) { + _instance.platform = EPlatform.OSF1; + }else if (isSolaris()) { + _instance.platform = EPlatform.Solaris; + }else if (isSunOS()) { + _instance.platform = EPlatform.SunOS; + }else if (isWindows()) { + _instance.platform = EPlatform.Windows; + }else{ + _instance.platform = EPlatform.Others; + } + return _instance.platform; + } + /** + * @param args + */ + public static void main(String[] args) { + System.out.println(OSinfo.getOSname()); + } +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/config/BaseConfig.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/config/BaseConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..67f8bc837a9d70f5243719953090ae66c612fc85 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/config/BaseConfig.java @@ -0,0 +1,116 @@ + +package org.jeecg.modules.KM.common.config; + +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.common.utils.KMDateUtils; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import jakarta.annotation.PostConstruct; +import java.io.File; +import java.util.Date; + +@Configuration +@ConfigurationProperties(prefix = "base") +@EnableConfigurationProperties(BaseConfig.class) +public class BaseConfig { + + @PostConstruct + public void init(){ + File file=new File(uploadDir); + if(!file.exists()){ + file.mkdirs(); + } + } + + + private String uploadDir; + private String sofficePath; +// private String oneSystemUrl; +// private String oneMapUrl; + +// public String getOneSystemUrl() { +// return oneSystemUrl; +// } +// +// public void setOneSystemUrl(String oneSystemUrl) { +// this.oneSystemUrl = oneSystemUrl; +// } +// +// public String getOneMapUrl() { +// return oneMapUrl; +// } +// +// public void setOneMapUrl(String oneMapUrl) { +// this.oneMapUrl = oneMapUrl; +// } + + public String getSofficePath() { + return sofficePath; + } + + public void setSofficePath(String sofficePath) { + this.sofficePath = sofficePath; + } + + public String getUploadDir() { + return uploadDir; + } + + public void setUploadDir(String uploadDir) { + this.uploadDir = uploadDir; + } + + + public File getTodayUploadDir(){ + String today= KMDateUtils.formatDate1(new Date()); + File t=new File(uploadDir,today); + if(!t.exists()){ + t.mkdirs(); + } + return t; + } + + public String getRelativePath(File file){ + String absPath = file.getAbsolutePath(); +// String a =absPath.substring(0,uploadDir.length()); + if(absPath.isEmpty() || absPath.length() { + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + return httpClientBuilder; + }); + + // 创建RestClientTransport实例 + RestClientTransport transport = new RestClientTransport(builder.build(), new JacksonJsonpMapper()); + + // 创建OpenSearchClient实例 + OpenSearchClient client = new OpenSearchClient(transport); + + return client; +} + public OpenSearchClient openSearchClientNoAuth() { + // 设置主机信息 + final String hostname = masterHost; + final int port = masterPort; + final String scheme = HttpHost.DEFAULT_SCHEME_NAME; // 使用HTTP协议 + + // 创建RestClient实例 + RestClientBuilder builder = RestClient.builder(new HttpHost(hostname, port, scheme)); + + // 创建RestClientTransport实例 + RestClientTransport transport = new RestClientTransport(builder.build(), new JacksonJsonpMapper()); + + // 创建OpenSearchClient实例 + OpenSearchClient client = new OpenSearchClient(transport); + + return client; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocConvertFlagEnum.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocConvertFlagEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..4de2e7143af78ac47cc5ad3c4eecfc5a46671365 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocConvertFlagEnum.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.KM.common.enums; + +public enum DocConvertFlagEnum { + + Fail(-1), + WaitConvert(0), + Converted(1), + NonConvert(2); + + DocConvertFlagEnum(Integer code ) { + this.code = code; + } + + private Integer code; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocFTIFlagEnum.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocFTIFlagEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..992887f1d922b74289411d987d00d0a2bd9d9a10 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocFTIFlagEnum.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.KM.common.enums; + +public enum DocFTIFlagEnum { + Fail(-1), + WaitProcess(0), + Processed(1), + NonFTI(2); + + DocFTIFlagEnum(Integer code ) { + this.code = code; + } + + private Integer code; + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocPublicRemark.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocPublicRemark.java new file mode 100644 index 0000000000000000000000000000000000000000..6148253b6e5cb93f8ec4cf8ba0b6c349d50f565a --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocPublicRemark.java @@ -0,0 +1,30 @@ +package org.jeecg.modules.KM.common.enums; + +public enum DocPublicRemark { + OwnOrg(1,"本部门及下属"), + Public(0,"所有部门"); + + DocPublicRemark(Integer code, String name) { + this.code = code; + this.name = name; + } + + private Integer code; + private String name; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocReleaseFlagEnum.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocReleaseFlagEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..88c38bb064ff75dae875b56869dff68fad16f4b8 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocReleaseFlagEnum.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.KM.common.enums; + +public enum DocReleaseFlagEnum { + Off(0), + Released(1); + + DocReleaseFlagEnum(Integer code ) { + this.code = code; + } + + private Integer code; + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocStatusEnum.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocStatusEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..a3e3ca069cde50f8a460b16e94e36bbcdda460a3 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocStatusEnum.java @@ -0,0 +1,33 @@ +package org.jeecg.modules.KM.common.enums; + +public enum DocStatusEnum { + Draft(0,"草稿"), + WaitAudit(1,"待审核"), + Passed(2,"审核通过"), + Reject(3,"审核驳回"), + Delete(9,"删除"); + + DocStatusEnum(Integer code, String name) { + this.code = code; + this.name = name; + } + + private Integer code; + private String name; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocVisitTypeEnum.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocVisitTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..9935c0ff63c17cdd4822ca799cceafcaf783ca6f --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/DocVisitTypeEnum.java @@ -0,0 +1,30 @@ +package org.jeecg.modules.KM.common.enums; + +public enum DocVisitTypeEnum { + + + Upload(0), + AuditPass(1), + AuditReject(2), + ChangePreview(3), + Download(4), + View(5), + Edit(6), + Delete(7), + UpdateFile(8); + + DocVisitTypeEnum(Integer code) { + this.code = code; + } + + private Integer code; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/EPlatform.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/EPlatform.java new file mode 100644 index 0000000000000000000000000000000000000000..9496a6e6be42958345816a379e0e47025aa00e3f --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/enums/EPlatform.java @@ -0,0 +1,34 @@ +package org.jeecg.modules.KM.common.enums; + +/** + * 平台 + * @author isea533 + */ +public enum EPlatform { + Any("any"), + Linux("Linux"), + Mac_OS("Mac OS"), + Mac_OS_X("Mac OS X"), + Windows("Windows"), + OS2("OS/2"), + Solaris("Solaris"), + SunOS("SunOS"), + MPEiX("MPE/iX"), + HP_UX("HP-UX"), + AIX("AIX"), + OS390("OS/390"), + FreeBSD("FreeBSD"), + Irix("Irix"), + Digital_Unix("Digital Unix"), + NetWare_411("NetWare"), + OSF1("OSF1"), + OpenVMS("OpenVMS"), + Others("Others"); + private EPlatform(String desc){ + this.description = desc; + } + public String toString(){ + return description; + } + private String description; +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/init/EsTemplateInit.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/init/EsTemplateInit.java new file mode 100644 index 0000000000000000000000000000000000000000..4e37d7a19e731201040b52fad5cdab60ad6c1675 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/init/EsTemplateInit.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.KM.common.init; + +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.KM.service.IKmEsMgntService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@Order(1) //指定顺序 +public class EsTemplateInit implements CommandLineRunner { + @Autowired + IKmEsMgntService iKmEsMgntService; + + @Override + public void run(String... args) throws Exception { + log.info("start check ES template and init..."); + iKmEsMgntService.initTemplateAndSyncDocs(); + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/rules/KMConstant.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/rules/KMConstant.java new file mode 100644 index 0000000000000000000000000000000000000000..eabc601974120b26222d50e329b3ebf73b376ac5 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/rules/KMConstant.java @@ -0,0 +1,139 @@ +package org.jeecg.modules.KM.common.rules; +import org.jeecg.modules.KM.common.OSinfo; +import org.jeecg.modules.KM.service.IKmSysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class KMConstant { + @Autowired + private IKmSysConfigService kmSysConfigService; + + public static String SearchTermSeprator = " + "; + public static char fileSeparator = '/'; + + //redis prefix + public static String UserDocVisitHistoryPrefix = "UserDocVisitHistoryPrefix_"; + public static String UserDownloadLimitPrefix = "UserDownloadLimitPerDay_"; + public static String UserSearchLimitPrefix = "UserSearchLimitPerTenSeconds_"; + public static String UserViewLimitPrefix = "UserViewLimitPerTenSeconds_"; + + //ES prefix +// public static String DocIndexPrefix = "test_"; + public static String DocIndexPrefix = ""; + public static String DocIndexName = DocIndexPrefix + "km_doc"; + public static String DocIndexAliasName = DocIndexPrefix + "km_doc_alias"; + public static String KMSearchRecordIndexName = DocIndexPrefix + "log_km_search_record"; + public static String KMSearchRecordIndexAliasName = DocIndexPrefix + "log_km_search_record_alias"; + public static String DocVisitIndexName = DocIndexPrefix + "log_km_doc_visit_record"; + public static String DocVisitIndexAliasName = DocIndexPrefix + "log_km_doc_visit_record_alias"; + + //定时任务相关 + public static String JobAutoScanFileBasePath = "JobAutoScanFileBasePath"; + + public static Integer SearchTimeOutSeconds = 10; //秒 + public static Integer SaveTimeOutHours = 1; //1小时 + public static Integer SaveTimeOutMinutes = 1; //1分钟 + public static String InnerUser = "1"; + public static String PublicUser = "0"; + public static Integer DocPublic = 1; + public static Integer DocNotPublic = 0; + public static Integer AllowDownload = 1; + public static Integer ForbideDownload = 0; + + + private Float TitleSearchBoost = Float.valueOf("1"); + private Float ContentSearchBoost = Float.valueOf("1"); + private Float KeywordSearchBoost = Float.valueOf("1"); + private Integer DownloadLimit = 1000; + private Integer SearchLimit = 10; + private Integer ViewLimit = 10; + + public Float getTitleSearchBoost() { + String titleSearchBoostConfig = kmSysConfigService.getSysConfigValue("TitleSearchBoostConfig"); + if( titleSearchBoostConfig!= null && !titleSearchBoostConfig.isEmpty()) + TitleSearchBoost = Float.valueOf(titleSearchBoostConfig); + return TitleSearchBoost; + } + + public Float getContentSearchBoost() { + String contentSearchBoostConfig = kmSysConfigService.getSysConfigValue("ContentSearchBoostConfig"); + if( contentSearchBoostConfig!= null && !contentSearchBoostConfig.isEmpty()) + ContentSearchBoost = Float.valueOf(contentSearchBoostConfig); + return ContentSearchBoost; + } + + public Float getKeywordSearchBoost() { + String keywordSearchBoostConfig = kmSysConfigService.getSysConfigValue("KeywordSearchBoostConfig"); + if( keywordSearchBoostConfig!= null && !keywordSearchBoostConfig.isEmpty()) + KeywordSearchBoost = Float.valueOf(keywordSearchBoostConfig); + return KeywordSearchBoost; + } + + public Integer getDownloadLimit() { + String downloadLimitConfig = kmSysConfigService.getSysConfigValue("downloadLimitConfig"); + if( downloadLimitConfig!= null && !downloadLimitConfig.isEmpty()) + DownloadLimit = Integer.valueOf(downloadLimitConfig); + return DownloadLimit; + } + + + public Integer getSearchLimit() { + String searchLimitConfig = kmSysConfigService.getSysConfigValue("searchLimitConfig"); + if( searchLimitConfig!= null && !searchLimitConfig.isEmpty()) + SearchLimit = Integer.valueOf(searchLimitConfig); + return SearchLimit; + } + + public Integer getViewLimit() { + String viewLimitConfig = kmSysConfigService.getSysConfigValue("viewLimitConfig"); + if( viewLimitConfig!= null && !viewLimitConfig.isEmpty()) + ViewLimit = Integer.valueOf(viewLimitConfig); + return ViewLimit; + } + + static { + if(OSinfo.isWindows()) fileSeparator = '\\'; + if(OSinfo.isLinux()) fileSeparator = '/'; + } + + public boolean isFileTypeSupport(String suffix){ + String fileTypes = kmSysConfigService.getSysConfigValue("supportFileTypes"); + if(fileTypes!=null && !fileTypes.isEmpty() ){ + if(fileTypes.equals("*")) + return true; + for (String s : fileTypes.split(",")) { + if(suffix.toLowerCase().equals(s)) + return true; + } + } + else{ + return true; + } + return false; + } + + public boolean isIndexFileType(String suffix){ + String fileTypes = kmSysConfigService.getSysConfigValue("IndexFileTypes"); + if(fileTypes!=null && !fileTypes.isEmpty() ){ + for (String s : fileTypes.split(",")) { + if(suffix.toLowerCase().equals(s)) + return true; + } + } + return false; + } + + public boolean isConvertFileType(String suffix){ + String fileTypes = kmSysConfigService.getSysConfigValue("ConvertFileTypes"); + if(fileTypes!=null && !fileTypes.isEmpty() ){ + for (String s : fileTypes.split(",")) { + if(suffix.toLowerCase().equals(s)) + return true; + } + } + return false; + } + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/rules/SerialNumberRule.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/rules/SerialNumberRule.java new file mode 100644 index 0000000000000000000000000000000000000000..9d5e005d9b63405ea3955793f2e4450fd15c29fd --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/rules/SerialNumberRule.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.KM.common.rules; + +import org.apache.commons.lang.math.RandomUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class SerialNumberRule { + static public String generate() { + String prefix = "Z"; + + SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss"); + int random = RandomUtils.nextInt(90) + 10; + String value = prefix + format.format(new Date()) + random; + return value; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/system/vo/KmSearchResultObjVO.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/system/vo/KmSearchResultObjVO.java new file mode 100644 index 0000000000000000000000000000000000000000..605b98d553d69cc09d6f6e5ba8a2a243e0fc830c --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/system/vo/KmSearchResultObjVO.java @@ -0,0 +1,20 @@ +package org.jeecg.common.system.vo; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel(value="检索返回对象", description="检索返回对象") +public class KmSearchResultObjVO implements Serializable { + private static final long serialVersionUID = 1L; + + private boolean success; + private List paramPath; + private IPage kmSearchResultVOPage; + private String message; + + public KmSearchResultObjVO(){} +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/DictUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/DictUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..dd7e904edca4f466a157e39a2b2ef54dc1d70944 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/DictUtils.java @@ -0,0 +1,177 @@ +package org.jeecg.modules.KM.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.vo.DictModel; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.system.vo.KmSearchResultObjVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Component +@Slf4j +public class DictUtils { + + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private RedisTemplate redisTemplate; + + + public String getDicText(String dicCode,String dicItemCode){ + String dicText = ""; + List dictModelList = sysBaseAPI.queryDictItemsByCode(dicCode); + if(dictModelList !=null && !dictModelList.isEmpty()){ + for(int i=0;i items = new ArrayList<>(); + for (Object record : ((KmSearchResultObjVO) ( (Result) result).getResult()).getKmSearchResultVOPage().getRecords()) { + ObjectMapper mapper = new ObjectMapper(); + String json="{}"; + try { + //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat + json = mapper.writeValueAsString(record); + } catch (JsonProcessingException e) { + log.error("json解析失败"+e.getMessage(),e); + } + JSONObject item = JSONObject.parseObject(json); + //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ + //for (Field field : record.getClass().getDeclaredFields()) { + for (Field field : oConvertUtils.getAllFields(record)) { + //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ + if (field.getAnnotation(Dict.class) != null) { + String code = field.getAnnotation(Dict.class).dicCode(); + String text = field.getAnnotation(Dict.class).dicText(); + String table = field.getAnnotation(Dict.class).dictTable(); + String key = String.valueOf(item.get(field.getName())); + + //翻译字典值对应的txt + String textValue = translateDictValue(code, text, table, key); + + log.debug(" 字典Val : "+ textValue); + log.debug(" __翻译字典字段__ "+field.getName() + CommonConstant.DICT_TEXT_SUFFIX+": "+ textValue); + item.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue); + } + //date类型默认转换string格式化日期 + if (field.getType().getName().equals("java.util.Date")&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){ + SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName())))); + } + } + items.add(item); + } + //((KmSearchResultObjVO) ((Result) result).getResult()).getKmSearchResultVOPage().setRecords(items); + } + + } + } + + /** + * 翻译字典文本 + * @param code + * @param text + * @param table + * @param key + * @return + */ + private String translateDictValue(String code, String text, String table, String key) { + if(oConvertUtils.isEmpty(key)) { + return null; + } + StringBuffer textValue=new StringBuffer(); + String[] keys = key.split(","); + for (String k : keys) { + String tmpValue = null; + log.debug(" 字典 key : "+ k); + if (k.trim().length() == 0) { + continue; //跳过循环 + } + //update-begin--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题----- + if (!StringUtils.isEmpty(table)){ + log.info("--DictAspect------dicTable="+ table+" ,dicText= "+text+" ,dicCode="+code); + String keyString = String.format("sys:cache:dictTable::SimpleKey [%s,%s,%s,%s]",table,text,code,k.trim()); + if (redisTemplate.hasKey(keyString)){ + try { + tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); + } catch (Exception e) { + log.warn(e.getMessage()); + } + }else { + tmpValue= sysBaseAPI.translateDictFromTable(table,text,code,k.trim()); + } + }else { + String keyString = String.format("sys:cache:dict::%s:%s",code,k.trim()); + if (redisTemplate.hasKey(keyString)){ + try { + tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); + } catch (Exception e) { + log.warn(e.getMessage()); + } + }else { + tmpValue = sysBaseAPI.translateDict(code, k.trim()); + } + } + //update-end--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题----- + + if (tmpValue != null) { + if (!"".equals(textValue.toString())) { + textValue.append(","); + } + textValue.append(tmpValue); + } + + } + return textValue.toString(); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/EsUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/EsUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..cc8e0aba6f198d548e238bdc655abd83566e9466 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/EsUtils.java @@ -0,0 +1,235 @@ +package org.jeecg.modules.KM.common.utils; + +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.opensearch.client.opensearch.indices.AnalyzeRequest; +import org.opensearch.client.opensearch.indices.AnalyzeResponse; +import org.opensearch.client.opensearch.indices.analyze.AnalyzeToken; +import org.opensearch.client.opensearch._types.query_dsl.BoolQuery; +import org.opensearch.client.opensearch._types.query_dsl.Query; +import org.opensearch.client.opensearch._types.query_dsl.QueryBuilders; +import org.opensearch.client.opensearch._types.query_dsl.TermsQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchPhraseQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchQuery; +import org.opensearch.client.opensearch._types.query_dsl.RangeQuery; +import org.opensearch.client.opensearch._types.query_dsl.PrefixQuery; +import org.opensearch.client.opensearch._types.query_dsl.TermQuery; +import org.opensearch.client.opensearch._types.FieldValue; +import org.opensearch.client.json.JsonData; + +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.KM.VO.KmDocEsFilterParamVO; +import org.jeecg.modules.KM.VO.KmDocEsParamVO; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.entity.KmSearchRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Date; +import java.util.Arrays; +import java.util.stream.Collectors; + +@Component +public class EsUtils { + @Autowired + private OpenSearchClient openSearchClient; + @Autowired + private KMConstant kmConstant; + +/** + * 获取使用 ik_smart 分析器分析后的搜索词列表。 + * + * @param searchContent 需要分析的搜索内容 + * @return 分析后的搜索词列表 + */ + public List getIkAnalyzeSearchTerms(String searchContent) { + // 创建 AnalyzeRequest 实例 + AnalyzeRequest request = new AnalyzeRequest.Builder() + .index(KMConstant.DocIndexAliasName) + .analyzer("ik_smart") + .text(searchContent) + .build(); + + List result = new ArrayList<>(); + try { + if (!searchContent.isEmpty()) { + // 使用 OpenSearchClient 发送请求并获取响应 + AnalyzeResponse response = openSearchClient.indices().analyze(request); + + // 处理响应中的 tokens + for (AnalyzeToken token : response.tokens()) { + result.add(token.token()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + public BoolQuery.Builder buildESQueryParams(List filterParams){ + //最终条件 + BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool(); + for (KmDocEsFilterParamVO filterParam : filterParams) { + BoolQuery.Builder oneFilter = buildESQueryParam(filterParam); + // 将子查询的条件分别添加到主查询中 + boolQueryBuilder.must(Query.of(q -> q.bool(oneFilter.build()))); + } + return boolQueryBuilder; + } +public BoolQuery.Builder buildESQueryParam(KmDocEsFilterParamVO kmDocEsFilterParamVO) { + + // 创建 BoolQuery.Builder 实例 + BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder(); + BoolQuery.Builder boolQueryBuilderDefault = new BoolQuery.Builder(); + + // 1. 分类检索,用 filter + if (kmDocEsFilterParamVO.getCategory() != null && !kmDocEsFilterParamVO.getCategory().isEmpty()) { + List categorys = kmDocEsFilterParamVO.getCategory(); + // 将 List 转换为 List + List fieldValues = categorys.stream() + .map(FieldValue::of) + .collect(Collectors.toList()); + Query termsQuery = new TermsQuery.Builder() + .field("category") + .terms(t -> t.value(fieldValues)) + .build()._toQuery(); + boolQueryBuilder.filter(termsQuery); + } + + // 准备好标题、全文检索的条件 + Query titleMatchQuery = null; + Query contentMatchQuery = null; + if (oConvertUtils.isNotEmpty(kmDocEsFilterParamVO.getTitle())) { + if (kmDocEsFilterParamVO.getPhraseMatchSearchFlag() != null && kmDocEsFilterParamVO.getPhraseMatchSearchFlag()) { + titleMatchQuery = new MatchPhraseQuery.Builder() + .field("title") + .query(kmDocEsFilterParamVO.getTitle()) + .slop(2) + .build()._toQuery(); + } else { + FieldValue titleFieldValue = FieldValue.of(kmDocEsFilterParamVO.getTitle()); + titleMatchQuery = new MatchQuery.Builder() + .field("title") + .query(titleFieldValue) + .analyzer("ik_smart") + .boost(kmConstant.getTitleSearchBoost()) + .build()._toQuery(); + } + } + if (oConvertUtils.isNotEmpty(kmDocEsFilterParamVO.getContent())) { + if (kmDocEsFilterParamVO.getPhraseMatchSearchFlag() != null && kmDocEsFilterParamVO.getPhraseMatchSearchFlag()) { + contentMatchQuery = new MatchPhraseQuery.Builder() + .field("content") + .query(kmDocEsFilterParamVO.getContent()) + .slop(2) + .build()._toQuery(); + } else { + FieldValue cFieldValue = FieldValue.of(kmDocEsFilterParamVO.getContent()); + contentMatchQuery = new MatchQuery.Builder() + .field("content") + .query(cFieldValue) + .analyzer("ik_smart") + .boost(kmConstant.getContentSearchBoost()) + .build()._toQuery(); + } + } + + // 2. 标题检索 高级用 must,快速用 should + if (kmDocEsFilterParamVO.getTitle() != null && !kmDocEsFilterParamVO.getTitle().isEmpty()) { + if (kmDocEsFilterParamVO.getAdvSearchFlag()) { + boolQueryBuilder.must(titleMatchQuery); + } else { + boolQueryBuilderDefault.should(titleMatchQuery); + } + } + + // 3. 全文检索 高级用 must,快速用 should + if (kmDocEsFilterParamVO.getContent() != null && !kmDocEsFilterParamVO.getContent().isEmpty()) { + if (kmDocEsFilterParamVO.getAdvSearchFlag() != null && kmDocEsFilterParamVO.getAdvSearchFlag()) { + boolQueryBuilder.must(contentMatchQuery); + } else { + boolQueryBuilderDefault.should(contentMatchQuery); + } + } + + // 4. 关键字检索 用 term 精确匹配; 高级用 must,快速用 should + if (kmDocEsFilterParamVO.getKeywords() != null && !kmDocEsFilterParamVO.getKeywords().isEmpty()) { + BoolQuery.Builder boolQueryBuilderKeywords = new BoolQuery.Builder(); + kmDocEsFilterParamVO.getKeywords().forEach(keyword -> { + FieldValue kFieldValue = FieldValue.of(keyword); + boolQueryBuilderKeywords.should(new TermQuery.Builder() + .field("keywords") + .value(kFieldValue) + .boost(kmConstant.getKeywordSearchBoost()) + .build()._toQuery()); + }); + if (kmDocEsFilterParamVO.getAdvSearchFlag() != null && kmDocEsFilterParamVO.getAdvSearchFlag()) { + boolQueryBuilder.must(boolQueryBuilderKeywords.build()._toQuery()); + } else { + boolQueryBuilderDefault.should(boolQueryBuilderKeywords.build()._toQuery()); + } + } + + // 处理快速检索的合并条件:标题、关键字、全文 + if (kmDocEsFilterParamVO.getAdvSearchFlag() == null || !kmDocEsFilterParamVO.getAdvSearchFlag()) { + boolQueryBuilder.must(boolQueryBuilderDefault.build()._toQuery()); + } + + // 5. 发布时间检索 用 filter + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + if (kmDocEsFilterParamVO.getCreateTimeEnd() != null) { + Query rangeQueryEnd = new RangeQuery.Builder() + .field("createTime") + .lte(JsonData.of(format.format(kmDocEsFilterParamVO.getCreateTimeEnd()))) + .build()._toQuery(); + boolQueryBuilder.filter(rangeQueryEnd); + } + if (kmDocEsFilterParamVO.getCreateTimeStart() != null) { + Query rangeQueryStart = new RangeQuery.Builder() + .field("createTime") + .gte(JsonData.of(format.format(kmDocEsFilterParamVO.getCreateTimeStart()))) + .build()._toQuery(); + boolQueryBuilder.filter(rangeQueryStart); + } + + // 7. 标签检索(多选) 用 filter + if (kmDocEsFilterParamVO.getBusinessTypes() != null && !kmDocEsFilterParamVO.getBusinessTypes().isEmpty()) { + List businessTypes = kmDocEsFilterParamVO.getBusinessTypes(); + // 将 List 转换为 List + List fieldValues = businessTypes.stream() + .map(FieldValue::of) + .collect(Collectors.toList()); + Query termsQuery = new TermsQuery.Builder() + .field("businessTypes") + .terms(t -> t.value(fieldValues)) + .build()._toQuery(); + boolQueryBuilder.filter(termsQuery); + } + + // 9. 专题检索(多选,前缀模糊匹配) 用 filter + if (kmDocEsFilterParamVO.getTopicCodes() != null && !kmDocEsFilterParamVO.getTopicCodes().isEmpty()) { + BoolQuery.Builder boolQueryBuilderTopicCodes = new BoolQuery.Builder(); + for (String topicCode : kmDocEsFilterParamVO.getTopicCodes()) { + boolQueryBuilderTopicCodes.should(new PrefixQuery.Builder() + .field("topicCodes") + .value(topicCode) + .build()._toQuery()); + } + Query boolQueryTopicCodes = boolQueryBuilderTopicCodes.build()._toQuery(); + boolQueryBuilder.filter(boolQueryTopicCodes); + } + + // 返回 BoolQuery.Builder 而不是构建好的 BoolQuery + return boolQueryBuilder; +} +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/HashUtil.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/HashUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..3074f0cc131c1e8b173ce2b6e338008023d8abce --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/HashUtil.java @@ -0,0 +1,64 @@ +package org.jeecg.modules.KM.common.utils; + +import org.apache.commons.io.IOUtils; + +import java.io.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class HashUtil { + public static String sha256(File file){ + InputStream fis = null; + try { + fis = new FileInputStream(file); + return sha256(fis); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static String sha256(String s) { + InputStream fis = new ByteArrayInputStream(s.getBytes()); + try { + return sha256(fis); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static String sha256(InputStream inputStream) throws IOException + + { + byte buffer[] = new byte[1024 * 10]; + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("SHA-256"); + for (int numRead = 0; (numRead = inputStream.read(buffer)) > 0; ) { + md5.update(buffer, 0, numRead); + } + byte[] digest = md5.digest(); + return toHexString(digest); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(inputStream); + } + return null; + } + + private static String toHexString(byte[] digest) { + StringBuffer strHexString = new StringBuffer(); + for (int i = 0; i < digest.length; i++) { + String hex = Integer.toHexString(0xff & digest[i]); + if (hex.length() == 1) { + strHexString.append('0'); + } + strHexString.append(hex); + } + return strHexString.toString(); + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/IpUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/IpUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..5f3f35c8eee17a8cafdfa8e205fd515eb8ad2c12 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/IpUtils.java @@ -0,0 +1,48 @@ +package org.jeecg.modules.KM.common.utils; + +import lombok.extern.slf4j.Slf4j; +//import me.zhyd.oauth.log.Log; + +import jakarta.servlet.http.HttpServletRequest; + + +@Slf4j +public class IpUtils { + + public static String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + log.debug("x-forwarded-for ip: " + ip); + if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { + // 多次反向代理后会有多个ip值,第一个ip才是真实ip + if( ip.indexOf(",")!=-1 ){ + ip = ip.split(",")[0]; + } + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + log.debug("Proxy-Client-IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + log.debug("WL-Proxy-Client-IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + log.debug("HTTP_CLIENT_IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + log.debug("HTTP_X_FORWARDED_FOR ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + log.debug("X-Real-IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + log.debug("getRemoteAddr ip: " + ip); + } + log.debug("获取客户端ip: " + ip); + return ip; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/KMDateUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/KMDateUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..058ba65f5b224b91c9b648d2385e2a5540519ea3 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/KMDateUtils.java @@ -0,0 +1,79 @@ +package org.jeecg.modules.KM.common.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +public class KMDateUtils { + + public static String formatDateyyyyMM(Date date){ + SimpleDateFormat sd = new SimpleDateFormat("yyyyMM"); + return sd.format(date); + } + + public static String formatDateyyyyMMdd(Date date){ + SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd"); + return sd.format(date); + } + + public static String formatDate1(Date date){ + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); + return sd.format(date); + } + + public static String formatDate2(Date date){ + SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + return sd.format(date); + } + + + + public static String formatDate3(Date date){ + SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmms"); + return sd.format(date); + } + + public static String formatDate4(Date date){ + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sd.format(date); + } + + public static Date parseTZDateString(String dateString){ + SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + return df.parse(dateString); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + + public static String getTimeStamp(){ + Long timeStamp = System.currentTimeMillis(); + String timeStampString = Long.toString(timeStamp); + return timeStampString.substring(0,timeStampString.length()-3); + } + + public static Date parse(String src){ + SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmms"); + try { + return sd.parse(src); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + public static Date parse2(String src){ + SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + try { + return sd.parse(src); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/KMRedisUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/KMRedisUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..a2936c02b0b26a8255f8efa432b74487b37e72db --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/KMRedisUtils.java @@ -0,0 +1,114 @@ +package org.jeecg.modules.KM.common.utils; + +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.DateUtils; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.util.Calendar; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +@Component +public class KMRedisUtils { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + @Autowired + private RedisTemplate redisTemplate; + + //检查时间内下载次数是否超限制 + public boolean validUserLimit(String limitType, Integer limitAmount,Integer calendarUnit,Integer amount) throws ParseException { + resetUserLimit(limitType,calendarUnit,amount); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return false; + + String userId = sysUser.getUsername(); + String userKey = limitType + userId; + return !redisTemplate.hasKey(userKey) + || redisTemplate.opsForList().size(userKey) < limitAmount; + } + + //重设下载次数缓存,从左到右的时间升序列表 + private void resetUserLimit(String limitType, Integer timeUnit, Integer amount) throws ParseException { + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return; + + String userId = sysUser.getUsername(); + String userKey = limitType + userId; + if(redisTemplate.hasKey(userKey) + && redisTemplate.opsForList().size(userKey) >0){ + //清除掉xx时间以前的记录 + Calendar startDate = DateUtils.getCalendar(); + startDate.add(timeUnit,-1 * amount); + + Calendar downloadDate = DateUtils.parseCalendar( + redisTemplate + .opsForList() + .range(userKey,0,1) + .get(0) + .toString() ,"yyyyMMddHHmmss"); + while(DateUtils.dateDiff('s',downloadDate,startDate) < 0 + && redisTemplate.opsForList().size(userKey) > 0){ + redisTemplate.opsForList().leftPop(userKey); + downloadDate = DateUtils.parseCalendar( + redisTemplate + .opsForList() + .range(userKey,0,1) + .get(0) + .toString() ,"yyyyMMddHHmmss"); + } + } + } + + //在右边push当前时间,并设置失效时间 + public void refreshUserLimit(String limitType, TimeUnit unit, Integer amount){ + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return; + + String userId = sysUser.getUsername(); + String userKey =limitType + userId; + redisTemplate.opsForList() + .rightPush(userKey, DateUtils.formatDate("yyyyMMddHHmmss")); + //设置一天后过期 + redisTemplate.opsForList() + .getOperations() + .expire(userKey,amount, unit); + } + + //设置用户访问历史文档,保留最近十个 + public void logPersonalDocHistory(String userId,String docId){ + String userKey = KMConstant.UserDocVisitHistoryPrefix + userId; + if(stringRedisTemplate.hasKey(userKey)){ +// 计数参数以下列方式影响操作: +// count> 0:删除等于从头到尾移动的值的元素。 +// count <0:删除等于从尾到头移动的值的元素。 +// count = 0:删除等于value的所有元素。 + stringRedisTemplate.opsForList().remove(userKey,0,docId); + if(stringRedisTemplate.opsForList().size(userKey) >= 10){ + stringRedisTemplate.opsForList().rightPop(userKey); + } + } + stringRedisTemplate.opsForList().leftPush(userKey,docId); + } + + //获取用户最近访问的档案 + public List getPersonalDocHistory(String userId){ + String userKey = KMConstant.UserDocVisitHistoryPrefix + userId; + List result = stringRedisTemplate + .opsForList() + .range(userKey,0,-1); + return result; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/OfficeUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/OfficeUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..2de706e86435ea2d1ebf6882707fc0123be2e12c --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/OfficeUtils.java @@ -0,0 +1,213 @@ +package org.jeecg.modules.KM.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.poi.hssf.usermodel.HSSFPrintSetup; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.ss.usermodel.PrintSetup; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFPrintSetup; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * + * Title: OfficeUtils.java + * + * @author lwx + * @time 2018/6/29 下午5:20 + */ +@Slf4j +public class OfficeUtils { + + private static void formatExcel(String srcFile){ + String fileExt = StringUtils.getFileSuffix(srcFile); + if ( fileExt != null ) { + try { + if(fileExt.equals("xlsx")){ + XSSFWorkbook wb = new XSSFWorkbook(Files.newInputStream(Paths.get(srcFile))); + + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + XSSFSheet sheet = wb.getSheetAt(i); + //打印设置 + XSSFPrintSetup print = sheet.getPrintSetup(); + print.setLandscape(true); // 打印方向,true:横向,false:纵向(默认) + print.setFitHeight((short)0);//设置高度为自动分页 + print.setFitWidth((short)1);//设置宽度为一页 + print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //纸张类型 +// print.setScale((short)55);//自定义缩放①,此处100为无缩放 + //启用“适合页面”打印选项的标志 + sheet.setFitToPage(true); + } + File file = new File(srcFile); + OutputStream fos = new FileOutputStream(file); + wb.write(fos); + }else if(fileExt.equals("xls")){ + POIFSFileSystem fs = new POIFSFileSystem(Files.newInputStream(Paths.get(srcFile))); + HSSFWorkbook wb = new HSSFWorkbook(fs); + + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + Sheet sheet = wb.getSheetAt(i); + //打印设置 + PrintSetup print = sheet.getPrintSetup(); + print.setLandscape(true); // 打印方向,true:横向,false:纵向(默认) + print.setFitHeight((short)0);//设置高度为自动分页 + print.setFitWidth((short)1);//设置宽度为一页 + print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //纸张类型 + //启用“适合页面”打印选项的标志 + sheet.setFitToPage(true); + } + File file = new File(srcFile); + OutputStream fos = new FileOutputStream(file); + wb.write(fos); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + public static boolean convertPdf(String sofficePath,File srcFile, File targetDir){ + //设置excel文件格式为不换行折断 + formatExcel(srcFile.getAbsolutePath()); + Listcommands=new ArrayList<>(); + String outputDir = targetDir.getAbsolutePath(); + commands.add(sofficePath); + commands.add("--headless"); + commands.add("--invisible"); + commands.add("--convert-to"); + commands.add("pdf"); + commands.add("--outdir"); + commands.add(outputDir); + commands.add(srcFile.getAbsolutePath()); + log.info("开始转换pdf,命令行是:{}", Arrays.toString(commands.toArray())); + try { + + ProcessBuilder pb = new ProcessBuilder(commands); + pb.redirectErrorStream(true); + Process process = pb.start(); + String result = IOUtils.toString(process.getInputStream(),"utf-8"); + boolean exitFlag = process.waitFor(10, TimeUnit.SECONDS); + if(exitFlag) { + int code = process.exitValue(); + + log.info("convertPdf from {} output: {}\n result:{}\n exitValue:{}\n", srcFile.getAbsolutePath(), outputDir, result, code); + + process.destroy(); + + File targetFile = new File(targetDir, StringUtils.getFileNameWithoutSuffix(srcFile.getName()) + ".pdf"); + if (targetFile.exists()) { + log.info("文档转化成功,{},目标文件是:{}", srcFile.getAbsolutePath(), targetFile.getAbsolutePath()); + return true; + } else { + log.info("文档转化失败,{},目标文件是:{}", srcFile.getAbsolutePath(), targetFile.getAbsolutePath()); + return false; + } + } + else { + log.info("等待命令退出失败"); + return false; + } + } catch (IOException e) { + log.error("convertPdf IOException:",e); + }catch (InterruptedException e) { + log.error("convertPdf InterruptedException:",e); + } + return false; + } + + public static void printStream(InputStream inputStream){ + new Thread(){ + @Override + public void run() { + log.info("开始读取流,thread:{}",currentThread().getId()); + try { + String s = IOUtils.toString(inputStream,"utf-8"); + log.info("流内容:{}",s); + } catch (IOException e) { + log.error("读取流异常",e); + } + log.info("结束读取流,thread:{}",currentThread().getId()); + } + }.start(); + } +// +// public static boolean convertPdf(String sofficePath,File srcFile, File targetDir) { +// OutputStream outputStream = null; +// File targetFile = new File(targetDir, +// StringUtils.getFileNameWithoutSuffix(srcFile.getName())+".pdf"); +// if (!targetFile.exists()) { +// 19 try { +// 20 // 如果文件找不到,就new一个 +// 21 targetFile.createNewFile(); +// 22 } catch (IOException e) { +// 23 e.printStackTrace(); +// 24 } +// 25 } +// +// String content = fileToTxt(srcFile); +// +// try { +// outputStream = new FileOutputStream(targetFile); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// log.error("文件不存在:" + srcFile.getAbsolutePath()+srcFile.getName()); +// return false; +// } +// try { +// outputStream.write(content.getBytes()); +// outputStream.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// log.error("文件操作异常:" + srcFile.getAbsolutePath()+srcFile.getName()); +// return false; +// } +// return true; +// } +// +// private static String fileToTxt(File f) { +// //1、创建一个parser +// Parser parser = new AutoDetectParser(); +// InputStream is = null; +// try { +// Metadata metadata = new Metadata(); +// metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName()); +// is = new FileInputStream(f); +// ContentHandler handler = new BodyContentHandler(); +// ParseContext context = new ParseContext(); +// context.set(Parser.class,parser); +// //2、执行parser的parse()方法。 +// parser.parse(is,handler, metadata,context); +// for(String name:metadata.names()) { +// System.out.println(name+":"+metadata.get(name)); +// } +// return handler.toString(); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } catch (SAXException e) { +// e.printStackTrace(); +// } catch (TikaException e) { +// e.printStackTrace(); +// } finally { +// try { +// if(is!=null) is.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return ""; +// } + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/RandomUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/RandomUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..7398e49331f305dde14cfbc86e8d2ff5467e2aa4 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/RandomUtils.java @@ -0,0 +1,53 @@ +//package org.jeecg.modules.KM.common.utils; +// +//import cn.hutool.core.util.RandomUtil; +//import io.swagger.models.auth.In; +// +//import java.util.ArrayList; +//import java.util.List; +// +//public class RandomUtils { +// +// private final static String[] keywords = {"中国","技术","系统","基础","运维","功夫","科亿信息技术","程序员","进口红酒","红酒","进口","中国人民","中国人民银行","全国","银行","人民银行","中国人","国人","员工","程序"}; +// private final static String[] topicCodes = {"A01","A01B01","A01B02","A01B01C01","A01B01C02","A01B01C03","A01C01","A01C02","A01C03","A01C03D01","A01C03D02","B01","B01C03D01","B01C01D01","B01C03D02","B01A03D01","B01A03A01","B01C03D04","A03","B09"}; +// +// public static String[] generateRamdonTopicCodes(){ +// String topicCodeString[] = new String[5]; +// for(int i=0;i<5;i++){ +// topicCodeString[i]=topicCodes[RandomUtil.randomInt(0,20)]; +// } +// +// return topicCodeString; +// } +// +// public static String generateRamdonKeywords(){ +// String keyWordString = "关键字"; +// int count = RandomUtil.randomInt(5,10); +// for(int i=0;i intList = new ArrayList(); +// for(int i=0;i<10;i++){ +// Integer t = RandomUtil.randomInt(1,10); +// intList.add(t); +// } +// +// String a= intList.toString(); +// return a.substring(1,a.length()-1); +// } +// +//} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/SetUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/SetUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e34d6db3183b334b3f478f73abc7a8b85dcf8d19 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/SetUtils.java @@ -0,0 +1,43 @@ +package org.jeecg.modules.KM.common.utils; + +import java.util.HashSet; +import java.util.Set; +public class SetUtils { + + public static Set union(Set setA, Set setB) { + Set tmp = new HashSet(setA); + tmp.addAll(setB); + return tmp; + } + + public static Set intersection(Set setA, Set setB) { + Set tmp = new HashSet(); + for (T x : setA) + if (setB.contains(x)) + tmp.add(x); + return tmp; + } + + public static Set difference(Set setA, Set setB) { + Set tmp = new HashSet(setA); + tmp.removeAll(setB); + return tmp; + } + + public static Set symDifference(Set setA, Set setB) { + Set tmpA; + Set tmpB; + + tmpA = union(setA, setB); + tmpB = intersection(setA, setB); + return difference(tmpA, tmpB); + } + + public static boolean isSubset(Set setA, Set setB) { + return setB.containsAll(setA); + } + + public static boolean isSuperset(Set setA, Set setB) { + return setA.containsAll(setB); + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/StringUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/StringUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..b926caa02999b8bb015de42bc44fa17015d9ef70 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/StringUtils.java @@ -0,0 +1,88 @@ +package org.jeecg.modules.KM.common.utils; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class StringUtils { + public static String byteToStringUTF8(byte[]bytes){ + try { + return new String (bytes,"utf-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + public static byte[] stringToByteUTF8(String s){ + try { + return s.getBytes("utf-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + public static String getFileSuffix(String fileName){ + int pos=fileName.lastIndexOf("."); + if(pos>=0){ + if(pos+1!=fileName.length()){ + return fileName.substring(pos+1,fileName.length()).toLowerCase(); + } + } + return ""; + } + + public static String getFileNameWithoutSuffix(String fileName){ + int pos=fileName.lastIndexOf("."); + if(pos>=0){ + if(pos+1!=fileName.length()){ + return fileName.substring(0,pos); + } + } + return ""; + } + + + public static List splitStrListToList(List sourceList){ + List resultList = new ArrayList<>(); + for (int i = 0; i < sourceList.size(); i++) { + resultList.addAll(splitStringToList(sourceList.get(i))); + } + + return resultList; + } + + //更换其他字符或空格为",",最后得到string数组 + public static List splitStringToList(String source){ + List resultList = new ArrayList<>(); + List tmptList = new ArrayList<>(); + //String regExpress = "-~!@#%&_`=}:\"<>]\\\\;\'/\\$\\(\\)\\*\\+\\.\\[\\?\\\\\\^\\{\\|"; + String regExpress = "[<~!@#%&_`=}:\">\\;'/\\$\\(\\)\\*\\+\\.\\[\\?\\\\\\^\\{\\|\\-\\]]"; + if(source !=null && source.length()>0){ + source = source.replaceAll(regExpress,",") + .replace(" ",","); + tmptList = Arrays.asList(source.split(",")); + tmptList.forEach((e)->{ + if(!e.isEmpty()){ + resultList.add(e); + } + }); + } + return resultList; + } + + //合并字符list成为字符串,用分隔符"," + public static String concatListToString(List stringList){ + String result = ""; + if(stringList != null & stringList.size()>0) { + for (int i = 0; i < stringList.size(); i++) { + if(stringList.get(i) != null && stringList.get(i).length()>0) + result = result + stringList.get(i) + ","; + } + if(result.length()>0) + result = result.substring(0,result.length()-1); + } + return result; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/TikaUtils.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/TikaUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..0596cbcba3df2e78767f1c8c253e13abe7532b68 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/common/utils/TikaUtils.java @@ -0,0 +1,64 @@ +package org.jeecg.modules.KM.common.utils; + +import jodd.util.StringUtil; +import org.apache.commons.io.FileUtils; +import org.apache.tika.detect.EncodingDetector; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.parser.AutoDetectParser; +import org.apache.tika.parser.txt.UniversalEncodingDetector; +import org.apache.tika.sax.BodyContentHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; + +public class TikaUtils { + private static Logger logger= LoggerFactory.getLogger(TikaUtils.class); + public static String parseContent(File f){ + String content =null; + try{ + InputStream stream = FileUtils.openInputStream(f); + content =parseContent(stream); + if(StringUtil.isEmpty(content)){ + content=parseTxt(f); + } + if (content != null) { + return content; + } + }catch (Exception e){ + logger.error("tika parse error",e); + } + return content; + } + + private static String parseTxt(File file) throws IOException { + InputStream stream1 = FileUtils.openInputStream(file); + EncodingDetector detector=new UniversalEncodingDetector(); + Charset charset = detector.detect(new BufferedInputStream(stream1), new Metadata()); + stream1.close(); + if(charset!=null){ + return FileUtils.readFileToString(file,charset); + }else { + return null; + } + } + + public static String parseContent(InputStream stream){ + String content =null; + try{ + AutoDetectParser parser = new AutoDetectParser(); + BodyContentHandler handler = new BodyContentHandler(Integer.MAX_VALUE); + Metadata metadata = new Metadata(); + parser.parse(stream, handler, metadata); + content = handler.toString(); + }catch (Exception e){ + logger.error("tika parse error",e); + } + return content; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/EsMgntController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/EsMgntController.java new file mode 100644 index 0000000000000000000000000000000000000000..136bd2ebd2187a366bcda0aa0ce69daa34ad2c71 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/EsMgntController.java @@ -0,0 +1,46 @@ +package org.jeecg.modules.KM.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.KM.service.IKmEsMgntService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@Api(tags="ES-management") +@RestController +@RequestMapping("/KM/EsMgnt") +@Slf4j +public class EsMgntController { + @Autowired + private IKmEsMgntService kmEsMgntService; + + @ApiOperation(value="ES-management-km_doc模板初始化", notes="ES-management-km_doc模板初始化") + @PutMapping(value = "/initKmDocTemplate") + public Result initKmDocTemplate() throws IOException { + return kmEsMgntService.initKmDocTemplate(); + + } + + + @ApiOperation(value="ES-management-km_doc_visit_record模板初始化", notes="ES-management-km_doc_visit_record模板初始化") + @PutMapping(value = "/initKmDocVisitTemplate") + public Result initKmDocVisitTemplate() throws IOException { + return kmEsMgntService.initKmDocVisitTemplate(); + + } + + + @ApiOperation(value="ES-management-km_search_record模板初始化", notes="ES-management-km_search_record模板初始化") + @PutMapping(value = "/initKmSearchRecordTemplate") + public Result initKmSearchRecordTemplate() throws IOException { + return kmEsMgntService.initKmSearchRecordTemplate(); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/IndexController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/IndexController.java new file mode 100644 index 0000000000000000000000000000000000000000..1f25056654ccf7fb4dc0ccae1462783e005a32a5 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/IndexController.java @@ -0,0 +1,48 @@ +package org.jeecg.modules.KM.controller; + +import org.jeecg.modules.KM.service.DocumentService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import org.springframework.ai.document.Document; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequestMapping("/api/vi/rag") +@Tag(name = "RAG demo") +public class IndexController { + + @Autowired + private DocumentService documentService; + + + @Operation(summary = "上传文档") + @PostMapping("/upload") + public ResponseEntity upload(@RequestBody MultipartFile file) { + documentService.uploadDocument(file); + return ResponseEntity.ok("success"); + } + + @Operation(summary = "搜索文档") + @GetMapping("/search") + public ResponseEntity> searchDoc(@RequestParam String keyword) { + return ResponseEntity.ok(documentService.search(keyword)); + } + + + @Operation(summary = "问答文档") + @GetMapping("/chat") + public ResponseEntity chat(@RequestParam String message) { + return ResponseEntity.ok(documentService.chat(message)); + } + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocBusinessTypeController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocBusinessTypeController.java new file mode 100644 index 0000000000000000000000000000000000000000..77fe8713c0ce69d988633ccd5eb3d72560b627b9 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocBusinessTypeController.java @@ -0,0 +1,148 @@ +package org.jeecg.modules.KM.controller; + +import java.util.Arrays; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.KM.entity.KmDocBusinessType; +import org.jeecg.modules.KM.service.IKmDocBusinessTypeService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_doc_business_type") +@RestController +@RequestMapping("/KM/kmDocBusinessType") +@Slf4j +public class KmDocBusinessTypeController extends JeecgController { + @Autowired + private IKmDocBusinessTypeService kmDocBusinessTypeService; + + /** + * 分页列表查询 + * + * @param kmDocBusinessType + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_doc_business_type-分页列表查询") + @ApiOperation(value="km_doc_business_type-分页列表查询", notes="km_doc_business_type-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmDocBusinessType kmDocBusinessType, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocBusinessType, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocBusinessTypeService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param kmDocBusinessType + * @return + */ + @AutoLog(value = "km_doc_business_type-添加") + @ApiOperation(value="km_doc_business_type-添加", notes="km_doc_business_type-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody KmDocBusinessType kmDocBusinessType) { + kmDocBusinessTypeService.save(kmDocBusinessType); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param kmDocBusinessType + * @return + */ + @AutoLog(value = "km_doc_business_type-编辑") + @ApiOperation(value="km_doc_business_type-编辑", notes="km_doc_business_type-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody KmDocBusinessType kmDocBusinessType) { + kmDocBusinessTypeService.updateById(kmDocBusinessType); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_business_type-通过id删除") + @ApiOperation(value="km_doc_business_type-通过id删除", notes="km_doc_business_type-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + kmDocBusinessTypeService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc_business_type-批量删除") + @ApiOperation(value="km_doc_business_type-批量删除", notes="km_doc_business_type-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmDocBusinessTypeService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_business_type-通过id查询") + @ApiOperation(value="km_doc_business_type-通过id查询", notes="km_doc_business_type-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmDocBusinessType kmDocBusinessType = kmDocBusinessTypeService.getById(id); + if(kmDocBusinessType==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmDocBusinessType); + } + + /** + * 导出excel + * + * @param request + * @param kmDocBusinessType + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmDocBusinessType kmDocBusinessType) { + return super.exportXls(request, kmDocBusinessType, KmDocBusinessType.class, "km_doc_business_type"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmDocBusinessType.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocCommentsController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocCommentsController.java new file mode 100644 index 0000000000000000000000000000000000000000..5a6fae6044932bfc487026116ac434ccfb6153b6 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocCommentsController.java @@ -0,0 +1,150 @@ +package org.jeecg.modules.KM.controller; + +import java.util.Arrays; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.KM.VO.KmDocCommentsVO; +import org.jeecg.modules.KM.entity.KmDocComments; +import org.jeecg.modules.KM.service.IKmDocCommentsService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_doc_comments") +@RestController +@RequestMapping("/KM/KmDocComments") +@Slf4j +public class KmDocCommentsController extends JeecgController { + @Autowired + private IKmDocCommentsService KmDocCommentsService; + + /** + * 分页列表查询 + * + * @param KmDocComments + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_doc_comments-分页列表查询") + @ApiOperation(value="km_doc_comments-分页列表查询", notes="km_doc_comments-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmDocComments KmDocComments, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { +// QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(KmDocComments, req.getParameterMap()); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = KmDocCommentsService.queryPageList(page, KmDocComments); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param KmDocComments + * @return + */ + @AutoLog(value = "km_doc_comments-添加") + @ApiOperation(value="km_doc_comments-添加", notes="km_doc_comments-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody KmDocComments KmDocComments) { + KmDocCommentsService.save(KmDocComments); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param KmDocComments + * @return + */ + @AutoLog(value = "km_doc_comments-编辑") + @ApiOperation(value="km_doc_comments-编辑", notes="km_doc_comments-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody KmDocComments KmDocComments) { + KmDocCommentsService.updateById(KmDocComments); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_comments-通过id删除") + @ApiOperation(value="km_doc_comments-通过id删除", notes="km_doc_comments-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + KmDocCommentsService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc_comments-批量删除") + @ApiOperation(value="km_doc_comments-批量删除", notes="km_doc_comments-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.KmDocCommentsService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_comments-通过id查询") + @ApiOperation(value="km_doc_comments-通过id查询", notes="km_doc_comments-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmDocComments KmDocComments = KmDocCommentsService.getById(id); + if(KmDocComments==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(KmDocComments); + } + + /** + * 导出excel + * + * @param request + * @param KmDocComments + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmDocComments KmDocComments) { + return super.exportXls(request, KmDocComments, KmDocComments.class, "km_doc_comments"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmDocComments.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocController.java new file mode 100644 index 0000000000000000000000000000000000000000..e925798d1fca92fa81caa3220583f258f267e74b --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocController.java @@ -0,0 +1,814 @@ +package org.jeecg.modules.KM.controller; + +import java.io.*; +import java.text.ParseException; +import java.util.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.PermissionData; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.vo.KmSearchResultObjVO; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.DateUtils; +import org.jeecg.modules.KM.VO.*; +import org.jeecg.modules.KM.common.config.BaseConfig; +import org.jeecg.modules.KM.common.enums.DocConvertFlagEnum; +import org.jeecg.modules.KM.common.enums.DocStatusEnum; +import org.jeecg.modules.KM.common.enums.DocVisitTypeEnum; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.common.utils.*; +import org.jeecg.modules.KM.entity.KmDoc; +import org.jeecg.modules.KM.entity.KmFile; +import org.jeecg.modules.KM.service.*; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_doc") +@RestController +@RequestMapping("/KM/kmDoc") +@Slf4j +public class KmDocController extends JeecgController { + @Autowired + private IKmDocService kmDocService; + @Autowired + private IKmFileService kmFileService; + //@Autowired + //private openSearchClient client; + @Autowired + private KMConstant commonConstant; + @Autowired + private IKmDocVisitRecordService kmDocVisitRecordService; + @Autowired + private IThreadPoolExecutorService executorService; + @Autowired + private DictUtils dictUtils; + @Autowired + private BaseConfig baseConfig; + @Autowired + private IKmSysConfigService kmSysConfigService; + + @Autowired + private IKmDocTopicTypeService kmDocTopicTypeService; + + @AutoLog(value = "km_doc-文件上传") + @ApiOperation(value = "km_doc-文件上传", notes = "km_doc-文件上传") + @PostMapping("/uploadDoc") + @ResponseBody + public Result uploadDoc(@RequestParam(value = "file") MultipartFile file,HttpServletRequest req){ + try{ + if(!commonConstant.isFileTypeSupport(StringUtils.getFileSuffix(file.getOriginalFilename()))){ + return Result.error("不支持的文件格式"); + } + + KmFile dupFile =kmFileService.getKmFileBySha256(HashUtil.sha256(file.getInputStream())); + if(dupFile != null){ + return Result.error("该文件已经存在无需重复上传,源文件:"+ dupFile.getOriginalName()); + } + + Map parameterMap = req.getParameterMap(); +// Gson gson = new Gson(); +// String json = gson.toJson(req.getParameterMap()); + + KmDocParamVO kmDocParamVO = new KmDocParamVO(); + if (parameterMap.containsKey("category")){ + kmDocParamVO.setCategory(parameterMap.get("category")[0]); + } + if (parameterMap.containsKey("businessTypes")){ + kmDocParamVO.setBusinessTypeList(Arrays.asList(parameterMap.get("businessTypes")[0].split(","))); + } + if (parameterMap.containsKey("topicIds")){ + kmDocParamVO.setAddTopicIdList(Arrays.asList(parameterMap.get("topicIds")[0].split(","))); + } + if (parameterMap.containsKey("depId")){ + kmDocParamVO.setDepId(parameterMap.get("depId")[0]); + } + if (parameterMap.containsKey("keywords")){ + kmDocParamVO.setKeywords(parameterMap.get("keywords")[0]); + } + if (parameterMap.containsKey("publicRemark")){ + kmDocParamVO.setPublicRemark(Integer.parseInt(parameterMap.get("publicRemark")[0])); + } + + KmFile kmFile = kmFileService.saveFile(file); + + KmDoc kmDoc = kmDocService.saveDoc(kmFile,kmDocParamVO); + + if(kmDoc != null && kmDoc.getId() != null) { + kmDocVisitRecordService.logVisit(kmDoc.getId(), + IpUtils.getIpAddr(req), + DocVisitTypeEnum.Upload.getCode()); + } + else{ + kmFileService.deleteKmFile(kmFile.getId()); + return Result.error("保存文档数据发生错误"); + } + }catch (Exception e){ + log.error("uploadDoc",e); + return Result.error(e.getMessage()); + } + return Result.OK(); + } + + /** + * 提审 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc-提审") + @ApiOperation(value="km_doc-提审", notes="km_doc-提审") + @PutMapping(value = "/submitAudit") + public Result submitAudit(@RequestParam(name="id") String id) { + KmDoc kmDoc = kmDocService.getById(id); + if(kmDoc!= null && (kmDoc.getStatus().equals(DocStatusEnum.Draft.getCode()) + || kmDoc.getStatus().equals(DocStatusEnum.Reject.getCode()) )){ + kmDoc.setStatus(DocStatusEnum.WaitAudit.getCode()); + if(kmDocService.updateById(kmDoc)){ + return Result.OK("提审成功"); + } + else + return Result.error("全部失败"); + } + else{ + return Result.error("不允许提审"); + } + } + + /** + * 批量提审 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc-批量提审") + @ApiOperation(value="km_doc-批量提审", notes="km_doc-批量提审") + @PutMapping(value = "/submitAuditBatch") + public Result submitAuditBatch(@RequestParam(name="ids",required=true) String ids) { + Integer success = 0; + List failIds = new ArrayList<>(); + if(ids.length()>0) { + List idList = Arrays.asList(ids.split(",")); + for (String id : idList) { + KmDoc kmDoc = kmDocService.getById(id); + if(kmDoc!= null && (kmDoc.getStatus().equals(DocStatusEnum.Draft.getCode()) + || kmDoc.getStatus().equals(DocStatusEnum.Reject.getCode()) )){ + kmDoc.setStatus(DocStatusEnum.WaitAudit.getCode()); + if(kmDocService.updateById(kmDoc)){ + success +=1; + } + else + failIds.add(id); + } + else{ + failIds.add(id); + } + } + } + if(success >0) + return Result.OK(failIds); + else + return Result.error("全部失败"); + } + + //取消文件收录 + @ApiOperation(value="km_doc-取消文件收录", notes="km_doc-取消文件收录") + @PutMapping(value = "/removeDocFromTopic") + public Result removeDocFromTopic(@RequestParam(name="topicId",required = true) String topicId, + @RequestParam(name="docId", required = true) String docId) { + return kmDocService.removeDocFromTopic(topicId,docId); + } + + + //收录文件到专题 + @ApiOperation(value="km_doc-收录文件到专题", notes="km_doc-收录文件到专题") + @PutMapping(value = "/addDocToTopic") + public Result addDocToTopic(@RequestParam(name="topicId",required = true) String topicId, + @RequestParam(name="docIds", required = true) String docIds) { + if(docIds != null && docIds.length()>0) { + return kmDocService.addDocToTopic(topicId, Arrays.asList(docIds.split(","))); + } + else + return Result.error("文档参数不能为空"); + } + + /** + * 分页查询专题文档 + * + * @param topicId + * @param pageNo + * @param pageSize + * @param topicId + * @return + */ + @ApiOperation(value="km_doc-分页查询专题文档", notes="km_doc-分页查询专题文档") + @GetMapping(value = "/listTopicPageList") + public Result queryTopicPageList(@RequestParam(name="topicId",required = true) String topicId, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) { + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocService.queryTopicPageList(page,topicId); + return Result.OK(pageList); + } + + /** + * 分页草稿列表 + * + * @param kmDocParamVO + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value="km_doc-分页草稿列表", notes="km_doc-分页草稿列表") + @GetMapping(value = "/listDraft") + public Result queryDraftPageList(KmDocParamVO kmDocParamVO, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocParamVO, req.getParameterMap()); + String orderBy = queryWrapper.getExpression().getOrderBy().getSqlSegment(); + kmDocParamVO.setStatusList(Arrays.asList(0,3)); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + //草稿箱只看自己创建的 + if(sysUser != null) { + kmDocParamVO.setCreateBy(sysUser.getUsername()); + } + else + return Result.error("当前登录用户信息异常"); + + Page page = new Page<>(pageNo, pageSize); + IPage pageList = kmDocService.queryPageList(page,kmDocParamVO,orderBy); + return Result.OK(pageList); + } + + /** + * 分页待审核列表 + * + * @param kmDocParamVO + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value="km_doc-分页待审核列表", notes="km_doc-分页待审核列表") + @GetMapping(value = "/listWaitAudit") + @PermissionData(pageComponent = "km/filemanagement/PendingReviewList") + public Result queryWaitAuditPageList(KmDocParamVO kmDocParamVO, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocParamVO, req.getParameterMap()); + String orderBy = queryWrapper.getExpression().getOrderBy().getSqlSegment(); + kmDocParamVO.setStatusList(Arrays.asList(1)); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocService.queryPageList(page,kmDocParamVO,orderBy); + return Result.OK(pageList); + } + + + /** + * 分页已审核列表 + * + * @param kmDocParamVO + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value="km_doc-分页已审核列表", notes="km_doc-分页已审核列表") + @GetMapping(value = "/listPassed") + @PermissionData(pageComponent = "km/filemanagement/AuditedList") + public Result queryPassedPageList(KmDocParamVO kmDocParamVO, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocParamVO, req.getParameterMap()); + String orderBy = queryWrapper.getExpression().getOrderBy().getSqlSegment(); + kmDocParamVO.setStatusList(Arrays.asList(2)); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocService.queryPageList(page,kmDocParamVO,orderBy); + return Result.OK(pageList); + } + + @ApiOperation(value="km_doc-最新发布档案", notes="km_doc-最新发布档案") + @GetMapping(value = "/listRecently") + public Result queryRecentPageList(KmDocParamVO kmDocParamVO, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocParamVO, req.getParameterMap()); + String orderBy = queryWrapper.getExpression().getOrderBy().getSqlSegment(); + kmDocParamVO.setStatusList(Arrays.asList(2)); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocService.queryPublicPageList(page,kmDocParamVO,orderBy); + return Result.OK(pageList); + } + + @AutoLog(value = "km_doc-编辑草稿") + @ApiOperation(value="km_doc-编辑草稿", notes="km_doc-编辑草稿") + @PutMapping(value = "/editDraft") + @Transactional + public Result editDraft(@RequestBody KmDocParamVO kmdDocTarget,HttpServletRequest req) { + Result result = kmDocService.editDraft(kmdDocTarget); + if(result.isSuccess()){ + kmDocVisitRecordService.logVisit(kmdDocTarget.getId(),IpUtils.getIpAddr(req),DocVisitTypeEnum.Edit.getCode()); + } + return result; + } + + @AutoLog(value = "km_doc-编辑并发布") + @ApiOperation(value="km_doc-编辑并发布", notes="km_doc-编辑并发布") + @PutMapping(value = "/editAndRelease") + @Transactional + public Result editAndRelease(@RequestBody KmDocParamVO kmdDocTarget,HttpServletRequest req) { + Result result = kmDocService.editAndRelease(kmdDocTarget,req); + if(result.isSuccess()){ + kmDocVisitRecordService.logVisit(kmdDocTarget.getId(),IpUtils.getIpAddr(req),DocVisitTypeEnum.Edit.getCode()); + } + return result; + } + + @AutoLog(value = "km_doc-编辑发布状态") + @ApiOperation(value="km_doc-编辑发布状态", notes="km_doc-编辑发布状态") + @PutMapping(value = "/editReleaseFlag") + public Result editReleaseFlag(@RequestBody KmDoc kmDoc,HttpServletRequest req) { + Result result = kmDocService.editReleaseFlag(kmDoc); + if(result.isSuccess()){ + kmDocVisitRecordService.logVisit(kmDoc.getId(),IpUtils.getIpAddr(req),DocVisitTypeEnum.Edit.getCode()); + } + return result; + } + + @AutoLog(value = "km_doc-编辑已审核") + @ApiOperation(value="km_doc-编辑已审核", notes="km_doc-编辑已审核") + @PutMapping(value = "/editRelease") + @Transactional + public Result editAuditPassed(@RequestBody KmDocParamVO kmDocTarget,HttpServletRequest req) { + Result result = kmDocService.editAuditPassed(kmDocTarget); + if(result.isSuccess()){ + kmDocVisitRecordService.logVisit(kmDocTarget.getId(),IpUtils.getIpAddr(req),DocVisitTypeEnum.Edit.getCode()); + } + return result; + } + + /** + * 审核驳回 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc-审核驳回") + @ApiOperation(value="km_doc-审核驳回", notes="km_doc-审核驳回") + @PutMapping(value = "/auditReject") + public Result auditReject(@RequestParam(name="id",required=true) String id,HttpServletRequest req) { + KmDoc kmDoc = kmDocService.getById(id); + if(kmDoc !=null && kmDoc.getStatus().equals(DocStatusEnum.WaitAudit.getCode())){ + kmDoc.setStatus(DocStatusEnum.Reject.getCode()); + if(kmDocService.updateById(kmDoc)) { + kmDocVisitRecordService.logVisit(kmDoc.getId(),IpUtils.getIpAddr(req),DocVisitTypeEnum.AuditReject.getCode()); + log.info("驳回文档成功:{}",kmDoc.getName()); + return Result.OK("审核成功!"); + } + } + return Result.error("审核失败!"); + } + + /** + * 批量审核驳回 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc-批量审核驳回") + @ApiOperation(value="km_doc-批量审核驳回", notes="km_doc-批量审核驳回") + @PutMapping(value = "/auditRejectBatch") + public Result auditRejectBatch(@RequestParam(name="ids",required=true) String ids,HttpServletRequest req) { + Integer success = 0; + List successIds = new ArrayList<>(); + List failIds = new ArrayList<>(); + if(ids.length()>0) { + List idList = Arrays.asList(ids.split(",")); + for (String id : idList) { + KmDoc kmDoc = kmDocService.getById(id); + if(kmDoc!= null && kmDoc.getStatus().equals(DocStatusEnum.WaitAudit.getCode()) ){ + kmDoc.setStatus(DocStatusEnum.Reject.getCode()); + if(kmDocService.updateById(kmDoc)){ + kmDocVisitRecordService.logVisit(kmDoc.getId(),IpUtils.getIpAddr(req),DocVisitTypeEnum.AuditReject.getCode()); + log.info("驳回文档成功:{}",kmDoc.getName()); + successIds.add(id); + success +=1; + } + else + failIds.add(id); + } + else{ + failIds.add(id); + } + } + } + if(success >0) { + return Result.OK(failIds); + } + else + return Result.error("全部失败"); + } + + /** + * 审核通过 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc-审核通过") + @ApiOperation(value="km_doc-审核通过", notes="km_doc-审核通过") + @PutMapping(value = "/auditPass") + public Result auditPass(@RequestParam(name="id",required=true) String id,HttpServletRequest req) { + return kmDocService.auditDoc(id,req); + } + + /** + * 批量审核通过 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc-批量审核通过") + @ApiOperation(value="km_doc-批量审核通过", notes="km_doc-批量审核通过") + @PutMapping(value = "/auditPassBatch") + public Result auditPassBatch(@RequestParam(name="ids",required=true) String ids,HttpServletRequest req) { + Integer success = 0; + List successIds = new ArrayList<>(); + List failIds = new ArrayList<>(); + if(ids.length()>0) { + String ip = IpUtils.getIpAddr(req); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + //String userId = "1"; + if(sysUser == null) + return Result.error("用户信息异常"); + + String userId = sysUser.getUsername(); + + List idList = Arrays.asList(ids.split(",")); + for (String id : idList) { + KmDoc kmDoc = kmDocService.getById(id); + if(kmDoc!= null && kmDoc.getStatus().equals(DocStatusEnum.WaitAudit.getCode()) ){ + kmDoc.setStatus(DocStatusEnum.Passed.getCode()); + kmDoc.setLastUpdateTime(DateUtils.getDate()); + kmDoc.setLastUpdateBy(userId); + if(kmDocService.updateById(kmDoc)){ + kmDocService.indexDocSync(kmDoc); + successIds.add(id); + success +=1; + + log.info("审核文档成功:{}",kmDoc.getName()); + kmDocVisitRecordService.logVisit(id, + IpUtils.getIpAddr(req), + DocVisitTypeEnum.AuditPass.getCode()); + } + else + failIds.add(id); + } + else{ + failIds.add(id); + } + } + } + if(success >0) { + //审核后才入库ES kmDocService.indexDocSyncBatch(successIds); + return Result.OK(failIds); + } + else + return Result.error("全部失败"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc-通过id删除") + @ApiOperation(value="km_doc-通过id删除", notes="km_doc-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id,HttpServletRequest req) { +// if (!kmDocTopicTypeService.removeDocFromAllTopics(id)) { +// return Result.error("removeDocFromAllTopics fail:" + id); +// } + kmDocTopicTypeService.removeDocFromAllTopics(id); + return kmDocService.deleteDoc(id,req); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc-批量删除") + @ApiOperation(value="km_doc-批量删除", notes="km_doc-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids,HttpServletRequest req) { + Integer success = 0; + List failIds = new ArrayList<>(); + + if(ids.length()>0) { + List idList = Arrays.asList(ids.split(",")); + for (String id : idList) { + KmDoc kmDoc = kmDocService.getById(id); + if(kmDoc!= null ){ + Result result = kmDocService.deleteDoc(id,req); + if(result.isSuccess()){ + kmDocTopicTypeService.removeDocFromAllTopics(id); + success +=1; + } + else + failIds.add(id); + } + else{ + failIds.add(id); + } + } + } + if(success >0) + return Result.OK(failIds); + else + return Result.error("全部失败"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @ApiOperation(value="km_doc-通过id查询", notes="km_doc-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { +// KmDoc kmDoc = kmDocService.getById(id); + Page page = new Page<>(1, 1); + KmDocParamVO kmDocParamVO = new KmDocParamVO(); + kmDocParamVO.setId(id); + IPage pageList = kmDocService.queryPageList(page,kmDocParamVO,""); + if(pageList.getSize()<=0) { + return Result.error("未找到对应数据"); + } + return Result.OK(pageList); + } + + /** + * 导出excel + * + * @param request + * @param kmDoc + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmDoc kmDoc) { + return super.exportXls(request, kmDoc, KmDoc.class, "km_doc"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmDoc.class); + } + + + //以下是ES库综合检索api + /** + * @param docId 指想排重的docid + * @param checkType 1-标题排重,2-文本内容排重 + * @功能描述 传入指定的indexid,列出相似的文档 + */ + @ApiOperation(value="km_doc-排重检索", notes="km_doc-排重检索") + @GetMapping(value = "/docDPCheck") + public Result docDPCheck(String docId,String checkType, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req){ + try { + //KmDocEsVO kmDocEsVO = kmDocService.getEsDocByDocId(indexId); + KmDocEsParamVO kmDocEsParamVO = new KmDocEsParamVO(); + kmDocEsParamVO.setColumn("_score"); + kmDocEsParamVO.setOrder("desc"); + KmDoc kmDoc = kmDocService.getById(docId); + if(kmDoc != null ) { + String docTitle = kmDoc.getTitle(); + + + if(checkType.equals("2") ){ + KmFile kmFile = kmFileService.getKmFile(kmDoc.getFileId()); + File file = baseConfig.getFile(kmFile.getPhysicalPath()); + if (file != null && file.exists()) { + String content = TikaUtils.parseContent(file); + if (content != null && !content.isEmpty()) { + String maxContentSearchLength = kmSysConfigService.getSysConfigValue("MaxContentSearchLength"); + if(maxContentSearchLength!= null && !maxContentSearchLength.isEmpty()) { + Integer intMaxContentSearchLength = 0; + try{ + intMaxContentSearchLength = Integer.parseInt(maxContentSearchLength); + } + catch (NumberFormatException e){ + + } + if (intMaxContentSearchLength > 0 && content.length() > intMaxContentSearchLength) + content = content.substring(0, intMaxContentSearchLength-1); + } + kmDocEsParamVO.setContent(content); + } else { + return Result.error("file not found"); + } + } + } + + if(checkType.equals("1") && docTitle != null && !docTitle.isEmpty()) + kmDocEsParamVO.setTitle(docTitle); + + Page page = new Page(pageNo, pageSize); + KmSearchResultObjVO kmSearchResultObjVO = kmDocService.checkDuplicateESKmDoc(page, kmDocEsParamVO, req); + if (kmSearchResultObjVO.isSuccess()) { + dictUtils.parseDictText(kmSearchResultObjVO); + return Result.OK(kmSearchResultObjVO); + } else + return Result.error(kmSearchResultObjVO.getMessage()); + } + else{ + return Result.error("doc not found"); + } + } + catch (IOException e){ + return Result.error(e.getMessage()); + } + } + + @ApiOperation(value="km_doc-普通检索", notes="km_doc-普通检索") + @PostMapping(value = "/searchDoc") + public Result searchDoc(@RequestBody(required = true) KmDocEsParamVO kmDocEsParamVO, +// @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, +// @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req){ + try { +// if(kmDocEsParamVO.getKeywords() !=null && kmDocEsParamVO.getKeywords().size() >0) { +// kmDocEsParamVO.setKeywords( +// StringUtils.splitStrListToList( +// kmDocEsParamVO.getKeywords())); +// } + kmDocEsParamVO.setPageNo(kmDocEsParamVO.getPageNo() == null ? 1:kmDocEsParamVO.getPageNo()); + kmDocEsParamVO.setPageSize(kmDocEsParamVO.getPageSize() == null ? 10:kmDocEsParamVO.getPageSize()); + Page page = new Page(kmDocEsParamVO.getPageNo(), kmDocEsParamVO.getPageSize()); + KmSearchResultObjVO kmSearchResultObjVO = kmDocService.searchESKmDoc(page, kmDocEsParamVO, req); + if(kmSearchResultObjVO.isSuccess()) { +// dictUtils.parseDictText(kmSearchResultObjVO); + return Result.OK(kmSearchResultObjVO); + } + else + return Result.error(kmSearchResultObjVO.getMessage()); + } + catch (IOException e){ + return Result.error(e.getMessage()); + } + } + + @ApiOperation(value="km_doc-高级检索", notes="km_doc-高级检索") + @GetMapping(value = "/advanceSearchDoc") + public Result advanceSearchDoc(KmDocEsParamVO kmDocEsParamVO, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req){ + return searchDoc(kmDocEsParamVO,req); + } + + /** + * @param docId 指想要下载的文档id + * @param response + * @功能描述 下载文件:将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存 + */ + @ApiOperation(value="km_doc-下载文件", notes="km_doc-下载文件") + @GetMapping("/downloadKmDoc") + @SuppressWarnings("ALL") + public void downloadKmDoc(@RequestParam(value = "docId") String docId, HttpServletResponse response,HttpServletRequest req) throws IOException, ParseException { + kmDocService.downloadKmDoc(docId,response,req); + + } + + /** + * @param docId 指想要预览的文档id + * @param response + * @功能描述 下载文件:将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存 + */ + @ApiOperation(value="km_doc-预览文件", notes="km_doc-预览文件") + @GetMapping("/previewKmDoc") + @SuppressWarnings("ALL") + public void previewKmDoc(@RequestParam(value = "docId") String docId, HttpServletResponse response,HttpServletRequest req) throws IOException { + kmDocService.viewKmDoc(docId,response,req); + } + + + @AutoLog(value = "km_doc-预览文件替换") + @ApiOperation(value = "km_doc-预览文件替换", notes = "km_doc-预览文件替换") + @PostMapping("/changePreviewFile") + @ResponseBody + public Result changePreviewFile(@RequestParam(value = "file") MultipartFile file,@RequestParam(value = "docId") String docId,HttpServletRequest req){ + try{ + if(!StringUtils.getFileSuffix(file.getOriginalFilename()).toLowerCase().equals("pdf") ){ + return Result.error("仅支持pdf文件"); + } + KmDoc kmDoc = kmDocService.getById(docId); + if(kmDoc == null){ + return Result.error("文档没找到"); + } + KmFile kmFile = kmFileService.saveFile(file); + if(kmFile != null){ + kmDoc.setConvertFlag(DocConvertFlagEnum.Converted.getCode()); + kmDoc.setProcessMsg(""); + kmDoc.setPreviewFileId(kmFile.getId()); + if(!kmDocService.updateById(kmDoc)) + return Result.error("更新文档信息失败"); + else{ + //日志 + kmDocVisitRecordService.logVisit(docId, + IpUtils.getIpAddr(req), + DocVisitTypeEnum.ChangePreview.getCode()); + } + } + }catch (Exception e){ + log.error("changePreviewFile",e); + return Result.error(e.getMessage()); + } + return Result.OK(); + } + + @AutoLog(value = "km_doc-预览文件复位") + @ApiOperation(value = "km_doc-预览文件复位", notes = "km_doc-预览文件复位") + @PostMapping("/resetPreviewFile") + @ResponseBody + public Result resetPreviewFile( @RequestParam(value = "docId") String docId){ + try{ + KmDoc kmDoc = kmDocService.getById(docId); + if(kmDoc == null){ + return Result.error("文档没找到"); + } + + if(kmDoc.getOriginalPreviewFileId() != null){ + kmDoc.setPreviewFileId(kmDoc.getOriginalPreviewFileId()); + if(!kmDocService.updateById(kmDoc)) + return Result.error("更新文档信息失败"); + } + }catch (Exception e){ + log.error("resetPreviewFile",e); + return Result.error(e.getMessage()); + } + return Result.OK(); + } + + @ApiOperation(value="km_doc-文档统计", notes="km_doc-文档统计") + @GetMapping(value = "/queryKmDocStatistics") + public Result queryKmDocStatistics( @RequestParam(value = "statisticsType") Integer statisticsType, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize ) { + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocService.queryKmDocStatistics(page,statisticsType); + return Result.OK(pageList); + } + + + @AutoLog(value = "km_doc-批量转换") + @ApiOperation(value="km_doc-批量转换", notes="km_doc-批量转换") + @PostMapping(value = "/convertAll") + public Result convertAll(HttpServletRequest req) { + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.ne(KmDoc::getFileType,"pdf"); + List kmDocList = kmDocService.list(wrapper); + + if(kmDocList.size()>0) { + for (KmDoc kmDoc : kmDocList) { + if(kmDoc!= null ){ + kmDocService.convertDocSync(kmDoc); + } + } + } + return Result.OK(); + } + + } diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocFavouriteController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocFavouriteController.java new file mode 100644 index 0000000000000000000000000000000000000000..ff981bd3fa9bb3a6ce762a1fe22459a8bc4d8132 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocFavouriteController.java @@ -0,0 +1,163 @@ +package org.jeecg.modules.KM.controller; + +import java.util.Arrays; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.modules.KM.VO.KmDocParamVO; +import org.jeecg.modules.KM.VO.KmDocVO; +import org.jeecg.modules.KM.entity.KmDocFavourite; +import org.jeecg.modules.KM.service.IKmDocFavouriteService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_doc_favourite") +@RestController +@RequestMapping("/KM/kmDocFavourite") +@Slf4j +public class KmDocFavouriteController extends JeecgController { + @Autowired + private IKmDocFavouriteService kmDocFavouriteService; + + /** + * 分页列表查询 + * + * @param + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_doc_favourite-分页列表查询") + @ApiOperation(value="km_doc_favourite-分页列表查询", notes="km_doc_favourite-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmDocParamVO kmDocParamVO, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser != null) { +// //处理过滤source -> sourceList +// if(kmDocParamVO.getSource() != null && !kmDocParamVO.getSource().isEmpty()) +// kmDocParamVO.setSourceList(Arrays.asList(kmDocParamVO.getSource().split(","))); + + KmDocVO kmDocVO = new KmDocVO(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocVO, req.getParameterMap()); + String orderBy = queryWrapper.getExpression().getOrderBy().getSqlSegment(); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = kmDocFavouriteService.queryPageList(page, sysUser.getId(),kmDocParamVO,orderBy); + return Result.OK(pageList); + } + else + return Result.error("登录信息异常"); + } + + /** + * 添加 + * + * @param docId + * @return + */ + @AutoLog(value = "km_doc_favourite-添加") + @ApiOperation(value="km_doc_favourite-添加", notes="km_doc_favourite-添加") + @PostMapping(value = "/add") + public Result add(@RequestParam(name = "docId") String docId) { + + return kmDocFavouriteService.addFavouriteDoc(docId); + } + + /** + * 编辑 + * + * @param kmDocFavourite + * @return + */ + @AutoLog(value = "km_doc_favourite-编辑") + @ApiOperation(value="km_doc_favourite-编辑", notes="km_doc_favourite-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody KmDocFavourite kmDocFavourite) { + kmDocFavouriteService.updateById(kmDocFavourite); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param docId + * @return + */ + @AutoLog(value = "km_doc_favourite-通过id删除") + @ApiOperation(value="km_doc_favourite-通过id删除", notes="km_doc_favourite-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="docId",required=true) String docId) { + + return kmDocFavouriteService.delFavouriteDoc(docId); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc_favourite-批量删除") + @ApiOperation(value="km_doc_favourite-批量删除", notes="km_doc_favourite-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmDocFavouriteService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_favourite-通过id查询") + @ApiOperation(value="km_doc_favourite-通过id查询", notes="km_doc_favourite-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmDocFavourite kmDocFavourite = kmDocFavouriteService.getById(id); + if(kmDocFavourite==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmDocFavourite); + } + + /** + * 导出excel + * + * @param request + * @param kmDocFavourite + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmDocFavourite kmDocFavourite) { + return super.exportXls(request, kmDocFavourite, KmDocFavourite.class, "km_doc_favourite"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmDocFavourite.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocTopicTypeController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocTopicTypeController.java new file mode 100644 index 0000000000000000000000000000000000000000..d847a1491fce7e9d1dd4af0c2deb464725c33333 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocTopicTypeController.java @@ -0,0 +1,148 @@ +package org.jeecg.modules.KM.controller; + +import java.util.Arrays; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.KM.entity.KmDocTopicType; +import org.jeecg.modules.KM.service.IKmDocTopicTypeService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_doc_topic_type") +@RestController +@RequestMapping("/KM/kmDocTopicType") +@Slf4j +public class KmDocTopicTypeController extends JeecgController { + @Autowired + private IKmDocTopicTypeService kmDocTopicTypeService; + + /** + * 分页列表查询 + * + * @param kmDocTopicType + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_doc_topic_type-分页列表查询") + @ApiOperation(value="km_doc_topic_type-分页列表查询", notes="km_doc_topic_type-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmDocTopicType kmDocTopicType, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocTopicType, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocTopicTypeService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param kmDocTopicType + * @return + */ + @AutoLog(value = "km_doc_topic_type-添加") + @ApiOperation(value="km_doc_topic_type-添加", notes="km_doc_topic_type-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody KmDocTopicType kmDocTopicType) { + kmDocTopicTypeService.save(kmDocTopicType); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param kmDocTopicType + * @return + */ + @AutoLog(value = "km_doc_topic_type-编辑") + @ApiOperation(value="km_doc_topic_type-编辑", notes="km_doc_topic_type-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody KmDocTopicType kmDocTopicType) { + kmDocTopicTypeService.updateById(kmDocTopicType); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_topic_type-通过id删除") + @ApiOperation(value="km_doc_topic_type-通过id删除", notes="km_doc_topic_type-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + kmDocTopicTypeService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc_topic_type-批量删除") + @ApiOperation(value="km_doc_topic_type-批量删除", notes="km_doc_topic_type-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmDocTopicTypeService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_topic_type-通过id查询") + @ApiOperation(value="km_doc_topic_type-通过id查询", notes="km_doc_topic_type-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmDocTopicType kmDocTopicType = kmDocTopicTypeService.getById(id); + if(kmDocTopicType==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmDocTopicType); + } + + /** + * 导出excel + * + * @param request + * @param kmDocTopicType + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmDocTopicType kmDocTopicType) { + return super.exportXls(request, kmDocTopicType, KmDocTopicType.class, "km_doc_topic_type"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmDocTopicType.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocVersionController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocVersionController.java new file mode 100644 index 0000000000000000000000000000000000000000..d19d75b3d292ef361e740f312a2bfc2a46202f22 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocVersionController.java @@ -0,0 +1,149 @@ +//package org.jeecg.modules.KM.controller; +// +//import java.util.Arrays; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import org.jeecg.common.api.vo.Result; +//import org.jeecg.common.system.query.QueryGenerator; +//import org.jeecg.modules.KM.entity.KmDocVersion; +//import org.jeecg.modules.KM.service.IKmDocVersionService; +// +//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import lombok.extern.slf4j.Slf4j; +//import org.jeecg.common.system.base.controller.JeecgController; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +//import org.springframework.web.servlet.ModelAndView; +//import io.swagger.annotations.Api; +//import io.swagger.annotations.ApiOperation; +//import org.jeecg.common.aspect.annotation.AutoLog; +// +//@Api(tags="km_doc_version") +//@RestController +//@RequestMapping("/KM/kmDocVersion") +//@Slf4j +//public class KmDocVersionController extends JeecgController { +// @Autowired +// private IKmDocVersionService kmDocVersionService; +// +// /** +// * 分页列表查询 +// * +// * @param kmDocVersion +// * @param pageNo +// * @param pageSize +// * @param req +// * @return +// */ +// @AutoLog(value = "km_doc_version-分页列表查询") +// @ApiOperation(value="km_doc_version-分页列表查询", notes="km_doc_version-分页列表查询") +// @GetMapping(value = "/list") +// public Result queryPageList(KmDocVersion kmDocVersion, +// @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, +// @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, +// HttpServletRequest req) { +// QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocVersion, req.getParameterMap()); +// Page page = new Page(pageNo, pageSize); +// IPage pageList = kmDocVersionService.page(page, queryWrapper); +// return Result.OK(pageList); +// } +// +// /** +// * 添加 +// * +// * @param kmDocVersion +// * @return +// */ +// @AutoLog(value = "km_doc_version-添加") +// @ApiOperation(value="km_doc_version-添加", notes="km_doc_version-添加") +// @PostMapping(value = "/add") +// public Result add(@RequestBody KmDocVersion kmDocVersion) { +// kmDocVersionService.save(kmDocVersion); +// return Result.OK("添加成功!"); +// } +// +// /** +// * 编辑 +// * +// * @param kmDocVersion +// * @return +// */ +// @AutoLog(value = "km_doc_version-编辑") +// @ApiOperation(value="km_doc_version-编辑", notes="km_doc_version-编辑") +// @PutMapping(value = "/edit") +// public Result edit(@RequestBody KmDocVersion kmDocVersion) { +// kmDocVersionService.updateById(kmDocVersion); +// return Result.OK("编辑成功!"); +// } +// +// /** +// * 通过id删除 +// * +// * @param id +// * @return +// */ +// @AutoLog(value = "km_doc_version-通过id删除") +// @ApiOperation(value="km_doc_version-通过id删除", notes="km_doc_version-通过id删除") +// @DeleteMapping(value = "/delete") +// public Result delete(@RequestParam(name="id",required=true) String id) { +// kmDocVersionService.removeById(id); +// return Result.OK("删除成功!"); +// } +// +// /** +// * 批量删除 +// * +// * @param ids +// * @return +// */ +// @AutoLog(value = "km_doc_version-批量删除") +// @ApiOperation(value="km_doc_version-批量删除", notes="km_doc_version-批量删除") +// @DeleteMapping(value = "/deleteBatch") +// public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { +// this.kmDocVersionService.removeByIds(Arrays.asList(ids.split(","))); +// return Result.OK("批量删除成功!"); +// } +// +// /** +// * 通过id查询 +// * +// * @param id +// * @return +// */ +// @AutoLog(value = "km_doc_version-通过id查询") +// @ApiOperation(value="km_doc_version-通过id查询", notes="km_doc_version-通过id查询") +// @GetMapping(value = "/queryById") +// public Result queryById(@RequestParam(name="id",required=true) String id) { +// KmDocVersion kmDocVersion = kmDocVersionService.getById(id); +// if(kmDocVersion==null) { +// return Result.error("未找到对应数据"); +// } +// return Result.OK(kmDocVersion); +// } +// +// /** +// * 导出excel +// * +// * @param request +// * @param kmDocVersion +// */ +// @RequestMapping(value = "/exportXls") +// public ModelAndView exportXls(HttpServletRequest request, KmDocVersion kmDocVersion) { +// return super.exportXls(request, kmDocVersion, KmDocVersion.class, "km_doc_version"); +// } +// +// /** +// * 通过excel导入数据 +// * +// * @param request +// * @param response +// * @return +// */ +// @RequestMapping(value = "/importExcel", method = RequestMethod.POST) +// public Result importExcel(HttpServletRequest request, HttpServletResponse response) { +// return super.importExcel(request, response, KmDocVersion.class); +// } +// +//} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocVisitRecordController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocVisitRecordController.java new file mode 100644 index 0000000000000000000000000000000000000000..f28a32d3bb9470385d9ecd128b9756474c660990 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmDocVisitRecordController.java @@ -0,0 +1,194 @@ +package org.jeecg.modules.KM.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.modules.KM.common.utils.KMRedisUtils; +import org.jeecg.modules.KM.entity.KmDoc; +import org.jeecg.modules.KM.entity.KmDocVisitRecord; +import org.jeecg.modules.KM.service.IKmDocService; +import org.jeecg.modules.KM.service.IKmDocVisitRecordService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_doc_visit_record") +@RestController +@RequestMapping("/KM/kmDocVisitRecord") +@Slf4j +public class KmDocVisitRecordController extends JeecgController { + @Autowired + private IKmDocVisitRecordService kmDocVisitRecordService; + @Autowired + private IKmDocService kmDocService; + @Autowired + private KMRedisUtils kmRedisUtils; + + + @ApiOperation(value="km_doc_visit_record-最近访问档案", notes="km_doc_visit_record-最近访问档案") + @GetMapping(value = "/recentlyVisitDocs") + public Result recentlyVisitDocs(){ + try { + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser != null) { + String userId = sysUser.getUsername(); + + List recentlyDocIds = kmRedisUtils.getPersonalDocHistory(userId); + if(recentlyDocIds.size() > 0) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(KmDoc::getId, recentlyDocIds); + List recentlyDocs = kmDocService.list(queryWrapper); + List result = new ArrayList<>(); + for (int i = 0; i < recentlyDocIds.size(); i++) { + String docId = recentlyDocIds.get(i); + + for (int j = 0; j < recentlyDocs.size(); j++) { + if(recentlyDocs.get(j).getId().equals(docId)) + result.add(recentlyDocs.get(j)); + } + } + + return Result.OK(result); + } + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error("发生异常"); + } + return Result.OK("空数据"); + } + + /** + * 分页列表查询 + * + * @param kmDocVisitRecord + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_doc_visit_record-分页列表查询") + @ApiOperation(value="km_doc_visit_record-分页列表查询", notes="km_doc_visit_record-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmDocVisitRecord kmDocVisitRecord, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmDocVisitRecord, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmDocVisitRecordService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param kmDocVisitRecord + * @return + */ + @AutoLog(value = "km_doc_visit_record-添加") + @ApiOperation(value="km_doc_visit_record-添加", notes="km_doc_visit_record-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody KmDocVisitRecord kmDocVisitRecord) { + kmDocVisitRecordService.save(kmDocVisitRecord); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param kmDocVisitRecord + * @return + */ + @AutoLog(value = "km_doc_visit_record-编辑") + @ApiOperation(value="km_doc_visit_record-编辑", notes="km_doc_visit_record-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody KmDocVisitRecord kmDocVisitRecord) { + kmDocVisitRecordService.updateById(kmDocVisitRecord); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_visit_record-通过id删除") + @ApiOperation(value="km_doc_visit_record-通过id删除", notes="km_doc_visit_record-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + kmDocVisitRecordService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_doc_visit_record-批量删除") + @ApiOperation(value="km_doc_visit_record-批量删除", notes="km_doc_visit_record-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmDocVisitRecordService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_doc_visit_record-通过id查询") + @ApiOperation(value="km_doc_visit_record-通过id查询", notes="km_doc_visit_record-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmDocVisitRecord kmDocVisitRecord = kmDocVisitRecordService.getById(id); + if(kmDocVisitRecord==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmDocVisitRecord); + } + + /** + * 导出excel + * + * @param request + * @param kmDocVisitRecord + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmDocVisitRecord kmDocVisitRecord) { + return super.exportXls(request, kmDocVisitRecord, KmDocVisitRecord.class, "km_doc_visit_record"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmDocVisitRecord.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmFileController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmFileController.java new file mode 100644 index 0000000000000000000000000000000000000000..2a4d90d826542a79c793398c5e873bae3ccb80f0 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmFileController.java @@ -0,0 +1,148 @@ +package org.jeecg.modules.KM.controller; + +import java.util.Arrays; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.KM.entity.KmFile; +import org.jeecg.modules.KM.service.IKmFileService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_file") +@RestController +@RequestMapping("/KM/kmFile") +@Slf4j +public class KmFileController extends JeecgController { + @Autowired + private IKmFileService kmFileService; + + /** + * 分页列表查询 + * + * @param kmFile + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_file-分页列表查询") + @ApiOperation(value="km_file-分页列表查询", notes="km_file-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmFile kmFile, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmFile, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmFileService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param kmFile + * @return + */ + @AutoLog(value = "km_file-添加") + @ApiOperation(value="km_file-添加", notes="km_file-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody KmFile kmFile) { + kmFileService.save(kmFile); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param kmFile + * @return + */ + @AutoLog(value = "km_file-编辑") + @ApiOperation(value="km_file-编辑", notes="km_file-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody KmFile kmFile) { + kmFileService.updateById(kmFile); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_file-通过id删除") + @ApiOperation(value="km_file-通过id删除", notes="km_file-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + kmFileService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_file-批量删除") + @ApiOperation(value="km_file-批量删除", notes="km_file-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmFileService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_file-通过id查询") + @ApiOperation(value="km_file-通过id查询", notes="km_file-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmFile kmFile = kmFileService.getById(id); + if(kmFile==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmFile); + } + + /** + * 导出excel + * + * @param request + * @param kmFile + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmFile kmFile) { + return super.exportXls(request, kmFile, KmFile.class, "km_file"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmFile.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmHonePageController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmHonePageController.java new file mode 100644 index 0000000000000000000000000000000000000000..18717a086ea274844de6db210428e7ea72192b72 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmHonePageController.java @@ -0,0 +1,105 @@ +package org.jeecg.modules.KM.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.vo.DictModel; +import org.jeecg.common.system.vo.SysCategoryModel; +import org.jeecg.modules.KM.VO.KmChartVO; +import org.jeecg.modules.KM.VO.KmDocStatisticsVO; +import org.jeecg.modules.KM.VO.KmDocSummaryVO; +import org.jeecg.modules.KM.entity.KmDoc; +import org.jeecg.modules.KM.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.io.IOException; +import java.util.*; + +@Api(tags="km_doc") +@RestController +@RequestMapping("/KM/HomePage") +@Slf4j +public class KmHonePageController extends JeecgController { + @Autowired + private IKmSearchRecordService kmSearchRecordService; + @Autowired + private IKmSysConfigService kmSysConfigService; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private IKmDocService kmDocService; + + + @ApiOperation(value="km_doc-首页专题", notes="km_doc-首页专题") + @GetMapping(value = "/listRecommendTopic") + public Result listRecommendTopic( ) { + Map sysCategoryModelsTarget = new HashMap<>(); + List sysCategoryModels =sysBaseAPI.queryCategoryRecommend(); + for (SysCategoryModel model : sysCategoryModels){ + sysCategoryModelsTarget.put(model.getCode(),model); + } + + String recommendHotTopic = kmSysConfigService.getSysConfigValue("RecommendHotTopic"); + if(recommendHotTopic != null && recommendHotTopic.equals("1")) { + try { + List sysCategoryModelsHot = kmSearchRecordService.retriveHotTopic(); + if(sysCategoryModelsHot != null && !sysCategoryModelsHot.isEmpty()){ + + for (SysCategoryModel modelHot:sysCategoryModelsHot){ + if(!sysCategoryModelsTarget.containsKey(modelHot.getCode())) + sysCategoryModelsTarget.put(modelHot.getCode(),modelHot); + } + } + } + catch (IOException e){ + e.printStackTrace(); + //return Result.error("io异常"); + } + } + if(!sysCategoryModelsTarget.isEmpty()) { + List sysCategoryModelsResult = new ArrayList<>(sysCategoryModelsTarget.values()); + if(sysCategoryModelsResult.size()>20) + sysCategoryModelsResult = sysCategoryModelsResult.subList(0,19); + return Result.OK(sysCategoryModelsResult); + } + else + return Result.OK(); + } + + @ApiOperation(value="km_doc-首页业务列表", notes="km_doc-首页业务列表") + @GetMapping(value = "/listBusinessType") + public Result listBusinessType( ) { + List dictModelList = sysBaseAPI.queryDictItemList("km_dict_business"); + if(dictModelList.size()>20) + dictModelList = dictModelList.subList(0,19); + return Result.OK(dictModelList); + } + + @ApiOperation(value="km_doc-后台数据统计页面接口", notes="km_doc-后台数据统计页面接口") + @GetMapping(value = "/getCharData") + public Result getCharData( ) throws IOException { + KmChartVO kmChartVO = new KmChartVO(); + List categoryList = kmDocService.queryKmDocStatistics(1); + kmChartVO.setCategoryChartList(categoryList); + List businessList = kmDocService.queryKmDocStatistics(4); + kmChartVO.setBusinessChartList(businessList); + List topicList = kmDocService.queryKmDocStatistics(5); + kmChartVO.setTopicChartList(topicList); + List hotKeyword = kmSearchRecordService.hotKeywordReport(); + kmChartVO.setHotKeywordList(hotKeyword); + List hotTopic = kmSearchRecordService.hotTopicReport(); + kmChartVO.setHotTopicList(hotTopic); + KmDocSummaryVO kmDocSummaryVO = kmDocService.queryKmDocSummary(); + kmChartVO.setKmDocSummaryVO(kmDocSummaryVO); + return Result.OK(kmChartVO); + } + + + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSearchRecordController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSearchRecordController.java new file mode 100644 index 0000000000000000000000000000000000000000..33fdada7058b91bc0d11748b112a86ad9bc7e53f --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSearchRecordController.java @@ -0,0 +1,170 @@ +package org.jeecg.modules.KM.controller; + +import java.util.Arrays; +import java.util.List; +import java.io.IOException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.KM.entity.KmSearchRecord; +import org.jeecg.modules.KM.service.IKmSearchRecordService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + +@Api(tags="km_search_record") +@RestController +@RequestMapping("/KM/kmSearchRecord") +@Slf4j +public class KmSearchRecordController extends JeecgController { + @Autowired + private IKmSearchRecordService kmSearchRecordService; + + @ApiOperation(value="km_search_record-热词报告", notes="km_search_record-热词报告") + @GetMapping(value = "/hotKeywordReport") + public Result hotKeywordReport(){ + try { + List result = kmSearchRecordService.hotKeywordReport(); + return Result.OK(result); + } catch (IOException e) { + e.printStackTrace(); + return Result.error("错误,io异常"); + } + } + + @ApiOperation(value="km_search_record-热门专题报告", notes="km_search_record-热门专题报告") + @GetMapping(value = "/hotTopicReport") + public Result hotTopicReport(){ + List result = kmSearchRecordService.hotTopicReport(); + return Result.OK(result); + + } + + /** + * 分页列表查询 + * + * @param kmSearchRecord + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_search_record-分页列表查询") + @ApiOperation(value="km_search_record-分页列表查询", notes="km_search_record-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmSearchRecord kmSearchRecord, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmSearchRecord, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmSearchRecordService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param kmSearchRecord + * @return + */ + @AutoLog(value = "km_search_record-添加") + @ApiOperation(value="km_search_record-添加", notes="km_search_record-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody KmSearchRecord kmSearchRecord) { + kmSearchRecordService.save(kmSearchRecord); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param kmSearchRecord + * @return + */ + @AutoLog(value = "km_search_record-编辑") + @ApiOperation(value="km_search_record-编辑", notes="km_search_record-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody KmSearchRecord kmSearchRecord) { + kmSearchRecordService.updateById(kmSearchRecord); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_search_record-通过id删除") + @ApiOperation(value="km_search_record-通过id删除", notes="km_search_record-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + kmSearchRecordService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_search_record-批量删除") + @ApiOperation(value="km_search_record-批量删除", notes="km_search_record-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmSearchRecordService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_search_record-通过id查询") + @ApiOperation(value="km_search_record-通过id查询", notes="km_search_record-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmSearchRecord kmSearchRecord = kmSearchRecordService.getById(id); + if(kmSearchRecord==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmSearchRecord); + } + + /** + * 导出excel + * + * @param request + * @param kmSearchRecord + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmSearchRecord kmSearchRecord) { + return super.exportXls(request, kmSearchRecord, KmSearchRecord.class, "km_search_record"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmSearchRecord.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSysConfigController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSysConfigController.java new file mode 100644 index 0000000000000000000000000000000000000000..adb6c3702cd61a18ab8672bb9b9661eafaf0b923 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSysConfigController.java @@ -0,0 +1,174 @@ +package org.jeecg.modules.KM.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.ibatis.annotations.Param; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.entity.KmSysConfig; +import org.jeecg.modules.KM.service.IKmSysConfigService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; +//import springfox.documentation.spring.web.json.Json; + +@Api(tags="km_sys_config") +@RestController +@RequestMapping("/KM/kmSysConfig") +@Slf4j +public class KmSysConfigController extends JeecgController { + @Autowired + private IKmSysConfigService kmSysConfigService; + + /** + * 分页列表查询 + * + * @param kmSysConfig + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_sys_config-分页列表查询") + @ApiOperation(value="km_sys_config-分页列表查询", notes="km_sys_config-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmSysConfig kmSysConfig, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(kmSysConfig, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmSysConfigService.page(page, queryWrapper); + return Result.OK(pageList); + } + + @AutoLog(value = "km_sys_config-获取所有配置") + @ApiOperation(value="km_sys_config-获取所有配置", notes="km_sys_config-获取所有配置") + @GetMapping(value = "/listAllConfig") + public Result queryAllConfigist() { + Map allConfig = kmSysConfigService.queryAllConfig(); + return Result.OK(allConfig); + } + + /** + * 添加 + * + * @param kmSysConfig + * @return + */ + @AutoLog(value = "km_sys_config-添加") + @ApiOperation(value="km_sys_config-添加", notes="km_sys_config-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody KmSysConfig kmSysConfig) { + kmSysConfigService.save(kmSysConfig); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param kmSysConfig + * @return + */ + @AutoLog(value = "km_sys_config-编辑") + @ApiOperation(value="km_sys_config-编辑", notes="km_sys_config-编辑") + @PutMapping(value = "/edit") + @CacheEvict(value = "kmSysConfig",allEntries = true) + public Result edit(@RequestBody KmSysConfig kmSysConfig) { + kmSysConfigService.updateById(kmSysConfig); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_sys_config-通过id删除") + @ApiOperation(value="km_sys_config-通过id删除", notes="km_sys_config-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + kmSysConfigService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_sys_config-批量删除") + @ApiOperation(value="km_sys_config-批量删除", notes="km_sys_config-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmSysConfigService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_sys_config-通过id查询") + @ApiOperation(value="km_sys_config-通过id查询", notes="km_sys_config-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmSysConfig kmSysConfig = kmSysConfigService.getById(id); + if(kmSysConfig==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmSysConfig); + } + @AutoLog(value = "km_sys_config-查询site信息") + @ApiOperation(value="km_sys_config-查询site信息", notes="km_sys_config-查询site信息") + @GetMapping(value = "/querySiteInfo") + public Result querySiteInfo() { + List kmSysConfigList = kmSysConfigService.querySiteInfo(); +// KmSysConfig kmSysConfig = (KmSysConfig) kmSysConfigList + if(kmSysConfigList==null || kmSysConfigList.size() == 0) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmSysConfigList); + } + + /** + * 导出excel + * + * @param request + * @param kmSysConfig + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, KmSysConfig kmSysConfig) { + return super.exportXls(request, kmSysConfig, KmSysConfig.class, "km_sys_config"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, KmSysConfig.class); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSysDbBackupController.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSysDbBackupController.java new file mode 100644 index 0000000000000000000000000000000000000000..363045f198e4c5917451b1cfa88415c047cd8e04 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/controller/KmSysDbBackupController.java @@ -0,0 +1,300 @@ +package org.jeecg.modules.KM.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.CommonUtils; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.entity.KmSysDbBackup; +import org.jeecg.modules.KM.entity.KmSysDbBackup; +import org.jeecg.modules.KM.service.IKmSysDbBackupService; +import org.jeecg.modules.KM.service.IKmSysDbBackupService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Arrays; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +@Api(tags="km_sys_db_backup") +@RestController +@RequestMapping("/KM/kmSysDbBackup") +@Slf4j +public class KmSysDbBackupController extends JeecgController { + @Autowired + private IKmSysDbBackupService kmSysDbBackupService; + + @Value("${spring.datasource.dynamic.datasource.master.url}") + private String dbServerUrl; + @Value("${spring.datasource.dynamic.datasource.master.username}") + private String dbServerUserName; + @Value("${spring.datasource.dynamic.datasource.master.password}") + private String dbServerPassword; + @Value("${base.db-backup-dir}") + private String dbBackupDir; + + /** + * 分页列表查询 + * + * @param KmSysDbBackup + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "km_sys_db_backup-分页列表查询") + @ApiOperation(value="km_sys_db_backup-分页列表查询", notes="km_sys_db_backup-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(KmSysDbBackup KmSysDbBackup, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(KmSysDbBackup, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = kmSysDbBackupService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param + * @return + */ + @AutoLog(value = "km_sys_db_backup-添加") + @ApiOperation(value="km_sys_db_backup-添加", notes="km_sys_db_backup-添加") + @PostMapping(value = "/add") + public Result add() { + String dbType = CommonUtils.getDatabaseType(); + if (!dbType.equalsIgnoreCase("mysql")) { + return Result.error("只支持mysql数据库备份"); + } + if (oConvertUtils.isEmpty(dbBackupDir) || oConvertUtils.isEmpty(dbServerUrl) || oConvertUtils.isEmpty(dbServerUserName) || oConvertUtils.isEmpty(dbServerPassword)) { + return Result.error("备份配置缺失"); + } + String fileName = "backup_" + new Date().getTime() + ".sql"; + String filePath = dbBackupDir + File.separator + fileName; + + String temp = dbServerUrl.substring(dbServerUrl.indexOf("//")); + String dbServerIp = temp.substring(2,temp.indexOf(":")); + temp = temp.substring(temp.indexOf(":")); + String dbServerPort = temp.substring(1,temp.indexOf("/")); + temp = temp.substring(temp.indexOf("/")); + String dbName = temp.substring(1,temp.indexOf("?")); + + String cmd = "cmd /c mysqldump -u" + dbServerUserName + " -p" + dbServerPassword + " -h " + dbServerIp + " -P " + dbServerPort + " " + dbName +" > " + filePath; + //-u后的root为mysql数据库用户名,-p后接的123456为该用户密码,注意不要有空格;dbName填写需要备份数据的数据库名称,大于号后接生成文件路径 + try { + Process process = Runtime.getRuntime().exec(cmd); + boolean exitFlag = process.waitFor(10*60, TimeUnit.SECONDS); + if(exitFlag) { + int code = process.exitValue(); + log.info("code:"+code); + if(code == 0){ + KmSysDbBackup kmSysDbBackup = new KmSysDbBackup(); + File backupFile = new File(filePath); + kmSysDbBackup.setSize(backupFile.length()); + kmSysDbBackup.setFileName(fileName); + kmSysDbBackup.setFilePath(filePath); + kmSysDbBackup.setCreateTime(new Date()); + kmSysDbBackupService.save(kmSysDbBackup); + log.info("【备份数据库】成功,SQL文件:{}", fileName); + return Result.OK("备份成功!"); + }else { + return Result.error("备份命令执行失败,返回码:",code); + } + }else { + return Result.error("备份超时"); + } + }catch (Exception e){ + log.error("【备份数据库】失败:{}", e.getMessage()); + return Result.error(e.getMessage()); + } + } + + /** + * 通过id下载 + * + * @param id + * @return + */ + @AutoLog(value = "km_sys_db_backup-通过id下载") + @ApiOperation(value="km_sys_db_backup-通过id下载", notes="km_sys_db_backup-通过id下载") + @GetMapping(value = "/downloadById") + public void downloadById(@RequestParam(name="id",required=true) String id, HttpServletResponse response) throws IOException { + KmSysDbBackup kmSysDbBackup = kmSysDbBackupService.getById(id); + if(kmSysDbBackup==null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + assert kmSysDbBackup != null; + String filePath = kmSysDbBackup.getFilePath(); + if(oConvertUtils.isEmpty(filePath)){ + return; + } + // 其余处理略 + InputStream inputStream = null; + OutputStream outputStream = null; + try { + File file = new File(filePath); + if(!file.exists()){ + response.setStatus(404); + throw new RuntimeException("文件["+filePath+"]不存在.."); + } + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.setContentType("application/octet-stream"); + response.addHeader("Access-Control-Expose-Headers","Content-disposition"); + response.addHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(kmSysDbBackup.getFileName(), "UTF-8")); + inputStream = new BufferedInputStream(new FileInputStream(filePath)); + outputStream = response.getOutputStream(); + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + response.flushBuffer(); + } catch (IOException e) { + log.error("下载备份文件失败" + e.getMessage()); + response.setStatus(404); + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "km_sys_db_backup-通过id删除") + @ApiOperation(value="km_sys_db_backup-通过id删除", notes="km_sys_db_backup-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + KmSysDbBackup kmSysDbBackup = kmSysDbBackupService.getById(id); + if(kmSysDbBackup==null) { + return Result.error("未找到对应数据"); + } + String filePath = kmSysDbBackup.getFilePath(); + File file = new File(filePath); + if (file.exists()) { + file.delete(); + } + kmSysDbBackupService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "km_sys_db_backup-批量删除") + @ApiOperation(value="km_sys_db_backup-批量删除", notes="km_sys_db_backup-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.kmSysDbBackupService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "km_sys_db_backup-通过id查询") + @ApiOperation(value="km_sys_db_backup-通过id查询", notes="km_sys_db_backup-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + KmSysDbBackup kmSysDbBackup = kmSysDbBackupService.getById(id); + if(kmSysDbBackup==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(kmSysDbBackup); + } + + + /** + * 添加 + * + * @param + * @return + */ + @AutoLog(value = "km_sys_db_backup-恢复") + @ApiOperation(value="km_sys_db_backup-恢复", notes="km_sys_db_backup-恢复") + @PostMapping(value = "/recover") + public Result recover(@RequestParam(name="id",required=true) String id) { + String dbType = CommonUtils.getDatabaseType(); + if (!dbType.equalsIgnoreCase("mysql")) { + return Result.error("只支持mysql数据库备份"); + } + if (oConvertUtils.isEmpty(dbBackupDir) || oConvertUtils.isEmpty(dbServerUrl) || oConvertUtils.isEmpty(dbServerUserName) || oConvertUtils.isEmpty(dbServerPassword)) { + return Result.error("备份配置缺失"); + } + KmSysDbBackup kmSysDbBackup = kmSysDbBackupService.getById(id); + if(kmSysDbBackup==null) { + return Result.error("未找到对应数据"); + } + + String filePath = kmSysDbBackup.getFilePath(); + + String temp = dbServerUrl.substring(dbServerUrl.indexOf("//")); + String dbServerIp = temp.substring(2,temp.indexOf(":")); + temp = temp.substring(temp.indexOf(":")); + String dbServerPort = temp.substring(1,temp.indexOf("/")); + temp = temp.substring(temp.indexOf("/")); + String dbName = temp.substring(1,temp.indexOf("?")); + + String cmd = "cmd /c mysqldump -u" + dbServerUserName + " -p" + dbServerPassword + " -h " + dbServerIp + " -P " + dbServerPort + " " + dbName +" < " + filePath; + //-u后的root为mysql数据库用户名,-p后接的123456为该用户密码,注意不要有空格;dbName填写需要备份数据的数据库名称,大于号后接生成文件路径 + try { + Process process = Runtime.getRuntime().exec(cmd); + boolean exitFlag = process.waitFor(10*60, TimeUnit.SECONDS); + if(exitFlag) { + int code = process.exitValue(); + log.info("code:"+code); + if(code == 0){ + log.info("【恢复数据库】成功,SQL文件:{}", kmSysDbBackup.getFileName()); + return Result.OK("恢复数据库成功!"); + }else { + return Result.error("命令执行失败,返回码:",code); + } + }else { + return Result.error("备份超时"); + } + }catch (Exception e){ + log.error("【恢复数据库】失败:{}", e.getMessage()); + return Result.error(e.getMessage()); + } + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDoc.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDoc.java new file mode 100644 index 0000000000000000000000000000000000000000..c84b09f41f2f067319ec787671aff5c9666acf5c --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDoc.java @@ -0,0 +1,158 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import java.math.BigInteger; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +@TableName("km_doc") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc对象", description="km_doc") +public class KmDoc implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**fileId*/ + @Excel(name = "fileId", width = 15) + @ApiModelProperty(value = "fileId") + private String fileId; + /**previewFileId*/ + @Excel(name = "previewFileId", width = 15) + @ApiModelProperty(value = "previewFileId") + private String previewFileId; + /**originalPreviewFileId*/ + @Excel(name = "originalPreviewFileId", width = 15) + @ApiModelProperty(value = "originalPreviewFileId") + private String originalPreviewFileId; + private String indexId; + /**orgCode*/ + @Excel(name = "orgCode", width = 15) + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "org_code") + @ApiModelProperty(value = "orgCode") + private String orgCode; + /**depId*/ + @Excel(name = "depId", width = 15) + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + @ApiModelProperty(value = "depId") + private String depId; + /**fileSize*/ + @Excel(name = "fileSize", width = 15) + @ApiModelProperty(value = "fileSize") + private Long fileSize; + /**name*/ + @Excel(name = "name", width = 15) + @ApiModelProperty(value = "name") + private String name; + /**title*/ + @Excel(name = "title", width = 15) + @ApiModelProperty(value = "title") + private String title; + /**favourites*/ + @Excel(name = "favourites", width = 15) + @ApiModelProperty(value = "favourites") + private BigInteger favourites; + /**serialNumber*/ + @Excel(name = "serialNumber", width = 15) + @ApiModelProperty(value = "serialNumber") + private String serialNumber; + /**fileType*/ + @Excel(name = "fileType", width = 15) + @ApiModelProperty(value = "fileType") + private String fileType; + /**status*/ + @Excel(name = "status", width = 15) + @ApiModelProperty(value = "status") + private Integer status; + /**category*/ + @Excel(name = "category", width = 15) + @ApiModelProperty(value = "category") + @Dict(dicCode = "km_dict_category") + private String category; + /**keywords*/ + @Excel(name = "keywords", width = 15) + @ApiModelProperty(value = "keywords") + private String keywords; + /**ftiFlag*/ + @Excel(name = "ftiFlag", width = 15) + @ApiModelProperty(value = "ftiFlag") + @Dict(dicCode = "dict_fti_flag") + private Integer ftiFlag; + /**convertFlag*/ + @Excel(name = "convertFlag", width = 15) + @ApiModelProperty(value = "convertFlag") + private Integer convertFlag; + /**releaseFlag*/ + @Excel(name = "releaseFlag", width = 15) + @ApiModelProperty(value = "releaseFlag") + private Integer releaseFlag; + /**downloadFlag*/ + @Excel(name = "downloadFlag", width = 15) + @ApiModelProperty(value = "downloadFlag") + @Dict(dicCode = "dict_downloadFlag") + private Integer downloadFlag; + /**downloads*/ + @Excel(name = "downloads", width = 15) + @ApiModelProperty(value = "downloads") + private BigInteger downloads; + /**comments*/ + @Excel(name = "comments", width = 15) + @ApiModelProperty(value = "comments") + private BigInteger comments; + /**views*/ + @Excel(name = "views", width = 15) + @ApiModelProperty(value = "views") + private BigInteger views; + /**lastUpdateBy*/ + @Excel(name = "lastUpdateBy", width = 15) + @ApiModelProperty(value = "lastUpdateBy") + private String lastUpdateBy; + /**lastUpdateTime*/ + @Excel(name = "lastUpdateTime", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "lastUpdateTime") + private Date lastUpdateTime; + /**createBy*/ + @ApiModelProperty(value = "createBy") + private String createBy; + /**createTime*/ + @Excel(name = "createTime", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTime") + private Date createTime; + /**processMsg*/ + @Excel(name = "processMsg", width = 15) + @ApiModelProperty(value = "processMsg") + private String processMsg; + /**publicRemark*/ + @Dict(dicCode = "dict_public_remark") + @Excel(name = "publicRemark", width = 15) + @ApiModelProperty(value = "publicRemark") + private Integer publicRemark; + /**remark*/ + @Excel(name = "remark", width = 15) + @ApiModelProperty(value = "remark") + private String remark; + /**currentVersion*/ + @Excel(name = "currentVersion", width = 15) + @ApiModelProperty(value = "currentVersion") + private Integer currentVersion; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocBusinessType.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocBusinessType.java new file mode 100644 index 0000000000000000000000000000000000000000..d7f7338c3ed088338dbdbbd442bc3446bec74d66 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocBusinessType.java @@ -0,0 +1,34 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@TableName("km_doc_business_type") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc_business_type对象", description="km_doc_business_type") +public class KmDocBusinessType implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**id*/ + @Excel(name = "id", width = 15) + @ApiModelProperty(value = "id") + private java.lang.String docId; + /**businessType*/ + @Excel(name = "businessType", width = 15) + @ApiModelProperty(value = "businessType") + private java.lang.String businessType; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocComments.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocComments.java new file mode 100644 index 0000000000000000000000000000000000000000..a25faf5d2e6cd7eb1fd5c2b9b80dea93e6745207 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocComments.java @@ -0,0 +1,50 @@ +package org.jeecg.modules.KM.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("km_doc_comments") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc_comments对象", description="km_doc_comments对象") +public class KmDocComments implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**docid*/ + @Excel(name = "id", width = 15) + @ApiModelProperty(value = "id") + private String docId; + /**create_time*/ + @Excel(name = "create_time", width = 15) + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "id") + private Date createTime; + /**create_by*/ + @Excel(name = "create_by", width = 15) + @ApiModelProperty(value = "id") + private String createBy; + /**comment*/ + @Excel(name = "comment", width = 15) + @ApiModelProperty(value = "comment") + private String comment; + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocFavourite.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocFavourite.java new file mode 100644 index 0000000000000000000000000000000000000000..74965fd61b77f4c57988b03c0b8e1d910b494b9e --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocFavourite.java @@ -0,0 +1,42 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@TableName("km_doc_favourite") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc_favourite对象", description="km_doc_favourite") +public class KmDocFavourite implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**userId*/ + @Excel(name = "userId", width = 15) + @ApiModelProperty(value = "userId") + private String userId; + /**docId*/ + @Excel(name = "docId", width = 15) + @ApiModelProperty(value = "docId") + private String docId; + /**addTime*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "addTime") + private Date addTime; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocTopicType.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocTopicType.java new file mode 100644 index 0000000000000000000000000000000000000000..8dcba78c27690924c27cbfc3b886b51822a1010a --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocTopicType.java @@ -0,0 +1,34 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@TableName("km_doc_topic_type") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc_topic_type对象", description="km_doc_topic_type") +public class KmDocTopicType implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**id*/ + @Excel(name = "id", width = 15) + @ApiModelProperty(value = "id") + private String docId; + /**topicId*/ + @Excel(name = "topicId", width = 15) + @ApiModelProperty(value = "topicId") + private String topicId; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocVersion.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocVersion.java new file mode 100644 index 0000000000000000000000000000000000000000..6659063b75b3d53714cff0179c3410c7464e8489 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocVersion.java @@ -0,0 +1,58 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@TableName("km_doc_version") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc_version对象", description="km_doc_version") +public class KmDocVersion implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**docid*/ + @Excel(name = "id", width = 15) + @ApiModelProperty(value = "id") + private java.lang.String docId; + /**file_id*/ + @Excel(name = "file_id", width = 15) + @ApiModelProperty(value = "file_id") + private java.lang.String fileId; + /**version*/ + @Excel(name = "version", width = 15) + @ApiModelProperty(value = "version") + private java.lang.Integer version; + /**create_time*/ + @Excel(name = "create_time", width = 15) + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "id") + private Date createTime; + /**create_by*/ + @Excel(name = "create_by", width = 15) + @ApiModelProperty(value = "id") + private java.lang.String createBy; + /**comment*/ + @Excel(name = "comment", width = 15) + @ApiModelProperty(value = "comment") + private java.lang.String comment; + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocVisitRecord.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocVisitRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..91e69d63e777d99c7999a3061cb7ade21cc1aca2 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmDocVisitRecord.java @@ -0,0 +1,51 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@TableName("km_doc_visit_record") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_doc_visit_record对象", description="km_doc_visit_record") +public class KmDocVisitRecord implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**id*/ + @Excel(name = "id", width = 15) + @ApiModelProperty(value = "id") + private String docId; + /**1:上传 2:预览 3:下载 4:删除*/ + @Excel(name = "1:上传 2:预览 3:下载 4:删除", width = 15) + @ApiModelProperty(value = "1:上传 2:预览 3:下载 4:删除") + private Integer visitType; + private String keywords; + private String keywordsMax; + /**sourceIp*/ + @Excel(name = "sourceIp", width = 15) + @ApiModelProperty(value = "sourceIp") + private String sourceIp; + /**createBy*/ + @ApiModelProperty(value = "createBy") + private String createBy; + /**createTime*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTime") + private Date createTime; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmFile.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmFile.java new file mode 100644 index 0000000000000000000000000000000000000000..a063c496919a39d00502688c29719bc62b7062c3 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmFile.java @@ -0,0 +1,38 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@TableName("km_file") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_file对象", description="km_file") +public class KmFile implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**sha256*/ + @Excel(name = "sha256", width = 15) + @ApiModelProperty(value = "sha256") + private String sha256; + /**physicalPath*/ + @Excel(name = "physicalPath", width = 15) + @ApiModelProperty(value = "physicalPath") + private String physicalPath; + /**originalName*/ + @Excel(name = "originalName", width = 15) + @ApiModelProperty(value = "originalName") + private String originalName; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSearchRecord.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSearchRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..5e516d572144d97bbaf15b392ce0d739c31fddae --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSearchRecord.java @@ -0,0 +1,49 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@TableName("km_search_record") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_search_record对象", description="km_search_record") +public class KmSearchRecord implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**keywords*/ + @Excel(name = "keywords", width = 15) + @ApiModelProperty(value = "keywords") + private String keywords; + private String keywordsMax; + private String title; + private String content; + private String topicCodes; + /**sourceIp*/ + @Excel(name = "sourceIp", width = 15) + @ApiModelProperty(value = "sourceIp") + private String sourceIp; + /**createBy*/ + @ApiModelProperty(value = "createBy") + private String createBy; + /**createTime*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTime") + private Date createTime; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSysConfig.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSysConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..f50d4ad453ce622399bde8905878f0d9e82790e3 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSysConfig.java @@ -0,0 +1,46 @@ +package org.jeecg.modules.KM.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@TableName("km_sys_config") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_sys_config对象", description="km_sys_config") +public class KmSysConfig implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**itemCode*/ + @Excel(name = "itemCode", width = 15) + @ApiModelProperty(value = "itemCode") + private java.lang.String itemCode; + /**itemValue*/ + @Excel(name = "itemValue", width = 15) + @ApiModelProperty(value = "itemValue") + private java.lang.String itemValue; + /**itemName*/ + @Excel(name = "itemName", width = 15) + @ApiModelProperty(value = "itemName") + private java.lang.String itemName; + /**valueType*/ + @Excel(name = "valueType", width = 15) + @ApiModelProperty(value = "valueType") + private java.lang.String valueType; + /**valueOptions*/ + @Excel(name = "valueOptions", width = 15) + @ApiModelProperty(value = "valueOptions") + private java.lang.String valueOptions; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSysDbBackup.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSysDbBackup.java new file mode 100644 index 0000000000000000000000000000000000000000..3a17f2b7e652c3158c362b34c3f6b29e1e838d33 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/entity/KmSysDbBackup.java @@ -0,0 +1,48 @@ +package org.jeecg.modules.KM.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("km_sys_db_backup") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="km_sys_db_backup对象", description="数据库备份记录") +public class KmSysDbBackup implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**fileName*/ + @Excel(name = "fileName", width = 15) + @ApiModelProperty(value = "fileName") + private String fileName; + /**filePath*/ + @Excel(name = "filePath", width = 15) + @ApiModelProperty(value = "filePath") + private String filePath; + /**size*/ + @Excel(name = "size", width = 15) + @ApiModelProperty(value = "size") + private Long size; + /**createTime*/ + @Excel(name = "createTime", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "createTime") + private Date createTime; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/jobs/fileScanImportJob.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/jobs/fileScanImportJob.java new file mode 100644 index 0000000000000000000000000000000000000000..7da6e8225a3320fadc02b28ed8b9c05a3813dd3e --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/jobs/fileScanImportJob.java @@ -0,0 +1,92 @@ +package org.jeecg.modules.KM.jobs; + +import cn.hutool.core.date.DateTime; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.vo.DictModel; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.KM.VO.KmDocParamVO; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.service.IKmDocService; +import org.jeecg.modules.KM.service.IKmSysConfigService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +public class fileScanImportJob implements Job { + + @Autowired + private IKmSysConfigService sysConfigService; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private IKmDocService docService; + + private Map categoryMap = new HashMap<>(); + + @Override + public void execute(JobExecutionContext jobExecutionContext){ + log.info("{} - 扫描外部文件启动...", DateTime.now()); + String externalFileFolder = sysConfigService.getSysConfigValue(KMConstant.JobAutoScanFileBasePath); + if (oConvertUtils.isEmpty(externalFileFolder) ) { + log.error("扫描导入文件路径启动,但未配置扫描路径..."); + return; + } + File baseFolder = new File(externalFileFolder); + if (!baseFolder.exists() || !baseFolder.isDirectory()) { + log.error("配置的基础扫描路径错误..."); + return; + } + File[] listFiles = baseFolder.listFiles(); + if (listFiles == null || listFiles.length == 0) { + log.info("扫描外部文件,根目录为空"); + return; + } + initCategoryMap(); + for (File listFile : listFiles) { + if (listFile.isFile()) { + KmDocParamVO kmDocParamVO = new KmDocParamVO(); + Result result = docService.importExternalFile(listFile, kmDocParamVO); + }else { + scanAndImportFolder(listFile,listFile.getPath()); + } + } + + } + + private void scanAndImportFolder(File dir,String categoryPath){ + File[] listFiles = dir.listFiles(); + if (listFiles == null || listFiles.length == 0) { + return; + }else { + for (File file : listFiles) { + if (file.isFile()) { + KmDocParamVO kmDocParamVO = new KmDocParamVO(); + kmDocParamVO.setCategory(categoryMap.get(categoryPath)); + docService.importExternalFile(file,kmDocParamVO); + }else { + scanAndImportFolder(file,categoryPath); + } + } + } + } + + private void initCategoryMap(){ + List dictModelList = sysBaseAPI.queryDictItemList("km_dict_category"); + if (oConvertUtils.isNotEmpty(dictModelList) && dictModelList.size()>0) { + for (DictModel dictModel : dictModelList) { + if (!categoryMap.containsKey(dictModel.getText())) { + categoryMap.put(dictModel.getText(),dictModel.getValue()); + } + } + } + + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocBusinessTypeMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocBusinessTypeMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..dbb7139d95d631d35cd46eeae16d3e7f353ff7f5 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocBusinessTypeMapper.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.KM.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.KM.entity.KmDocBusinessType; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface KmDocBusinessTypeMapper extends BaseMapper { + + @Select("select business_type from km_doc_business_type where doc_id=#{id}") + List getBusinessTypes(@Param("id") String docId); + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocCommentsMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocCommentsMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..6a9ae523222122803d1d48c69cae6e8da874d44c --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocCommentsMapper.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.KM.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.KM.VO.KmDocCommentsVO; +import org.jeecg.modules.KM.entity.KmDocComments; + +import java.util.List; + +public interface KmDocCommentsMapper extends BaseMapper { + @Select("select * from km_doc_comments where doc_id=#{docId} order by create_time desc") + List getComments(@Param("docId") String docId); + @Select("select kdc.*,su.avatar from km_doc_comments kdc left join sys_user su on kdc.create_by=su.username where doc_id=#{kmDocComments.docId} order by create_time desc") + Page getPageList(Page page, KmDocComments kmDocComments); + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocFavouriteMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocFavouriteMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f78a8b43424edd66b47157b2b277669b0803a603 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocFavouriteMapper.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.KM.mapper; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.KM.VO.KmDocParamVO; +import org.jeecg.modules.KM.VO.KmDocVO; +import org.jeecg.modules.KM.entity.KmDocFavourite; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface KmDocFavouriteMapper extends BaseMapper { + + Page getPageList(Page page, + @Param("userId") String userId, + @Param("kmDocParamVO") KmDocParamVO kmDocParamVO, + @Param("dbType")String dbType, + @Param("orderBy") String orderBy); + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..19cc921698d9b618c4777a94e4354d01749d3bf3 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocMapper.java @@ -0,0 +1,37 @@ +package org.jeecg.modules.KM.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.KM.VO.KmDocParamVO; +import org.jeecg.modules.KM.VO.KmDocStatisticsVO; +import org.jeecg.modules.KM.VO.KmDocSummaryVO; +import org.jeecg.modules.KM.VO.KmDocVO; +import org.jeecg.modules.KM.entity.KmDoc; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +public interface KmDocMapper extends BaseMapper { + + Page getPageList(Page page, + @Param("userId") String userId, + @Param("kmDocParamVO") KmDocParamVO kmDocParamVO, + @Param("permissionSql")String permissionSql, + @Param("dbType")String dbType, + @Param("orderBy") String orderBy); + + KmDoc getKmDocByFileId(@Param("fileId") String fileId); + + Page queryTopicPageList(Page page,@Param("topicId") String topicId); + + Page queryKmDocStatistics(Page page,@Param("statisticsType") Integer statisticsType,@Param("dbType")String dbType); + List queryKmDocStatistics( @Param("statisticsType") Integer statisticsType, @Param("dbType")String dbType); + KmDocSummaryVO queryKmDocSummary(@Param("dbType")String dbType); + + @Select("SELECT count(0) FROM km_doc_topic_type kdtp join km_doc kd on kd.id = kdtp.doc_id where kd.status!=9 and topic_id=#{topidId} ") + Integer checkTopicOfDoc(@Param("topidId") String topidId); + @Select("SELECT count(0) FROM km_doc_business_type kdbt join km_doc kd on kd.id = kdbt.doc_id where kd.status!=9 and kdbt.business_type=#{businessType} ") + Integer checkBusinessTypeOfDoc(@Param("businessType") String businessType); + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocTopicTypeMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocTopicTypeMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..303be510ad5de3d6b2898fd3133e9a42cc826756 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocTopicTypeMapper.java @@ -0,0 +1,12 @@ +package org.jeecg.modules.KM.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.KM.entity.KmDocTopicType; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface KmDocTopicTypeMapper extends BaseMapper { + List getDocTopicCodes(@Param("docId") String docId); + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocVersionMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocVersionMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..2c923779a1049b40b839b2f67c7402bf99b06e1f --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocVersionMapper.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.KM.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.KM.entity.KmDocVersion; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +public interface KmDocVersionMapper extends BaseMapper { + @Select("select version from km_doc_version where doc_id=#{id}") + List getversions(@Param("id") String docId); + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocVisitRecordMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocVisitRecordMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..8f7fc6917c243c775ffd99a9eee11f97cf3d1f69 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmDocVisitRecordMapper.java @@ -0,0 +1,8 @@ +package org.jeecg.modules.KM.mapper; + +import org.jeecg.modules.KM.entity.KmDocVisitRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface KmDocVisitRecordMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmFileMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmFileMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..9d3fd9858c825e5476cb39da3e1f34e5ad85ef20 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmFileMapper.java @@ -0,0 +1,8 @@ +package org.jeecg.modules.KM.mapper; + +import org.jeecg.modules.KM.entity.KmFile; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface KmFileMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSearchRecordMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSearchRecordMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..5bc498a2acedbb61bbe7f029edeeffd53e2857d0 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSearchRecordMapper.java @@ -0,0 +1,8 @@ +package org.jeecg.modules.KM.mapper; + +import org.jeecg.modules.KM.entity.KmSearchRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface KmSearchRecordMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSysConfigMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSysConfigMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..81efa8d6b7359c408655daa8ba0833617b187064 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSysConfigMapper.java @@ -0,0 +1,9 @@ +package org.jeecg.modules.KM.mapper; + +import org.jeecg.modules.KM.entity.KmSysConfig; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface KmSysConfigMapper extends BaseMapper { + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSysDbBackupMapper.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSysDbBackupMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..8d17a7e8d0ad80d8a81b5e2a2efe2510a13a916b --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/KmSysDbBackupMapper.java @@ -0,0 +1,9 @@ +package org.jeecg.modules.KM.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.KM.entity.KmFile; +import org.jeecg.modules.KM.entity.KmSysDbBackup; + +public interface KmSysDbBackupMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocBusinessTypeMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocBusinessTypeMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..684a353deea9b20e259d57bbb545e0d1b2c4a13a --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocBusinessTypeMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocCommentsMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocCommentsMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..95d7b63c98c2b1daa2b23d217aa3bd940ff2c2a7 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocCommentsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocFavouriteMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocFavouriteMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a0d8fc2f8d423b8c1374f72266c23df46802dca --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocFavouriteMapper.xml @@ -0,0 +1,101 @@ + + + + + + + diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..fd2775052e6094ac2cd8cd93fc1c07eedd72f4b9 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocMapper.xml @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocTopicTypeMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocTopicTypeMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e55fbffe1ed0f48f8bb758085821d94fe91f35d --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocTopicTypeMapper.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocVersionMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocVersionMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..7242c8533528e7cca197fd44394a386750e675e1 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocVersionMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocVisitRecordMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocVisitRecordMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..9505c15fb749d59382e0a2560362abb316520997 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmDocVisitRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmFileMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmFileMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..01f9caa830da02f156bac117dd290561b878e7af --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmFileMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSearchRecordMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSearchRecordMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..e04d573e5d2aa288d0fcbdb2edd7a8ce5344dc84 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSearchRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSysConfigMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSysConfigMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..54edb6dc00cf39b4d1337d2b01ca0748066d0a53 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSysConfigMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSysDbBackup.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSysDbBackup.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f452849533be69bb2063839d033e37587254840 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmSysDbBackup.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmTopicTypeMapper.xml b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmTopicTypeMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..bf2ea485bc0bbd74c4769644553649d71570e76a --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/mapper/xml/KmTopicTypeMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/reader/ParagraphTextReader.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/reader/ParagraphTextReader.java new file mode 100644 index 0000000000000000000000000000000000000000..a36e00aeb509440de2caad2414c0567e20c20868 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/reader/ParagraphTextReader.java @@ -0,0 +1,143 @@ +package org.jeecg.modules.KM.reader; + +import cn.hutool.core.collection.ListUtil; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.springframework.ai.document.Document; +import org.springframework.ai.document.DocumentReader; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.util.StreamUtils; + +/** + * @Description: text文本段落读取 + * @Author: jay + * @Date: 2024/3/19 9:05 + * @Version: 1.0 + */ +public class ParagraphTextReader implements DocumentReader { + + public static final String CHARSET_METADATA = "charset"; + + public static final String SOURCE_METADATA = "source"; + + /** + * Input resource to load the text from. + */ + private final Resource resource; + + /** + * @return Character set to be used when loading data from the + */ + private Charset charset = StandardCharsets.UTF_8; + + /** + * 默认窗口大小,为1 + */ + private static final int DEFAULT_WINDOW_SIZE = 1; + + /** + * 窗口大小,为段落的数量,用于滚动读取 + */ + private int windowSize = DEFAULT_WINDOW_SIZE; + + public static final String START_PARAGRAPH_NUMBER = "startParagraphNumber"; + public static final String END_PARAGRAPH_NUMBER = "endParagraphNumber"; + + private final Map customMetadata = new HashMap<>(); + + public ParagraphTextReader(String resourceUrl) { + this(new DefaultResourceLoader().getResource(resourceUrl)); + } + + public ParagraphTextReader(Resource resource) { + Objects.requireNonNull(resource, "The Spring Resource must not be null"); + this.resource = resource; + } + + public ParagraphTextReader(String resourceUrl, int windowSize) { + this(new DefaultResourceLoader().getResource(resourceUrl), windowSize); + } + + public ParagraphTextReader(Resource resource, int windowSize) { + Objects.requireNonNull(resource, "The Spring Resource must not be null"); + this.resource = resource; + this.windowSize = windowSize; + } + + public void setCharset(Charset charset) { + Objects.requireNonNull(charset, "The charset must not be null"); + this.charset = charset; + } + + public Charset getCharset() { + return this.charset; + } + + /** + * Metadata associated with all documents created by the loader. + * + * @return Metadata to be assigned to the output Documents. + */ + public Map getCustomMetadata() { + return this.customMetadata; + } + + /** + * 读取文本内容,并根据换行进行分段,采用窗口模式,窗口为段落的数量 + * + * @return 文档信息列表 + */ + @Override + public List get() { + try { + + List readDocuments = new ArrayList(); + String document = StreamUtils.copyToString(this.resource.getInputStream(), this.charset); + + // Inject source information as a metadata. + this.customMetadata.put(CHARSET_METADATA, this.charset.name()); + this.customMetadata.put(SOURCE_METADATA, this.resource.getFilename()); + + List paragraphs = Arrays.asList(document.split("\n")); + + //采用窗口滑动读取 + int startIndex = 0; + int endIndex = startIndex + this.windowSize; + if (endIndex > paragraphs.size()) { + readDocuments.add(this.toDocument(paragraphs, startIndex + 1, paragraphs.size())); + } else { + for (; endIndex <= paragraphs.size(); startIndex++, endIndex++) { + readDocuments.add(this.toDocument(ListUtil.sub(paragraphs, startIndex, endIndex), startIndex + 1, endIndex)); + } + } + return readDocuments; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 封装段落成文档 + * + * @param paragraphList 段落内容列表 + * @param startParagraphNum 开始段落编码 + * @param endParagraphNum 结束段落编码 + * @return 文档信息 + */ + private Document toDocument(List paragraphList, int startParagraphNum, int endParagraphNum) { + Document doc = new Document(String.join("\n", paragraphList)); + doc.getMetadata().putAll(this.customMetadata); + doc.getMetadata().put(START_PARAGRAPH_NUMBER, startParagraphNum); + doc.getMetadata().put(END_PARAGRAPH_NUMBER, endParagraphNum); + return doc; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/DocumentService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/DocumentService.java new file mode 100644 index 0000000000000000000000000000000000000000..00397a7ad70256813974f51b0e5ab0fdf27cb621 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/DocumentService.java @@ -0,0 +1,167 @@ +package org.jeecg.modules.KM.service; + +import static org.jeecg.modules.KM.reader.ParagraphTextReader.END_PARAGRAPH_NUMBER; +import static org.jeecg.modules.KM.reader.ParagraphTextReader.START_PARAGRAPH_NUMBER; + +import cn.hutool.core.util.ArrayUtil; +import org.jeecg.modules.KM.reader.ParagraphTextReader; +import java.io.File; +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import org.springframework.ai.document.Document; +import org.springframework.ai.ollama.OllamaChatModel; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileUrlResource; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +/** + * @Description: 文档服务 + * @Author: jay + * @Date: 2024/3/18 10:02 + * @Version: 1.0 + */ +@Service +public class DocumentService { + + @Autowired + private VectorStore vectorStore; + + @Autowired + private OllamaChatModel ollamaChatModel; + + private static final String PATH = "/app/ragdemo/path"; + + /** + * 使用spring ai解析txt文档 + * + * @param file + * @throws MalformedURLException + */ + public void uploadDocument(MultipartFile file) { + //保存file到本地 + String textResource = file.getOriginalFilename(); + //判断文件是否是TXT + if (!textResource.endsWith(".txt")) { + throw new RuntimeException("只支持txt格式文件"); + } + String filepath = PATH + textResource; + File file1 = new File(filepath); + if (file1.exists()) { + throw new RuntimeException("文件已存在"); + } + try { + file.transferTo(file1); + } catch (Exception e) { + e.printStackTrace(); + } + List documentList = paragraphTextReader(file1); + vectorStore.add(documentList); + } + + private List paragraphTextReader(File file) { + List docs = null; + try { + ParagraphTextReader reader = new ParagraphTextReader(new FileUrlResource(file.toURI().toURL()), 5); + reader.getCustomMetadata().put("filename", file.getName()); + reader.getCustomMetadata().put("filepath", file.getAbsolutePath()); + docs = reader.get(); + } catch (Exception e) { + e.printStackTrace(); + } + return docs; + } + + /** + * 合并文档列表 + * + * @param documentList 文档列表 + * @return 合并后的文档列表 + */ + private List mergeDocuments(List documentList) { + List mergeDocuments = new ArrayList(); + //根据文档来源进行分组 + Map> documentMap = documentList.stream().collect(Collectors.groupingBy(item -> ((String) item.getMetadata().get("source")))); + for (Entry> docListEntry : documentMap.entrySet()) { + //获取最大的段落结束编码 + int maxParagraphNum = (int) docListEntry.getValue() + .stream().max(Comparator.comparing(item -> ((int) item.getMetadata().get(END_PARAGRAPH_NUMBER)))).get().getMetadata().get(END_PARAGRAPH_NUMBER); + //根据最大段落结束编码构建一个用于合并段落的空数组 + String[] paragraphs = new String[maxParagraphNum]; + //用于获取最小段落开始编码 + int minParagraphNum = maxParagraphNum; + for (Document document : docListEntry.getValue()) { + //文档内容根据回车进行分段 + String[] tempPs = document.getContent().split("\n"); + //获取文档开始段落编码 + int startParagraphNumber = (int) document.getMetadata().get(START_PARAGRAPH_NUMBER); + if (minParagraphNum > startParagraphNumber) { + minParagraphNum = startParagraphNumber; + } + //将文档段落列表拷贝到合并段落数组中 + System.arraycopy(tempPs, 0, paragraphs, startParagraphNumber - 1, tempPs.length); + } + //合并段落去除空值,并组成文档内容 + Document mergeDoc = new Document(ArrayUtil.join(ArrayUtil.removeNull(paragraphs), "\n")); + //合并元数据 + mergeDoc.getMetadata().putAll(docListEntry.getValue().get(0).getMetadata()); + //设置元数据:开始段落编码 + mergeDoc.getMetadata().put(START_PARAGRAPH_NUMBER, minParagraphNum); + //设置元数据:结束段落编码 + mergeDoc.getMetadata().put(END_PARAGRAPH_NUMBER, maxParagraphNum); + mergeDocuments.add(mergeDoc); + } + return mergeDocuments; + } + + /** + * 根据关键词搜索向量库 + * + * @param keyword 关键词 + * @return 文档列表 + */ + public List search(String keyword) { + return mergeDocuments(vectorStore.similaritySearch(keyword)); + } + + /** + * 问答,根据输入内容回答 + * + * @param message 输入内容 + * @return 回答内容 + */ + public String chat(String message) { + //查询获取文档信息 + List documents = search(message); + + //提取文本内容 + String content = documents.stream() + .map(Document::getContent) + .collect(Collectors.joining("\n")); + + //封装prompt并调用大模型 + String chatResponse = ollamaChatModel.call(getChatPrompt2String(message, content)); + return chatResponse; + } + + /** + * 获取prompt + * + * @param message 提问内容 + * @param context 上下文 + * @return prompt + */ + private String getChatPrompt2String(String message, String context) { + String promptText = """ + 请用仅用以下内容回答"%s": + %s + """; + return String.format(promptText, message, context); + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocBusinessTypeService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocBusinessTypeService.java new file mode 100644 index 0000000000000000000000000000000000000000..2f77b84a2f4ecd7b765857aafe4c77161aa0b0dd --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocBusinessTypeService.java @@ -0,0 +1,11 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.modules.KM.entity.KmDocBusinessType; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +public interface IKmDocBusinessTypeService extends IService { +// KmDocBusinessType getByDocIdAndBusinessType( String docId, String businessType); + + List getBusinessTypes(String docId); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocCommentsService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocCommentsService.java new file mode 100644 index 0000000000000000000000000000000000000000..058b813dcfef7ebf4fae42f217343ee8da16df64 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocCommentsService.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.KM.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.KM.VO.KmDocCommentsVO; +import org.jeecg.modules.KM.entity.KmDocComments; + +import java.util.List; + + +public interface IKmDocCommentsService extends IService { + + List getComments(String docId); + + Page queryPageList(Page page, KmDocComments kmDocComments); + + boolean save(KmDocComments kmDocComments); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocFavouriteService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocFavouriteService.java new file mode 100644 index 0000000000000000000000000000000000000000..a5ff3759f3c350b1688414a07641c4aa3abbad22 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocFavouriteService.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.KM.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.KM.VO.KmDocParamVO; +import org.jeecg.modules.KM.VO.KmDocVO; +import org.jeecg.modules.KM.entity.KmDocFavourite; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface IKmDocFavouriteService extends IService { + + Page queryPageList(Page page, String userId, KmDocParamVO kmDocParamVO,String orderBy); + + Result addFavouriteDoc(String docId); + + Result delFavouriteDoc(String docId); + + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocService.java new file mode 100644 index 0000000000000000000000000000000000000000..40c607fbdee86d32f3da3d20a813d925171119bc --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocService.java @@ -0,0 +1,89 @@ +package org.jeecg.modules.KM.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.vo.KmSearchResultObjVO; +import org.jeecg.modules.KM.VO.*; +import org.jeecg.modules.KM.entity.KmDoc; +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.KM.entity.KmFile; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.util.List; + + +public interface IKmDocService extends IService { + + Result updateOfficeFile(String docId, File file,String userName); + + Result saveDocToEs(KmDocEsVO kmDocEsVO, String indexId); + + Result deleteDocFromEs(String indexId); + + KmSearchResultObjVO searchESKmDoc(Page page, KmDocEsParamVO kmDocEsParamVO, HttpServletRequest req) throws IOException; + KmSearchResultObjVO checkDuplicateESKmDoc(Page page, KmDocEsParamVO kmDocEsParamVO, HttpServletRequest req) throws IOException; + + Page queryPageList(Page page, KmDocParamVO kmDocParamVO,String orderBy); + + //首页最新发布文档列表 + Page queryPublicPageList(Page page, KmDocParamVO kmDocParamVO,String orderBy); + + Result importExternalFile(File externalFile, KmDocParamVO kmDocParamVO); + + @Transactional + KmDoc saveDoc(KmFile kmFile, KmDocParamVO kmDocParamVO); + + void convertDocSync(KmDoc doc); + + void indexDocSync(KmDoc doc); + + void indexDocSyncBatch(List idList); + +// KmDoc saveDoc(KmFile kmFile,KmDoc kmDoc); + + KmDoc getDocByFileId(String fileId); + + void downloadKmDoc(String docId, HttpServletResponse response, HttpServletRequest req) throws IOException, ParseException; + + void viewKmDoc( String docId, HttpServletResponse response,HttpServletRequest req) throws IOException; + + Result editDraft(KmDocParamVO kmDocParamVO); + + Result editAndRelease(KmDocParamVO kmDocParamVO,HttpServletRequest req); + Result auditDoc(String id,HttpServletRequest req); + + Result editAuditPassed(KmDocParamVO kmdocTarget); + + Result editReleaseFlag(KmDoc kmdocTarget); + + Page queryTopicPageList(Page page,String topicId); + + Boolean checkCategoryOfDoc(String category); + + Boolean checkTopicOfDoc(String topidId); + + Boolean checkBusinessTypeOfDoc(String businessType); + + Result addDocToTopic(String topicId, List docIds); + + Result removeDocFromTopic( String topicId, String docId); + + Page queryKmDocStatistics(Page page,Integer statisticsType); + List queryKmDocStatistics(Integer statisticsType); + + Result auditDocImportedFile(String id); + + Result deleteDoc(String docId, HttpServletRequest req); + + KmDocEsVO getEsDocByDocId(String indexId); + + KmDocSummaryVO queryKmDocSummary(); + + List getReleasedDocs(); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocTopicTypeService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocTopicTypeService.java new file mode 100644 index 0000000000000000000000000000000000000000..7e1adec8b26628298bd53a898d32a576ca9116b2 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocTopicTypeService.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.modules.KM.entity.KmDocTopicType; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +public interface IKmDocTopicTypeService extends IService { + KmDocTopicType getByDocIdAndTopicId( String docId, String topicId); + + boolean removeDocFromAllTopics( String docId ); + + List getDocTopicCodes(String docId); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocVersionService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocVersionService.java new file mode 100644 index 0000000000000000000000000000000000000000..7d58fa7c83d546fe2ba1fb29d184288663c3c71e --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocVersionService.java @@ -0,0 +1,12 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.modules.KM.entity.KmDocVersion; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + + +public interface IKmDocVersionService extends IService { +// KmDocVersion getByDocIdAndVersion( String docId, String version); + + List getVersions(String docId); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocVisitRecordService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocVisitRecordService.java new file mode 100644 index 0000000000000000000000000000000000000000..246c3e42b5ffe841e8cbd21565615cdd28ee0704 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmDocVisitRecordService.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.modules.KM.entity.KmDocVisitRecord; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.IOException; +import java.util.List; + +public interface IKmDocVisitRecordService extends IService { + + void logVisit(String docId,String ip,Integer visitType); + void logVisit(String docId,String ip,Integer visitType,String keyword); + void logVisit(String docId,String ip,Integer visitType,String keyword,String userId); + + List recentlyVisitedDocs(String createBy) throws IOException; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmEsMgntService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmEsMgntService.java new file mode 100644 index 0000000000000000000000000000000000000000..7bcff8c6d20df80996bd52f52059d4988659d880 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmEsMgntService.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.common.api.vo.Result; +import java.io.IOException; + +public interface IKmEsMgntService { + + Result initTemplateAndSyncDocs() throws IOException; + + //为初始化索引 + void initEXIndex(); + + Result syncReleasedDocToES() throws IOException; + + Result initKmDocTemplate() throws IOException; + + Result initKmDocVisitTemplate() throws IOException ; + + Result initKmSearchRecordTemplate() throws IOException ; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmFileService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmFileService.java new file mode 100644 index 0000000000000000000000000000000000000000..0b63eff7e728e8f3814ca43d260cf507c7b4e197 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmFileService.java @@ -0,0 +1,28 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.modules.KM.entity.KmFile; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; + +public interface IKmFileService extends IService { + + KmFile saveFile(MultipartFile file); + + KmFile transferExternalFile(File file); + + KmFile transferExternalFile(String content, String suffix); + + KmFile saveFileInfoToDB(String physicalPath,String fileName); + + KmFile getKmFileBySha256(String sha256); + + KmFile getKmFile(String fileId); + + String readKmFileString(String fileId); + + boolean deleteKmFile(String fileId); + + boolean exist(String fileId); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSearchRecordService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSearchRecordService.java new file mode 100644 index 0000000000000000000000000000000000000000..27ffed1cf3bbf245701e4353a39ff164590db1b8 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSearchRecordService.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.common.system.vo.SysCategoryModel; +import org.jeecg.modules.KM.entity.KmSearchRecord; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.IOException; +import java.util.List; + +public interface IKmSearchRecordService extends IService { + + void logSearch(String keyword,String title,String content,String topicCode,String ip); + + List hotKeywordReport() throws IOException; + List hotTopicReport() ; + List retriveHotTopic() throws IOException; +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSysConfigService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSysConfigService.java new file mode 100644 index 0000000000000000000000000000000000000000..78287f103cd9247fc42a4eb037c9282ba6152e62 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSysConfigService.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.KM.service; + +import org.jeecg.modules.KM.entity.KmSysConfig; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; +import java.util.Map; + +public interface IKmSysConfigService extends IService { + + String getSysConfigValue(String sysConfigCode); + List querySiteInfo(); + + Map queryAllConfig(); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSysDbBackupService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSysDbBackupService.java new file mode 100644 index 0000000000000000000000000000000000000000..82e78a3d4e12c0130c6d70b692427face496a5ea --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IKmSysDbBackupService.java @@ -0,0 +1,10 @@ +package org.jeecg.modules.KM.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.KM.entity.KmFile; +import org.jeecg.modules.KM.entity.KmSysDbBackup; +import org.springframework.web.multipart.MultipartFile; + +public interface IKmSysDbBackupService extends IService { + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IThreadPoolExecutorService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IThreadPoolExecutorService.java new file mode 100644 index 0000000000000000000000000000000000000000..4780cfa6cbdb96adec7f70ca94a61befcaa7c19c --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/IThreadPoolExecutorService.java @@ -0,0 +1,8 @@ +package org.jeecg.modules.KM.service; + + +public interface IThreadPoolExecutorService { + void singleExecute(Runnable runnable); + + void execute(Runnable runnable); +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocBusinessTypeServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocBusinessTypeServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..9ef4dd1eeb55451908092bfcfdb7d47d50d1853e --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocBusinessTypeServiceImpl.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.KM.service.impl; + +import org.jeecg.modules.KM.entity.KmDocBusinessType; +import org.jeecg.modules.KM.mapper.KmDocBusinessTypeMapper; +import org.jeecg.modules.KM.service.IKmDocBusinessTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + +@Service +public class KmDocBusinessTypeServiceImpl extends ServiceImpl implements IKmDocBusinessTypeService { + @Autowired + private KmDocBusinessTypeMapper kmDocBusinessTypeMapper; + + + @Override + public List getBusinessTypes(String docId){ + return kmDocBusinessTypeMapper.getBusinessTypes(docId); + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocCommentsServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocCommentsServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f744b81f00d73c8cf18a2d6b1fe703ac6d193c73 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocCommentsServiceImpl.java @@ -0,0 +1,63 @@ +package org.jeecg.modules.KM.service.impl; + +import cn.hutool.core.date.DateTime; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.modules.KM.VO.KmDocCommentsVO; +import org.jeecg.modules.KM.VO.KmDocVO; +import org.jeecg.modules.KM.entity.KmDoc; +import org.jeecg.modules.KM.entity.KmDocComments; +import org.jeecg.modules.KM.mapper.KmDocCommentsMapper; +import org.jeecg.modules.KM.service.IKmDocCommentsService; +import org.jeecg.modules.KM.service.IKmDocService; +import org.jeecg.modules.KM.service.IKmDocVersionService; +import org.jeecg.modules.KM.service.IKmFileService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigInteger; +import java.util.List; + + +@Service +public class KmDocCommentsServiceImpl extends ServiceImpl implements IKmDocCommentsService { + + @Autowired + private KmDocCommentsMapper kmDocCommentsMapper; + + @Autowired + private IKmDocService kmDocService; + + @Override + public List getComments(String docId){ + return kmDocCommentsMapper.getComments(docId); + } + + @Override + public Page queryPageList(Page page, KmDocComments kmDocComments){ + Page pageList = kmDocCommentsMapper.getPageList(page, kmDocComments); + + return pageList; + } + + @Override + public boolean save(KmDocComments kmDocComments){ + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return false; + String userId = sysUser.getUsername(); + + kmDocComments.setCreateBy(userId); + kmDocComments.setCreateTime(DateTime.now()); + + kmDocCommentsMapper.insert(kmDocComments); + KmDoc kmdoc = kmDocService.getById(kmDocComments.getDocId()); + if (kmdoc != null) { + kmdoc.setComments(kmdoc.getComments() == null? BigInteger.valueOf(1) : kmdoc.getComments().add( BigInteger.valueOf(1)) ); + } + kmDocService.updateById(kmdoc); + return true; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocFavouriteServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocFavouriteServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..aa84c00edceed4909ba8cdebca520ea65a47e09f --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocFavouriteServiceImpl.java @@ -0,0 +1,99 @@ +package org.jeecg.modules.KM.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.CommonUtils; +import org.jeecg.common.util.DateUtils; +import org.jeecg.modules.KM.VO.KmDocParamVO; +import org.jeecg.modules.KM.VO.KmDocVO; +import org.jeecg.modules.KM.entity.KmDoc; +import org.jeecg.modules.KM.entity.KmDocFavourite; +import org.jeecg.modules.KM.mapper.KmDocFavouriteMapper; +import org.jeecg.modules.KM.service.IKmDocFavouriteService; +import org.jeecg.modules.KM.service.IKmDocService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigInteger; + +@Service +public class KmDocFavouriteServiceImpl extends ServiceImpl implements IKmDocFavouriteService { + + @Autowired + private KmDocFavouriteMapper kmDocFavouriteMapper; + + @Autowired + private IKmDocService kmDocService; + @Override + public Page queryPageList(Page page, String userId, KmDocParamVO kmDocParamVO,String orderBy){ + String dbType = CommonUtils.getDatabaseType(); + return kmDocFavouriteMapper.getPageList(page,userId,kmDocParamVO,dbType,orderBy); + + } + + /* + 增加收藏文档 + */ + @Override + public Result addFavouriteDoc(String docId){ + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser != null){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(KmDocFavourite::getUserId,sysUser.getId()); + queryWrapper.eq(KmDocFavourite::getDocId,docId); + if(this.count(queryWrapper) >=1) { + Long count = this.count(queryWrapper); + return Result.error("已经收藏的文档无需再次收藏"); + } + + KmDocFavourite kmDocFavourite = new KmDocFavourite(); + kmDocFavourite.setUserId(sysUser.getId()); + kmDocFavourite.setDocId(docId); + kmDocFavourite.setAddTime(DateUtils.getDate()); + if(super.save(kmDocFavourite)) { + KmDoc kmDoc = kmDocService.getById(kmDocFavourite.getDocId()); + if (kmDoc != null) { + kmDoc.setFavourites(kmDoc.getFavourites() == null ? BigInteger.valueOf(1) : kmDoc.getFavourites().add(BigInteger.valueOf(1))); + kmDocService.updateById(kmDoc); + } + return Result.OK(); + } + else + return Result.error("保存数据失败"); + } + else + return Result.error("获取登录信息异常"); + } + + /* + 删除收藏文档 + */ + @Override + public Result delFavouriteDoc(String docId){ + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser != null){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(KmDocFavourite::getUserId,sysUser.getId()); + queryWrapper.eq(KmDocFavourite::getDocId,docId); + if(this.count(queryWrapper) !=1) + return Result.error("数据异常"); + if(kmDocFavouriteMapper.delete(queryWrapper)>0) { + KmDoc kmDoc = kmDocService.getById(docId); + if (kmDoc != null) { + kmDoc.setFavourites(kmDoc.getFavourites() == null ? BigInteger.valueOf(1) : kmDoc.getFavourites().subtract(BigInteger.valueOf(1))); + kmDocService.updateById(kmDoc); + } + return Result.OK(); + } + else + return Result.error("删除数据失败"); + } + else + return Result.error("获取登录信息异常"); + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3946be6222e139f1528a173797b2d426b18d4cdf --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocServiceImpl.java @@ -0,0 +1,1687 @@ +package org.jeecg.modules.KM.service.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONObject; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.opensearch.client.opensearch.indices.AnalyzeRequest; +import org.opensearch.client.opensearch.indices.AnalyzeResponse; +import org.opensearch.client.opensearch.indices.analyze.AnalyzeToken; +import org.opensearch.client.opensearch._types.query_dsl.BoolQuery; +import org.opensearch.client.opensearch._types.query_dsl.Query; +import org.opensearch.client.opensearch._types.query_dsl.QueryBuilders; +import org.opensearch.client.opensearch._types.query_dsl.TermsQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchPhraseQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchQuery; +import org.opensearch.client.opensearch._types.query_dsl.RangeQuery; +import org.opensearch.client.opensearch._types.query_dsl.PrefixQuery; +import org.opensearch.client.opensearch._types.query_dsl.TermQuery; +import org.opensearch.client.opensearch._types.query_dsl.IdsQuery; +import org.opensearch.client.opensearch._types.FieldValue; +import org.opensearch.client.json.JsonData; +import org.opensearch.client.opensearch.core.SearchRequest; +import org.opensearch.client.opensearch.core.SearchResponse; +import org.opensearch.client.opensearch.core.UpdateRequest; +import org.opensearch.client.opensearch.core.UpdateResponse; +import org.opensearch.client.opensearch.core.search.Hit; +import org.opensearch.client.opensearch._types.Refresh; +import org.opensearch.client.opensearch._types.Time; +// https://www.javadoc.io/doc/org.opensearch.client/opensearch-java/latest/org/opensearch/client/opensearch/core/IndexRequest.html +import org.opensearch.client.opensearch.core.IndexRequest; +import org.opensearch.client.opensearch.core.IndexResponse; +import org.opensearch.client.opensearch.core.DeleteRequest; +import org.opensearch.client.opensearch.core.DeleteResponse; +import org.opensearch.client.opensearch.OpenSearchClient; + +import org.opensearch.client.opensearch._types.SortOrder; +import org.opensearch.client.opensearch._types.FieldSort; +import org.opensearch.client.opensearch.core.search.Highlight; +import org.opensearch.client.opensearch.core.search.HighlightField; + +import org.apache.commons.io.FilenameUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.vo.KmSearchResultObjVO; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.CommonUtils; +import org.jeecg.common.util.DateUtils; +//import org.jeecg.common.util.RedisUtil; +import org.jeecg.common.util.UUIDGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.KM.VO.*; +import org.jeecg.modules.KM.common.config.BaseConfig; +import org.jeecg.modules.KM.common.enums.*; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.common.rules.SerialNumberRule; +import org.jeecg.modules.KM.common.utils.*; +import org.jeecg.modules.KM.entity.*; +import org.jeecg.modules.KM.mapper.KmDocMapper; +import org.jeecg.modules.KM.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Service; +import java.io.*; +import java.math.BigInteger; +import java.net.URLEncoder; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Service +@Slf4j +public class KmDocServiceImpl extends ServiceImpl implements IKmDocService { + + //@Value("${files.docservice.url.site-ip}") + //private String docserviceSiteIp; + @Resource + private KmDocMapper kmDocMapper; + @Autowired + private IKmFileService kmFileService; + @Autowired + private IKmDocTopicTypeService kmDocTopicTypeService; + @Autowired + private BaseConfig baseConfig; + @Autowired + private IThreadPoolExecutorService executorService; + @Autowired + private OpenSearchClient openSearchClient; + @Autowired + private EsUtils esUtils; + @Autowired + private KMConstant kmConstant; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private DictUtils dictUtils; + @Autowired + private IKmDocBusinessTypeService kmDocBusinessTypeService; +// @Autowired +// private IKmDocVersionService kmDocVersionService; + @Autowired + private IKmDocVisitRecordService kmDocVisitRecordService; + @Autowired + private IKmSearchRecordService kmSearchRecordService; + @Autowired + private KMRedisUtils KMRedisUtils; + @Autowired + private IKmDocFavouriteService kmDocFavouriteService; + @Autowired + private IKmSysConfigService kmSysConfigService; + @Autowired + private IKmDocVersionService kmDocVersionService; + + private File M2F(MultipartFile file) throws Exception { + File f=File.createTempFile(UUID.randomUUID().toString(), "." + FilenameUtils.getExtension(file.getOriginalFilename())); + file.transferTo(f); + return f; + } + @SneakyThrows + private static MultipartFile fileToMultipartFile(File file) { + InputStream inputStream = new FileInputStream(file); + MultipartFile multipartFile = new MockMultipartFile(file.getName(), inputStream); + return multipartFile; + } + @Override + public Result updateOfficeFile(String docId, File file,String userName){ + Result result = new Result<>(); + KmDocParamVO kmDocParamVO = new KmDocParamVO(); + MultipartFile multipartFile = fileToMultipartFile(file); + //1、保存文件,生成新的kmfile + KmFile kmFile = kmFileService.saveFile(multipartFile); + + //2、给kmdoc更换文件 + result = updateDocFile(docId,kmFile.getId(),userName); + if(result.isSuccess()) { + //3、写日志 + kmDocVisitRecordService.logVisit(docId, + "", + DocVisitTypeEnum.UpdateFile.getCode(), + "", + userName); + } +// else{ +// kmFileService.deleteKmFile(kmFile.getId()); +// return Result.error("保存文档数据发生错误"); +// } + return result; + } + + + @Override + public Page queryPageList(Page page, KmDocParamVO kmDocParamVO,String orderBy){ + String permissionSql = QueryGenerator.installAuthJdbc(KmDocVO.class); + String dbType = CommonUtils.getDatabaseType(); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return null; + + String userId = sysUser.getId(); + //处理过滤source -> sourceList + if(kmDocParamVO.getDepId() != null && !kmDocParamVO.getDepId().isEmpty()) + kmDocParamVO.setDepIdList(Arrays.asList(kmDocParamVO.getDepId().split(","))); + //处理过滤source -> sourceList +// if(kmDocParamVO.getOrgCode() != null && !kmDocParamVO.getOrgCode().isEmpty()) +// kmDocParamVO.setSourceList(Arrays.asList(kmDocParamVO.getOrgCode().split(","))); + + return kmDocMapper.getPageList(page,userId,kmDocParamVO,permissionSql,dbType,orderBy); + } + + //查询首页的最近发布档案列表,公开范围 + @Override + public Page queryPublicPageList(Page page, KmDocParamVO kmDocParamVO,String orderBy) { + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return null; + + String departmentFilterEnabled = kmSysConfigService.getSysConfigValue("departmentFilterEnabled"); + if( departmentFilterEnabled != null + && departmentFilterEnabled.equals("1") + && !SecurityUtils.getSubject().isPermitted("DepartmentFilterIgnore") ){ + String orgCode = sysUser.getOrgCode(); + kmDocParamVO.setOrgCode(orgCode); + kmDocParamVO.setDepartmentFilterEnabled(true); + } + + + kmDocParamVO.setReleaseFlag(DocReleaseFlagEnum.Released.getCode()); + String userId = sysUser.getId(); + + String dbType = CommonUtils.getDatabaseType(); + Page pageList = kmDocMapper.getPageList(page, userId, kmDocParamVO, "", dbType, orderBy); +// if(!pageList.getRecords().isEmpty() && sysUser.getThirdType().equals(KMConstant.InnerUser)){ +// if(!pageList.getRecords().isEmpty()){ +// for (KmDocVO item:pageList.getRecords()) { +// item.setDownloadFlag(KMConstant.AllowDownload); +// } +// } + return pageList; +// return kmDocMapper.getPageList(page, userId, kmDocParamVO, "", dbType, orderBy); + } + + private Result updateDocFile(String docId,String fileId,String userName){ + Result result = new Result<>(); + KmDoc kmDoc = this.getById(docId); + if (kmDoc == null) { + return Result.error("doc not found"); + } + + //1、生成新的文档历史版本记录 + Integer newVersion = kmDoc.getCurrentVersion() == null? 1: kmDoc.getCurrentVersion()+1; + KmDocVersion kmDocVersion = new KmDocVersion(); + kmDocVersion.setDocId(docId); + kmDocVersion.setFileId(fileId); + kmDocVersion.setVersion(newVersion); + kmDocVersion.setCreateBy(userName); + kmDocVersion.setComment("Update"); + if (!kmDocVersionService.save(kmDocVersion)) { + return Result.error("save kmdoc version fail"); + } + //3、更新kmdoc记录 + kmDoc.setFileId(fileId); + kmDoc.setCurrentVersion(newVersion); + kmDoc.setLastUpdateTime(DateTime.now()); + kmDoc.setLastUpdateBy(userName); + this.updateById(kmDoc); + + //3、转pdf + renewPreviewDocSync(kmDoc); + + //4、如果已经发布,入库ES + if (kmDoc.getStatus().equals(DocStatusEnum.Passed.getCode())) { + ftiIndexDoc(kmDoc); + } + + return result; + } + + private void renewPreviewDocSync(KmDoc kmDoc){ + kmDoc.setConvertFlag(DocConvertFlagEnum.WaitConvert.getCode()); + convertDocSync(kmDoc); + } + + @Override + public Result importExternalFile(File externalFile, KmDocParamVO kmDocParamVO){ + KmFile kmFile = kmFileService.transferExternalFile(externalFile); + if (oConvertUtils.isNotEmpty(kmFile)) { + KmDoc kmDoc = saveDoc(kmFile, kmDocParamVO); + if (oConvertUtils.isNotEmpty(kmDoc)) { + return auditDocImportedFile(kmDoc.getId()); + } + } + return Result.error("未知错误"); + } + + @Override + @Transactional + public KmDoc saveDoc(KmFile kmFile, KmDocParamVO kmDocParamVO) { + KmDoc kmDoc =new KmDoc(); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + String userId = sysUser.getUsername(); + //传参 + kmDoc.setCategory(kmDocParamVO.getCategory()); + kmDoc.setKeywords(kmDocParamVO.getKeywords()); + if(kmDocParamVO.getDepId() !=null && kmDocParamVO.getDepId().isEmpty()) { + String depId = kmDocParamVO.getDepId(); + String orgCode = sysBaseAPI.queryDepartOrgCodeById(depId); + kmDoc.setDepId(depId); + kmDoc.setOrgCode(orgCode); + } + + kmDoc.setCreateBy(userId); + kmDoc.setCreateTime(DateUtils.getDate()); + kmDoc.setId(UUIDGenerator.generate()); + kmDoc.setDownloads(BigInteger.valueOf(0)); + kmDoc.setViews(BigInteger.valueOf(0)); + kmDoc.setSerialNumber(SerialNumberRule.generate()); + kmDoc.setStatus(DocStatusEnum.Draft.getCode()); + //默认为公开,并允许下载 +// kmDoc.setPublicRemark(DocPublicRemark.Public.getCode()); + kmDoc.setPublicRemark(kmDocParamVO.getPublicRemark()); + + kmDoc.setOrgCode(sysUser.getOrgCode()); + kmDoc.setDepId(sysUser.getDepartIds()); +// kmDoc.setPublicFlag(KMConstant.DocPublic); + kmDoc.setDownloadFlag(KMConstant.AllowDownload); + + //file properties + kmDoc.setFileId(kmFile.getId()); + File distFile = baseConfig.getFile(kmFile.getPhysicalPath()); + kmDoc.setFileType(StringUtils.getFileSuffix(kmFile.getOriginalName())); + kmDoc.setName(kmFile.getOriginalName()); + kmDoc.setTitle(kmFile.getOriginalName().substring(0,kmFile.getOriginalName().lastIndexOf("."))); + kmDoc.setFileSize(distFile.length()); + + //放在审批后再入库 + kmDoc.setStatus(DocStatusEnum.Draft.getCode()); + kmDoc.setReleaseFlag(DocReleaseFlagEnum.Off.getCode()); + kmDoc.setFtiFlag(DocFTIFlagEnum.WaitProcess.getCode()); + + //pdf文件自己就是预览文件 + if(kmDoc.getFileType().equals("pdf") ) { + kmDoc.setConvertFlag(DocConvertFlagEnum.NonConvert.getCode()); + kmDoc.setOriginalPreviewFileId(kmFile.getId()); + kmDoc.setPreviewFileId(kmFile.getId()); + } + else if(kmConstant.isConvertFileType(kmDoc.getFileType())){ + kmDoc.setConvertFlag(DocConvertFlagEnum.WaitConvert.getCode()); + + } + else { + //无需转换预览文件 + kmDoc.setConvertFlag(DocConvertFlagEnum.NonConvert.getCode()); + kmDoc.setOriginalPreviewFileId(""); + kmDoc.setPreviewFileId(""); + } + + kmDoc.setFtiFlag(DocFTIFlagEnum.WaitProcess.getCode()); + baseMapper.insert(kmDoc); + + if(kmDoc.getId() != null){ + if(kmDocParamVO.getBusinessTypeList()!=null && kmDocParamVO.getBusinessTypeList().size()>0) { + for (String businessType : kmDocParamVO.getBusinessTypeList()) { + KmDocBusinessType tmpKmDocBusinessType = new KmDocBusinessType(); + tmpKmDocBusinessType.setDocId(kmDoc.getId()); + tmpKmDocBusinessType.setBusinessType(businessType); + if (!kmDocBusinessTypeService.save(tmpKmDocBusinessType)){ + return kmDoc; + } + } + } + + if(kmDocParamVO.getAddTopicIdList()!=null && kmDocParamVO.getAddTopicIdList().size()>0){ + for (String topic : kmDocParamVO.getAddTopicIdList()) { + KmDocTopicType tmpKmDocTopicType = new KmDocTopicType(); + tmpKmDocTopicType.setTopicId(topic); + tmpKmDocTopicType.setDocId(kmDoc.getId()); + if(!kmDocTopicTypeService.save(tmpKmDocTopicType)){ + return kmDoc; + } + } + } + } + + //根据ConvertFlag进行转换处理 + if(kmDoc.getConvertFlag() == null || kmDoc.getConvertFlag() == DocConvertFlagEnum.WaitConvert.getCode()) { + executorService.singleExecute(() -> convertDocSync(kmDoc)); + } + return kmDoc; + } + + @Override + public void convertDocSync(KmDoc kmDoc) { +// kmDoc = super.getById(kmDoc.getId()); + if (kmDoc.getConvertFlag() != null && !kmDoc.getConvertFlag().equals(DocConvertFlagEnum.WaitConvert.getCode())) { + return; + } + log.info("开始转换文档:{}", kmDoc.getName()); + if (kmDoc == null) { + kmDoc.setConvertFlag(DocConvertFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[convertDocSync] doc is null"); + log.error("doc is null"); + } else { + KmFile KmFile = kmFileService.getKmFile(kmDoc.getFileId()); + if (KmFile == null) { + kmDoc.setConvertFlag(DocConvertFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[convertDocSync] upload file is null,fileId:" + kmDoc.getFileId()); + log.error("upload file is null,fileId:{}", kmDoc.getFileId()); + } else { + File file = baseConfig.getFile(KmFile.getPhysicalPath()); + if (file.exists()) { + File targetDir = new File(file.getParentFile(), "pdf"); + boolean result = OfficeUtils.convertPdf(baseConfig.getSofficePath(), file, targetDir); + if (!result) { + kmDoc.setConvertFlag(DocConvertFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[convertDocSync] 文档转换成pdf预览文件失败,路径:" + KmFile.getPhysicalPath()); + log.error("文档转换失败,{}", kmDoc.getName()); + } else { + String fileName = KmFile.getId() + ".pdf"; + String targetFilePath = targetDir.getPath() + KMConstant.fileSeparator + fileName; + KmFile kmFile = kmFileService.saveFileInfoToDB(targetFilePath, fileName); + if (kmFile != null) { + //转换成功 + kmDoc.setPreviewFileId(kmFile.getId()); + kmDoc.setOriginalPreviewFileId(kmFile.getId()); + kmDoc.setConvertFlag(DocConvertFlagEnum.Converted.getCode()); + log.info("文档转换成功,{}", kmDoc.getName()); + } else { + kmDoc.setConvertFlag(DocConvertFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg( "[convertDocSync] 保存预览文件信息到数据库失败:" + fileName); + log.error("保存转换文件信息到数据库失败", kmDoc.getName()); + } + } + } else { + kmDoc.setConvertFlag(DocConvertFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[convertDocSync] 文件不存在或打开文件失败,路径:" + KmFile.getPhysicalPath()); + log.error("文件不存在或打开文件失败,路径:{}", KmFile.getPhysicalPath()); + } + } + } + this.updateById(kmDoc); + } + + @Override + public void indexDocSyncBatch(List idList) { + executorService.singleExecute(() -> indexDocBatch(idList)); + } + + private void indexDocBatch(List idList) { + for (String id:idList) { + KmDoc kmDoc = super.getById(id); + if(kmDoc!= null){ + ftiIndexDoc(kmDoc); + } + } + } + + @Override + public void indexDocSync(KmDoc kmDoc) { + executorService.singleExecute(() -> ftiIndexDoc(kmDoc)); + } + + private void ftiIndexDoc(KmDoc kmDoc){ + ftiIndexDocBase( kmDoc,true); + } + private void ftiIndexDocBase(KmDoc kmDoc,boolean logError){ + kmDoc = super.getById(kmDoc.getId()); + log.info("index Task id:{},docName:{}",kmDoc.getId(),kmDoc.getName()); + if(kmDoc==null){ + if(logError){ + kmDoc.setFtiFlag(DocFTIFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[ftiIndexDoc] doc is null"); + } + }else { + KmFile KmFile = kmFileService.getKmFile(kmDoc.getFileId()); + if(KmFile==null){ + if(logError) { + kmDoc.setFtiFlag(DocFTIFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[ftiIndexDoc] upload file not exists,id:" + kmDoc.getId()); + log.error("入库ES失败,upload file not exists,id:{}", kmDoc.getId()); + } + }else { + KmDocEsVO kmDocEsVO = KmDocToEsVO(kmDoc); + kmDocEsVO.setReleaseFlag(DocReleaseFlagEnum.Released.getCode()); + File file = baseConfig.getFile(KmFile.getPhysicalPath()); + if (file != null && file.exists()) { + String content = ""; + if(kmConstant.isIndexFileType(kmDoc.getFileType())) { + content = TikaUtils.parseContent(file); + if (content == null) { + content = ""; + if(logError) { + kmDoc.setFtiFlag(DocFTIFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[ftiIndexDoc] tika解析文件内容为空,路径:" + file.getAbsolutePath()); + log.error("[ftiIndexDoc] tika解析文件内容为空,路径:{}", file.getAbsolutePath()); + } + } + else { + if(logError) { + kmDoc.setFtiFlag(DocFTIFlagEnum.Processed.getCode()); + } + } + } + else{ + if(logError) { + kmDoc.setFtiFlag(DocFTIFlagEnum.NonFTI.getCode()); + } + } + //保存提取的全文,准备入库ES + kmDocEsVO.setContent(content); + //保存数据到ES + Result result = this.saveDocToEs(kmDocEsVO,null); + if(result.getCode() == CommonConstant.SC_OK_200){ + kmDoc.setFtiFlag(DocFTIFlagEnum.Processed.getCode()); + kmDoc.setReleaseFlag(DocReleaseFlagEnum.Released.getCode()); + //保存ES的index id + kmDoc.setIndexId(result.getResult().toString()); + log.info("入库ES成功:{}",kmDocEsVO.getDocId()); + } + else{ + if(logError) { + kmDoc.setFtiFlag(DocFTIFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[ftiIndexDoc] 入库ES失败:" + result.getMessage()); + kmDoc.setReleaseFlag(DocReleaseFlagEnum.Off.getCode()); + log.error("入库ES失败,{}", result.getMessage()); + } + } + log.info("解析文件成功:{}",kmDocEsVO.getDocId()); + } else { + if(logError) { + kmDoc.setFtiFlag(DocFTIFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg("[ftiIndexDoc] 解析文件失败,文件不存在或打开文件失败,路径:" + KmFile.getPhysicalPath()); + log.error("解析文件失败,文件不存在或打开文件失败,路径:{}", KmFile.getPhysicalPath()); + } + } + } + } + //保存doc对象 + this.updateById(kmDoc); + } + @Override + public KmDoc getDocByFileId(String fileId){ + return kmDocMapper.getKmDocByFileId(fileId); + } + + private KmDocEsVO KmDocToEsVO(KmDoc kmDoc){ + KmDocEsVO kmDocEsVO = new KmDocEsVO(); + //kmDocEsVO.setIndexId(kmDoc.getIndexId()); + kmDocEsVO.setCategory(kmDoc.getCategory()); + kmDocEsVO.setDocId(kmDoc.getId()); + kmDocEsVO.setCreateTime(kmDoc.getCreateTime()); + kmDocEsVO.setTitle(kmDoc.getTitle()); + kmDocEsVO.setOrgCode(kmDoc.getOrgCode()); + kmDocEsVO.setReleaseFlag(kmDoc.getReleaseFlag()); +// kmDocEsVO.setFileNo(kmDoc.getFileNo()); +// kmDocEsVO.setPubTimeTxt(kmDoc.getPubTimeTxt()); + kmDocEsVO.setPublicRemark(kmDoc.getPublicRemark()); + if(kmDoc.getKeywords() != null) { + kmDocEsVO.setKeywords(kmDoc.getKeywords() + .replaceAll(" "," ") + .replaceAll(" "," ") + .replaceAll(" ",",") + .replaceAll(",",",") + .split(",")); + } + List docBusinessTypeList = kmDocBusinessTypeService.getBusinessTypes(kmDoc.getId()); + if(docBusinessTypeList != null && docBusinessTypeList.size()>0){ + kmDocEsVO.setBusinessTypes( + docBusinessTypeList.toArray(new String[docBusinessTypeList.size()])); + } + //改为从数据库获取 topicCode + List docTopicCodeList = kmDocTopicTypeService.getDocTopicCodes(kmDoc.getId()); + if(docTopicCodeList != null && docTopicCodeList.size()>0) { + kmDocEsVO.setTopicCodes( + docTopicCodeList.toArray(new String[docTopicCodeList.size()])); + } + + return kmDocEsVO; + } + + private Result saveDocToEs(KmDoc kmDocParam){ + KmDocEsVO kmDocEsVO = KmDocToEsVO(kmDocParam); + Result result = saveDocToEs(kmDocEsVO,kmDocParam.getIndexId()); + KmDoc kmDoc = super.getById(kmDocParam.getId()); + if(result.isSuccess()){ + if(result.getResult() != null && !result.getResult().toString().isEmpty() ){ + String newIndexId = result.getResult().toString(); + kmDoc.setIndexId(newIndexId); + } + kmDoc.setFtiFlag(DocFTIFlagEnum.Processed.getCode()); + } + else{ + kmDoc.setFtiFlag(DocFTIFlagEnum.Fail.getCode()); + kmDoc.setProcessMsg(result.getMessage()); + } + if(this.updateById(kmDoc)) { + return result; + } + else{ + return Result.error("保存文档数据到数据库失败"); + } + } + + @Override + public KmDocEsVO getEsDocByDocId(String docId){ + // I GIVE UP + return null; + } + + public static String generateId() { + // 生成一个随机的UUID + UUID uuid = UUID.randomUUID(); + + // 将UUID转换成字节数组 + byte[] uuidBytes = toByteArray(uuid); + + // 使用URL和文件名安全的Base64编码器进行编码 + String encoded = Base64.getUrlEncoder().withoutPadding().encodeToString(uuidBytes); + + return encoded; + } + + private static byte[] toByteArray(UUID uuid) { + long msb = uuid.getMostSignificantBits(); + long lsb = uuid.getLeastSignificantBits(); + byte[] array = new byte[16]; + + for (int i = 0; i < 8; i++) { + array[i] = (byte) (msb >>> 8 * (7 - i)); + } + for (int i = 8; i < 16; i++) { + array[i] = (byte) (lsb >>> 8 * (7 - i + 8)); + } + + return array; + } + @Override + public Result saveDocToEs(KmDocEsVO kmDocEsVO, String indexId) { + try { + boolean indexExistFlag = true ; + if(indexId != null && !indexId.isEmpty()) { + //通过索引id查询 + // 构建查询条件 + IdsQuery.Builder idsQueryBuilder = new IdsQuery.Builder() + .values(List.of(indexId)); + + // 构建搜索请求 + SearchRequest request = new SearchRequest.Builder() + .index(KMConstant.DocIndexAliasName) + .query(idsQueryBuilder.build()._toQuery()) + .timeout("10s") // 设置超时时间 + .build(); + + // 执行搜索请求并获取响应 + SearchResponse searchResponse = openSearchClient.search(request, KmDocEsVO.class); + if(searchResponse == null){ + return Result.error("从ES查询文档索引失败"); + } + else{ + long c = searchResponse.hits().total().value(); + if(c == 0){ + indexExistFlag = false; + } + else{ + //更新ES记录 + UpdateRequest updateRequest = new UpdateRequest.Builder() + .index(KMConstant.DocIndexAliasName) + .id(indexId) + .doc(kmDocEsVO) + .timeout(Time.of(t -> t.time(KMConstant.SaveTimeOutHours + "h"))) + .refresh(Refresh.WaitFor) + .build(); + UpdateResponse updateResponse = openSearchClient.update(updateRequest,KmDocEsVO.class); + //FIXME: not sure of the code. + if (!"updated".equalsIgnoreCase(updateResponse.result().toString())) { + return Result.error("更新ES发生错误,返回码[" + updateResponse.result().toString() + "]"); + } else { + return Result.OK(); + } + } + } + } + else{ + indexExistFlag = false; + } + + if(!indexExistFlag){ + // 生成随机ID + String customId = generateId(); // 使用UUID生成随机ID, 22bytes, < 32 bytes, which is mysql limited in mysql table. + //插入数据,index不存在则自动根据匹配到的template创建。index没必要每天创建一个,如果是为了灵活管理,最低建议每月一个 yyyyMM。 + IndexRequest indexRequest = new IndexRequest.Builder() + .index(KMConstant.DocIndexName) + .id(customId) + .document(kmDocEsVO) + .timeout(Time.of(t -> t.time(KMConstant.SaveTimeOutHours + "h"))) + .build(); + //考虑大文件,允许1小时超时时间,前提是异步执行入库ES + try{ + + IndexResponse response = openSearchClient.index(indexRequest); + if (!"created".equalsIgnoreCase(response.result().toString())) { + return Result.error("入库ES发生错误,返回码[" + response.result().toString() + "]"); + } else { + return Result.OK(customId); + } + }catch (Exception e){ + String searchFor = "created"; + + // 将两个字符串都转为小写后检查是否包含 + boolean containsIgnoreCase = e.getMessage().toLowerCase().contains(searchFor.toLowerCase()); + if(containsIgnoreCase){ + return Result.OK(customId); + }else{ + +ObjectMapper objectMapper = new ObjectMapper(); +String json = objectMapper.writeValueAsString(kmDocEsVO); +System.out.println("kmDocEsVO: " + json); // 打印 JSON 数据 + e.printStackTrace(); + return Result.error("ERROR:index to es exception:" + e.getMessage()); + } + } + } + else{ + return Result.error("未知错误"); + } + } + catch (Exception e){ + e.printStackTrace(); + return Result.error("操作ES发生异常:" + e.getMessage()); + } + } + + @Override + public Result deleteDocFromEs(String indexId){ + try { + // 构建查询 + Query query = new Query.Builder() + .ids(new IdsQuery.Builder().values(indexId).build()) + .build(); + + // 构建搜索请求 + SearchRequest searchRequest = new SearchRequest.Builder() + .index(KMConstant.DocIndexAliasName) + .query(query) + .timeout(String.format("%ss",KMConstant.SearchTimeOutSeconds)) + .build(); + + // 执行搜索 + SearchResponse searchResponse = openSearchClient.search(searchRequest, Object.class); + + // 检查搜索结果 + if (searchResponse.hits().total().value() == 0) { + return Result.OK(); + } else { + // 构建删除请求 + DeleteRequest deleteRequest = new DeleteRequest.Builder() + .index(KMConstant.DocIndexAliasName) + .id(indexId) + .timeout(Time.of(t -> t.time(KMConstant.SaveTimeOutHours + "h"))) + .refresh(Refresh.True) // 立即刷新 + .build(); + + // 执行删除 + DeleteResponse deleteResponse = openSearchClient.delete(deleteRequest); + + // 检查删除结果 + if (!"deleted".equalsIgnoreCase(deleteResponse.result().toString())) { + log.info("从OpenSearch删除文档失败:{}", indexId); + return Result.error("从OpenSearch删除文档发生错误,返回码[" + deleteResponse.result().toString() + "]"); + } else { + log.info("从OpenSearch删除文档成功:{}", indexId); + return Result.OK("从OpenSearch删除文档成功"); + } + } + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("操作OpenSearch发生异常:" + e.getMessage()); + } + } + + private List retrieveDocDbInfo(List kmDocEsVOList){ + if(kmDocEsVOList == null || kmDocEsVOList.isEmpty()) + return Collections.EMPTY_LIST; + //get info from DB + List docIdList = new ArrayList<>(); + kmDocEsVOList.forEach(e->{docIdList.add(e.getDocId());}); + List kmSearchResultVOList = new ArrayList<>(); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + if(sysUser == null) { + return kmSearchResultVOList; + } + else { + String userId = sysUser.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(KmDocFavourite::getDocId,docIdList); + queryWrapper.eq(KmDocFavourite::getUserId,userId); + List kmDocFavouriteList = kmDocFavouriteService.list(queryWrapper); + List favouritDocList = new ArrayList<>(); + if(kmDocFavouriteList != null && kmDocFavouriteList.size()>0){ + kmDocFavouriteList.forEach(e-> favouritDocList.add(e.getDocId())); + } + List kmDocList = super.listByIds(docIdList); + Map kmDocMap = new HashMap<>(); + kmDocList.forEach(e -> kmDocMap.put(e.getId(), e)); + kmDocEsVOList.forEach((e) -> { + KmSearchResultVO kmSearchResultVO = new KmSearchResultVO(); + kmSearchResultVO.setCategory(e.getCategory()); + kmSearchResultVO.setId(e.getDocId()); + kmSearchResultVO.setCreateTime(e.getCreateTime()); + kmSearchResultVO.setPublicRemark(e.getPublicRemark()); + kmSearchResultVO.setOrgCode(e.getOrgCode()); + kmSearchResultVO.setTitle(e.getTitle()); + kmSearchResultVO.setContent(e.getContent()); + if (e.getKeywords() != null) + kmSearchResultVO.setKeywords(StringUtils.concatListToString(Arrays.asList(e.getKeywords()))); + if (e.getTopicCodes() != null) + kmSearchResultVO.setTopicCodes(StringUtils.concatListToString(Arrays.asList(e.getTopicCodes()))); + if (e.getBusinessTypes() != null) + kmSearchResultVO.setBusinessTypes(StringUtils.concatListToString(Arrays.asList(e.getBusinessTypes()))); + //拼装db信息 + if (kmDocMap.containsKey(kmSearchResultVO.getId())) { + KmDoc one = kmDocMap.get(kmSearchResultVO.getId()); + kmSearchResultVO.setDownloads(one.getDownloads()); + kmSearchResultVO.setViews(one.getViews()); + kmSearchResultVO.setFileId(one.getFileId()); + kmSearchResultVO.setPreviewFileId(one.getPreviewFileId()); + kmSearchResultVO.setFileType(one.getFileType()); + kmSearchResultVO.setFileSize(one.getFileSize()); + kmSearchResultVO.setDownloadFlag(one.getDownloadFlag()); + kmSearchResultVO.setRemark(one.getRemark()); + kmSearchResultVO.setCreateBy(one.getCreateBy()); + } + //拼装收藏夹标记 + if(favouritDocList.contains(e.getDocId())) + kmSearchResultVO.setFavourite(1); + else + kmSearchResultVO.setFavourite(0); + + kmSearchResultVOList.add(kmSearchResultVO); + }); + return kmSearchResultVOList; + } + } + + private KmSearchRecord getParamKmSearchRecord(KmDocEsParamVO kmDocEsParamVO ){ + KmSearchRecord kmSearchRecord = new KmSearchRecord(); + if (kmDocEsParamVO.getTitle() != null && !kmDocEsParamVO.getTitle().isEmpty()) { + kmSearchRecord.setTitle(kmDocEsParamVO.getTitle()); + } + + // 关键字检索 + if (kmDocEsParamVO.getKeywords() != null && kmDocEsParamVO.getKeywords().size() > 0) { + kmSearchRecord.setKeywords(StringUtils.concatListToString(kmDocEsParamVO.getKeywords())); + } + //content + if (kmDocEsParamVO.getContent() != null && !kmDocEsParamVO.getContent().isEmpty()) { + kmSearchRecord.setContent(kmDocEsParamVO.getContent()); + } + return kmSearchRecord; + } + + private List getParamKeywords(KmDocEsParamVO kmDocEsParamVO ){ + List keywords = new ArrayList<>(); + if (kmDocEsParamVO.getTitle() != null && !kmDocEsParamVO.getTitle().isEmpty()) { + keywords.add(kmDocEsParamVO.getTitle()); + } + + // 关键字检索 + if (kmDocEsParamVO.getKeywords() != null && kmDocEsParamVO.getKeywords().size() > 0) { + keywords.addAll(kmDocEsParamVO.getKeywords().subList(0, kmDocEsParamVO.getKeywords().size())); + } + //content + if (kmDocEsParamVO.getContent() != null && !kmDocEsParamVO.getContent().isEmpty()) { + keywords.add(kmDocEsParamVO.getContent()); + } + return keywords; + } + + @Override + public Result editReleaseFlag(KmDoc kmdocTarget){ + KmDoc kmDocOrig = super.getById(kmdocTarget.getId()); + if(kmDocOrig == null) + return Result.error("找不到文档"); + if(kmDocOrig.getStatus() != DocStatusEnum.Passed.getCode() ) + return Result.error("文档状态不允许修改"); + + kmDocOrig.setReleaseFlag(kmdocTarget.getReleaseFlag()); + if(super.updateById(kmDocOrig)) { + return saveDocToEs(kmDocOrig); + } + else + return Result.error("修改失败"); + } + + @Override + @Transactional(rollbackFor=Exception.class,propagation = Propagation.REQUIRED) + public Result editAuditPassed(KmDocParamVO kmdocTarget) { + KmDoc kmDocOrig = super.getById(kmdocTarget.getId()); + if (kmDocOrig == null) + return Result.error("找不到文档"); + if (kmDocOrig.getStatus() != DocStatusEnum.Passed.getCode() ) + return Result.error("文档状态不允许修改"); + + Result result = edit(kmDocOrig,kmdocTarget); + if(result.getCode() == CommonConstant.SC_OK_200){ + if(kmdocTarget.getReleaseFlag() == DocReleaseFlagEnum.Released.getCode() ){ + //已经发布的,保存到ES. orgcode已被edit修改 + result = saveDocToEs(kmdocTarget); + if(result.getCode() != CommonConstant.SC_OK_200){ + //事务回滚 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return Result.error(result.getMessage()); + } + } + return Result.OK("修改成功"); + } + else { + //事务回滚 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return Result.error(result.getMessage()); + } + } + + @Override + @Transactional(rollbackFor=Exception.class,propagation = Propagation.REQUIRED) + public Result editDraft(KmDocParamVO kmdocTarget ) { + KmDoc kmDocOrig = super.getById(kmdocTarget.getId()); + if(kmDocOrig == null) + return Result.error("找不到文档"); + if(kmDocOrig.getStatus() != DocStatusEnum.Draft.getCode() + && kmDocOrig.getStatus() != DocStatusEnum.WaitAudit.getCode() + && kmDocOrig.getStatus() != DocStatusEnum.Reject.getCode() ) + return Result.error("文档状态不允许修改"); + + //两个参数,对比多值属性的交集,以增删子表数据 + Result result = edit(kmDocOrig,kmdocTarget); + if(result.getCode() != CommonConstant.SC_OK_200){ + //事务回滚 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return Result.error(result.getMessage()); + } + else + return Result.OK("修改成功"); + } + + //editAndRelease + @Override + @Transactional(rollbackFor=Exception.class,propagation = Propagation.REQUIRED) + public Result editAndRelease(KmDocParamVO kmdocTarget ,HttpServletRequest req) { + KmDoc kmDocOrig = super.getById(kmdocTarget.getId()); + if(kmDocOrig == null) + return Result.error("找不到文档"); + if(kmDocOrig.getStatus() != DocStatusEnum.WaitAudit.getCode() ) + return Result.error("文档状态不允许修改"); + + //两个参数,对比多值属性的交集,以增删子表数据 + Result result = edit(kmDocOrig,kmdocTarget); + if(result.getCode() != CommonConstant.SC_OK_200){ + //事务回滚 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return Result.error(result.getMessage()); + } + else { + return auditDoc(kmdocTarget.getId(),req); + } + } + + @Override + @Transactional(rollbackFor=Exception.class,propagation = Propagation.SUPPORTS) + public Result auditDoc(String id,HttpServletRequest req){ + KmDoc kmDoc = super.getById(id); + if(kmDoc !=null && kmDoc.getStatus().equals(DocStatusEnum.WaitAudit.getCode())){ + + kmDoc.setStatus(DocStatusEnum.Passed.getCode()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return Result.error("用户信息异常"); + + String userId = sysUser.getUsername(); + + kmDoc.setLastUpdateTime(DateUtils.getDate()); + kmDoc.setLastUpdateBy(userId); + if(super.updateById(kmDoc)) { + // 审核后才入库ES + indexDocSync(kmDoc); + + kmDocVisitRecordService.logVisit(id, + IpUtils.getIpAddr(req), + DocVisitTypeEnum.AuditPass.getCode()); + log.info("审核文档成功:{}",kmDoc.getName()); + + return Result.OK("审核成功!"); + } + } + return Result.error("审核失败!"); + } + + @Override + public Result auditDocImportedFile(String id){ + KmDoc kmDoc = super.getById(id); + kmDoc.setLastUpdateTime(DateUtils.getDate()); + if(super.updateById(kmDoc)) { + // 审核后才入库ES + indexDocSync(kmDoc); + return Result.OK("审核成功!"); + }else + return Result.error("审核失败!"); + } + + + //编辑doc + @Transactional(propagation= Propagation.SUPPORTS) + public Result edit(KmDoc kmDocOrig,KmDocParamVO kmDocParamVO) { +// KmDoc kmDocTarget = new KmDoc(); + KmDoc kmDocTarget = super.getById(kmDocOrig.getId()); + // 只允许部分字段可以修改 +// BeanUtils.copyProperties(kmDocOrig,kmDocTarget); + kmDocTarget.setTitle(kmDocParamVO.getTitle()); + kmDocTarget.setKeywords(kmDocParamVO.getKeywords()); + kmDocTarget.setCategory(kmDocParamVO.getCategory()); + kmDocTarget.setDownloadFlag(kmDocParamVO.getDownloadFlag()); + kmDocTarget.setPublicRemark(kmDocParamVO.getPublicRemark()); + kmDocTarget.setRemark(kmDocParamVO.getRemark()); +// kmDocTarget.setPubTimeTxt(kmDocParamVO.getPubTimeTxt()); +// kmDocTarget.setSource(kmDocParamVO.getSource()); +// kmDocTarget.setPublicFlag(kmDocParamVO.getPublicFlag()); +// kmDocTarget.setEffectTime(kmDocParamVO.getEffectTime()); +// kmDocTarget.setFileNo(kmDocParamVO.getFileNo()); + //目前传id,后端需要转换 + String depId = kmDocParamVO.getDepId(); + if(depId != null && !depId.isEmpty()) { + String orgCode = sysBaseAPI.queryDepartOrgCodeById(depId); + if(orgCode != null && !orgCode.isEmpty()) { + kmDocTarget.setOrgCode(orgCode); + kmDocTarget.setDepId(depId); + //前端orgcode不传,这里回传给调用方回写ES + kmDocParamVO.setOrgCode(orgCode); + } + } + //处理发布年份 +// String pubTimeTxt = kmDocTarget.getPubTimeTxt(); +// if(pubTimeTxt != null && pubTimeTxt.length()>0){ +// String pubTime = ""; +// if(pubTimeTxt.indexOf("/") >0 ){ +// pubTime = pubTimeTxt.substring(0,pubTimeTxt.indexOf("/")); +// kmDocTarget.setPubTime(pubTime); +// } +// else if( pubTimeTxt.indexOf("-") >0){ +// pubTime = pubTimeTxt.substring(0,pubTimeTxt.indexOf("-")); +// kmDocTarget.setPubTime(pubTime); +// } +// else{ +// if(pubTimeTxt.length()==4) +// kmDocTarget.setPubTime(pubTimeTxt); +// else +// return Result.error("发布日期格式错误"); +// } +// } + + if(kmDocParamVO.getRemoveBusinessTypeList()!=null && kmDocParamVO.getRemoveBusinessTypeList().size()>0) { + for (String businessType : kmDocParamVO.getRemoveBusinessTypeList()) { + //KmDocBusinessType tmpKmDocBusinessType = kmDocBusinessTypeService.getByDocIdAndBusinessType(kmDocOrig.getId(), businessType); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(KmDocBusinessType::getDocId,kmDocOrig.getId()); + queryWrapper.eq(KmDocBusinessType::getBusinessType,businessType); + KmDocBusinessType tmpKmDocBusinessType = kmDocBusinessTypeService.getOne(queryWrapper); + if (tmpKmDocBusinessType != null && !kmDocBusinessTypeService.removeById(tmpKmDocBusinessType)) + return Result.error("删除标签错误"); + } + } + if(kmDocParamVO.getAddBusinessTypeList()!=null && kmDocParamVO.getAddBusinessTypeList().size()>0) { + for (String businessType : kmDocParamVO.getAddBusinessTypeList()) { + KmDocBusinessType tmpKmDocBusinessType = new KmDocBusinessType(); + tmpKmDocBusinessType.setDocId(kmDocOrig.getId()); + tmpKmDocBusinessType.setBusinessType(businessType); + if (!kmDocBusinessTypeService.save(tmpKmDocBusinessType)) + return Result.error("保存标签错误"); + } + } + + + if(kmDocParamVO.getRemoveTopicIdList()!=null && kmDocParamVO.getRemoveTopicIdList().size()>0){ + for (String topic :kmDocParamVO.getRemoveTopicIdList()) { + //KmDocTopicType tmpKmDocTopicType = kmDocTopicTypeService.getByDocIdAndTopicId(kmDocOrig.getId(),topic); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(KmDocTopicType::getDocId,kmDocOrig.getId()); + queryWrapper.eq(KmDocTopicType::getTopicId,topic); + KmDocTopicType tmpKmDocTopicType = kmDocTopicTypeService.getOne(queryWrapper); + if(tmpKmDocTopicType!=null && !kmDocTopicTypeService.removeById(tmpKmDocTopicType)) + return Result.error("删除知识专题错误"); + } + } + if(kmDocParamVO.getAddTopicIdList()!=null && kmDocParamVO.getAddTopicIdList().size()>0){ + for (String topic : kmDocParamVO.getAddTopicIdList()) { + KmDocTopicType tmpKmDocTopicType = new KmDocTopicType(); + tmpKmDocTopicType.setTopicId(topic); + tmpKmDocTopicType.setDocId(kmDocOrig.getId()); + if(!kmDocTopicTypeService.save(tmpKmDocTopicType)) + return Result.error("保存知识专题数据错误"); + } + } + + if(super.updateById(kmDocTarget)) { + return Result.OK("编辑成功!"); + } + else + return Result.error("更新文档失败"); + } + + public Result deleteDoc(String docId,HttpServletRequest req){ + KmDoc kmDoc = this.getById(docId); +// if(kmDoc!= null && (kmDoc.getStatus().equals(DocStatusEnum.Draft.getCode()) +// || kmDoc.getStatus().equals(DocStatusEnum.Reject.getCode()))) { + if(kmDoc!= null) { + //先从ES删除,如果失败直接返回 + if( kmDoc.getStatus().equals(DocStatusEnum.Passed.getCode()) + && kmDoc.getIndexId() != null + && !kmDoc.getIndexId().isEmpty()){ + Result result = deleteDocFromEs(kmDoc.getIndexId()); + if(!result.isSuccess()) + return result; + } + + if (kmDoc.getFileId()!=null){ + kmFileService.deleteKmFile(kmDoc.getFileId()); + } + if (kmDoc.getPreviewFileId()!=null){ + kmFileService.deleteKmFile(kmDoc.getPreviewFileId()); + } + //逻辑删除 + kmDoc.setStatus(DocStatusEnum.Delete.getCode()); + boolean updateFlag = super.updateById(kmDoc); + if (updateFlag) { + log.info("删除文件成功;删除文档记录成功:{}",kmDoc.getName()); + //日志 + kmDocVisitRecordService.logVisit(docId, + IpUtils.getIpAddr(req), + DocVisitTypeEnum.Delete.getCode()); + + return Result.OK("删除成功!"); + } + + } + return Result.error("删除失败!"); + + } + + //流方式获取文件或预览文件 + private void getKmDoc( KmDoc kmDoc, HttpServletRequest httpServletRequest,HttpServletResponse response, String getMethod) throws IOException{ +// KmDoc kmDoc = super.getById(docId); +// if(kmDoc == null) { +// response.sendError(HttpStatus.NOT_FOUND.value(),"无效的文档"); +// return; +// } + + KmFile kmFile = null; + String filename = ""; + + if(getMethod.equals("Download") || getMethod.equals("Edit")) { + //进行权限控制 +// LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); +// if (sysUser == null ) { +// response.sendError(HttpStatus.UNAUTHORIZED.value(), "登录用户信息异常"); +// return; +// } +// if(sysUser.getThirdType() == null +// ||sysUser.getThirdType().equals(KMConstant.PublicUser)) { +// //如果是公众用户,下载条件:发布+上架+文档公开+允许下载 +// if (kmDoc.getStatus() != DocStatusEnum.Passed.getCode() +// && kmDoc.getReleaseFlag() != DocReleaseFlagEnum.Released.getCode() +// && kmDoc.getPublicFlag() != KMConstant.DocPublic +// && kmDoc.getDownloadFlag() != KMConstant.AllowDownload) { +// response.sendError(HttpStatus.FORBIDDEN.value(), "文档不允许下载"); +// return; +// } +// } + kmFile = kmFileService.getKmFile(kmDoc.getFileId()); + if(kmDoc.getTitle() != null && !kmDoc.getTitle().isEmpty()) + filename = kmDoc.getTitle() + "." + kmDoc.getFileType(); //根据title命名文件名 + else + filename = "未命名." + kmDoc.getFileType(); + } + else{ + if(kmDoc.getPreviewFileId() == null || kmDoc.getPreviewFileId().isEmpty()){ + response.sendError(HttpStatus.NOT_FOUND.value(), "预览文件不存在"); + return; + } + kmFile = kmFileService.getKmFile(kmDoc.getPreviewFileId()); + if(kmDoc.getTitle() != null && !kmDoc.getTitle().isEmpty()) + filename = kmDoc.getTitle() + ".pdf" ; //预览为pdf文件 + else + filename = "未命名.pdf" ; + } + + if(kmFile == null) { + response.sendError(HttpStatus.NOT_FOUND.value(),"文件没找到"); + return; + } + + String filePath = baseConfig.getFilePath(kmFile.getPhysicalPath()); + + InputStream inputStream =null; + ServletOutputStream outputStream = null; + try { + inputStream = new FileInputStream(filePath);// 文件的存放路径 +// response.reset(); + response.setContentType("application/octet-stream"); +// String filename = kmDoc.getTitle() + "." + kmDoc.getFileType(); //根据title命名文件名 + //解决跨域 +// response.addHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin")); +// response.addHeader("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE,OPTIONS"); +// response.addHeader("Access-Control-Allow-Credentials", "true"); +// response.addHeader("Access-Control-Allow-Headers", "*"); +// response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,token"); + response.addHeader("Access-Control-Max-Age", "600000"); + //response.setHeader("Content-Length", "" + kmDoc.getFileSize()); + + response.addHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.addHeader("Access-Control-Expose-Headers","Content-disposition"); + outputStream = response.getOutputStream(); + byte[] b = new byte[1024]; + int len; + //从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1 + while ((len = inputStream.read(b)) > 0) { + outputStream.write(b, 0, len); + } + outputStream.flush(); + response.flushBuffer(); + //更新下载数和view数 + if(getMethod.equals("Download")){ + kmDoc.setDownloads(kmDoc.getDownloads().add(BigInteger.valueOf(1))); + } + else if(getMethod.equals("View")){ + kmDoc.setViews(kmDoc.getViews().add(BigInteger.valueOf(1))); + } + super.updateById(kmDoc); + + }catch (FileNotFoundException e){ + response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(),"内部错误"); + response.flushBuffer(); + if(outputStream !=null) + outputStream.close(); + if(inputStream != null) + inputStream.close(); + + } finally { + response.flushBuffer(); + if(outputStream !=null) + outputStream.close(); + if(inputStream != null) + inputStream.close(); + } + } + + + //for onlyoffice editor + public void downloadDocOF(String docId, HttpServletResponse response, HttpServletRequest req) throws IOException, ParseException { + KmDoc kmDoc = super.getById(docId); + if(kmDoc == null) { + response.sendError(HttpStatus.NOT_FOUND.value(),"无效的文档"); + return; + } + // log.info("docserviceSiteIp:" + docserviceSiteIp); + log.info("req.getRemoteAddr():" + req.getRemoteAddr()); + boolean onlyOfficeDownloadFlag = false; // req.getRemoteAddr().equals(docserviceSiteIp); + //24小时下载次数限制:via redis,对院内用户不限制 + if(onlyOfficeDownloadFlag ){ + getKmDoc(kmDoc, req,response, "Edit"); + } + else{ + response.sendError(HttpStatus.FORBIDDEN.value(),"下载限制"); + } + } + //下载文件 + @SuppressWarnings("ALL") + public void downloadKmDoc(String docId, HttpServletResponse response, HttpServletRequest req) throws IOException, ParseException { + KmDoc kmDoc = super.getById(docId); + if(kmDoc == null) { + response.sendError(HttpStatus.NOT_FOUND.value(),"无效的文档"); + return; + } + + //进行权限控制 + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (sysUser == null ) { + response.sendError(HttpStatus.UNAUTHORIZED.value(), "登录用户信息异常"); + return; + } + //todo:根据文档的部门访问范围控制访问权限 + + //对onlyoffice服务器放行 + if (req.getRemoteAddr().equals("")) { + + } + //24小时下载次数限制:via redis,对院内用户不限制 + if(KMRedisUtils.validUserLimit(KMConstant.UserDownloadLimitPrefix,kmConstant.getDownloadLimit(),Calendar.DATE,1)) { + //关键字处理 + Subject subject = SecurityUtils.getSubject(); + Session session = subject.getSession(); + Object keywordsObj = session.getAttribute("keywords"); + + getKmDoc(kmDoc, req,response, "Download"); + KMRedisUtils.refreshUserLimit(KMConstant.UserDownloadLimitPrefix,TimeUnit.DAYS,1); + + //日志 + String concatKeyword = ""; + if(keywordsObj !=null){ + List keywordsList = (List)keywordsObj; + concatKeyword = StringUtils.concatListToString(keywordsList); + } + kmDocVisitRecordService.logVisit(docId, + IpUtils.getIpAddr(req), + DocVisitTypeEnum.View.getCode(),concatKeyword); + } + else{ + response.sendError(HttpStatus.FORBIDDEN.value(),"24小时下载次数超过限制,请稍后再试"); + } + } + + //预览文件 + @SuppressWarnings("ALL") + public void viewKmDoc( String docId, HttpServletResponse response,HttpServletRequest req) throws IOException { + try { + KmDoc kmDoc = super.getById(docId); + if(kmDoc == null) { + response.sendError(HttpStatus.NOT_FOUND.value(),"无效的文档"); + return; + } + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (sysUser == null ) { + response.sendError(HttpStatus.UNAUTHORIZED.value(), "登录用户信息异常"); + return; + } + //todo:根据文档的部门访问范围控制访问权限 + + if(KMRedisUtils.validUserLimit(KMConstant.UserViewLimitPrefix,kmConstant.getViewLimit(),Calendar.SECOND,10)) { + //日志,关键字处理 + Subject subject = SecurityUtils.getSubject(); + Session session = subject.getSession(); + Object keywordsObj = session.getAttribute("keywords"); + + getKmDoc(kmDoc,req, response, "View"); + KMRedisUtils.refreshUserLimit(KMConstant.UserViewLimitPrefix, TimeUnit.SECONDS, 10); + + String concatKeyword = ""; + if(keywordsObj !=null){ + List keywordsList = (List)keywordsObj; + concatKeyword = StringUtils.concatListToString(keywordsList); + } + kmDocVisitRecordService.logVisit(docId, + IpUtils.getIpAddr(req), + DocVisitTypeEnum.View.getCode(), + concatKeyword); + } + else { + response.sendError(HttpStatus.FORBIDDEN.value(),"预览太频繁,请稍后再试"); + } + } catch (ParseException e) { + e.printStackTrace(); + } + + } + + @Override + public Page queryTopicPageList(Page page,String topicId){ + return kmDocMapper.queryTopicPageList(page,topicId); + } + + @Override + public Boolean checkCategoryOfDoc(String category){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.ne("status",9); + queryWrapper.eq("category",category); + Long selectCount = baseMapper.selectCount(queryWrapper); + return selectCount > 0; + } + + @Override + public Boolean checkTopicOfDoc(String topidId){ + Integer topicCountOfDoc = kmDocMapper.checkTopicOfDoc(topidId); + return topicCountOfDoc > 0; + } + + @Override + public Boolean checkBusinessTypeOfDoc(String businessType){ + Integer businessTypeOfDoc = kmDocMapper.checkBusinessTypeOfDoc(businessType); + return businessTypeOfDoc > 0; + } + @Override + public Result addDocToTopic( String topicId, List docIds) { + List failDocIds = new ArrayList<>(); + Integer failCount = 0; + if (docIds != null && docIds.size() > 0) { + for (String docId:docIds) { + if(kmDocTopicTypeService.getByDocIdAndTopicId(docId,topicId) != null) + { + failDocIds.add(docId); + failCount += 1; + } + else { + KmDoc kmDoc = this.getById(docId); + if (kmDoc == null) { + return Result.error("kmdoc not found"); + } + KmDocTopicType kmDocTopicType = new KmDocTopicType(); + kmDocTopicType.setDocId(docId); + kmDocTopicType.setTopicId(topicId); + if (!kmDocTopicTypeService.save(kmDocTopicType)) { + failDocIds.add(docId); + failCount += 1; + continue; + } + //保存km_doc到es + Result result = saveDocToEs(kmDoc); + if (!result.isSuccess()) { + failDocIds.add(docId); + failCount += 1; + } + } + } + } + if(failCount == docIds.size()) + return Result.error("全部失败"); + else { + String failTitles = ""; + for (int i = 0; i < failDocIds.size() ; i++) { + KmDoc oneDoc = super.getById(failDocIds.get(i)); + if(oneDoc != null) + failTitles = failTitles + oneDoc.getTitle() + ","; + } + if(failTitles.length()>0) + failTitles = failTitles.substring(0,failTitles.length()-1); + return Result.OK(failTitles); + } + } + + @Override + public Result removeDocFromTopic(String topicId,String docId){ + KmDocTopicType tmpKmDocTopicType = kmDocTopicTypeService.getByDocIdAndTopicId(docId,topicId); + if(tmpKmDocTopicType!=null && !kmDocTopicTypeService.removeById(tmpKmDocTopicType)) + return Result.error("删除知识专题错误"); + else { + KmDoc kmDoc = this.getById(docId); + if (kmDoc != null) { + return saveDocToEs(kmDoc); + } + } + return Result.OK(); + + } + + @Override + public Page queryKmDocStatistics(Page page,Integer statisticsType){ + String dbType = CommonUtils.getDatabaseType(); + return kmDocMapper.queryKmDocStatistics(page,statisticsType,dbType); + } + + @Override + public List queryKmDocStatistics(Integer statisticsType){ + String dbType = CommonUtils.getDatabaseType(); + return kmDocMapper.queryKmDocStatistics(statisticsType,dbType); + } + + @Override + public KmDocSummaryVO queryKmDocSummary(){ + String dbType = CommonUtils.getDatabaseType(); + return kmDocMapper.queryKmDocSummary(dbType); + } + + + @Override + public List getReleasedDocs(){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("status",2); + List kmDocList = kmDocMapper.selectList(queryWrapper); + return kmDocList; + } + + public KmSearchResultObjVO searchESKmDoc(Page page, KmDocEsParamVO kmDocEsParamVO, HttpServletRequest req) throws IOException { + Map parameterMap = req.getParameterMap(); + List kmDocEsVOList = new ArrayList<>(); + Page resultVOPage = new Page<>(page.getCurrent(), page.getSize()); + KmSearchResultObjVO kmSearchResultObjVO = new KmSearchResultObjVO(); + + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (sysUser == null) { + kmSearchResultObjVO.setSuccess(false); + kmSearchResultObjVO.setMessage("用户登陆信息异常"); + return kmSearchResultObjVO; + } + KmSearchRecord kmSearchRecord = new KmSearchRecord(); + + // 构建最终查询条件 + BoolQuery.Builder boolFinalQueryBuilder = new BoolQuery.Builder(); + + // 过滤条件 + if (kmDocEsParamVO.getFilterParams() != null && !kmDocEsParamVO.getFilterParams().isEmpty()) { + BoolQuery.Builder filterQueryParamsBuilder = esUtils.buildESQueryParams(kmDocEsParamVO.getFilterParams()); + BoolQuery filterQueryParams = filterQueryParamsBuilder.build(); + boolFinalQueryBuilder.filter(filterQueryParams._toQuery()); + } + + // 标题和全文检索条件 + if (oConvertUtils.isNotEmpty(kmDocEsParamVO.getTitle())) { + kmSearchRecord.setTitle(kmDocEsParamVO.getTitle()); + Query titleQuery = null; + if(kmDocEsParamVO.getPhraseMatchSearchFlag() != null && kmDocEsParamVO.getPhraseMatchSearchFlag()){ + titleQuery = MatchPhraseQuery.of(m -> m.field("title").query(kmDocEsParamVO.getTitle()).slop(2))._toQuery(); + }else{ + titleQuery = MatchQuery.of(m -> m.field("title").query(FieldValue.of(kmDocEsParamVO.getTitle())).analyzer("ik_smart").boost(kmConstant.getTitleSearchBoost()))._toQuery(); + } + boolFinalQueryBuilder.must(titleQuery); + } + + if (oConvertUtils.isNotEmpty(kmDocEsParamVO.getContent())) { + kmSearchRecord.setContent(kmDocEsParamVO.getContent()); + Query contentQuery = kmDocEsParamVO.getPhraseMatchSearchFlag() != null && kmDocEsParamVO.getPhraseMatchSearchFlag() + ? MatchPhraseQuery.of(m -> m.field("content").query(kmDocEsParamVO.getContent()).slop(2))._toQuery() + : MatchQuery.of(m -> m.field("content").query(FieldValue.of(kmDocEsParamVO.getContent())).analyzer("ik_smart").boost(kmConstant.getContentSearchBoost()))._toQuery(); + boolFinalQueryBuilder.must(contentQuery); + } + + // 分类过滤 + if (kmDocEsParamVO.getCategory() != null && !kmDocEsParamVO.getCategory().isEmpty()) { + // 将 List 转换为 List + List categoryValues = kmDocEsParamVO.getCategory().stream() + .map(FieldValue::of) + .collect(Collectors.toList()); + boolFinalQueryBuilder.filter(TermsQuery.of(t -> t.field("category").terms(terms -> terms.value(categoryValues)))._toQuery()); + } + + // 发布时间范围过滤 + DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + if (kmDocEsParamVO.getCreateTimeEnd() != null) { + boolFinalQueryBuilder.filter(RangeQuery.of(r -> r.field("createTime").lte(JsonData.of(format.format(kmDocEsParamVO.getCreateTimeEnd()))))._toQuery()); + } + if (kmDocEsParamVO.getCreateTimeStart() != null) { + boolFinalQueryBuilder.filter(RangeQuery.of(r -> r.field("createTime").gte(JsonData.of(format.format(kmDocEsParamVO.getCreateTimeStart()))))._toQuery()); + } + + // 发布状态过滤 + boolFinalQueryBuilder.filter(TermQuery.of(t -> t.field("releaseFlag").value(FieldValue.of(1)))._toQuery()); + + // 高亮设置 + Highlight highlight = Highlight.of(h -> h + .fields("title", HighlightField.of(f -> f.numberOfFragments(1).fragmentSize(200))) + .fields("content", HighlightField.of(f -> f.numberOfFragments(1).fragmentSize(200).noMatchSize(200))) + .preTags("") + .postTags("")); + + // 分页设置 + int from = Math.toIntExact(page.getCurrent() < 1 ? 0 : page.getSize() * (page.getCurrent() - 1)); + int size = Math.toIntExact(Math.min(page.getSize(), 100)); + + // 构建搜索请求 + SearchRequest searchRequest = SearchRequest.of(s -> s + .index(KMConstant.DocIndexAliasName) + .query(boolFinalQueryBuilder.build()._toQuery()) + .highlight(highlight) + .from(from) + .size(size) + .timeout(String.format("%ss",KMConstant.SearchTimeOutSeconds)) + .source(sf -> sf.filter(f -> f.excludes("content")))); + + // 执行搜索 + SearchResponse searchResponse = openSearchClient.search(searchRequest, KmDocEsVO.class); + + // 处理搜索结果 + if (searchResponse.hits().total().value() <= 0) { + kmSearchResultObjVO.setKmSearchResultVOPage(resultVOPage); + kmSearchResultObjVO.setSuccess(true); + } else { + for (Hit hit : searchResponse.hits().hits()) { + KmDocEsVO kmDocEsVO = hit.source(); + if (hit.highlight() != null) { + if (hit.highlight().containsKey("title")) { + kmDocEsVO.setTitle(hit.highlight().get("title").get(0)); + } + if (hit.highlight().containsKey("content")) { + kmDocEsVO.setContent(hit.highlight().get("content").get(0)); + } + } + kmDocEsVOList.add(kmDocEsVO); + } + List kmSearchResultVOList = retrieveDocDbInfo(kmDocEsVOList); + resultVOPage.setRecords(kmSearchResultVOList); + resultVOPage.setTotal(searchResponse.hits().total().value()); + resultVOPage.setSearchCount(searchResponse.hits().total().value() > 0); + kmSearchResultObjVO.setKmSearchResultVOPage(resultVOPage); + kmSearchResultObjVO.setSuccess(true); + } + + // 记录搜索日志 + executorService.execute(() -> kmSearchRecordService.logSearch( + kmSearchRecord.getKeywords(), + kmSearchRecord.getTitle(), + kmSearchRecord.getContent(), + kmSearchRecord.getTopicCodes(), + IpUtils.getIpAddr(req))); + + return kmSearchResultObjVO; + } + + @Override + public KmSearchResultObjVO checkDuplicateESKmDoc(Page page, KmDocEsParamVO kmDocEsParamVO, HttpServletRequest req) throws IOException { + List kmDocEsVOList = new ArrayList<>(); + Page resultVOPage = new Page<>(page.getCurrent(), page.getSize()); + KmSearchResultObjVO kmSearchResultObjVO = new KmSearchResultObjVO(); + + try { + if (!KMRedisUtils.validUserLimit(KMConstant.UserSearchLimitPrefix, kmConstant.getSearchLimit(), Calendar.SECOND, 10)) { + kmSearchResultObjVO.setSuccess(false); + kmSearchResultObjVO.setMessage("操作太频繁,请稍后再试"); + return kmSearchResultObjVO; + } + } catch (ParseException e) { + e.printStackTrace(); + } + + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (sysUser == null) { + kmSearchResultObjVO.setSuccess(false); + kmSearchResultObjVO.setMessage("用户登陆信息异常"); + return kmSearchResultObjVO; + } + KmSearchRecord kmSearchRecord = new KmSearchRecord(); + + BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder(); + String duplicateCheckHitRate = kmSysConfigService.getSysConfigValue("DuplicateCheckHitRate"); + if (duplicateCheckHitRate == null || duplicateCheckHitRate.isEmpty()) { + duplicateCheckHitRate = "50%"; + } + + final String dh = duplicateCheckHitRate; + // 标题和全文检索条件 + if (oConvertUtils.isNotEmpty(kmDocEsParamVO.getTitle())) { + kmSearchRecord.setTitle(kmDocEsParamVO.getTitle()); + final String title = kmDocEsParamVO.getTitle(); + + boolQueryBuilder.should(MatchQuery.of(m -> m.field("title").query(FieldValue.of(title)).minimumShouldMatch(dh).analyzer("ik_smart"))._toQuery()); + } + if (oConvertUtils.isNotEmpty(kmDocEsParamVO.getContent())) { + kmSearchRecord.setContent(kmDocEsParamVO.getContent()); + final String content = kmDocEsParamVO.getContent(); + boolQueryBuilder.should(MatchQuery.of(m -> m.field("content").query(FieldValue.of(content)).minimumShouldMatch(dh).analyzer("ik_smart"))._toQuery()); + } + + // 高亮设置 + Highlight highlight = Highlight.of(h -> h + .fields("title", HighlightField.of(f -> f.preTags("").postTags(""))) + .requireFieldMatch(false)); + + // 分页设置 + int from = Math.toIntExact(page.getCurrent() < 1 ? 0 : page.getSize() * (page.getCurrent() - 1)); + int size = Math.toIntExact(Math.min(page.getSize(), 100)); + + // 构建搜索请求 + SearchRequest searchRequest = SearchRequest.of(s -> s + .index(KMConstant.DocIndexAliasName) + .query(boolQueryBuilder.build()._toQuery()) + .highlight(highlight) + .from(from) + .size(size) + .timeout(String.format("%ss",KMConstant.SearchTimeOutSeconds)) + .source(sf -> sf.filter(f -> f.excludes("content")))); + + // 执行搜索 + SearchResponse searchResponse = openSearchClient.search(searchRequest, KmDocEsVO.class); + + // 处理搜索结果 + if (searchResponse.hits().total().value() <= 0) { + kmSearchResultObjVO.setKmSearchResultVOPage(resultVOPage); + kmSearchResultObjVO.setSuccess(true); + } else { + for (Hit hit : searchResponse.hits().hits()) { + KmDocEsVO kmDocEsVO = hit.source(); + if (hit.highlight() != null && hit.highlight().containsKey("title")) { + kmDocEsVO.setTitle(hit.highlight().get("title").get(0)); + } + kmDocEsVOList.add(kmDocEsVO); + } + List kmSearchResultVOList = retrieveDocDbInfo(kmDocEsVOList); + resultVOPage.setRecords(kmSearchResultVOList); + resultVOPage.setTotal(searchResponse.hits().total().value()); + resultVOPage.setSearchCount(searchResponse.hits().total().value() > 0); + kmSearchResultObjVO.setKmSearchResultVOPage(resultVOPage); + kmSearchResultObjVO.setSuccess(true); + } + + return kmSearchResultObjVO; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocTopicTypeServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocTopicTypeServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..986846156ecec3c691d9c9fd6625236ed01cecdc --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocTopicTypeServiceImpl.java @@ -0,0 +1,46 @@ +package org.jeecg.modules.KM.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.jeecg.modules.KM.entity.KmDocTopicType; +import org.jeecg.modules.KM.mapper.KmDocTopicTypeMapper; +import org.jeecg.modules.KM.service.IKmDocTopicTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + + +@Service +public class KmDocTopicTypeServiceImpl extends ServiceImpl implements IKmDocTopicTypeService { + + @Autowired + KmDocTopicTypeMapper kmDocTopicTypeMapper; + + @Override + public KmDocTopicType getByDocIdAndTopicId( String docId, String topicId){ +// return kmDocTopicTypeMapper.getByDocIdAndTopicId(docId,topicId); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(KmDocTopicType::getDocId,docId); + queryWrapper.eq(KmDocTopicType::getTopicId,topicId); + KmDocTopicType tmpKmDocTopicType = super.getOne(queryWrapper); + return tmpKmDocTopicType; + } + + @Override + public boolean removeDocFromAllTopics( String docId ){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(KmDocTopicType::getDocId,docId); + return super.remove(queryWrapper); + } + + @Override + public List getDocTopicCodes(String docId){ + List docTopicCodeList = kmDocTopicTypeMapper.getDocTopicCodes(docId); + if(!docTopicCodeList.isEmpty()){ + return docTopicCodeList; + } + else { + return null; + } + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocVersionServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocVersionServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..1c103e37f47c0a0843b5a1a3d41c38a89249b421 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocVersionServiceImpl.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.KM.service.impl; + +import org.jeecg.modules.KM.entity.KmDocVersion; +import org.jeecg.modules.KM.mapper.KmDocVersionMapper; +import org.jeecg.modules.KM.service.IKmDocVersionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + + +@Service +public class KmDocVersionServiceImpl extends ServiceImpl implements IKmDocVersionService { + + @Autowired + private KmDocVersionMapper kmDocVersionMapper; + + @Override + public List getVersions(String docId){ + return kmDocVersionMapper.getversions(docId); + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocVisitRecordServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocVisitRecordServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..5750cbe14f37f3ca92a874cf07933a2300d8d8e6 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmDocVisitRecordServiceImpl.java @@ -0,0 +1,175 @@ +package org.jeecg.modules.KM.service.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONObject; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; + +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.opensearch.client.opensearch._types.Refresh; +import org.opensearch.client.opensearch.core.IndexRequest; +import org.opensearch.client.opensearch.core.IndexResponse; +import org.opensearch.client.transport.TransportOptions; +import org.opensearch.client.opensearch._types.Time; +import org.opensearch.client.json.JsonData; +import org.opensearch.client.opensearch.indices.AnalyzeRequest; +import org.opensearch.client.opensearch.indices.AnalyzeResponse; +import org.opensearch.client.opensearch.indices.analyze.AnalyzeToken; +import org.opensearch.client.opensearch._types.query_dsl.BoolQuery; +import org.opensearch.client.opensearch._types.query_dsl.Query; +import org.opensearch.client.opensearch._types.query_dsl.QueryBuilders; +import org.opensearch.client.opensearch._types.query_dsl.TermsQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchPhraseQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchQuery; +import org.opensearch.client.opensearch._types.query_dsl.RangeQuery; +import org.opensearch.client.opensearch._types.query_dsl.PrefixQuery; +import org.opensearch.client.opensearch._types.query_dsl.TermQuery; +import org.opensearch.client.opensearch._types.FieldValue; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.opensearch.client.opensearch._types.query_dsl.TermQuery; +import org.opensearch.client.opensearch.core.SearchRequest; +import org.opensearch.client.opensearch.core.SearchResponse; +import org.opensearch.client.opensearch._types.SortOptions; +import org.opensearch.client.opensearch._types.SortOrder; + +import org.opensearch.client.json.JsonData; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.DateUtils; +import org.jeecg.common.util.UUIDGenerator; +import org.jeecg.modules.KM.VO.KmDocEsVO; +import org.jeecg.modules.KM.VO.KmDocVisitRecordEsVO; +import org.jeecg.modules.KM.common.enums.DocVisitTypeEnum; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.common.utils.EsUtils; +import org.jeecg.modules.KM.common.utils.KMDateUtils; +import org.jeecg.modules.KM.common.utils.KMRedisUtils; +import org.jeecg.modules.KM.common.utils.StringUtils; +import org.jeecg.modules.KM.entity.KmDocVisitRecord; +import org.jeecg.modules.KM.mapper.KmDocVisitRecordMapper; +import org.jeecg.modules.KM.service.IKmDocVisitRecordService; +import org.jeecg.modules.KM.service.IThreadPoolExecutorService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.time.Duration; +import java.util.Date; +import java.util.Date; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class KmDocVisitRecordServiceImpl extends ServiceImpl implements IKmDocVisitRecordService { + + @Autowired + private IThreadPoolExecutorService executorService; + @Autowired + private EsUtils esUtils; + @Autowired + private OpenSearchClient openSearchClient; + @Autowired + private KMRedisUtils kMRedisUtils; + + @Override + public void logVisit(String docId,String ip,Integer visitType) { + logVisit(docId,ip,visitType,""); + } + + @Override + public void logVisit(String docId,String ip,Integer visitType,String keyword) { + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + //String userId = "1"; + if(sysUser != null) { + String userId = sysUser.getUsername(); + logVisit(docId, ip, visitType, keyword, userId); + } + } + + @Override + public void logVisit(String docId,String ip,Integer visitType,String keyword,String userId){ + KmDocVisitRecord kmDocVisitRecord = new KmDocVisitRecord(); + kmDocVisitRecord.setId(UUIDGenerator.generate()); + kmDocVisitRecord.setDocId(docId); + kmDocVisitRecord.setCreateBy(userId); + kmDocVisitRecord.setCreateTime(DateUtils.getDate()); + kmDocVisitRecord.setVisitType(visitType); + kmDocVisitRecord.setSourceIp(ip); + kmDocVisitRecord.setKeywords(keyword); + + //通过es获取分词结果 + List paramKeywordList = esUtils.getIkAnalyzeSearchTerms(keyword); + String keywordsMax = StringUtils.concatListToString(paramKeywordList); + kmDocVisitRecord.setKeywordsMax(keywordsMax); + executorService.execute(()->super.save(kmDocVisitRecord)); + + //下载、预览:保存最近访问的个人文档记录与ES日志 + if(visitType == DocVisitTypeEnum.View.getCode() + || visitType == DocVisitTypeEnum.Download.getCode()) { + //入库ES + executorService.execute(()->saveToEs(convertToEsVo(kmDocVisitRecord))); + + executorService.execute(() -> kMRedisUtils.logPersonalDocHistory(userId, docId)); + } + } + + + private KmDocVisitRecordEsVO convertToEsVo(KmDocVisitRecord kmDocVisitRecord){ + KmDocVisitRecordEsVO kmDocVisitRecordEsVO = new KmDocVisitRecordEsVO(); + kmDocVisitRecordEsVO.setCreateBy(kmDocVisitRecord.getCreateBy()); + kmDocVisitRecordEsVO.setCreateTime(kmDocVisitRecord.getCreateTime()); + kmDocVisitRecordEsVO.setDocId(kmDocVisitRecord.getDocId()); + kmDocVisitRecordEsVO.setKeywords(kmDocVisitRecord.getKeywords()); + if(kmDocVisitRecord.getKeywordsMax() != null&& kmDocVisitRecord.getKeywordsMax().length()>0) + kmDocVisitRecordEsVO.setKeywordsMax(kmDocVisitRecord.getKeywordsMax().split(",")); + kmDocVisitRecordEsVO.setSourceIp(kmDocVisitRecord.getSourceIp()); + kmDocVisitRecordEsVO.setVisitType(kmDocVisitRecord.getVisitType()); + return kmDocVisitRecordEsVO; + } + + + private void saveToEs(KmDocVisitRecordEsVO kmDocVisitRecordEsVO) { + try { + //插入数据,index不存在则自动根据匹配到的template创建。index没必要每天创建一个,如果是为了灵活管理,最低建议每月一个 yyyyMM。 + String indexSuffix = KMDateUtils.formatDateyyyyMM(DateUtils.getDate()); + IndexRequest.Builder indexRequest = new IndexRequest.Builder() + .index(KMConstant.DocVisitIndexName + "_" + indexSuffix); + indexRequest.timeout(Time.of(t -> t.time(String.format("%sm",KMConstant.SaveTimeOutMinutes)))); + indexRequest.refresh(Refresh.WaitFor); + indexRequest.document(kmDocVisitRecordEsVO); + IndexResponse response = openSearchClient.index(indexRequest.build()); + if (!"created".equalsIgnoreCase(response.result().toString())) { + log.error("入库ES发生错误,返回码:" + response.result().toString() ); + } + else + log.debug("访问记录入库ES成功"); + } + catch (Exception e){ + log.error("入库ES发生错误" ,e ); + } + } + + + @Deprecated + @Override + public List recentlyVisitedDocs(String createBy) throws IOException { + List result = new ArrayList<>(); + // I GIVE UP. + + return result; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmEsMgntServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmEsMgntServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..0b5a7c15e28d99687debb48705dda215726398e0 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmEsMgntServiceImpl.java @@ -0,0 +1,402 @@ +package org.jeecg.modules.KM.service.impl; + +import cn.hutool.core.collection.CollUtil; +import lombok.extern.slf4j.Slf4j; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.opensearch.client.opensearch.indices.AnalyzeRequest; +import org.opensearch.client.opensearch.indices.AnalyzeResponse; +import org.opensearch.client.opensearch.indices.analyze.AnalyzeToken; +import org.opensearch.client.opensearch._types.query_dsl.BoolQuery; +import org.opensearch.client.opensearch._types.query_dsl.Query; +import org.opensearch.client.opensearch._types.query_dsl.QueryBuilders; +import org.opensearch.client.opensearch._types.query_dsl.TermsQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchPhraseQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchQuery; +import org.opensearch.client.opensearch._types.query_dsl.RangeQuery; +import org.opensearch.client.opensearch._types.query_dsl.PrefixQuery; +import org.opensearch.client.opensearch._types.query_dsl.TermQuery; +import org.opensearch.client.opensearch._types.FieldValue; +import org.opensearch.client.opensearch.cluster.GetComponentTemplateRequest; +import org.opensearch.client.opensearch.cluster.GetComponentTemplateResponse; +import org.opensearch.client.opensearch.indices.GetIndexTemplateRequest; +import org.opensearch.client.opensearch.indices.GetIndexTemplateResponse; +import org.opensearch.client.opensearch.indices.get_index_template.IndexTemplate; +import org.opensearch.client.opensearch.indices.get_index_template.IndexTemplateItem; +import org.opensearch.client.opensearch.indices.ExistsIndexTemplateRequest; +import org.opensearch.client.transport.endpoints.BooleanResponse; +import org.opensearch.client.json.JsonData; +import org.opensearch.client.opensearch.indices.GetIndexRequest; +import org.opensearch.client.opensearch.indices.GetIndexResponse; +import org.opensearch.client.opensearch.indices.PutIndexTemplateRequest; +import org.opensearch.client.opensearch.indices.PutIndexTemplateResponse; +import org.opensearch.client.opensearch.indices.put_index_template.IndexTemplateMapping; +import org.opensearch.client.opensearch.indices.IndexSettings; +import org.opensearch.client.opensearch.indices.Translog; +import org.opensearch.client.opensearch._types.Time; +import org.opensearch.client.opensearch.indices.Alias; +import org.opensearch.client.opensearch._types.mapping.TypeMapping; +import org.opensearch.client.opensearch._types.mapping.Property; +import org.opensearch.client.opensearch._types.mapping.KeywordProperty; +import org.opensearch.client.opensearch._types.mapping.IntegerNumberProperty; +import org.opensearch.client.opensearch._types.mapping.TextProperty; +import org.opensearch.client.opensearch._types.mapping.DateProperty; +import org.opensearch.client.opensearch._types.mapping.IpProperty; +import org.opensearch.client.opensearch._types.mapping.TermVectorOption; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.KM.VO.KmDocEsVO; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.entity.KmDoc; +import org.jeecg.modules.KM.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.io.*; +import java.util.List; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@Service +@Slf4j +public class KmEsMgntServiceImpl implements IKmEsMgntService { + + @Autowired + private OpenSearchClient openSearchClient; + + @Autowired + private KmDocServiceImpl kmDocService; + + private boolean checkTemplateExists(String templateName) throws IOException { + ExistsIndexTemplateRequest request = new ExistsIndexTemplateRequest.Builder() + .name(templateName) + .build(); + + BooleanResponse response = openSearchClient.indices().existsIndexTemplate​(request); + + return response.value(); + } + + private boolean checkIndexExists(String indexName)throws IOException { + GetIndexRequest request = new GetIndexRequest.Builder() + .index(indexName) + .build(); + GetIndexResponse response = openSearchClient.indices().get(request); + return !response.result().isEmpty(); + } + + //为初始化索引 + @Override + public void initEXIndex(){ + KmDocEsVO kmEsVO = new KmDocEsVO(); + kmEsVO.setTitle("for init"); + kmEsVO.setDocId("1"); + Result result = kmDocService.saveDocToEs(kmEsVO, ""); + if (result.isSuccess()) { + String indexId = (String) result.getResult(); + if (indexId != null && !indexId.isEmpty()) { + Result result1 = kmDocService.deleteDocFromEs(indexId); + if (result1.isSuccess()) { + log.info("init index success!"); + } + } + } + } + + @Override + public Result syncReleasedDocToES(){ + Result result = Result.OK("初始化:同步发布文档到ES");; + + List releasedDocs = kmDocService.getReleasedDocs(); + for (KmDoc releasedDoc : releasedDocs) { + kmDocService.indexDocSync(releasedDoc); + } + return result; + } + + @Override + public Result initTemplateAndSyncDocs() throws IOException { + Result result = Result.OK("创建模版");; + if(!checkTemplateExists(KMConstant.DocIndexName)){ + result = initKmDocTemplate(); + if(!result.isSuccess()){ + log.error(result.getMessage()); + return result; + } + //首次建索引 + initEXIndex(); + } + if (!checkIndexExists(KMConstant.DocIndexName)) { + log.info("start sync docs record to ES..."); + //for手工删索引,重新对知识入库 + syncReleasedDocToES(); + } + if(!checkTemplateExists(KMConstant.KMSearchRecordIndexName)){ + result = initKmSearchRecordTemplate(); + if(!result.isSuccess()){ + log.error(result.getMessage()); + return result; + } + } + if(!checkTemplateExists(KMConstant.DocVisitIndexName)){ + result = initKmDocVisitTemplate(); + if(!result.isSuccess()){ + log.error(result.getMessage()); + return result; + } + } + if(!result.isSuccess()){ + log.error("初始化ES模版失败:",result.getMessage()); + } + return result; + } + + @Override + public Result initKmDocTemplate() throws IOException { + + // 构建IndexSettings对象 + Translog translog = new Translog.Builder() + .durability("async") + .syncInterval(Time.of(t -> t.time("120s"))) + .build(); + + IndexSettings indexSettings = new IndexSettings.Builder() + .numberOfShards("2") + .numberOfReplicas("0") + .maxResultWindow(1000) + .translog(translog) + .refreshInterval(Time.of(t -> t.time("10s"))) + .build(); + + // 构建aliases配置 + Map alias = Collections.singletonMap(KMConstant.DocIndexAliasName, + new Alias.Builder().isWriteIndex(true).build()); + + // 构建mappings配置 + Map properties = new HashMap<>(); + Property dateProp = new Property.Builder() + .date(new DateProperty.Builder().format("yyyy-MM-dd||epoch_millis||strict_date_optional_time").build()) + .build(); + + Property txtProp = new Property.Builder() + .text(new TextProperty.Builder().analyzer("ik_max_word").termVector(TermVectorOption.WithPositionsOffsets).build()) + .build(); + + properties.put("createTime", dateProp); + properties.put("title", txtProp); + properties.put("content", txtProp); + + Property intProp = new Property.Builder() + .integer(new IntegerNumberProperty.Builder().build()) + .build(); + properties.put("releaseFlag", intProp); + properties.put("publicRemark", intProp); + properties.put("category", intProp); + properties.put("businessTypes", intProp); + Property prop = new Property.Builder() + .keyword(new KeywordProperty.Builder().build()) + .build(); + properties.put("topicCodes", prop); + properties.put("id", prop); + properties.put("fileNo", prop); + properties.put("orgCode", prop); + properties.put("keywords", prop); + properties.put("topicCodes", prop); + + TypeMapping tm = new TypeMapping.Builder() + .properties(properties) + .build(); + + // 构建IndexTemplateMapping对象 + IndexTemplateMapping itmapping = new IndexTemplateMapping.Builder() + .settings(indexSettings) + .aliases(alias) + .mappings(tm) // 使用properties代替整个mappings对象 + .build(); + + // 构建PutIndexTemplateRequest请求 + PutIndexTemplateRequest request = new PutIndexTemplateRequest.Builder() + .name(KMConstant.DocIndexName) + .indexPatterns(Collections.singletonList(KMConstant.DocIndexName + "*")) + .template(itmapping) + .priority(3) + .build(); + + // 执行请求并获取响应 + PutIndexTemplateResponse response = openSearchClient.indices().putIndexTemplate(request); + + if (response.acknowledged()) { + log.info(KMConstant.DocIndexName + "模版创建成功!"); + return Result.ok("创建模版成功!"); + } else { + log.error(KMConstant.DocIndexName + "模版创建失败!"); + return Result.error("创建模版失败!"); + } + } + + + @Override + public Result initKmDocVisitTemplate() throws IOException { + + // 构建IndexSettings对象 + Translog translog = new Translog.Builder() + .durability("async") + .syncInterval(Time.of(t -> t.time("600s"))) + .build(); + + IndexSettings indexSettings = new IndexSettings.Builder() + .numberOfShards("2") + .numberOfReplicas("0") + .maxResultWindow(1000) + .translog(translog) + .refreshInterval(Time.of(t -> t.time("60s"))) + .build(); + + // 构建aliases配置 + Map alias = Collections.singletonMap(KMConstant.DocVisitIndexAliasName, + new Alias.Builder().isWriteIndex(true).build()); + + // 构建mappings配置 + Map properties = new HashMap<>(); + Property dateProp = new Property.Builder() + .date(new DateProperty.Builder().format("yyyy-MM-dd HH:mm:ss").build()) + .build(); + + Property txtProp = new Property.Builder() + .text(new TextProperty.Builder().analyzer("ik_smart").build()) + .build(); + + properties.put("createTime", dateProp); + properties.put("keywords", txtProp); + + Property intProp = new Property.Builder() + .integer(new IntegerNumberProperty.Builder().build()) + .build(); + properties.put("visitType", intProp); + + Property prop = new Property.Builder() + .keyword(new KeywordProperty.Builder().build()) + .build(); + properties.put("createBy", prop); + properties.put("id", prop); + + properties.put("keywordsMax", prop); + Property ipProp = new Property.Builder() + .ip(new IpProperty.Builder().build()) + .build(); + properties.put("sourceIp", ipProp); + + TypeMapping tm = new TypeMapping.Builder() + .properties(properties) + .build(); + + // 构建IndexTemplateMapping对象 + IndexTemplateMapping itmapping = new IndexTemplateMapping.Builder() + .settings(indexSettings) + .aliases(alias) + .mappings(tm) // 使用properties代替整个mappings对象 + .build(); + + // 构建PutIndexTemplateRequest请求 + PutIndexTemplateRequest request = new PutIndexTemplateRequest.Builder() + .name(KMConstant.DocVisitIndexName) + .indexPatterns(Collections.singletonList(KMConstant.DocVisitIndexName + "*")) + .template(itmapping) + .priority(1) + .build(); + + // 执行请求并获取响应 + PutIndexTemplateResponse response = openSearchClient.indices().putIndexTemplate(request); + + if (response.acknowledged()) { + log.info(KMConstant.DocVisitIndexName + "模版创建成功!"); + return Result.ok("创建模版成功!"); + } else { + log.error(KMConstant.DocVisitIndexName + "模版创建失败!"); + return Result.error("创建模版失败!"); + } + } + + @Override + public Result initKmSearchRecordTemplate() throws IOException { + + // 构建IndexSettings对象 + Translog translog = new Translog.Builder() + .durability("async") + .syncInterval(Time.of(t -> t.time("600s"))) + .build(); + + IndexSettings indexSettings = new IndexSettings.Builder() + .numberOfShards("2") + .numberOfReplicas("0") + .maxResultWindow(10000) + .translog(translog) + .refreshInterval(Time.of(t -> t.time("60s"))) + .build(); + + // 构建aliases配置 + Map alias = Collections.singletonMap(KMConstant.KMSearchRecordIndexAliasName, + new Alias.Builder().isWriteIndex(true).build()); + + // 构建mappings配置 + Map properties = new HashMap<>(); + Property dateProp = new Property.Builder() + .date(new DateProperty.Builder().format("yyyy-MM-dd HH:mm:ss").build()) + .build(); + + Property txtProp = new Property.Builder() + .text(new TextProperty.Builder().analyzer("ik_smart").build()) + .build(); + + properties.put("createTime", dateProp); + properties.put("title", txtProp); + properties.put("content", txtProp); + properties.put("keywords", txtProp); + + + Property prop = new Property.Builder() + .keyword(new KeywordProperty.Builder().build()) + .build(); + properties.put("createBy", prop); + properties.put("topicCodes", prop); + + properties.put("keywordsMax", prop); + Property ipProp = new Property.Builder() + .ip(new IpProperty.Builder().build()) + .build(); + properties.put("sourceIp", ipProp); + + TypeMapping tm = new TypeMapping.Builder() + .properties(properties) + .build(); + + // 构建IndexTemplateMapping对象 + IndexTemplateMapping itmapping = new IndexTemplateMapping.Builder() + .settings(indexSettings) + .aliases(alias) + .mappings(tm) // 使用properties代替整个mappings对象 + .build(); + + // 构建PutIndexTemplateRequest请求 + PutIndexTemplateRequest request = new PutIndexTemplateRequest.Builder() + .name(KMConstant.KMSearchRecordIndexName) + .indexPatterns(Collections.singletonList(KMConstant.KMSearchRecordIndexName + "*")) + .template(itmapping) + .build(); + + // 执行请求并获取响应 + PutIndexTemplateResponse response = openSearchClient.indices().putIndexTemplate(request); + + if (response.acknowledged()) { + log.info(KMConstant.KMSearchRecordIndexName + "模版创建成功!"); + return Result.ok("创建模版成功!"); + } else { + log.error(KMConstant.KMSearchRecordIndexName + "模版创建失败!"); + return Result.error("创建模版失败!"); + } + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmFileServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmFileServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..aa5b2de70ffeeffc664b7a21ddbdfe0cd53908d2 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmFileServiceImpl.java @@ -0,0 +1,186 @@ +package org.jeecg.modules.KM.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.commons.io.FileUtils; +import org.jeecg.common.util.UUIDGenerator; +import org.jeecg.modules.KM.common.config.BaseConfig; +import org.jeecg.modules.KM.common.utils.HashUtil; +import org.jeecg.modules.KM.common.utils.StringUtils; +import org.jeecg.modules.KM.entity.KmFile; +import org.jeecg.modules.KM.mapper.KmFileMapper; +import org.jeecg.modules.KM.service.IKmFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.IOException; +import java.util.List; + +@Service +public class KmFileServiceImpl extends ServiceImpl implements IKmFileService { + + @Autowired + private BaseConfig baseConfig; + private Logger logger= LoggerFactory.getLogger(KmFileServiceImpl.class); + + + + @Override + public KmFile saveFile(MultipartFile file) { + try { + File todayDir=baseConfig.getTodayUploadDir(); + String fileId = UUIDGenerator.generate(); + String s = file.getOriginalFilename(); + String sf = file.getName(); + String suffix= StringUtils.getFileSuffix( (file.getOriginalFilename() == null || file.getOriginalFilename().isEmpty() ) ? file.getName() : file.getOriginalFilename()); +// String suffix= StringUtils.getFileSuffix(file.getOriginalFilename()); + File dist=new File(todayDir,fileId+"."+suffix); + file.transferTo(dist); + KmFile kmFile=new KmFile(); + kmFile.setId(fileId); + kmFile.setOriginalName(file.getOriginalFilename()); + kmFile.setPhysicalPath(baseConfig.getRelativePath(dist)); + kmFile.setSha256(HashUtil.sha256(dist)); + baseMapper.insert(kmFile); + return kmFile; + } catch (IOException e) { + logger.error("文件上传transferTo错误",e); + } + return null ; + } + + @Override + public KmFile transferExternalFile(File file) { + try { + File todayDir=baseConfig.getTodayUploadDir(); + String fileId = UUIDGenerator.generate(); + String s = file.getName(); + String sf = file.getName(); + String suffix= StringUtils.getFileSuffix(file.getName()); + File dist=new File(todayDir,fileId+"."+suffix); + file.renameTo(dist); + KmFile kmFile=new KmFile(); + kmFile.setId(fileId); + kmFile.setOriginalName(file.getName()); + kmFile.setPhysicalPath(baseConfig.getRelativePath(dist)); + kmFile.setSha256(HashUtil.sha256(dist)); + baseMapper.insert(kmFile); + file.delete(); + return kmFile; + } catch (Exception e) { + logger.error("文件保存-transferExternalFile错误",e); + } + return null ; + } + @Override + public KmFile transferExternalFile(String content, String suffix) { + try { + File todayDir=baseConfig.getTodayUploadDir(); + String fileId = UUIDGenerator.generate(); + //String suffix=StringUtils.getFileSuffix(file.getOriginalFilename()); + File dist=new File(todayDir,fileId+"."+suffix); + FileUtils.writeStringToFile(dist,content,"utf-8"); + KmFile KmFile=new KmFile(); + KmFile.setId(fileId); + KmFile.setOriginalName(""); + KmFile.setPhysicalPath(baseConfig.getRelativePath(dist)); + //KmFile.setUrl(""); //下载路径,待定 + KmFile.setSha256(HashUtil.sha256(dist)); + baseMapper.insert(KmFile); + return KmFile; + } catch (IOException e) { + logger.error("文件上传transferTo错误",e); + } + return null ; + } + + @Override + public KmFile saveFileInfoToDB(String physicalPath,String fileName){ + try { + String fileId = UUIDGenerator.generate(); + KmFile KmFile=new KmFile(); + KmFile.setId(fileId); + KmFile.setOriginalName(fileName); + KmFile.setPhysicalPath(baseConfig.getRelativePath(physicalPath)); + baseMapper.insert(KmFile); + return KmFile; + } catch (Exception e) { + logger.error("文件保存到db错误",e); + } + return null ; + + } + + @Override + public KmFile getKmFileBySha256(String sha256) { +// EntityWrapperew=new EntityWrapper<>(); + QueryWrapper ew = new QueryWrapper<>(); + ew.eq("sha256",sha256); + List list = baseMapper.selectList(ew); + if(list.isEmpty()){ + return null; + }else { + return list.get(0); + } + } + + + + + @Override + public KmFile getKmFile(String fileId) { + return baseMapper.selectById(fileId); + } + + @Override + public String readKmFileString(String fileId) { + KmFile KmFile = getKmFile(fileId); + File file = new File(KmFile.getPhysicalPath()); + if(file.exists()){ + try { + return FileUtils.readFileToString(file,"utf-8"); + } catch (IOException e) { + logger.error("readKmFileString",e); + return null; + } + }else { + return null; + } + } + + @Override + public boolean deleteKmFile(String fileId) { + KmFile KmFile=getKmFile(fileId); + if(KmFile!=null){ + String filePath=KmFile.getPhysicalPath(); + File f=new File(baseConfig.getUploadDir(),filePath); + if(f.exists()){ + f.delete(); + } + super.removeById(fileId); + return true; + }else { + return false; + } + } + + + private String getNameByPath(String path){ + File f =new File(path); + return f.getName(); + } + @Override + public boolean exist(String fileId){ + if(fileId==null){ + return false; + } + QueryWrapper ew = new QueryWrapper<>(); +// EntityWrapperew=new EntityWrapper<>(); + ew.eq("file_id",fileId); + return this.count(ew)>0; + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSearchRecordServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSearchRecordServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..0b1ce0b308548135072f8ae2584955e79c100e98 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSearchRecordServiceImpl.java @@ -0,0 +1,242 @@ +package org.jeecg.modules.KM.service.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.opensearch.client.opensearch._types.Refresh; +import org.opensearch.client.opensearch.core.IndexRequest; +import org.opensearch.client.opensearch.core.IndexResponse; +import org.opensearch.client.transport.TransportOptions; +import org.opensearch.client.opensearch._types.Time; +import org.opensearch.client.json.JsonData; +import org.opensearch.client.opensearch.indices.AnalyzeRequest; +import org.opensearch.client.opensearch.indices.AnalyzeResponse; +import org.opensearch.client.opensearch.indices.analyze.AnalyzeToken; +import org.opensearch.client.opensearch._types.query_dsl.BoolQuery; +import org.opensearch.client.opensearch._types.query_dsl.Query; +import org.opensearch.client.opensearch._types.query_dsl.QueryBuilders; +import org.opensearch.client.opensearch._types.query_dsl.TermsQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchPhraseQuery; +import org.opensearch.client.opensearch._types.query_dsl.MatchQuery; +import org.opensearch.client.opensearch._types.query_dsl.RangeQuery; +import org.opensearch.client.opensearch._types.query_dsl.PrefixQuery; +import org.opensearch.client.opensearch._types.query_dsl.TermQuery; +import org.opensearch.client.opensearch._types.FieldValue; +import org.opensearch.client.opensearch.OpenSearchClient; +import org.opensearch.client.opensearch._types.query_dsl.TermQuery; +import org.opensearch.client.opensearch.core.SearchRequest; +import org.opensearch.client.opensearch.core.SearchResponse; +import org.opensearch.client.opensearch._types.SortOptions; +import org.opensearch.client.opensearch._types.SortOrder; + +import org.opensearch.client.opensearch._types.aggregations.Aggregation; +import org.opensearch.client.opensearch._types.aggregations.StringTermsAggregate; +import org.opensearch.client.opensearch._types.aggregations.StringTermsBucket; +import org.opensearch.client.opensearch._types.query_dsl.Query; +import org.opensearch.client.opensearch._types.aggregations.TermsAggregation; + +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.system.vo.SysCategoryModel; +import org.jeecg.common.util.DateUtils; +import org.jeecg.modules.KM.VO.KmSearchRecordEsVO; +import org.jeecg.modules.KM.common.rules.KMConstant; +import org.jeecg.modules.KM.common.utils.EsUtils; +import org.jeecg.modules.KM.common.utils.KMDateUtils; +import org.jeecg.modules.KM.common.utils.StringUtils; +import org.jeecg.modules.KM.entity.KmSearchRecord; +import org.jeecg.modules.KM.mapper.KmSearchRecordMapper; +import org.jeecg.modules.KM.service.IKmSearchRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Service +@Slf4j +public class KmSearchRecordServiceImpl extends ServiceImpl implements IKmSearchRecordService { + + @Autowired + private EsUtils esUtils; + @Autowired + private OpenSearchClient openSearchClient; + @Autowired + private ISysBaseAPI sysBaseAPI; + + @Override + public void logSearch(String keyword,String title,String content,String topicCode,String ip){ + KmSearchRecord kmSearchRecord = new KmSearchRecord(); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser == null) + return ; + + String userId = sysUser.getUsername(); + kmSearchRecord.setCreateBy(userId); + + //todo id generation + kmSearchRecord.setSourceIp(ip); + kmSearchRecord.setKeywords(keyword); + kmSearchRecord.setTitle(title); + kmSearchRecord.setContent(content); + kmSearchRecord.setTopicCodes(topicCode); + kmSearchRecord.setCreateBy(userId); + kmSearchRecord.setCreateTime(DateUtils.getDate()); + + String keywordString = ""; + if(content != null) keywordString += content; + if(title != null) keywordString = keywordString + "," + title; + List paramKeywordList = esUtils.getIkAnalyzeSearchTerms(keywordString); + //keyword不做分词 + if(keyword != null) + paramKeywordList.add(keyword); + + kmSearchRecord.setKeywordsMax(StringUtils.concatListToString(paramKeywordList)); + + super.save(kmSearchRecord); + + //入库ES + saveToEs(convertToEsVo(kmSearchRecord)); + } + + @Override + public List hotKeywordReport() throws IOException { + List result = new ArrayList<>(); + + // 构建聚合 + TermsAggregation aggregation = new TermsAggregation.Builder() + .field("keywordsMax") + .size(10) + .build(); + + // 构建搜索请求 + SearchRequest searchRequest = new SearchRequest.Builder() + .index(KMConstant.KMSearchRecordIndexAliasName) + .aggregations("keyword", new Aggregation.Builder().terms(aggregation).build()) + .timeout(String.format("%ss",KMConstant.SearchTimeOutSeconds)) + .build(); + + // 执行搜索 + SearchResponse searchResponse = openSearchClient.search(searchRequest, Object.class); + + // 检查搜索结果 + if (searchResponse.hits().total().value() <= 0) { + return null; + } else { + // 获取聚合结果 + StringTermsAggregate terms = searchResponse.aggregations().get("keyword").sterms(); + List buckets = terms.buckets().array(); + + // 遍历聚合桶 + for (StringTermsBucket bucket : buckets) { + String term = bucket.key(); + result.add(term); + } + } + return result; + } + + @Override + public List retriveHotTopic() throws IOException { + List result = new ArrayList<>(); + + // 构建聚合 + TermsAggregation aggregation = new TermsAggregation.Builder() + .field("topicCodes") + .size(10) + .build(); + + // 构建搜索请求 + SearchRequest searchRequest = new SearchRequest.Builder() + .index(KMConstant.KMSearchRecordIndexAliasName) + .aggregations("topicCode", new Aggregation.Builder().terms(aggregation).build()) + .timeout(String.format("%ss",KMConstant.SearchTimeOutSeconds)) + .build(); + + // 执行搜索 + SearchResponse searchResponse = openSearchClient.search(searchRequest, Object.class); + + // 检查搜索结果 + if (searchResponse.hits().total().value() <= 0) { + return null; + } else { + // 获取聚合结果 + StringTermsAggregate terms = searchResponse.aggregations().get("topicCode").sterms(); + List buckets = terms.buckets().array(); + + // 遍历聚合桶 + for (StringTermsBucket bucket : buckets) { + String term = bucket.key(); + SysCategoryModel sysCategoryModel = sysBaseAPI.queryCategoryByCode(term); + if (sysCategoryModel != null) { + result.add(sysCategoryModel); + } + } + } + return result; + } + + @Override + public List hotTopicReport() { + List result = new ArrayList<>(); + try { + List sysCategoryModels = retriveHotTopic(); + if(sysCategoryModels != null && !sysCategoryModels.isEmpty()) { + sysCategoryModels + .stream() + .forEach( + e -> { + result.add(e.getName()); + }); + return result; + } + } + catch (IOException e){ + e.printStackTrace(); + return result; + } + return result; + } + + private KmSearchRecordEsVO convertToEsVo(KmSearchRecord kmSearchRecord){ + KmSearchRecordEsVO kmSearchRecordEsVO = new KmSearchRecordEsVO(); + kmSearchRecordEsVO.setContent(kmSearchRecord.getContent()); + kmSearchRecordEsVO.setCreateBy(kmSearchRecord.getCreateBy()); + kmSearchRecordEsVO.setCreateTime(kmSearchRecord.getCreateTime()); + kmSearchRecordEsVO.setKeywords(kmSearchRecord.getKeywords()); + if(kmSearchRecord.getKeywordsMax() !=null && kmSearchRecord.getKeywordsMax().length()>0) + kmSearchRecordEsVO.setKeywordsMax(kmSearchRecord.getKeywordsMax().split(",")); + kmSearchRecordEsVO.setTitle(kmSearchRecord.getTitle()); + if(kmSearchRecord.getTopicCodes() != null && kmSearchRecord.getTopicCodes().length()>0) + kmSearchRecordEsVO.setTopicCodes(kmSearchRecord.getTopicCodes().split(",")); + kmSearchRecordEsVO.setSourceIp(kmSearchRecord.getSourceIp()); + return kmSearchRecordEsVO; + } + + //heavily copy from visit record + private void saveToEs(KmSearchRecordEsVO kmDocRecordEsVO) { + try { + //插入数据,index不存在则自动根据匹配到的template创建。index没必要每天创建一个,如果是为了灵活管理,最低建议每月一个 yyyyMM。 + String indexSuffix = KMDateUtils.formatDateyyyyMM(DateUtils.getDate()); + IndexRequest.Builder indexRequest = new IndexRequest.Builder() + .index(KMConstant.DocVisitIndexName + "_" + indexSuffix); + indexRequest.timeout(Time.of(t -> t.time(String.format("%sm",KMConstant.SaveTimeOutMinutes)))); + indexRequest.refresh(Refresh.WaitFor); + indexRequest.document(kmDocRecordEsVO); + IndexResponse response = openSearchClient.index(indexRequest.build()); + if (!"created".equalsIgnoreCase(response.result().toString())) { + log.error("入库ES发生错误,返回码:" + response.result().toString() ); + } + else + log.debug("访问记录入库ES成功"); + } + catch (Exception e){ + log.error("入库ES发生错误" ,e ); + } + } + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSysConfigServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSysConfigServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3ee944015d3c04db98c9da12922358141b5f7b97 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSysConfigServiceImpl.java @@ -0,0 +1,61 @@ +package org.jeecg.modules.KM.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.jeecg.modules.KM.entity.KmSysConfig; +import org.jeecg.modules.KM.mapper.KmSysConfigMapper; +import org.jeecg.modules.KM.service.IKmSysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class KmSysConfigServiceImpl extends ServiceImpl implements IKmSysConfigService { + + @Autowired + KmSysConfigMapper kmSysConfigMapper; + + @Override + @Cacheable(cacheNames = "kmSysConfig",key = "#sysConfigCode") + public String getSysConfigValue( String sysConfigCode){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(KmSysConfig::getItemCode ,sysConfigCode); + KmSysConfig kmSysConfig = this.getOne(queryWrapper); + String retValue = ""; + if(kmSysConfig != null ) + retValue = kmSysConfig.getItemValue(); + + return retValue; + } + + @Override +// @Cacheable(cacheNames = "kmSysConfig",key = "#sysConfigCode") + public List querySiteInfo(){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.likeRight(KmSysConfig::getItemCode ,"Site"); + List kmSysConfigList = this.list(queryWrapper); +// KmSysConfig kmSysConfig = (KmSysConfig) list; +// String retValue = ""; +// if(kmSysConfig != null ) +// retValue = kmSysConfig.getItemValue(); + + return kmSysConfigList; + } + + @Override + public Map queryAllConfig(){ + List sysConfigs = this.list(); + Map res = new HashMap(); + for (KmSysConfig config : sysConfigs) { + String configCode = config.getItemCode(); + String configValue = config.getItemValue(); + res.put(configCode,configValue); + } + log.debug("-------登录KM参数-----" + res.toString()); + return res; + } +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSysDbBackupServiceImpl.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSysDbBackupServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d9ffb40f2213ed70be9cce4987c9c4ff2568fc33 --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/KmSysDbBackupServiceImpl.java @@ -0,0 +1,12 @@ +package org.jeecg.modules.KM.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.jeecg.modules.KM.entity.KmSysDbBackup; +import org.jeecg.modules.KM.mapper.KmSysDbBackupMapper; +import org.jeecg.modules.KM.service.IKmSysDbBackupService; +import org.springframework.stereotype.Service; + +@Service +public class KmSysDbBackupServiceImpl extends ServiceImpl implements IKmSysDbBackupService { + +} diff --git a/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/ThreadPoolExecutorService.java b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/ThreadPoolExecutorService.java new file mode 100644 index 0000000000000000000000000000000000000000..ad8d3e0d5d6263f07d654b319a21ec7def76f4fa --- /dev/null +++ b/jeecg-boot/jeecg-module-KM/src/main/java/org/jeecg/modules/KM/service/impl/ThreadPoolExecutorService.java @@ -0,0 +1,69 @@ +package org.jeecg.modules.KM.service.impl; + +import org.jeecg.modules.KM.service.IThreadPoolExecutorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import javax.annotation.PreDestroy; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@Service +public class ThreadPoolExecutorService implements IThreadPoolExecutorService { +// private ThreadPoolExecutor poolExecutor; + + private static LinkedBlockingDeque deque = new LinkedBlockingDeque(10000); + private static ThreadPoolExecutor singleExecutor =new ThreadPoolExecutor( + 1,10000, 20, TimeUnit.SECONDS,deque);; + private static ArrayBlockingQueue poolQeque = new ArrayBlockingQueue(10); + private static ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor( + 5,20, 5, TimeUnit.SECONDS,poolQeque); + + private Logger logger= LoggerFactory.getLogger(ThreadPoolExecutorService.class); + public ThreadPoolExecutorService(){ + poolExecutor.allowCoreThreadTimeOut(true); + singleExecutor.allowCoreThreadTimeOut(true); + } + + @Override + public void singleExecute(Runnable runnable){ + singleExecutor.execute(() -> { +// try { +// Thread.sleep(300); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + runnable.run(); + }); + } + + @Override + public void execute(Runnable runnable){ + poolExecutor.execute(() -> { +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + runnable.run(); + }); + } + + @PreDestroy + public void destroy(){ + try { + poolExecutor.getQueue().clear(); + poolExecutor.shutdown(); + poolExecutor.awaitTermination(10,TimeUnit.SECONDS); + singleExecutor.getQueue().clear(); + singleExecutor.shutdown(); + singleExecutor.awaitTermination(10,TimeUnit.SECONDS); + } catch (InterruptedException e) { + logger.error("销毁线程池",e); + } + logger.info("销毁线程池"); + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index 67966d2309db986c023ff51e8e94dae37940d613..f107bef799b17b5debdcd2fbdc891ea8a413750a 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -544,4 +544,41 @@ public interface ISysBaseAPI extends CommonAPI { */ boolean dictTableWhiteListCheckByDict(String tableOrDictCode, String... fields); + /** + * KM module add the following code. + * @param categoryCode + * @return + */ + /** + * 42 根据分类字典code获取字典name + * @param categoryCode + */ + String queryCategoryNameByCode(String categoryCode); + + /** + * 43 根据分类字典id获取字典name + * @param categoryId + */ + String queryCategoryNameById(String categoryId); + + /** + * 44 根据部门id(逗号分隔),查询返回部门信息code + * @param id + * @return + */ + String queryDepartOrgCodeById(String id); + /** + * 45 根据分类字典code获取字典 + * @param categoryCode + */ + SysCategoryModel queryCategoryByCode(String categoryCode); + /** + * 46 获取推荐的专题 + * @param + */ + List queryCategoryRecommend(); + + /** 47,查询业务类型字典列表 */ + List queryDictItemList(String dictCode); + } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java index e19273b773f80ce249b593919e63e85c8c2250da..cf34602908911991430255be06d1453d26183eae 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java @@ -53,6 +53,10 @@ public class SysCategory implements Serializable,Comparable{ /**租户ID*/ private java.lang.Integer tenantId; + /* KM module add */ + /**用于首页推荐 */ + private java.lang.Boolean recommend; + @Override public int compareTo(SysCategory o) { //比较条件我们定的是按照code的长度升序 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java index 208ba7ee694a5d5ba61f88126d88aa909f3b6451..7eb247632ef06135c99a0fc0564ebec2dd31cab5 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java @@ -48,4 +48,8 @@ public interface SysCategoryMapper extends BaseMapper { @InterceptorIgnore(tenantLine = "true") @Select("SELECT code FROM sys_category WHERE ID = #{id}") SysCategory selectSysCategoryById(@Param("id") String id); + + /* KM module add */ + @Select("SELECT name FROM sys_category WHERE CODE = #{code,jdbcType=VARCHAR}") + public String queryNameByCode(@Param("code") String code); } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index 050c09452bfedc9340394fee0f21b9f3bab71ee4..1b7aaa2b1ca511bd7edc2ad9f2737ac97a293fbf 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -137,6 +137,10 @@ public class SysBaseApiImpl implements ISysBaseAPI { @Autowired private IDictTableWhiteListHandler dictTableWhiteListHandler; + /* KM module add. */ + @Autowired + private ISysDictItemService sysDictItemService; + @Override //@SensitiveDecode public LoginUser getUserByName(String username) { @@ -1819,4 +1823,90 @@ public class SysBaseApiImpl implements ISysBaseAPI { } } + /** + * KM add module impl + */ + // @Cacheable(value = "sys_category") + @Override + public String queryCategoryNameByCode(String categoryCode){ + SysCategoryModel sysCategoryModel = queryCategoryByCode(categoryCode); + if(sysCategoryModel != null) + return sysCategoryModel.getName(); + else + return ""; + // return categoryMapper.queryNameByCode(categoryCode); + } + // @Cacheable(value = "sys_category") + @Override + public String queryCategoryNameById(String categoryId){ + return categoryMapper.queryNameByCode(categoryId); + } + + @Override + public String queryDepartOrgCodeById(String id) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDepart::getId,id); + SysDepart sysDepart =sysDepartService.getOne(queryWrapper); + if( sysDepart!= null){ + return sysDepart.getOrgCode(); + } + else + return ""; + } + + @Cacheable(value = "sys_category") + @Override + public SysCategoryModel queryCategoryByCode(String categoryCode){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCategory::getCode,categoryCode); + SysCategory sysCategory = sysCategoryService.getOne(queryWrapper); + if(sysCategory != null) + return oConvertUtils.entityToModel(sysCategory,SysCategoryModel.class); + + return null; + } + /** + * 获取推荐首页的专题 + * @param + * @return + */ + @Override + public List queryCategoryRecommend(){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCategory::getRecommend,true); + List sysCategories = sysCategoryService.list(queryWrapper); + if(sysCategories != null && !sysCategories.isEmpty()){ + return oConvertUtils.entityListToModelList(sysCategories,SysCategoryModel.class); + } + return null; + } + + /** + * 获取首页的业务列表 + * @param + * @return + */ + @Override + public List queryDictItemList(String dictCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(SysDict::getDictCode,dictCode); + SysDict dict = sysDictService.getOne(queryWrapper); + if(dict != null) { + LambdaQueryWrapper queryWrapperItem = new LambdaQueryWrapper<>(); + queryWrapperItem.eq(SysDictItem::getDictId,dict.getId()); + queryWrapperItem.orderByAsc(SysDictItem::getSortOrder); + List dictItemList = sysDictItemService.list(queryWrapperItem); + if(!dictItemList.isEmpty()) { + // 封装成 model + List dictItemModelList = new ArrayList(); + for (SysDictItem dictItem : dictItemList) { + dictItemModelList.add(new DictModel(dictItem.getItemValue(), dictItem.getItemText())); + } + return dictItemModelList; + } + } + return null; + } + + } \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml index 48a017ab94b5c44d95496e304b33a75cc093ee56..afe8e947888940f61d223030b8f9c79a3462b01d 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml @@ -21,7 +21,7 @@ org.jeecgframework.boot - jeecg-module-demo + jeecg-module-KM ${jeecgboot.version} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/TestMain.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/TestMain.java deleted file mode 100644 index e83ed12d221a1a8aab92ca8df3a913801f7f9b2e..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/TestMain.java +++ /dev/null @@ -1,47 +0,0 @@ -//package org.jeecg; -// -//import com.alibaba.fastjson.JSONObject; -//import org.jeecg.common.util.RestUtil; -//import org.springframework.http.HttpHeaders; -//import org.springframework.http.HttpMethod; -//import org.springframework.http.MediaType; -//import org.springframework.http.ResponseEntity; -// -///** -// * @Description: TODO -// * @author: scott -// * @date: 2022年05月10日 14:02 -// */ -//public class TestMain { -// public static void main(String[] args) { -// // 请求地址 -// String url = "https://api.boot.jeecg.com/sys/user/list"; -// // 请求 Header (用于传递Token) -// HttpHeaders headers = getHeaders(); -// // 请求方式是 GET 代表获取数据 -// HttpMethod method = HttpMethod.GET; -// -// System.out.println("请求地址:" + url); -// System.out.println("请求方式:" + method); -// -// // 利用 RestUtil 请求该url -// ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); -// if (result != null && result.getBody() != null) { -// System.out.println("返回结果:" + result.getBody().toJSONString()); -// } else { -// System.out.println("查询失败"); -// } -// } -// private static HttpHeaders getHeaders() { -// String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.50h-g6INOZRVnznExiawFb1U6PPjcVVA4POeYRA5a5Q"; -// System.out.println("请求Token:" + token); -// -// HttpHeaders headers = new HttpHeaders(); -// String mediaType = MediaType.APPLICATION_JSON_VALUE; -// headers.setContentType(MediaType.parseMediaType(mediaType)); -// headers.set("Accept", mediaType); -// headers.set("X-Access-Token", token); -// return headers; -// } -// -//} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java deleted file mode 100644 index 3ec68c9692731fde846a7a625aefcca668ee3562..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.jeecg.modules.message.test; - -import com.alibaba.fastjson.JSONObject; -import com.aliyuncs.exceptions.ClientException; -import org.jeecg.JeecgSystemApplication; -import org.jeecg.common.api.dto.message.BusMessageDTO; -import org.jeecg.common.api.dto.message.BusTemplateMessageDTO; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.common.api.dto.message.TemplateMessageDTO; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.constant.enums.DySmsEnum; -import org.jeecg.common.constant.enums.EmailTemplateEnum; -import org.jeecg.common.constant.enums.MessageTypeEnum; -import org.jeecg.common.constant.enums.SysAnnmentTypeEnum; -import org.jeecg.common.system.api.ISysBaseAPI; -import org.jeecg.common.util.DySmsHelper; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.HashMap; -import java.util.Map; - -/** - * @Description: 消息推送测试 - * @Author: lsq - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class) -public class SendMessageTest { - - @Autowired - ISysBaseAPI sysBaseAPI; - - /** - * 发送系统消息 - */ - @Test - public void sendSysAnnouncement() { - //发送人 - String fromUser = "admin"; - //接收人 - String toUser = "jeecg"; - //标题 - String title = "系统消息"; - //内容 - String msgContent = "TEST:今日份日程计划已送达!"; - //发送系统消息 - sysBaseAPI.sendSysAnnouncement(new MessageDTO(fromUser, toUser, title, msgContent)); - //消息类型 - String msgCategory = CommonConstant.MSG_CATEGORY_1; - //业务类型 - String busType = SysAnnmentTypeEnum.EMAIL.getType(); - //业务ID - String busId = "11111"; - //发送带业务参数的系统消息 - BusMessageDTO busMessageDTO = new BusMessageDTO(fromUser, toUser, title, msgContent, msgCategory, busType,busId); - sysBaseAPI.sendBusAnnouncement(busMessageDTO); - } - - /** - * 发送模版消息 - */ - @Test - public void sendTemplateAnnouncement() { - //发送人 - String fromUser = "admin"; - //接收人 - String toUser = "jeecg"; - //标题 - String title = "通知公告"; - //模版编码 - String templateCode = "412358"; - //模版参数 - Map templateParam = new HashMap<>(); - templateParam.put("realname","JEECG用户"); - sysBaseAPI.sendTemplateAnnouncement(new TemplateMessageDTO(fromUser,toUser,title,templateParam,templateCode)); - //业务类型 - String busType = SysAnnmentTypeEnum.EMAIL.getType(); - //业务ID - String busId = "11111"; - //发送带业务参数的模版消息 - BusTemplateMessageDTO busMessageDTO = new BusTemplateMessageDTO(fromUser, toUser, title, templateParam ,templateCode, busType,busId); - sysBaseAPI.sendBusTemplateAnnouncement(busMessageDTO); - //新发送模版消息 - MessageDTO messageDTO = new MessageDTO(); - messageDTO.setType(MessageTypeEnum.XT.getType()); - messageDTO.setToAll(false); - messageDTO.setToUser(toUser); - messageDTO.setTitle("【流程错误】"); - messageDTO.setFromUser("admin"); - HashMap data = new HashMap<>(); - data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, "msg_node"); - messageDTO.setData(data); - messageDTO.setContent("TEST:流程执行失败!任务节点未找到"); - sysBaseAPI.sendTemplateMessage(messageDTO); - } - /** - * 发送邮件 - */ - @Test - public void sendEmailMsg() { - String title = "【日程提醒】您的日程任务即将开始"; - String content = "TEST:尊敬的王先生,您购买的演唱会将于本周日10:08分在国家大剧院如期举行,届时请携带好您的门票和身份证到场"; - String email = "250678106@qq.com"; - sysBaseAPI.sendEmailMsg(email,title,content); - } - /** - * 发送html模版邮件 - */ - @Test - public void sendTemplateEmailMsg() { - String title = "收到一个催办"; - String email = "250678106@qq.com"; - JSONObject params = new JSONObject(); - params.put("bpm_name","高级设置"); - params.put("bpm_task","审批人"); - params.put("datetime","2023-10-07 18:00:49"); - params.put("url","http://boot3.jeecg.com/message/template"); - params.put("remark","快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点"); - sysBaseAPI.sendHtmlTemplateEmail(email,title, EmailTemplateEnum.BPM_CUIBAN_EMAIL,params); - } - /** - * 发送短信 - */ - @Test - public void sendSms() throws ClientException { - //手机号 - String mobile = "159***"; - //消息模版 - DySmsEnum templateCode = DySmsEnum.LOGIN_TEMPLATE_CODE; - //模版所需参数 - JSONObject obj = new JSONObject(); - obj.put("code", "4XDP"); - DySmsHelper.sendSms(mobile, obj, templateCode); - } -} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/InsertDemoTest.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/InsertDemoTest.java deleted file mode 100644 index f458ecd5be0b4a6e4cf6fb40d0da62608c7a64e1..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/InsertDemoTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.jeecg.modules.system.test; - -import com.alibaba.fastjson.JSONObject; -import org.jeecg.JeecgSystemApplication; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.util.RedisUtil; -import org.jeecg.common.util.RestUtil; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * 系统用户单元测试 - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class) -public class InsertDemoTest { - /** - * 测试地址:实际使用时替换成你自己的地址 - */ - private final String BASE_URL = "http://localhost:8080/jeecg-boot//test/jeecgDemo/"; - //测试:用户名和密码 - private final String USERNAME = "admin"; - private final String PASSWORD = "123456"; - @Autowired - private RedisUtil redisUtil; - - /** - * 测试用例:新增 - */ - @Test - public void testAdd() { - // 请求地址 - String url = BASE_URL + "add" ; - // 请求 Header (用于传递Token) - HttpHeaders headers = this.getHeaders(); - // 请求方式是 POST 代表提交新增数据 - HttpMethod method = HttpMethod.POST; - - System.out.println("请求地址:" + url); - System.out.println("请求方式:" + method); - - - for (int i = 0; i < 100; i++) { - String name = "李哈哈" + i; - JSONObject params = new JSONObject(); - params.put("name", name); - System.out.println("请求参数:" + params.toJSONString()); - - // 利用 RestUtil 请求该url - ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); - if (result != null && result.getBody() != null) { - System.out.println("返回结果:" + result.getBody().toJSONString()); - } else { - System.out.println("查询失败"); - } - } - } - - - private String getToken() { - String token = JwtUtil.sign(USERNAME, PASSWORD); - redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60); - return token; - } - - private HttpHeaders getHeaders() { - String token = this.getToken(); - System.out.println("请求Token:" + token); - - HttpHeaders headers = new HttpHeaders(); - String mediaType = MediaType.APPLICATION_JSON_VALUE; - headers.setContentType(MediaType.parseMediaType(mediaType)); - headers.set("Accept", mediaType); - headers.set("X-Access-Token", token); - return headers; - } -} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java deleted file mode 100644 index ca1a0d9d7c01301b95e8d55efeafb8342b9c1095..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.jeecg.modules.system.test; - -import org.jeecg.JeecgSystemApplication; -import org.jeecg.modules.demo.mock.MockController; -import org.jeecg.modules.demo.test.entity.JeecgDemo; -import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper; -import org.jeecg.modules.demo.test.service.IJeecgDemoService; -import org.jeecg.modules.system.service.ISysDataLogService; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import jakarta.annotation.Resource; -import java.util.List; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class) -public class SampleTest { - - @Resource - private JeecgDemoMapper jeecgDemoMapper; - @Resource - private IJeecgDemoService jeecgDemoService; - @Resource - private ISysDataLogService sysDataLogService; - @Resource - private MockController mock; - - @Test - public void testSelect() { - System.out.println(("----- selectAll method test ------")); - List userList = jeecgDemoMapper.selectList(null); - Assert.assertEquals(5, userList.size()); - userList.forEach(System.out::println); - } - - @Test - public void testXmlSql() { - System.out.println(("----- selectAll method test ------")); - List userList = jeecgDemoMapper.getDemoByName("Sandy12"); - userList.forEach(System.out::println); - } - - /** - * 测试事务 - */ - @Test - public void testTran() { - jeecgDemoService.testTran(); - } - - /** - * 测试数据日志添加 - */ - @Test - public void testDataLogSave() { - System.out.println(("----- datalog test ------")); - String tableName = "jeecg_demo"; - String dataId = "4028ef81550c1a7901550c1cd6e70001"; - String dataContent = mock.sysDataLogJson(); - sysDataLogService.addDataLog(tableName, dataId, dataContent); - } -} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysTableWhiteCheckTest.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysTableWhiteCheckTest.java deleted file mode 100644 index 9865d84ef3dfe09dbfc5b1d1aba920d10cdd4db6..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysTableWhiteCheckTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.jeecg.modules.system.test; - -import org.jeecg.JeecgSystemApplication; -import org.jeecg.common.system.api.ISysBaseAPI; -import org.jeecg.config.JeecgBaseConfig; -import org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * @Description: 系统表白名单测试 - * @Author: sunjianlei - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class) -public class SysTableWhiteCheckTest { - - @Autowired - IDictTableWhiteListHandler whiteListHandler; - @Autowired - ISysBaseAPI sysBaseAPI; - - @Autowired - JeecgBaseConfig jeecgBaseConfig; - - @Before - public void before() { - String lowCodeMode = this.jeecgBaseConfig.getFirewall().getLowCodeMode(); - System.out.println("当前 LowCode 模式为: " + lowCodeMode); - // 清空缓存,防止影响测试 - whiteListHandler.clear(); - } - - @Test - public void testSql() { - System.out.println("=== 开始测试 SQL 方式 ==="); - String[] sqlArr = new String[]{ - "select username from sys_user", - "select username, CONCAT(realname, SEX) from SYS_USER", - "select username, CONCAT(realname, sex) from sys_user", - }; - for (String sql : sqlArr) { - System.out.println("- 测试Sql: " + sql); - try { - sysBaseAPI.dictTableWhiteListCheckBySql(sql); - System.out.println("-- 测试通过"); - } catch (Exception e) { - System.out.println("-- 测试未通过: " + e.getMessage()); - } - } - System.out.println("=== 结束测试 SQL 方式 ==="); - } - - @Test - public void testDict() { - System.out.println("=== 开始测试 DICT 方式 ==="); - - String table = "sys_user"; - String code = "username"; - String text = "realname"; - this.testDict(table, code, text); - - table = "sys_user"; - code = "username"; - text = "CONCAT(realname, sex)"; - this.testDict(table, code, text); - - table = "SYS_USER"; - code = "username"; - text = "CONCAT(realname, SEX)"; - this.testDict(table, code, text); - - System.out.println("=== 结束测试 DICT 方式 ==="); - } - - private void testDict(String table, String code, String text) { - try { - sysBaseAPI.dictTableWhiteListCheckByDict(table, code, text); - System.out.println("- 测试通过"); - } catch (Exception e) { - System.out.println("- 测试未通过: " + e.getMessage()); - } - } - -} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysUserTest.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysUserTest.java deleted file mode 100644 index 0d53115c6cf2e988835e65775aad9df284280316..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysUserTest.java +++ /dev/null @@ -1,177 +0,0 @@ -package org.jeecg.modules.system.test; - -import com.alibaba.fastjson.JSONObject; -import org.jeecg.JeecgSystemApplication; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.util.RedisUtil; -import org.jeecg.common.util.RestUtil; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * 系统用户单元测试 - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class) -public class SysUserTest { - /** - * 测试地址:实际使用时替换成你自己的地址 - */ - private final String BASE_URL = "http://localhost:8080/jeecg-boot/sys/user/"; - //测试:用户名和密码 - private final String USERNAME = "admin"; - private final String PASSWORD = "123456"; - @Autowired - private RedisUtil redisUtil; - - /** - * 测试用例:查询记录 - */ - @Test - public void testQuery() { - // 请求地址 - String url = BASE_URL + "list"; - // 请求 Header (用于传递Token) - HttpHeaders headers = this.getHeaders(); - // 请求方式是 GET 代表获取数据 - HttpMethod method = HttpMethod.GET; - - System.out.println("请求地址:" + url); - System.out.println("请求方式:" + method); - - // 利用 RestUtil 请求该url - ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); - if (result != null && result.getBody() != null) { - System.out.println("返回结果:" + result.getBody().toJSONString()); - } else { - System.out.println("查询失败"); - } - } - - /** - * 测试用例:新增 - */ - @Test - public void testAdd() { - // 请求地址 - String url = BASE_URL + "add" ; - // 请求 Header (用于传递Token) - HttpHeaders headers = this.getHeaders(); - // 请求方式是 POST 代表提交新增数据 - HttpMethod method = HttpMethod.POST; - - System.out.println("请求地址:" + url); - System.out.println("请求方式:" + method); - - JSONObject params = new JSONObject(); - params.put("username", "wangwuTest"); - params.put("password", "123456"); - params.put("confirmpassword","123456"); - params.put("realname", "单元测试"); - params.put("activitiSync", "1"); - params.put("userIdentity","1"); - params.put("workNo","0025"); - - System.out.println("请求参数:" + params.toJSONString()); - - // 利用 RestUtil 请求该url - ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); - if (result != null && result.getBody() != null) { - System.out.println("返回结果:" + result.getBody().toJSONString()); - } else { - System.out.println("查询失败"); - } - } - - - /** - * 测试用例:修改 - */ - @Test - public void testEdit() { - // 数据Id - String dataId = "1331795062924374018"; - // 请求地址 - String url = BASE_URL + "edit"; - // 请求 Header (用于传递Token) - HttpHeaders headers = this.getHeaders(); - // 请求方式是 PUT 代表提交修改数据 - HttpMethod method = HttpMethod.PUT; - - System.out.println("请求地址:" + url); - System.out.println("请求方式:" + method); - - JSONObject params = new JSONObject(); - params.put("username", "wangwuTest"); - params.put("realname", "单元测试1111"); - params.put("activitiSync", "1"); - params.put("userIdentity","1"); - params.put("workNo","0025"); - params.put("id",dataId); - - System.out.println("请求参数:" + params.toJSONString()); - - // 利用 RestUtil 请求该url - ResponseEntity result = RestUtil.request(url, method, headers, null, params, JSONObject.class); - if (result != null && result.getBody() != null) { - System.out.println("返回结果:" + result.getBody().toJSONString()); - } else { - System.out.println("查询失败"); - } - } - - - /** - * 测试用例:删除 - */ - @Test - public void testDelete() { - // 数据Id - String dataId = "1331795062924374018"; - // 请求地址 - String url = BASE_URL + "delete" + "?id=" + dataId; - // 请求 Header (用于传递Token) - HttpHeaders headers = this.getHeaders(); - // 请求方式是 DELETE 代表删除数据 - HttpMethod method = HttpMethod.DELETE; - - System.out.println("请求地址:" + url); - System.out.println("请求方式:" + method); - - // 利用 RestUtil 请求该url - ResponseEntity result = RestUtil.request(url, method, headers, null, null, JSONObject.class); - if (result != null && result.getBody() != null) { - System.out.println("返回结果:" + result.getBody().toJSONString()); - } else { - System.out.println("查询失败"); - } - } - - - private String getToken() { - String token = JwtUtil.sign(USERNAME, PASSWORD); - redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60); - return token; - } - - private HttpHeaders getHeaders() { - String token = this.getToken(); - System.out.println("请求Token:" + token); - - HttpHeaders headers = new HttpHeaders(); - String mediaType = MediaType.APPLICATION_JSON_VALUE; - headers.setContentType(MediaType.parseMediaType(mediaType)); - headers.set("Accept", mediaType); - headers.set("X-Access-Token", token); - return headers; - } -} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestSqlHandle.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestSqlHandle.java deleted file mode 100644 index 0e10a7c02432f14678520fb109e8ec630dc39ef4..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestSqlHandle.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.jeecg.smallTools; - -import org.junit.Test; - -/** - * 测试sql分割、替换等操作 - * - * @author: scott - * @date: 2023年09月05日 16:13 - */ -public class TestSqlHandle { - - /** - * Where 分割测试 - */ - @Test - public void testSqlSplitWhere() { - String tableFilterSql = " select * from data.sys_user Where name='12312' and age>100"; - String[] arr = tableFilterSql.split(" (?i)where "); - for (String sql : arr) { - System.out.println("sql片段:" + sql); - } - } - - - /** - * Where 替换 - */ - @Test - public void testSqlWhereReplace() { - String input = " Where name='12312' and age>100"; - String pattern = "(?i)where "; // (?i) 表示不区分大小写 - - String replacedString = input.replaceAll(pattern, ""); - - System.out.println("替换前的字符串:" + input); - System.out.println("替换后的字符串:" + replacedString); - } -} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java deleted file mode 100644 index aaac051ec2680097df14cac8e554c5c8da236ed8..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.jeecg.smallTools; - -import com.alibaba.fastjson.JSONArray; -import org.apache.commons.lang3.StringUtils; -import org.junit.Test; - -import java.text.MessageFormat; -import java.util.Arrays; -import java.util.Base64; - -/** - * 字符串处理测试 - * - * @author: scott - * @date: 2023年03月30日 15:27 - */ -public class TestStr { - - /** - * 测试参数格式化的问题,数字值有问题 - */ - @Test - public void testParameterFormat() { - String url = "/pages/lowApp/process/taskDetail?tenantId={0}&procInsId={1}&taskId={2}&taskDefKey={3}"; - String cc = MessageFormat.format(url, "6364", "111", "22", "333"); - System.out.println("参数是字符串:" + cc); - - String cc2 = MessageFormat.format(url, 6364, 111, 22, 333); - System.out.println("参数是数字(出问题):" + cc2); - } - - - @Test - public void testStringSplitError() { - String conditionValue = "qweqwe"; - String[] conditionValueArray = conditionValue.split(","); - System.out.println("length = "+ conditionValueArray.length); - Arrays.stream(conditionValueArray).forEach(System.out::println); - } - - @Test - public void testJSONArrayJoin() { - JSONArray valArray = new JSONArray(); - valArray.add("123"); - valArray.add("qwe"); - System.out.println("值: " + StringUtils.join(valArray, ",")); - } - - @Test - public void testSql() { - String sql = "select * from sys_user where sex = ${sex}"; - sql = sql.replaceAll("'?\\$\\{sex}'?","1"); - System.out.println(sql); - } - - @Test - public void base64(){ - String encodedString = "5L+d5a2Y5aSx6LSl77yM5YWN6LS554mI5pyA5aSa5Yib5bu6ezB95p2h6L+e5o6l77yM6K+35Y2H57qn5ZWG5Lia54mI77yB"; - byte[] decodedBytes = Base64.getDecoder().decode(encodedString); - String decodedString = new String(decodedBytes); - String tipMsg = MessageFormat.format(decodedString, 10); - System.out.println(tipMsg); - } - - /** - * 正则测试字符串只保存中文和数字和字母 - */ - @Test - public void testSpecialChar() { - String str = "Hello, World! 你好!这是一段特殊符号的测试,This is a test string with special characters: @#$%^&*"; - // 使用正则表达式替换特殊字符 - String replacedStr = str.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", ""); - System.out.println("Replaced String: " + replacedStr); - } - -} diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml index f1ccc179ff1a457ceeed534b0c6476ad7b67afae..5fb349195c0e260fe83fcc365bca0aed4faba57c 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml @@ -32,7 +32,7 @@ org.jeecgframework.boot - jeecg-module-demo + jeecg-module-KM diff --git a/jeecg-boot/pom.xml b/jeecg-boot/pom.xml index db73f0aa88bc92d49cd52313bcf03fd90b9f4a49..0e1aa034303cd23f3aa2ae85f6ce2b58c9f8c276 100644 --- a/jeecg-boot/pom.xml +++ b/jeecg-boot/pom.xml @@ -23,7 +23,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.5 + 3.4.1 @@ -80,11 +80,12 @@ + 1.0.0-SNAPSHOT jeecg-boot-base-core - jeecg-module-demo + jeecg-module-KM jeecg-module-system @@ -133,6 +134,7 @@ org.projectlombok lombok + 1.18.28 @@ -156,6 +158,13 @@ + + org.springframework.ai + spring-ai-bom + ${spring-ai.version} + pom + import + org.springframework.cloud @@ -459,8 +468,16 @@ org.apache.maven.plugins maven-compiler-plugin - ${java.version} - ${java.version} + + --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + + 17 + 17 UTF-8 @@ -598,4 +615,4 @@ - \ No newline at end of file +