Commit 16b8cf03 authored by 李成龙's avatar 李成龙

合并知识库代码到新框架

parent c6ab331e
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>amos-boot-module-biz</artifactId>
<groupId>com.amosframework.boot</groupId>
<version>1.0.0</version>
</parent>
<artifactId>amos-boot-module-knowledgebase-biz</artifactId>
<name>amos-boot-module-knowledgebase-biz</name>
<dependencies>
<dependency>
<groupId>com.amosframework.boot</groupId>
<artifactId>amos-boot-biz-common</artifactId>
<version>${amos-biz-boot.version}</version>
</dependency>
<dependency>
<groupId>org.typroject</groupId>
<artifactId>tyboot-component-emq</artifactId>
<version>${tyboot-version}</version>
<exclusions>
<exclusion>
<groupId>org.typroject</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 规则模块 -->
<dependency>
<groupId>com.yeejoin</groupId>
<artifactId>amos-component-rule</artifactId>
<version>${amos.version}</version>
</dependency>
<!-- 解析word -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>3.3.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-ImportXHTML</artifactId>
<version>3.3.6</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>3.3.6</version>
</dependency>
<!-- 解析html -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
<!-- 解析pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>2.0.1</version>
</dependency>
<!-- 解析excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
</project>
//package com.yeejoin.amos.knowledgebase.config;
//
//import com.baomidou.mybatisplus.core.toolkit.Sequence;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
///**
// * @author 杨博超
// * @ClassName Config
// * @Deacription TODO
// **/
//@Configuration
//public class Config {
//
// @Bean
// public Sequence sequence() {
// return new Sequence();
// }
//}
package com.yeejoin.amos.knowledgebase.config;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchClientConfig {
@Value("${spring.elasticsearch.rest.uris}")
private String uris;
@Bean
@Qualifier("highLevelClient")
public RestHighLevelClient restHighLevelClient() {
try {
String url = uris.replace("http://", "");
final String[] parts = StringUtils.split(url, ":");
HttpHost httpHost = new HttpHost(parts[0], Integer.parseInt(parts[1]), "http");
RestClientBuilder builder = RestClient.builder(httpHost);
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
// 该方法接收一个RequestConfig.Builder对象,对该对象进行修改后然后返回。
@Override
public RequestConfig.Builder customizeRequestConfig(
RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder.setConnectTimeout(5000 * 1000) // 连接超时(默认为1秒)
.setSocketTimeout(6000 * 1000);// 套接字超时(默认为30秒)//更改客户端的超时限制默认30秒现在改为100*1000分钟
}
});// 调整最大重试超时时间(默认为30秒).setMaxRetryTimeoutMillis(60000);
return new RestHighLevelClient(builder);
} catch (Exception e) {
throw new IllegalStateException("Invalid ES nodes " + "property '" + uris + "'", e);
}
}
}
package com.yeejoin.amos.knowledgebase.config;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
/**
* @author 杨博超
* @ClassName SimpleCORSFilter
* @Deacription TODO
**/
@Component
public class SimpleCORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {
}
public void destroy() {
}
@Override
public boolean isLoggable(LogRecord logRecord) {
return false;
}
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocAnnotateModel;
import com.yeejoin.amos.knowledgebase.face.service.DocAnnotateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.List;
/**
* <p>
* 知识库文档注释 前端控制器
* </p>
*
* @author ningtianqing
* @since 2020-09-16
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "docannotate")
@RequestMapping(value = "/v1/docannotate")
@Api(tags = "knowledgebase-文档注释")
public class DocAnnotateResource {
private final Logger logger = LogManager.getLogger(DocAnnotateResource.class);
@Autowired
private DocAnnotateService docAnnotateService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "创建注释")
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseModel<KnowledgeDocAnnotateModel> create(@RequestBody KnowledgeDocAnnotateModel model) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getDocSeq())
|| ValidationUtil.isEmpty(model.getAnnotateContent()))
throw new BadRequest("参数校验失败.");
return ResponseHelper.buildResponse(docAnnotateService.createAnnotate(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "更新注释")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.PUT)
public ResponseModel<KnowledgeDocAnnotateModel> update(
@RequestBody KnowledgeDocAnnotateModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getDocSeq())
|| ValidationUtil.isEmpty(model.getAnnotateContent()))
throw new BadRequest("参数校验失败.");
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(docAnnotateService.updateAnnotate(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "批量删除注释")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.DELETE)
public ResponseModel deleteComments(
@RequestBody KnowledgeDocAnnotateModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(docAnnotateService.deleteAnnotate(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "根据文档id获取文档下注释集合")
@RequestMapping(value = "/{docSeq}", method = RequestMethod.GET)
public ResponseModel getAnnotateByDocSeq(@PathVariable(value = "docSeq") String docSeq) {
List<KnowledgeDocAnnotateModel> list = docAnnotateService.queryForAnnotateList(docSeq);
return ResponseHelper.buildResponse(list);
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.service.DocAuditService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.Map;
/**
* <p>
* 知识库文档发布审核流程 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "docaudit")
@RequestMapping(value = "/v1/doccontent/docaudit")
@Api(tags = "knowledgebase-文档发布审核流程")
public class DocAuditResource {
private final Logger logger = LogManager.getLogger(DocAuditResource.class);
@Autowired
private DocAuditService docAuditService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档发布")
@RequestMapping(value = "/status/publish/{ids}", method = RequestMethod.PUT)
public ResponseModel docPublish(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(docAuditService.publish(StringUtil.String2LongList(ids)));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档取消发布")
@RequestMapping(value = "/status/unpublish/{ids}", method = RequestMethod.PUT)
public ResponseModel docUnpublish(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(docAuditService.unpublish(StringUtil.String2LongList(ids)));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档提交")
@RequestMapping(value = "/status/submit/{ids}", method = RequestMethod.PUT)
public ResponseModel docSubmit(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(docAuditService.submit(StringUtil.String2LongList(ids)));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档审核-通过")
@RequestMapping(value = "/status/pass/{ids}", method = RequestMethod.PUT)
public ResponseModel docPass(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(docAuditService.pass(StringUtil.String2LongList(ids)));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档审核-驳回")
@RequestMapping(value = "/status/reject/{id}", method = RequestMethod.PUT)
public ResponseModel docReject(@PathVariable(value = "id") Long id,
@RequestBody Map<String, Object> body) {
String rejectionComment = body.containsKey("rejectionComment") ? body.get("rejectionComment").toString() : null;
return ResponseHelper.buildResponse(docAuditService.reject(id, rejectionComment));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocCategoryModel;
import com.yeejoin.amos.knowledgebase.face.service.DocCategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 知识库文档分类 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "doccategory")
@RequestMapping(value = "/v1/doccategory")
@Api(tags = "knowledgebase-知识库文档分类")
public class DocCategoryResource {
private final Logger logger = LogManager.getLogger(DocCategoryResource.class);
@Autowired
private DocCategoryService docCategoryService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "创建")
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseModel<KnowledgeDocCategoryModel> create(@RequestBody KnowledgeDocCategoryModel model) {
model = docCategoryService.createOne(model);
return ResponseHelper.buildResponse(model);
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "更新")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.PUT)
public ResponseModel<KnowledgeDocCategoryModel> update(
@RequestBody KnowledgeDocCategoryModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(docCategoryService.updateOne(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询单个对象")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.GET)
public ResponseModel<KnowledgeDocCategoryModel> seleteOne(@PathVariable("sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(docCategoryService.queryBySeq(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "分页查询")
@RequestMapping(value = "/page", method = RequestMethod.GET)
public ResponseModel<Page> queryForPage(
@RequestParam(value = "current") int current,
@RequestParam(value = "size") int size) {
Page page = new Page();
page.setCurrent(current);
page.setSize(size);
return ResponseHelper.buildResponse(docCategoryService.queryForKnowledgeDocCategoryPage(page, RequestContext.getAgencyCode()));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "列表查询")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ResponseModel selectForList(@RequestParam(value = "parentId", required = false) Long parentId) {
return ResponseHelper.buildResponse(docCategoryService.queryForKnowledgeDocCategoryList(parentId));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档分类树查询")
@RequestMapping(value = "/tree", method = RequestMethod.GET)
public ResponseModel<Collection<KnowledgeDocCategoryModel>> docCategoryTree() {
return ResponseHelper.buildResponse(docCategoryService.queryDocCategoryTree(RequestContext.getAgencyCode(), 0L));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档分类树删除")
@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
public ResponseModel<List<Long>> deleteDocCategory(@PathVariable("ids") String ids) {
return ResponseHelper.buildResponse(docCategoryService.deleteDocCategory(ids));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档分类树查询-携带文档基本信息(包含根节点信息)")
@RequestMapping(value = "/tree-extra", method = RequestMethod.GET)
public ResponseModel<Collection> docCategoryTreeExtra(@RequestParam(value = "root", required = false) Long root,
@RequestParam(value = "onlyPublish", defaultValue = "true", required = false) Boolean onlyPublish) {
if (ValidationUtil.isEmpty(root)) {
root = DocCategoryService.ROOT;
}
return ResponseHelper.buildResponse(docCategoryService.queryDocCategoryTreeExtra(RequestContext.getAgencyCode(), root, onlyPublish));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocCommentsModel;
import com.yeejoin.amos.knowledgebase.face.service.DocCommentsService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.List;
/**
* <p>
* 知识库评论信息 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "doccomments")
@RequestMapping(value = "/v1/doccomments")
@Api(tags = "knowledgebase-知识库评论信息")
public class DocCommentsResource {
private final Logger logger = LogManager.getLogger(DocCommentsResource.class);
@Autowired
private DocCommentsService docCommentsService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "创建评论")
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseModel<KnowledgeDocCommentsModel> create(@RequestBody KnowledgeDocCommentsModel model) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getDocSeq())
|| ValidationUtil.isEmpty(model.getCommentsContent()))
throw new BadRequest("参数校验失败.");
return ResponseHelper.buildResponse(docCommentsService.createComments(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "批量删除评论")
@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
public ResponseModel deleteComments(
@PathVariable(value = "ids") String ids) {
List<Long> seqs = StringUtil.String2LongList(ids);
docCommentsService.deleteBatchSeq(seqs);
return ResponseHelper.buildResponse(seqs);
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "给评论点赞")
@RequestMapping(value = "/{sequenceNbr}/like", method = RequestMethod.PUT)
public ResponseModel<Boolean> like(
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(docCommentsService.like(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "分页查询文档的评论")
@RequestMapping(value = "/page", method = RequestMethod.GET)
public ResponseModel<Page> queryForPage(
@RequestParam(value = "docSeq") Long docSeq,
@RequestParam(value = "current") int current,
@RequestParam(value = "size") int size) {
Page page = new Page();
page.setCurrent(current);
page.setSize(size);
return ResponseHelper.buildResponse(docCommentsService.queryDocCommentsPage(page, RequestContext.getAgencyCode(), docSeq));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.enumeration.DynamicsFunctional;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocContentModel;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.service.DocContentService;
import com.yeejoin.amos.knowledgebase.face.service.DocLibraryService;
import com.yeejoin.amos.knowledgebase.face.service.DynamicsOptionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* <p>
* 知识库文档存储 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "doccontent")
@RequestMapping(value = "/v1/doccontent")
@Api(tags = "knowledgebase-知识库文档存储")
public class DocContentResource {
@Autowired
private DocContentService docContentService;
@Autowired
private DynamicsOptionService dynamicsOptionService;
@Autowired
private DocLibraryService docLibraryService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "创建文档")
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseModel<KnowledgeDocContentModel> createDoc(@RequestBody KnowledgeDocContentModel model) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getHtmlContent())
|| ValidationUtil.isEmpty(model.getDocTitle())
|| ValidationUtil.isEmpty(model.getDirectoryId())) {
throw new BadRequest("参数校验失败.");
}
return ResponseHelper.buildResponse(docContentService.createDoc(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "更新文档")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.PUT)
public ResponseModel<KnowledgeDocContentModel> update(
@RequestBody KnowledgeDocContentModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getDocTitle())
|| ValidationUtil.isEmpty(model.getDirectoryId())
|| ValidationUtil.isEmpty(model.getHtmlContent())) {
throw new BadRequest("参数校验失败.");
}
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(docContentService.updateDoc(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "更新文档内容")
@RequestMapping(value = "/content/{sequenceNbr}", method = RequestMethod.PUT)
public ResponseModel<KnowledgeDocContent> updateContent(
@RequestBody KnowledgeDocContentModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
if (ValidationUtil.isEmpty(sequenceNbr)
|| ValidationUtil.isEmpty(model.getHtmlContent())) {
throw new BadRequest("参数校验失败.");
}
return ResponseHelper.buildResponse(docContentService.updateHtmlContent(sequenceNbr, model.getHtmlContent()));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "删除文档")
@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
public ResponseModel<List<Long>> deleteDoc(
@PathVariable(value = "ids") String ids) {
List<Long> idList = StringUtil.String2LongList(ids);
if (ValidationUtil.isEmpty(ids)) {
throw new BadRequest("请选择要删除的文档.");
}
return ResponseHelper.buildResponse(docContentService.deleteDoc(idList));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "给文档点赞")
@RequestMapping(value = "/{sequenceNbr}/like", method = RequestMethod.PUT)
public ResponseModel like(
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(docContentService.like(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "给文档吐槽")
@RequestMapping(value = "/{sequenceNbr}/dislike", method = RequestMethod.PUT)
public ResponseModel dislike(
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(docContentService.disLike(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询单个文档内容信息")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.GET)
public ResponseModel<KnowledgeDocContentModel> seleteOne(@PathVariable("sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(docContentService.queryOneDocDetail(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "获取管理界面的表头")
@RequestMapping(value = "/docmanagement/header", method = RequestMethod.GET)
public ResponseModel docmanagementHeader() {
return ResponseHelper.buildResponse(dynamicsOptionService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name()));
}
// @TycloudOperation(ApiLevel = UserType.AGENCY)
// @ApiOperation(value = "分页查询文档信息")
// @RequestMapping(value = "/page", method = RequestMethod.GET)
// public ResponseModel<Page> queryDocPage(HttpServletRequest request) {
// Map paramMap = request.getParameterMap();
//
// String[] auditStatus = request.getParameterValues("auditStatus");
// String[] docStatus = request.getParameterValues("docStatus");
//
// if (!ValidationUtil.isEmpty(auditStatus) && auditStatus[0].length() == 0) {
// auditStatus = null;
// }
// if (!ValidationUtil.isEmpty(docStatus) && docStatus[0].length() == 0) {
// docStatus = null;
// }
// Date createTimeLeft = null;
// Date createTimeRight = null;
// try {
// if (!ValidationUtil.isEmpty(paramMap.get("createTimeLeft"))) {
// createTimeLeft = DateUtil.formatStringToDate(request.getParameterValues("createTimeLeft")[0], null);
// }
// if (!ValidationUtil.isEmpty(paramMap.get("createTimeRight"))) {
// createTimeRight = DateUtil.formatStringToDate(request.getParameterValues("createTimeRight")[0], null);
// }
// } catch (Exception e) {
// throw new BadRequest("时间范围参数格式有误");
// }
// int offset = Integer.parseInt(request.getParameterValues("offset")[0]);
// int end = Integer.parseInt(request.getParameterValues("end")[0]);
//
// paramMap.remove("offset");
// paramMap.remove("end");
// paramMap.remove("total");
// paramMap.remove("auditStatus");
// paramMap.remove("docStatus");
// paramMap.remove("createTimeLeft");
// paramMap.remove("createTimeRight");
//
// return ResponseHelper.buildResponse(docContentService.queryDocPage(offset, end, paramMap, auditStatus, docStatus, createTimeLeft, createTimeRight));
// }
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "分页查询文档信息")
@RequestMapping(value = "/page", method = RequestMethod.GET)
public ResponseModel<Page> queryDocPageNew(HttpServletRequest request,
@RequestParam(value = "offset") Integer offset,
@RequestParam(value = "end") Integer end,
@RequestParam(value = "directoryId", required = false) Long directoryId,
@RequestParam(value = "docTitle", required = false) String docTitle,
@RequestParam(value = "auditStatus", required = false) String[] auditStatus,
@RequestParam(value = "docStatus", required = false) String docStatus,
@RequestParam(value = "createTimeLeft", required = false) String createTimeLeft,
@RequestParam(value = "createTimeRight", required = false) String createTimeRight) {
Map requestMap = request.getParameterMap();
Page page = docLibraryService.queryDocList(offset, end, directoryId, docTitle, auditStatus, docStatus,
requestMap, createTimeLeft, createTimeRight, false, true);
return ResponseHelper.buildResponse(page);
}
// @TycloudOperation(ApiLevel = UserType.AGENCY)
// @ApiOperation(value = "字符串模糊查询文档(搜索项为文档标题和标签名称)")
// @RequestMapping(value = "/title/tag", method = RequestMethod.GET)
// public ResponseModel searchForDocs(
// @RequestParam(value = "queryStr", defaultValue = "") String queryStr,
// @RequestParam(value = "current") int current,
// @RequestParam(value = "size") int size) {
// Page page = new Page();
// page.setCurrent(current);
// page.setSize(size);
// return ResponseHelper.buildResponse(docContentService.searchForDoc(page, queryStr));
// }
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档被点赞/吐槽状态")
@RequestMapping(value = "/{sequenceNbr}/statistics/likes", method = RequestMethod.GET)
public ResponseModel queryLikeOrDis(
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(docContentService.queryLikeOrDis(sequenceNbr));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.service.DocContentService;
import com.yeejoin.amos.knowledgebase.face.service.DocLibraryService;
import com.yeejoin.amos.knowledgebase.face.service.ESDocService;
import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelImportConfig;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* <p>
* 文档库管理
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "doclibrary")
@RequestMapping(value = "/v1/doccontent/doclibrary")
@Api(tags = "knowledgebase-文档库管理")
public class DocLibraryResource {
@Autowired
private DocLibraryService docLibraryService;
/**
* 下拉式查询文档信息
*
* @param request 请求对象
* @param offset 跳过条数
* @param end 截止条数
* @param filterByCollection 是否以收藏作为条件
* @param createTimeLeft 创建时间左范围
* @param createTimeRight 创建时间右范围
* @return Page
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "下拉式查询文档信息")
@RequestMapping(value = "/page", method = RequestMethod.GET)
public ResponseModel<Page> queryDocPageNew(HttpServletRequest request,
@RequestParam(value = "offset") Integer offset,
@RequestParam(value = "end") Integer end,
@RequestParam(value = "filterByCollection") String filterByCollection,
@RequestParam(value = "directoryId", required = false) Long directoryId,
@RequestParam(value = "docTitle", required = false) String docTitle,
@RequestParam(value = "createTimeLeft", required = false) String createTimeLeft,
@RequestParam(value = "createTimeRight", required = false) String createTimeRight) {
Map requestMap = request.getParameterMap();
Page page = docLibraryService.queryDocList(offset, end, directoryId, docTitle, null, DocContentService.DOC_STATUS_PUBLISHED,
requestMap, createTimeLeft, createTimeRight, Boolean.parseBoolean(filterByCollection), false);
return ResponseHelper.buildResponse(page);
}
/**
* 收藏文档
*
* @param id
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档收藏")
@RequestMapping(value = "/collect/{id}", method = RequestMethod.PUT)
public ResponseModel docCollect(@PathVariable(value = "id") Long id) {
return ResponseHelper.buildResponse(docLibraryService.favorite(id, true));
}
/**
* 取消收藏
*
* @param id
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档取消收藏")
@RequestMapping(value = "/uncollect/{id}", method = RequestMethod.PUT)
public ResponseModel docUncollect(@PathVariable(value = "id") Long id) {
return ResponseHelper.buildResponse(docLibraryService.favorite(id, false));
}
/**
* 获取文档引用数和收藏数
*
* @param id
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "获取文档引用数和收藏数")
@RequestMapping(value = "/count/{id}", method = RequestMethod.GET)
public ResponseModel DocCount(@PathVariable(value = "id") Long id) {
return ResponseHelper.buildResponse(docLibraryService.countDoc(id));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "搜索联想")
@RequestMapping(value = "/associate", method = RequestMethod.GET)
public ResponseModel worldAssociate(
@RequestParam(value = "queryStr") String queryStr) {
if (ValidationUtil.isEmpty(queryStr)) {
queryStr = "";
}
return ResponseHelper.buildResponse(docLibraryService.associate(queryStr.trim()));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档数量统计")
@RequestMapping(value = "/statistics/count", method = RequestMethod.GET)
public ResponseModel statisticsCount(@RequestParam(value = "rangeDays", required = false) Integer rangeDays) {
if (ValidationUtil.isEmpty(rangeDays)) {
rangeDays = 5;
}
return ResponseHelper.buildResponse(docLibraryService.count(rangeDays));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询最新文档列表")
@RequestMapping(value = "/list/new/{top}", method = RequestMethod.GET)
public ResponseModel queryNews(@PathVariable(value = "top") Integer top) {
return ResponseHelper.buildResponse(docLibraryService.queryNewDocs(top));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询我的收藏列表")
@RequestMapping(value = "/list/favorites", method = RequestMethod.GET)
public ResponseModel queryFavorites() {
return ResponseHelper.buildResponse(docLibraryService.queryMyCollectedDocs());
}
@Autowired
private ESDocService eSDocService;
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(value = "耗时* 重建ES索引")
@RequestMapping(value = "/es/init", method = RequestMethod.PUT)
public ResponseModel initEs() {
RequestContext.setExeUserId("super");
return ResponseHelper.buildResponse(eSDocService.init());
}
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(value = "耗时* 刷新历史文档数据以支持高级检索,仅升级至高级检索版本时调用一次即可")
@RequestMapping(value = "/as/init", method = RequestMethod.PUT)
public ResponseModel initAdvancedSearch() {
RequestContext.setExeUserId("super");
return ResponseHelper.buildResponse(docLibraryService.init());
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "根据文档标题和标签名称查询文档")
@RequestMapping(value = "/es/query", method = RequestMethod.GET)
public ResponseModel filter(@RequestParam(value = "queryStr", required = false) String queryStr,
@RequestParam(value = "current", defaultValue = "0") int current,
@RequestParam(value = "size", defaultValue = "10") int size) {
return ResponseHelper.buildResponse(eSDocService.queryByKeys(queryStr, current, size));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "高级检索")
@RequestMapping(value = "/query/advanced", method = RequestMethod.POST)
public ResponseModel searchAdvanced(@RequestBody Map<String, Object> condition,
@RequestParam(value = "current", defaultValue = "0") int current,
@RequestParam(value = "size", defaultValue = "10") int size) {
Page page = new Page(current, size);
return ResponseHelper.buildResponse(docLibraryService.searchAdvanced(page,condition));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "根据文档标题和标签名称查询文档-APP")
@RequestMapping(value = "/es/query1", method = RequestMethod.GET)
public ResponseModel filter1(@RequestParam(value = "queryStr", required = false) String queryStr,
@RequestParam(value = "current", defaultValue = "0") int current,
@RequestParam(value = "size", defaultValue = "10") int size) {
return ResponseHelper.buildResponse(eSDocService.queryAndDetail(queryStr, current, size));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "导出为word文档")
@RequestMapping(value = "/export/{id}/{type}", method = RequestMethod.GET)
public void export(@PathVariable(value = "id") Long id,
@PathVariable(value = "type") String type,
HttpServletResponse response) {
if (ValidationUtil.isEmpty(type)) {
throw new BadRequest("参数有误");
}
docLibraryService.export(id, type, response);
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "导入excel文档")
@RequestMapping(value = "/import", method = RequestMethod.POST)
public ResponseModel importExcel(@RequestPart(value = "file") MultipartFile file,
@RequestPart(value = "module") String moduleStr) {
ExcelImportConfig excelConfig;
try {
excelConfig = JSON.parseObject(moduleStr, ExcelImportConfig.class);
} catch (Exception e) {
throw new BadRequest("模板配置信息格式有误");
}
return ResponseHelper.buildResponse(docLibraryService.importExcel(file, excelConfig));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocContentModel;
import com.yeejoin.amos.knowledgebase.face.service.DocContentService;
import com.yeejoin.amos.knowledgebase.face.service.DocLibraryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 文档库管理
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "doclibrary")
@RequestMapping(value = "/v1/doccontent/outer")
@Api(tags = "knowledgebase-文档库对外接口")
public class DocOuterResource {
@Autowired
private DocLibraryService docLibraryService;
@Autowired
private DocContentService docContentService;
/**
* 分页列表展示
*
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "分页查询文档信息")
@RequestMapping(value = "/page", method = RequestMethod.GET)
public ResponseModel<Page> queryDocPage(@RequestParam(value = "current") Integer current,
@RequestParam(value = "size") Integer size,
@RequestParam(value = "code", required = false) String code,
@RequestParam(value = "docTitle", required = false) String docTitle) {
Page page = new Page(current, size);
return ResponseHelper.buildResponse(docLibraryService.queryDocPage(page, docTitle, code));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询文档内容信息")
@RequestMapping(value = "/{ids}", method = RequestMethod.GET)
public ResponseModel<List<KnowledgeDocContentModel>> selectOne(@PathVariable("ids") String ids) {
String[] idList = ids.split(",");
List<KnowledgeDocContentModel> res = new ArrayList();
for (String id : idList) {
if (!ValidationUtil.isEmpty(id)) {
res.add(docContentService.queryOneDocDetail(Long.parseLong(id.trim())));
}
}
return ResponseHelper.buildResponse(res);
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "根据分类查询随机N条已发布文档")
@RequestMapping(value = "random-list", method = RequestMethod.GET)
public ResponseModel<List<KnowledgeDocContentModel>> selectByDirsRand(
@RequestParam(value = "directories") String directories,
@RequestParam(value = "total",required = false) Integer total) {
List<Long> directoryList;
try {
directoryList = StringUtil.String2LongList(directories);
} catch (Exception e) {
throw new BadRequest("参数有误");
}
if (ValidationUtil.isEmpty(total) || total==0) {
total = null;
}
return ResponseHelper.buildResponse(docLibraryService.selectByDirsRand(directoryList, total));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.service.StatisticsRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
@RestController
//@TycloudResource(module = "knowledgebase", value = "docstatistics")
//@RequestMapping(value = "/v1/doccontent/docstatistics")
//@Api(tags = "knowledgebase-文档统计报表")
public class DocStatisticsResource {
@Autowired
private StatisticsRecordService statisticsRecordService;
/*@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(value = "耗时* 刷新统计数据")
@RequestMapping(value = "/record/init", method = RequestMethod.PUT)
public ResponseModel init() {
return ResponseHelper.buildResponse(statisticsRecordService.init());
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "灾情统计")
@RequestMapping(value = "/count/disaster", method = RequestMethod.GET)
public ResponseModel selectDisasterCount() {
return ResponseHelper.buildResponse(statisticsRecordService.selectDisasterCount());
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "燃烧物质统计分类")
@RequestMapping(value = "/count/burning", method = RequestMethod.GET)
public ResponseModel selectBurningCategory() {
return ResponseHelper.buildResponse(statisticsRecordService.selectCategoryByName(StatisticsRecordService.STATISTICS_BURNING_CATEGORY));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "到场时间统计分类")
@RequestMapping(value = "/count/present", method = RequestMethod.GET)
public ResponseModel selectPresentCategory() {
return ResponseHelper.buildResponse(statisticsRecordService.selectCategoryByName(StatisticsRecordService.STATISTICS_PRESENT_CATEGORY));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "伤亡人数趋势统计")
@RequestMapping(value = "/count/casualties", method = RequestMethod.GET)
public ResponseModel selectCasualtiesSum(@RequestParam(value = "dateType") String dateType,
@RequestParam(value = "dateRangeLeft", required = false) String dateRangeLeft,
@RequestParam(value = "dateRangeRight", required = false) String dateRangeRight) {
return ResponseHelper.buildResponse(statisticsRecordService.selectCountByTypeAndDateRange(dateType, dateRangeLeft, dateRangeRight, StatisticsRecordService.STATISTICS_CASUALTIES_SUM));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "参战车辆数量统计")
@RequestMapping(value = "/count/power", method = RequestMethod.GET)
public ResponseModel selectPowerSum(@RequestParam(value = "dateType") String dateType,
@RequestParam(value = "dateRangeLeft", required = false) String dateRangeLeft,
@RequestParam(value = "dateRangeRight", required = false) String dateRangeRight) {
return ResponseHelper.buildResponse(statisticsRecordService.selectCountByTypeAndDateRange(dateType, dateRangeLeft, dateRangeRight, StatisticsRecordService.STATISTICS_POWER_SUM));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "过火面积统计")
@RequestMapping(value = "/count/area", method = RequestMethod.GET)
public ResponseModel selectAreaSum(@RequestParam(value = "dateType") String dateType,
@RequestParam(value = "dateRangeLeft", required = false) String dateRangeLeft,
@RequestParam(value = "dateRangeRight", required = false) String dateRangeRight) {
return ResponseHelper.buildResponse(statisticsRecordService.selectCountByTypeAndDateRange(dateType, dateRangeLeft, dateRangeRight, StatisticsRecordService.STATISTICS_AREA_COUNT));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "灭火药剂统计")
@RequestMapping(value = "/count/extinguishing", method = RequestMethod.GET)
public ResponseModel selectExtinguishingSum(@RequestParam(value = "dateType") String dateType,
@RequestParam(value = "dateRangeLeft", required = false) String dateRangeLeft,
@RequestParam(value = "dateRangeRight", required = false) String dateRangeRight) {
return ResponseHelper.buildResponse(statisticsRecordService.selectCountByTypeAndDateRange(dateType, dateRangeLeft, dateRangeRight, StatisticsRecordService.STATISTICS_EXTINGUISHING_SUM));
}*/
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsGroupModel;
import com.yeejoin.amos.knowledgebase.face.service.DynamicsGroupService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.List;
/**
* <p>
* 知识库系统动态选项配置的分组,用于区分不同功能的字段列表 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "dynamicsgroup")
@RequestMapping(value = "/v1/dynamicsgroup")
@Api(tags = "knowledgebase-统动态选项配置的分组")
public class DynamicsGroupResource {
private final Logger logger = LogManager.getLogger(DynamicsGroupResource.class);
@Autowired
private DynamicsGroupService dynamicsGroupService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "动态配置分组列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ResponseModel<List<KnowledgeDynamicsGroupModel>> queryByGroup() {
return ResponseHelper.buildResponse(dynamicsGroupService.queryGroupList(RequestContext.getAppKey()));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.enumeration.DynamicsFunctional;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsOptionModel;
import com.yeejoin.amos.knowledgebase.face.service.DynamicsOptionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.List;
/**
* <p>
* 知识库系统动态选项配置,多用于动态字段配置 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "dynamicsoption")
@RequestMapping(value = "/v1/dynamicsoption")
@Api(tags = "knowledgebase-动态选项配置")
public class DynamicsOptionResource {
private final Logger logger = LogManager.getLogger(DynamicsOptionResource.class);
@Autowired
private DynamicsOptionService dynamicsOptionService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "创建动态配置字段")
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseModel<KnowledgeDynamicsOptionModel> createOption(@RequestBody KnowledgeDynamicsOptionModel model) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getFieldLabel())
|| ValidationUtil.isEmpty(model.getDataType())
|| ValidationUtil.isEmpty(model.getGroupSeq())
|| ValidationUtil.isEmpty(model.getFieldName()))
throw new BadRequest("参数校验失败.");
return ResponseHelper.buildResponse(dynamicsOptionService.createOption(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "更新动态配置字段")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.PUT)
public ResponseModel<KnowledgeDynamicsOptionModel> udpateOption(
@RequestBody KnowledgeDynamicsOptionModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(dynamicsOptionService.udpateOption(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询单个字段信息")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.GET)
public ResponseModel<KnowledgeDynamicsOptionModel> seleteOne(@PathVariable Long sequenceNbr) {
return ResponseHelper.buildResponse(dynamicsOptionService.queryBySeq(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "删除单个字段定义")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.DELETE)
public ResponseModel<Boolean> deleteOption(@PathVariable Long sequenceNbr) {
return ResponseHelper.buildResponse(dynamicsOptionService.deleteOption(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "根据分组查询动态字段列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ResponseModel<List<KnowledgeDynamicsOptionModel>> queryByGroup(@RequestParam("groupSeq") Long groupSeq) {
return ResponseHelper.buildResponse(dynamicsOptionService.queryByGroupSeq(groupSeq));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "文档基础信息动态字段查询")
@RequestMapping(value = "/functional/list", method = RequestMethod.GET)
public ResponseModel<List<KnowledgeDynamicsOptionModel>> queryByFunctional() {
return ResponseHelper.buildResponse(dynamicsOptionService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name()));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.service.DynamicsValueService;
import io.swagger.annotations.Api;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
/**
* <p>
* 知识库系统动态选项配置的实例值 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "dynamicsvalue")
@RequestMapping(value = "/v1/dynamicsvalue")
@Api(tags = "knowledgebase-知识库系统动态选项配置的实例值")
public class DynamicsValueResource {
private final Logger logger = LogManager.getLogger(DynamicsValueResource.class);
@Autowired
private DynamicsValueService dynamicsValueService;
}
package com.yeejoin.amos.knowledgebase.controller;
import io.swagger.annotations.Api;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
/**
* <p>
* 知识库内容交互计数表 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "interactioncount")
@RequestMapping(value = "/v1/interactioncount")
@Api(tags = "knowledgebase-知识库内容交互计数表")
public class InteractionCountResource {
private final Logger logger = LogManager.getLogger(InteractionCountResource.class);
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.service.InteractionRecordService;
import io.swagger.annotations.Api;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
/**
* <p>
* 知识库内容交互记录 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "interactionrecord")
@RequestMapping(value = "/v1/interactionrecord")
@Api(tags = "knowledgebase-知识库内容交互记录")
public class InteractionRecordResource {
private final Logger logger = LogManager.getLogger(InteractionRecordResource.class);
@Autowired
private InteractionRecordService interactionRecordService;
}
package com.yeejoin.amos.knowledgebase.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.service.MessageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.List;
import java.util.Map;
@RestController
@TycloudResource(module = "knowledgebase", value = "interactionrecord")
@RequestMapping(value = "/v1/message")
@Api(tags = "knowledgebase-推送消息")
public class MessageResource {
private final String paramUsers = "target";
private final String paramTitle = "docTitle";
private final String paramContent = "content";
private final String paramDocSeq = "docSeq";
private final String paramWay = "way";
private final Logger logger = LogManager.getLogger(MessageResource.class);
@Autowired
private MessageService messageService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询用户的消息列表.")
@RequestMapping(value = "/list/owner", method = RequestMethod.GET)
public ResponseModel list(@RequestParam(value = "messageType", required = false) String messageType) {
if (ValidationUtil.isEmpty(messageType)) {
messageType = null;
}
return ResponseHelper.buildResponse(messageService.queryByOwner(RequestContext.getExeUserId(), messageType));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "根据id查询消息详情.")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.GET)
public ResponseModel queryOne(@PathVariable Long sequenceNbr) {
return ResponseHelper.buildResponse(messageService.queryById(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "阅读消息.")
@RequestMapping(value = "/status/read/{ids}", method = RequestMethod.PUT)
public ResponseModel readMessage(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(messageService.readMessage(StringUtil.String2LongList(ids)));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "阅读全部消息.")
@RequestMapping(value = "/status/read/all", method = RequestMethod.PUT)
public ResponseModel readAllMessageByUserId() {
return ResponseHelper.buildResponse(messageService.readAllMessageByUserId(RequestContext.getExeUserId()));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "要点推送.")
@RequestMapping(value = "/essential", method = RequestMethod.POST)
public ResponseModel pushEssential(@RequestBody Map<String, Object> body) {
if (body.containsKey(paramUsers) && body.containsKey(paramContent) && body.containsKey(paramDocSeq)) {
Object usersObj = body.get(paramUsers);
Object contentObj = body.get(paramContent);
Object docSeqObj = body.get(paramDocSeq);
Object titleObj = body.get(paramTitle);
if (ValidationUtil.isEmpty(usersObj)
|| !(usersObj instanceof List)
|| ValidationUtil.isEmpty(contentObj)
|| ValidationUtil.isEmpty(docSeqObj)
|| ValidationUtil.isEmpty(titleObj)) {
throw new BadRequest("参数不能为空");
}
try {
List<Map<String, Object>> users = (List<Map<String, Object>>) body.get(paramUsers);
String title = titleObj.toString();
String content = contentObj.toString();
Long docSeq = Long.valueOf(docSeqObj.toString());
return ResponseHelper.buildResponse(messageService.pushEssential(users, title, content, docSeq));
} catch (ClassCastException e) {
}
}
throw new BadRequest("参数格式有误");
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "战例分享.")
@RequestMapping(value = "/doccontent", method = RequestMethod.POST)
public ResponseModel shareDoc(@RequestBody Map<String, Object> body) {
if (body.containsKey(paramUsers) && body.containsKey(paramContent) && body.containsKey(paramWay)) {
Object usersObj = body.get(paramUsers);
Object contentObj = body.get(paramContent);
Object wayObj = body.get(paramWay);
if (ValidationUtil.isEmpty(usersObj)
|| !(usersObj instanceof List)
|| ValidationUtil.isEmpty(contentObj)
|| !(contentObj instanceof List)
|| ValidationUtil.isEmpty(wayObj)) {
throw new BadRequest("参数不能为空");
}
try {
List<Map<String, Object>> users = (List<Map<String, Object>>) usersObj;
List<Map<String, Object>> content = (List<Map<String, Object>>) contentObj;
String way = wayObj.toString();
return ResponseHelper.buildResponse(messageService.shareDoc(users, content, way));
} catch (ClassCastException e) {
logger.error(e.getMessage());
}
}
throw new BadRequest("参数格式有误");
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "分页查询查询用户的消息列表.")
@RequestMapping(value = "/list/page", method = RequestMethod.GET)
public ResponseModel<Page> list(
@RequestParam(value = "current", required = true) int current,
@RequestParam(value = "size", required = true) int size,
@RequestParam(value = "messageType", required = false) String messageType) {
if (size < 0 && current < 1) {
throw new BadRequest("参数有误");
}
List<Map> list = messageService.queryByPage(RequestContext.getExeUserId(), current,size,messageType);
Integer total = messageService.queryByPageCount(RequestContext.getExeUserId(),messageType);
//构建分页参数
Page page = new Page();
page.setCurrent(current);
page.setSize(size);
page.setRecords(list);
page.setTotal(total);
return ResponseHelper.buildResponse(page);
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupModel;
import com.yeejoin.amos.knowledgebase.face.service.TagGroupService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 标签分组 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "taggroup")
@RequestMapping(value = "/v1/taggroup")
@Api(tags = "knowledgebase-标签分组")
public class TagGroupResource {
private final Logger logger = LogManager.getLogger(TagGroupResource.class);
@Autowired
private TagGroupService tagGroupService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "创建标签分组.")
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseModel<KnowledgeTagGroupModel> createGroup(@RequestBody KnowledgeTagGroupModel model) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getGroupName()))
throw new BadRequest("参数校验失败.");
return ResponseHelper.buildResponse(tagGroupService.createGroup(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "更新标签分组")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.PUT)
public ResponseModel<KnowledgeTagGroupModel> updateGroup(
@RequestBody KnowledgeTagGroupModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getGroupName()))
throw new BadRequest("参数校验失败.");
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(tagGroupService.updateGroup(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "删除标签分组")
@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
public ResponseModel<List<Long>> deleteGroup(@PathVariable("ids") String ids) {
return ResponseHelper.buildResponse(tagGroupService.deleteGroup(ids));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "标签分组树结构")
@RequestMapping(value = "/tree", method = RequestMethod.GET)
public ResponseModel<Collection<KnowledgeTagGroupModel>> groupTree(@RequestParam("groupName") String groupName) {
return ResponseHelper.buildResponse(tagGroupService.queryGroupTree(RequestContext.getAgencyCode(),groupName));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.service.TagInstanceService;
import io.swagger.annotations.Api;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
/**
* <p>
* 标签实例 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "taginstance")
@RequestMapping(value = "/v1/taginstance")
@Api(tags = "knowledgebase-标签实例")
public class TagInstanceResource {
private final Logger logger = LogManager.getLogger(TagInstanceResource.class);
@Autowired
private TagInstanceService tagInstanceService;
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagModel;
import com.yeejoin.amos.knowledgebase.face.service.TagService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
/**
* <p>
* 标签库 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "tag")
@RequestMapping(value = "/v1/tag")
@Api(tags = "knowledgebase-标签库")
public class TagResource {
private final Logger logger = LogManager.getLogger(TagResource.class);
@Autowired
private TagService tagService;
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "创建标签")
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseModel<KnowledgeTagModel> create(@RequestBody KnowledgeTagModel model) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getTagName())
|| ValidationUtil.isEmpty(model.getTagGroup())
|| ValidationUtil.isEmpty(model.getTagType())) {
throw new BadRequest("参数校验失败.");
}
return ResponseHelper.buildResponse(tagService.createTag(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "更新标签")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.PUT)
public ResponseModel<KnowledgeTagModel> update(
@RequestBody KnowledgeTagModel model,
@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
if (ValidationUtil.isEmpty(model)
|| ValidationUtil.isEmpty(model.getTagName())
|| ValidationUtil.isEmpty(model.getTagGroup())) {
throw new BadRequest("参数校验失败.");
}
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(tagService.updateTag(model));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询单个对象")
@RequestMapping(value = "/{sequenceNbr}", method = RequestMethod.GET)
public ResponseModel seleteOne(@PathVariable(value="sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(tagService.detailTag(sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "条件查询")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ResponseModel queryMapList(
@RequestParam(value = "groupSeq", required = false) Long groupSeq,
@RequestParam(value = "tagName", required = false) String tagName,
@RequestParam(value = "tagCode", required = false) String tagCode,
@RequestParam(value = "tagStatus", required = false) String tagStatus) {
return ResponseHelper.buildResponse(tagService.queryTagMap(groupSeq, tagName, tagCode, tagStatus));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "按名称搜索")
@RequestMapping(value = "/list4doc", method = RequestMethod.GET)
public ResponseModel queryListForDoc(
@RequestParam(value = "tagName", required = false) String tagName) {
return ResponseHelper.buildResponse(tagService.queryTagDetailList(tagName));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询TOP15")
@RequestMapping(value = "/list/top", method = RequestMethod.GET)
public ResponseModel selectForList(@RequestParam(value = "quoteType", required = false) String quoteType) {
boolean isAll = ValidationUtil.equalsIgnoreCase(quoteType, TagService.APPKEY_ALL);
return ResponseHelper.buildResponse(tagService.queryTopList(isAll));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "批量删除")
@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
public ResponseModel batchOperate(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(tagService.delete(StringUtil.String2LongList(ids)));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "启用标签")
@RequestMapping(value = "status/activate/{ids}", method = RequestMethod.PUT)
public ResponseModel batchActivate(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(tagService.updateTagStatus(StringUtil.String2LongList(ids), TagService.TAG_STATUS_ACTIVATE));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "停用标签")
@RequestMapping(value = "status/deactivate/{ids}", method = RequestMethod.PUT)
public ResponseModel batchDeactivate(@PathVariable(value = "ids") String ids) {
return ResponseHelper.buildResponse(tagService.updateTagStatus(StringUtil.String2LongList(ids), TagService.TAG_STATUS_DEACTIVATE));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "检查标签名称是否已存在")
@RequestMapping(value = "/name/exist", method = RequestMethod.GET)
public ResponseModel checkTagName(@RequestParam("tagName") String tagName,
@RequestParam(value = "sequenceNbr", required = false) Long sequenceNbr) {
if (ValidationUtil.isEmpty(tagName)) {
throw new BadRequest("参数校验失败");
}
return ResponseHelper.buildResponse(tagService.tagNameIsExist(tagName, sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "查询标签关联的战例列表")
@RequestMapping(value = "/{sequenceNbr}/related/doc", method = RequestMethod.GET)
public ResponseModel queryRelatedDocList(@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(tagService.queryRelatedDocList(sequenceNbr));
}
}
package com.yeejoin.amos.knowledgebase.controller;
import com.yeejoin.amos.knowledgebase.face.service.TagValueService;
import io.swagger.annotations.Api;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.restful.doc.TycloudResource;
/**
* <p>
* 值标签的实例值 前端控制器
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@RestController
@TycloudResource(module = "knowledgebase", value = "tagvalue")
@RequestMapping(value = "/v1/tagvalue")
@Api(tags = "knowledgebase-值标签的实例值")
public class TagValueResource {
private final Logger logger = LogManager.getLogger(TagValueResource.class);
@Autowired
private TagValueService tagValueService;
}
package com.yeejoin.amos.knowledgebase.face.enumeration;
/**
* @author 杨博超
* @ClassName DynamicsFunctional
**/
public enum DynamicsFunctional {
DOC_BASEINFO,//文档基础信息动态字段配置
VALUE_TAG_CONFIG//标签配置信息动态字段
}
package com.yeejoin.amos.knowledgebase.face.enumeration;
import java.util.Comparator;
import java.util.List;
/**
* @author 杨博超
* @ClassName RoleName
* @Deacription
**/
public enum KnowledgeRoleName {
VIEWER("浏览者", 0, 0, 1, 1),
INPUTER("录入者", 0, 1, 1, 1),
AUDITOR("审核者", 0, 2, 1, 1),
TAG_MANAGER("标签管理员", 1, 0, 0, 0);
private String roleName;
private int tagManagerScore;
private int docManagerScore;
private int docGroupManagerScore;
private int searchScore;
KnowledgeRoleName(String roleName, int tagManagerScore, int docManagerScore, int docGroupManagerScore, int searchScore) {
this.roleName = roleName;
this.tagManagerScore = tagManagerScore;
this.docManagerScore = docManagerScore;
this.docGroupManagerScore = docGroupManagerScore;
this.searchScore = searchScore;
}
public String getRoleName() {
return roleName;
}
public int getTagManagerScore() {
return tagManagerScore;
}
public int getDocManagerScore() {
return docManagerScore;
}
public int getDocGroupManagerScore() {
return docGroupManagerScore;
}
public int getSearchScore() {
return searchScore;
}
public static KnowledgeRoleName getInstance(String roleName) {
KnowledgeRoleName knowledgeRoleName = null;
for (KnowledgeRoleName roleNameIns : KnowledgeRoleName.values()) {
if (roleNameIns.getRoleName().equals(roleName))
knowledgeRoleName = roleNameIns;
}
return knowledgeRoleName;
}
public static KnowledgeRoleName getMaxScore(List<String> roleNames, Comparator<KnowledgeRoleName> comparator) {
KnowledgeRoleName maxScore = null;
for (String roleName : roleNames) {
if (maxScore == null) {
maxScore = getInstance(roleName);
continue;
}
KnowledgeRoleName current = getInstance(roleName);
if(comparator.compare(current,maxScore) > 0)
maxScore = current;
}
return maxScore;
}
}
package com.yeejoin.amos.knowledgebase.face.enumeration;
/**
* @author 杨博超
* @ClassName OperateType
* @Deacription 内容操作类型
**/
public enum OperateType {
LIKE, //点赞
DIS_LIKE, //吐槽
COMMENT, //评论
REFERENCE, //引用
COLLECT //收藏
}
package com.yeejoin.amos.knowledgebase.face.enumeration;
/**
* @author 杨博超
* @ClassName DataType
* @Deacription 动态配置的值类型
**/
public enum OptionDataType {
String, Integer,datetime, Enum,Double,Date
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
/**
* @author 杨博超
* @ClassName AttachmentModel
**/
@Data
public class AttachmentModel {
private String fileType;
private String filename;
private String originalFileName;
private String fileUrl;
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import java.util.Date;
/**
* <p>
* 知识库文档注释信息
* </p>
*
* @author ningtianqing
* @since 2020-09-16
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeDocAnnotateModel extends BaseModel {
/**
* 文档id
*/
private Long docSeq;
/**
* 添加注释的用户id
*/
private String userId;
/**
* 添加注释的用户名称
*/
private String username;
/**
* 是否是当前用户添加的注释
*/
private Boolean isCurrentUser;
/**
* 添加注释后文档内容
*/
private String htmlContent;
/**
* 注释内容
*/
private String annotateContent;
/**
* 注释位置信息(前端定义和使用的内容)
*/
private String positionInfo;
/**
* 机构编号
*/
private String agencyCode;
private Date createTime;
private Date updateTime;
public Date getUpdateTime() {
return recDate;
}
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.foundation.utils.TreeNode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Collection;
/**
* <p>
* 知识库文档分类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeDocCategoryModel extends BaseModel implements TreeNode<KnowledgeDocCategoryModel,Long> {
/**
* 分组名称
*/
private String categoryName;
private Long parentId;
/**
* 机构编号
*/
private String agencyCode;
private Collection<KnowledgeDocCategoryModel> children;
@Override
public Long getMyParentId() {
return this.parentId;
}
@Override
public Long getMyId() {
return this.sequenceNbr;
}
@Override
public Collection<KnowledgeDocCategoryModel> getChildren() {
return children;
}
@Override
public void setChildren(Collection<KnowledgeDocCategoryModel> children) {
this.children = children;
}
@Override
public int compareTo(KnowledgeDocCategoryModel groupModel) {
return this.getMyId().compareTo(groupModel.getMyId());
}
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import java.util.Date;
/**
* <p>
* 知识库评论信息
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeDocCommentsModel extends BaseModel {
/**
* 文档id
*/
private Long docSeq;
/**
* 发表评论的用户id
*/
private String userId;
private String username;
/**
* 评论内容
*/
private String commentsContent;
/**
* 父级评论id
*/
private Long parentId;
/**
* 机构编号
*/
private String agencyCode;
/**
* 是否点赞
*/
private Boolean like;
/**
* 总点赞数量
*/
private Integer likedNum;
private Date createTime;
public Date getCreateTime() {
return recDate;
}
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* <p>
* 知识库文档存储
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeDocContentModel extends BaseModel {
/**
* 富文本内容存储
*/
private String htmlContent;
/**
* 文档状态:发布,未发布
*/
private String docStatus;
/**
* 录入者id
*/
private String userId;
/**
* 录入者姓名
*/
private String userName;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否有附件
*/
private Boolean haveAttachment;
/**
* 摘要
*/
private String summary;
/**
* 机构编号
*/
private String agencyCode;
/**
* 审核状态:通过,驳回,待审核,待提交
**/
private String auditStatus;
/**
* 驳回意见
**/
private String rejectionComment;
/**
* 审核人id
**/
private String auditorUserId;
private String orgCode;
/**
* 纯文本内容
*/
private String textContent;
/**
* 排序内容
*/
private String sortStr;
/**
* 所属目录
*/
private Long directoryId;
/**
* 文档标题
*/
private String docTitle;
private String directoryName; // 目录名称
private Date lastUpdateTime;
private Map<String, Object> docBaseInfo; // 文档基础信息<feildName,value>
private List<KnowledgeTagInstanceModel> docTags; // 文档标签<tagInstanceModel,>
private List<KnowledgeTagInstanceModel> docContentTags; // 文档内容标签<tagInstanceModel>
private List<KnowledgeTagInstanceModel> tagsToShow; // 只能搜索列表显示的标签信息
private List<AttachmentModel> attachments; // 附件信息;<附件id,附件原始名称>
private Boolean collected; // 收藏标识
public Date getLastUpdateTime() {
return recDate;
}
}
package com.yeejoin.amos.knowledgebase.face.model;
import com.baomidou.mybatisplus.annotation.TableField;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库系统动态选项配置的分组,用于区分不同功能的字段列表
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeDynamicsGroupModel extends BaseModel {
/**
* 分组名称
*/
private String groupName;
/**
* 前端配置
*/
private String frontEndConfig;
/**
* 机构编号
*/
private String agencyCode;
/**
* 功能标识
*/
private String functional;
/**
* 业务项目标识
*/
private String appKey;
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库系统动态选项配置,多用于动态字段配置
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeDynamicsOptionModel extends BaseModel {
/**
* 字段名
*/
private String fieldName;
/**
* 中文名
*/
private String fieldLabel;
/**
* 数据类型:文本,数字,枚举,日期
*/
private String dataType;
/**
* 功能标识
*/
private String functional;
/**
* 业务项目标识
*/
private String appKey;
private String frontEndConfig;
/**
* 机构编号
*/
private String agencyCode;
/**
* 字段分组主键
**/
private Long groupSeq;
private String queryStrategy;
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库系统动态选项配置的实例值
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeDynamicsValueModel extends BaseModel {
/**
* 字段名
*/
private String fieldName;
/**
* 中文名
*/
private String fieldLabel;
/**
* 数据类型:文本,数字,枚举,日期
*/
private String dataType;
/**
* 字段分组id
*/
private Long groupSeq;
/**
* 动态配置字段的值
*/
private String fieldValue;
/**
* 关联的对象id,即文档id
*/
private Long instanceId;
/**
* 机构编号
*/
private String agencyCode;
private Long optionSeq;
private String queryStrategy;
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库内容交互计数表
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeInteractionCountModel extends BaseModel {
/**
* 操作类型(标签所有情况引用,标签被已审核/已发布文档引用,文档引用)
*/
private String operateType;
/**
* 关联对象类型
*/
private String entityType;
/**
* 关联对象id
*/
private String entityId;
/**
* 计数
*/
private Integer operateCount;
/**
* 机构编号
*/
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库内容交互记录
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeInteractionRecordModel extends BaseModel {
/**
* 用户id
*/
private String userId;
/**
* 操作类型(点赞,吐槽,收藏)
*/
private String operateType;
/**
* 关联对象类型
*/
private String entityType;
/**
* 关联对象id
*/
private String entityId;
/**
* 机构编号
*/
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
/**
* <p>
* 消息
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeMessageModel extends BaseModel {
/**
* 消息类型
*/
private String messageType;
/**
* 消息标题
*/
private String messageTitle;
/**
* 消息内容
*/
private String messageContent;
/**
* 相关文档ID
*/
private Long targetSeq;
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
/**
* <p>
* 个人消息
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeMessagePersonalModel extends BaseModel {
/**
* 接收人
*/
private String messageOwner;
/**
* 消息ID
*/
private Long messageSeq;
/**
* 消息状态
*/
private Integer messageStatus;
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.foundation.utils.TreeNode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Collection;
/**
* <p>
* 标签分组
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeTagGroupModel extends BaseModel implements TreeNode<KnowledgeTagGroupModel,Long> {
/**
* 标签分类名称
*/
private String groupName;
/**
* 父级分类id
*/
private Long parentId;
/**
* 机构编号
*/
private String agencyCode;
private Collection<KnowledgeTagGroupModel> children;
@Override
public Long getMyParentId() {
return this.parentId;
}
@Override
public Long getMyId() {
return this.sequenceNbr;
}
@Override
public Collection<KnowledgeTagGroupModel> getChildren() {
return children;
}
@Override
public void setChildren(Collection<KnowledgeTagGroupModel> children) {
this.children = children;
}
@Override
public int compareTo(KnowledgeTagGroupModel groupModel) {
return this.getMyId().compareTo(groupModel.getMyId());
}
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
/**
* <p>
* 标签分组
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeTagGroupRefModel extends BaseModel {
/**
* 标签分组id
*/
private Long groupSeq;
/**
* 标签id
*/
private Long tagSeq;
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* <p>
* 标签实例
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeTagInstanceModel extends BaseModel {
/**
* 标签id
*/
private Long tagSeq;
/**
* 标签标记的目标id
*/
private Long targetSeq;
/**
* 标签名称
*/
private String tagName;
/**
* 标记方式:文档,内容
*/
private String markingType;
/**
* 机构编号
*/
private String agencyCode;
private String tagType;
private String frontEndConfig;
private List<KnowledgeTagValueModel> tagValues;//值标签的具体值
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Map;
/**
* <p>
* 标签库
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeTagModel extends BaseModel {
/**
* 标签名称
*/
private String tagName;
/**
* 标签编码
*/
private String tagCode;
/**
* 标签分类:文本标签,值标签,
*/
private String tagType;
/**
* 标签状态:启用,禁用
*/
private String tagStatus;
/**
* 标签备注
*/
private String tagRemark;
/**
* 机构编号
*/
private String agencyCode;
/**
* 被引用数量(所有文档)
*/
private Integer referenceNumber;
/**
* 动态值
*/
private Map<String, Object> tagValues;
/**
* 标签分类
*/
private List<Long> tagGroup;
/**
* 创建人姓名
*/
private String creator;
}
package com.yeejoin.amos.knowledgebase.face.model;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 值标签的实例值
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class KnowledgeTagValueModel extends BaseModel {
/**
* 标签实例id
*/
private Long instanceSeq;
/**
* 值标签的扩展字段名,内容标签文本位置,值标签文本内容/单值/日期,值标签范围最大值-最小值
*/
private String fieldName;
/**
* 值标签扩展字段的值
*/
private String tagValue;
/**
* 机构编号
*/
private String agencyCode;
private String unit;
}
package com.yeejoin.amos.knowledgebase.face.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import java.util.Date;
/**
* <p>
* 标签分组
* </p>
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowlege_statistics_record")
public class KnowlegeStatisticsRecordModel extends BaseModel {
/**
* 文档ID
*/
@TableField("DOC_SEQ")
private Long docSeq;
/**
* 警情发生时间
*/
@TableField("DISASTER_TIME")
private Date disasterTime;
/**
* 记录类型
*/
@TableField("RECORD_NAME")
private String recordName;
/**
* 分类字段值
*/
@TableField("CATEGORY_VALUE")
private String categoryValue;
/**
* 统计数值
*/
@TableField("COUNT_VALUE")
private Long countValue;
/**
* 值放大倍数
*/
@TableField("VALUE_WEIGHT")
private Integer valueWeight;
/**
* 数值单位
*/
@TableField("UNIT")
private Long unit;
}
package com.yeejoin.amos.knowledgebase.face.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.foundation.utils.TreeNode;
import java.util.Collection;
/**
* <h1><h1>
*
* @author tiantao
* @date 2021/1/18 11:36
*/
@EqualsAndHashCode
@Data
public class MultipleNodeModel implements TreeNode<MultipleNodeModel, Long> {
private String nodeType;
private Long nodeKey;
private String nodeTitle;
private Long nodeParent;
private Collection<MultipleNodeModel> nodeChildren;
private Object nodeExtraInfo;
@Override
public Long getMyParentId() {
return this.nodeParent;
}
@Override
public Long getMyId() {
return this.nodeKey;
}
@Override
public Collection<MultipleNodeModel> getChildren() {
return this.nodeChildren;
}
@Override
public void setChildren(Collection<MultipleNodeModel> collection) {
this.setNodeChildren(collection);
}
@Override
public int compareTo(MultipleNodeModel o) {
return this.getNodeKey().compareTo(o.getNodeKey());
}
}
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocAnnotate;
/**
* <p>
* 知识库文档注释 Mapper 接口
* </p>
*
* @author ningtianqing
* @since 2020-09-16
*/
public interface DocAnnotateMapper extends BaseMapper<KnowledgeDocAnnotate> {
}
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.model.MultipleNodeModel;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocCategory;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 知识库文档分类 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface DocCategoryMapper extends BaseMapper<KnowledgeDocCategory> {
List<MultipleNodeModel> queryDocAndCategoryTree(@Param("categoryIds") List<Long> categoryIds, @Param("docStatus") String docStatus);
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocComments;
/**
* <p>
* 知识库评论信息 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface DocCommentsMapper extends BaseMapper<KnowledgeDocComments> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* 知识库文档存储 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface DocContentMapper extends BaseMapper<KnowledgeDocContent> {
List<Map<String,Long>> searchForDocIds(@Param("agencyCode") String agencyCode,
@Param("queryStr") String queryStr,
@Param("docStatus")String []docStatus,
@Param("auditStatus")String [] auditStatus,
@Param("userId")String userId,
@Param("orgCode")String orgCode,
@Param("offset") long offset,
@Param("length") long length);
List<Map<String,Object>> queryDocBaseInfoList(Map<String, Object> paramMap);
int queryDocBaseInfoTotal(Map<String, Object> paramMap);
List<Long> getAllPublishedDocIds();
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsGroup;
/**
* <p>
* 知识库系统动态选项配置的分组,用于区分不同功能的字段列表 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface DynamicsGroupMapper extends BaseMapper<KnowledgeDynamicsGroup> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsOption;
/**
* <p>
* 知识库系统动态选项配置,多用于动态字段配置 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface DynamicsOptionMapper extends BaseMapper<KnowledgeDynamicsOption> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsValue;
/**
* <p>
* 知识库系统动态选项配置的实例值 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface DynamicsValueMapper extends BaseMapper<KnowledgeDynamicsValue> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.yeejoin.amos.knowledgebase.face.orm.entity.ESDocEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchCrudRepository;
public interface ESDocRepository extends ElasticsearchCrudRepository<ESDocEntity, Long> {
}
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeInteractionCount;
import java.util.List;
/**
* <p>
* 知识库内容交互计数表 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface InteractionCountMapper extends BaseMapper<KnowledgeInteractionCount> {
/**
* 查询标签被所有文档的引用状况
* @return
*/
List<KnowledgeInteractionCount> queryTagQuoteAll();
/**
* 查询标签被发布文档的引用状况
* @return
*/
List<KnowledgeInteractionCount> queryTagQuotePublish();
/**
* 根据实体类型删除记录
* @param entityType 类型
* @return
*/
int deleteByEntityType(String entityType);
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeInteractionRecord;
/**
* <p>
* 知识库内容交互记录 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface InteractionRecordMapper extends BaseMapper<KnowledgeInteractionRecord> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeMessage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@Mapper
public interface MessageMapper extends BaseMapper<KnowledgeMessage> {
List<Map> selectMessageListByOwner(@Param("owner") String owner, @Param("messageType")String messageType);
Map selectMessageBySeq(Long sequenceNbr);
List<Map> selectMessageListByPage(Map<String,Object> param );
Integer selectMessageListByCount(Map<String,Object> param);
}
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeMessagePersonal;
/**
* <p>
* 标签库 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface MessagePersonalMapper extends BaseMapper<KnowledgeMessagePersonal> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowlegeStatisticsRecord;
import java.util.List;
import java.util.Map;
/**
* <p>
* 标签分组 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface StatisticsRecordMapper extends BaseMapper<KnowlegeStatisticsRecord> {
/**
* 表清空
* @return
*/
void deleteAll();
/**
* 查询灾情总计
* @return
*/
Map<String, Object> selectDisasterCount();
/**
* 按类型分组查询
*/
List<Map<String, Object>> selectCategoryByName(String recordName);
/**
* 按类型查询/按时间分段总计
*/
List<Map<String, Object>> selectCountByNameAndDateRange(Map<String, Object> queryMap);
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagGroup;
/**
* <p>
* 标签分组 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface TagGroupMapper extends BaseMapper<KnowledgeTagGroup> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagGroupRef;
/**
* <p>
* 标签分组 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface TagGroupRefMapper extends BaseMapper<KnowledgeTagGroupRef> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagInstance;
/**
* <p>
* 标签实例 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface TagInstanceMapper extends BaseMapper<KnowledgeTagInstance> {
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTag;
import java.util.List;
/**
* <p>
* 标签库 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface TagMapper extends BaseMapper<KnowledgeTag> {
List<KnowledgeTag> queryTagByNameInPublishedDoc(String tagName);
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagValue;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 值标签的实例值 Mapper 接口
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
public interface TagValueMapper extends BaseMapper<KnowledgeTagValue> {
/**
* 根据文档id查询标签值列表
* @param docSeq 文档id
* @return
*/
List<KnowledgeTagValue> queryTagValuesByDocId(Long docSeq);
/**
* 根据文档id查询标签值列表
* @param docIds 文档id列表
* @return
*/
List<KnowledgeTagValue> queryTagValuesByDocIds(@Param("docIds") Collection<Long> docIds);
}
\ No newline at end of file
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date;
import java.util.List;
@Data
@Accessors(chain = true)
@Document(indexName = "knowledgebase", type = "doc", shards = 1, replicas = 0)
public class ESDocEntity {
/** 主键 */
@Id
private Long sequenceNbr;
/** 文档标题 */
@Field(type = FieldType.Text, searchAnalyzer = "ik_max_word", analyzer = "ik_max_word")
private String docTitle;
/** 主键 */
private Long directoryId;
/** 分类 */
@Field(type = FieldType.Text, searchAnalyzer = "ik_smart", analyzer = "ik_smart")
private String directoryName;
/** 作者 */
@Field(type = FieldType.Text, searchAnalyzer = "ik_smart", analyzer = "ik_smart")
private String author;
/** 发布时间 */
@Field(type = FieldType.Date, format = DateFormat.basic_date_time)
private Date lastUpdateTime;
/** 正文文字 */
@Field(type = FieldType.Text, searchAnalyzer = "ik_max_word", analyzer = "ik_max_word")
private String textContent;
/** 基本信息 */
@Field(type = FieldType.Text, searchAnalyzer = "ik_smart", analyzer = "ik_max_word")
private String docInfo;
/** 文档正文HTML */
private String htmlContent;
/** 文档摘要 */
private String summary;
/** 文档标签 */
@Field(type = FieldType.Nested, includeInParent = true)
private List<ESTagEntity> docTags;
/** 文档内容标签 */
@Field(type = FieldType.Nested, includeInParent = true)
private List<ESTagEntity> contentTags;
private String docJson;
@Field(type = FieldType.Keyword)
private String sortStr;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Parent;
@Data
@Accessors(chain = true)
@Document(indexName = "knowledgebase",type = "tag", shards = 1, replicas = 0)
public class ESTagEntity {
/** 主键 */
@Id
private Long sequenceNbr;
private Long tagSeq;
/** 标签名称 */
@Field(type = FieldType.Text, searchAnalyzer = "ik_max_word", analyzer = "ik_max_word")
private String tagName;
/** 标签值信息 */
@Field(type = FieldType.Text, searchAnalyzer = "ik_smart", analyzer = "ik_smart")
private String tagInfo;
/**原生数据*/
private String tagJson;
/** 绑定外键 */
@Parent(type = "doc")
private String docId;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* <p>
* 知识库文档注释
* </p>
*
* @author ningtianqing
* @since 2020-09-16
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_doc_annotate")
public class KnowledgeDocAnnotate extends BaseEntity {
/**
* 文档id
*/
@TableField("DOC_SEQ")
private Long docSeq;
/**
* 添加注释的用户id
*/
@TableField("USER_ID")
private String userId;
/**
* 注释内容
*/
@TableField("ANNOTATE_CONTENT")
private String annotateContent;
/**
* 注释位置信息(前端定义和使用的内容)
*/
@TableField("POSITION_INFO")
private String positionInfo;
/**
* 创建时间
*/
@TableField("CREATE_TIME")
private Date createTime;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库文档分类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_doc_category")
public class KnowledgeDocCategory extends BaseEntity {
/**
* 分组名称
*/
@TableField("CATEGORY_NAME")
private String categoryName;
@TableField("PARENT_ID")
private Long parentId;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库评论信息
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_doc_comments")
public class KnowledgeDocComments extends BaseEntity {
/**
* 文档id
*/
@TableField("DOC_SEQ")
private Long docSeq;
/**
* 发表评论的用户id
*/
@TableField("USER_ID")
private String userId;
/**
* 评论内容
*/
@TableField("COMMENTS_CONTENT")
private String commentsContent;
/**
* 父级评论id
*/
@TableField("PARENT_ID")
private Long parentId;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import java.util.Date;
/**
* <p>
* 知识库文档存储
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_doc_content")
public class KnowledgeDocContent extends BaseEntity {
/**
* 富文本内容存储
*/
@TableField("HTML_CONTENT")
private String htmlContent;
/**
* 文档状态:发布,未发布
*/
@TableField("DOC_STATUS")
private String docStatus;
/**
* 发布者
*/
@TableField("USER_ID")
private String userId;
/**
* 创建时间
*/
@TableField("CREATE_TIME")
private Date createTime;
/**
* 是否有附件
*/
@TableField("HAVE_ATTACHMENT")
private Boolean haveAttachment;
/**
* 摘要
*/
@TableField("SUMMARY")
private String summary;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
/**
* 审核状态:通过,驳回,待审核,待提交
**/
@TableField("AUDIT_STATUS")
private String auditStatus;
/**
* 驳回意见
**/
@TableField("REJECTION_COMMENT")
private String rejectionComment;
/**
* 审核人id
**/
@TableField("AUDITOR_USER_ID")
private String auditorUserId;
@TableField("ORG_CODE")
private String orgCode;
/**
* 纯文本内容
*/
@TableField("TEXT_CONTENT")
private String textContent;
/**
* 排序内容
*/
@TableField("SORT_STR")
private String sortStr;
/**
* 所属目录
*/
@TableField("DIRECTORY_ID")
private Long directoryId;
/**
* 文档标题
*/
@TableField("DOC_TITLE")
private String docTitle;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库系统动态选项配置的分组,用于区分不同功能的字段列表
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_dynamics_group")
public class KnowledgeDynamicsGroup extends BaseEntity {
/**
* 分组名称
*/
@TableField("GROUP_NAME")
private String groupName;
/**
* 前端配置
*/
@TableField("FRONT_END_CONFIG")
private String frontEndConfig;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
/**
* 功能标识
*/
@TableField("FUNCTIONAL")
private String functional;
/**
* 业务项目标识
*/
@TableField("APP_KEY")
private String appKey;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库系统动态选项配置,多用于动态字段配置
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_dynamics_option")
public class KnowledgeDynamicsOption extends BaseEntity {
/**
* 字段名
*/
@TableField("FIELD_NAME")
private String fieldName;
/**
* 中文名
*/
@TableField("FIELD_LABEL")
private String fieldLabel;
/**
* 数据类型:文本,数字,枚举,日期
*/
@TableField("DATA_TYPE")
private String dataType;
/**
* 功能标识
*/
@TableField("FUNCTIONAL")
private String functional;
/**
* 业务项目标识
*/
@TableField("APP_KEY")
private String appKey;
@TableField("FRONT_END_CONFIG")
private String frontEndConfig;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
/**
* 分组主键
*/
@TableField("GROUP_SEQ")
private Long groupSeq;
/**
* 查询策略
*/
@TableField("QUERY_STRATEGY")
private String queryStrategy;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库系统动态选项配置的实例值
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_dynamics_value")
public class KnowledgeDynamicsValue extends BaseEntity {
/**
* 字段名
*/
@TableField("FIELD_NAME")
private String fieldName;
/**
* 中文名
*/
@TableField("FIELD_LABEL")
private String fieldLabel;
/**
* 数据类型:文本,数字,枚举,日期
*/
@TableField("DATA_TYPE")
private String dataType;
/**
* 字段分组id
*/
@TableField("GROUP_SEQ")
private Long groupSeq;
/**
* 动态配置字段的值
*/
@TableField("FIELD_VALUE")
private String fieldValue;
/**
* 关联的对象id,即文档id
*/
@TableField("INSTANCE_ID")
private Long instanceId;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
@TableField("OPTION_SEQ")
private Long optionSeq;
@TableField("QUERY_STRATEGY")
private String queryStrategy;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库内容交互计数表
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_interaction_count")
public class KnowledgeInteractionCount extends BaseEntity {
/**
* 操作类型(标签所有情况引用,标签被已审核/已发布文档引用,文档引用)
*/
@TableField("OPERATE_TYPE")
private String operateType;
/**
* 关联对象类型
*/
@TableField("ENTITY_TYPE")
private String entityType;
/**
* 关联对象id
*/
@TableField("ENTITY_ID")
private String entityId;
/**
* 计数
*/
@TableField("OPERATE_COUNT")
private Integer operateCount;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 知识库内容交互记录
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_interaction_record")
public class KnowledgeInteractionRecord extends BaseEntity {
/**
* 用户id
*/
@TableField("USER_ID")
private String userId;
/**
* 操作类型(点赞,吐槽,收藏)
*/
@TableField("OPERATE_TYPE")
private String operateType;
/**
* 关联对象类型
*/
@TableField("ENTITY_TYPE")
private String entityType;
/**
* 关联对象id
*/
@TableField("ENTITY_ID")
private String entityId;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
/**
* <p>
* 消息
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_message")
public class KnowledgeMessage extends BaseEntity {
/**
* 消息类型
*/
@TableField("MESSAGE_TYPE")
private String messageType;
/**
* 消息标题
*/
@TableField("MESSAGE_TITLE")
private String messageTitle;
/**
* 消息内容
*/
@TableField("MESSAGE_CONTENT")
private String messageContent;
/**
* 相关文档ID
*/
@TableField("TARGET_SEQ")
private Long targetSeq;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
/**
* <p>
* 个人消息
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_message_personal")
public class KnowledgeMessagePersonal extends BaseEntity {
/**
* 接收人
*/
@TableField("MESSAGE_OWNER")
private String messageOwner;
/**
* 消息ID
*/
@TableField("MESSAGE_SEQ")
private Long messageSeq;
/**
* 消息状态
*/
@TableField("MESSAGE_STATUS")
private Integer messageStatus;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 标签库
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_tag")
public class KnowledgeTag extends BaseEntity {
/**
* 标签名称
*/
@TableField("TAG_NAME")
private String tagName;
/**
* 标签编码
*/
@TableField("TAG_CODE")
private String tagCode;
/**
* 标签分类:文本标签,值标签,
*/
@TableField("TAG_TYPE")
private String tagType;
/**
* 标签状态:启用,禁用
*/
@TableField("TAG_STATUS")
private String tagStatus;
/**
* 标签备注
*/
@TableField("TAG_REMARK")
private String tagRemark;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
/**
* 创建人姓名
*/
@TableField("CREATOR")
private String creator;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 标签分组
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_tag_group")
public class KnowledgeTagGroup extends BaseEntity {
/**
* 标签名称
*/
@TableField("GROUP_NAME")
private String groupName;
/**
* 父级分类id
*/
@TableField("PARENT_ID")
private Long parentId;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
/**
* <p>
* 标签分组
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_tag_group_ref")
public class KnowledgeTagGroupRef extends BaseEntity {
/**
* 标签分组id
*/
@TableField("GROUP_SEQ")
private Long groupSeq;
/**
* 标签id
*/
@TableField("TAG_SEQ")
private Long tagSeq;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 标签实例
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_tag_instance")
public class KnowledgeTagInstance extends BaseEntity {
/**
* 标签id
*/
@TableField("TAG_SEQ")
private Long tagSeq;
/**
* 标签标记的目标id
*/
@TableField("TARGET_SEQ")
private Long targetSeq;
/**
* 标签名称
*/
@TableField("TAG_NAME")
private String tagName;
/**
* 标记方式:文档,内容
*/
@TableField("MARKING_TYPE")
private String markingType;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
/**
* 标签类型
*/
@TableField("TAG_TYPE")
private String tagType;
@TableField("FRONT_END_CONFIG")
private String frontEndConfig;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 值标签的实例值
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowledge_tag_value")
public class KnowledgeTagValue extends BaseEntity {
/**
* 标签实例id
*/
@TableField("INSTANCE_SEQ")
private Long instanceSeq;
/**
* 值标签的扩展字段名,内容标签文本位置,值标签文本内容/单值/日期,值标签范围最大值-最小值
*/
@TableField("FIELD_NAME")
private String fieldName;
/**
* 值标签扩展字段的值
*/
@TableField("TAG_VALUE")
private String tagValue;
/**
* 机构编号
*/
@TableField("AGENCY_CODE")
private String agencyCode;
@TableField("UNIT")
private String unit;
}
package com.yeejoin.amos.knowledgebase.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import java.util.Date;
/**
* <p>
* 标签分组
* </p>
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("knowlege_statistics_record")
public class KnowlegeStatisticsRecord extends BaseEntity {
/**
* 文档ID
*/
@TableField("DOC_SEQ")
private Long docSeq;
/**
* 警情发生时间
*/
@TableField("DISASTER_TIME")
private Date disasterTime;
/**
* 记录类型
*/
@TableField("RECORD_NAME")
private String recordName;
/**
* 分类字段值
*/
@TableField("CATEGORY_VALUE")
private String categoryValue;
/**
* 统计数值
*/
@TableField("COUNT_VALUE")
private Long countValue;
/**
* 值放大倍数
*/
@TableField("VALUE_WEIGHT")
private Integer valueWeight;
/**
* 数值单位
*/
@TableField("UNIT")
private Long unit;
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocAnnotateModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.DocAnnotateMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocAnnotate;
import com.yeejoin.amos.knowledgebase.face.util.RemoteData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* <p>
* 知识库文档注释 服务类
* </p>
*
* @author ningtianqing
* @since 2020-09-16
*/
@Component
public class DocAnnotateService extends BaseService<KnowledgeDocAnnotateModel, KnowledgeDocAnnotate, DocAnnotateMapper> {
@Autowired
private DocContentService docContentService;
/**
* @author ningtianqing
* @description 创建注释信息
* @Param [commentsModel]
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocAnnotateModel
**/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public KnowledgeDocAnnotateModel createAnnotate(KnowledgeDocAnnotateModel annotateModel) {
annotateModel.setAgencyCode(RequestContext.getAgencyCode());
annotateModel.setUserId(RequestContext.getExeUserId());
annotateModel.setCreateTime(new Date());
docContentService.updateHtmlContent(annotateModel.getDocSeq(), annotateModel.getHtmlContent());
return this.createWithModel(annotateModel);
}
/**
* @author ningtianqing
* @description 更新注释信息ss
* @Param [commentsModel]
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocAnnotateModel
**/
public KnowledgeDocAnnotateModel updateAnnotate(KnowledgeDocAnnotateModel annotateModel) {
KnowledgeDocAnnotateModel oldModel = this.queryBySeq(annotateModel.getSequenceNbr());
Bean.copyExistPropertis(annotateModel, oldModel);
return this.updateWithModel(oldModel);
}
/**
* @author ningtianqing
* @description 删除注释
* @Param [id]
* @return String
**/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public Long deleteAnnotate(KnowledgeDocAnnotateModel annotateModel) {
if (ValidationUtil.isEmpty(annotateModel.getDocSeq()) || ValidationUtil.isEmpty(annotateModel.getHtmlContent())) {
this.deleteBySeq(annotateModel.getSequenceNbr());
return annotateModel.getSequenceNbr();
} else {
docContentService.updateHtmlContent(annotateModel.getDocSeq(), annotateModel.getHtmlContent());
this.deleteBySeq(annotateModel.getSequenceNbr());
return annotateModel.getSequenceNbr();
}
}
/**
* @author ningtianqing
* @description 根据文档id查询注释列表
* @Param [docSeq]
* @return List
**/
public List<KnowledgeDocAnnotateModel> queryForAnnotateList(String docSeq) {
List<KnowledgeDocAnnotateModel> list = this.queryForList("CREATE_TIME",true, docSeq);
Set<String> userIds = list.stream().filter(item -> !ValidationUtil.isEmpty(item)).map(arg0 -> arg0.getUserId()).collect(Collectors.toSet());
Map<String, String> userMap = RemoteData.getUserMap(userIds);
list.forEach(item -> {
item.setUsername(userMap.get(item.getUserId()));
item.setIsCurrentUser(ValidationUtil.equals(item.getUserId(),RequestContext.getExeUserId()));
});
return list;
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yeejoin.amos.component.rule.action.Topic;
import com.yeejoin.amos.component.rule.config.ClazzUtils;
import com.yeejoin.amos.component.rule.config.RuleConfig;
import com.yeejoin.amos.component.rule.model.ConstantCategoryModel;
import com.yeejoin.amos.component.rule.model.ConstantModel;
import com.yeejoin.amos.component.rule.model.DefinitionModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocContentModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.util.BaseUtil;
import com.yeejoin.amos.knowledgebase.face.util.ConfigLoader;
import com.yeejoin.amos.knowledgebase.face.util.QuoteCountFlushTiming;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.component.emq.EmqKeeper;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import org.typroject.tyboot.core.restful.exception.instance.RequestForbidden;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
/**
* <p>
* 知识库文档分类 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DocAuditService {
/**
* 审核状态--待提交
*/
public static final String DOC_AUDIT_STATUS_SAVED = "SAVED";
/**
* 审核状态--待审核
*/
public static final String DOC_AUDIT_STATUS_SUBMITTED = "SUBMITTED";
/**
* 审核状态--通过
*/
public static final String DOC_AUDIT_STATUS_PASSED = "PASSED";
/**
* 审核状态--驳回
*/
public static final String DOC_AUDIT_STATUS_REJECTED = "REJECTED";
private static final String TAG_INSTANCE_LABEL = "label";
private static String DELETE_SYNC_PLAN_TOPIC = "DELETE_SYNC_PLAN_DOC";
@Autowired
private DocContentService service;
@Autowired
private ESDocService eSDocService;
// @Autowired
// private StatisticsRecordService statisticsRecordService;
@Autowired
private DocLibraryService docLibraryService;
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private EmqKeeper emqKeeper;
@Autowired
private ConfigLoader configLoader;
private final Logger logger = LogManager.getLogger(DocAuditService.class);
/**
* 文档批量发布
*
* @param docSeqList 文档ID列表
* @return List
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<KnowledgeDocContentModel> publish(List<Long> docSeqList) {
List<KnowledgeDocContentModel> resList = docLibraryService.efficientList(docSeqList);
if (ValidationUtil.isEmpty(resList)) {
throw new DataNotFound("数据不存在");
}
//更新状态
for (KnowledgeDocContentModel oldDoc : resList) {
if (ValidationUtil.equals(oldDoc.getDocStatus(), DocContentService.DOC_STATUS_UNPUBLISHED)) {
oldDoc.setDocStatus(DocContentService.DOC_STATUS_PUBLISHED);
oldDoc.setAuditStatus(DOC_AUDIT_STATUS_PASSED);
oldDoc.setAuditorUserId(RequestContext.getExeUserId());
service.updateWithModel(oldDoc);
} else {
throw new RequestForbidden("只允许对未发布状态的文档执行此操作");
}
}
//记录需要统计的标签项
// statisticsRecordService.addDocRecords(resList);
//保存到ES存储
eSDocService.savePublishedDoc(resList);
// 设置定时刷新
QuoteCountFlushTiming.needFlushTag();
QuoteCountFlushTiming.needRulePush();
return resList;
}
/**
* 文档批量取消发布
*
* @param docSeqList 文档ID列表
* @return List
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<KnowledgeDocContentModel> unpublish(List<Long> docSeqList) {
List<KnowledgeDocContentModel> resList = docLibraryService.efficientList(docSeqList);
if (ValidationUtil.isEmpty(resList)) {
throw new DataNotFound("数据不存在");
}
for (KnowledgeDocContentModel oldDoc : resList) {
if (ValidationUtil.equals(oldDoc.getDocStatus(), DocContentService.DOC_STATUS_PUBLISHED)) {
//判断文档是否被引用
if (service.getReference(oldDoc.getSequenceNbr()) > 0) {
throw new RequestForbidden("含被引用文档,不能取消发布");
}
oldDoc.setDocStatus(DocContentService.DOC_STATUS_UNPUBLISHED);
oldDoc.setAuditStatus(DOC_AUDIT_STATUS_SAVED);
oldDoc.setAuditorUserId(RequestContext.getExeUserId());
service.updateWithModel(oldDoc);
} else {
throw new RequestForbidden("只允许对发布状态的文档执行此操作");
}
}
QuoteCountFlushTiming.needFlushTag();
QuoteCountFlushTiming.needRulePush();
// 删除已统计的标签项
// statisticsRecordService.deleteRecordsByDocIds(resList);
// 移除ES存储
eSDocService.deleteDocById(resList);
// 推送取消发布的文档至数字预案
pushDeletedDocs2DigitalPlanByMQ(resList);
return resList;
}
/**
* 文档批量提交
*
* @param docSeqList 文档ID列表
* @return List
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<KnowledgeDocContentModel> submit(List<Long> docSeqList) {
List<KnowledgeDocContentModel> resList = service.queryByIds(docSeqList);
if (ValidationUtil.isEmpty(resList)) {
throw new DataNotFound("数据不存在");
}
for (KnowledgeDocContentModel oldDoc : resList) {
if (ValidationUtil.equals(oldDoc.getAuditStatus(), DOC_AUDIT_STATUS_SAVED)) {
//更新审核状态
oldDoc.setAuditStatus(DOC_AUDIT_STATUS_SUBMITTED);
service.updateWithModel(oldDoc);
} else {
throw new RequestForbidden("只允许对待提交状态的文档执行此操作");
}
}
return resList;
}
/**
* 文档批量审核通过
*
* @param docSeqList 文档ID列表
* @return List
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<KnowledgeDocContentModel> pass(List<Long> docSeqList) {
List<KnowledgeDocContentModel> resList = docLibraryService.efficientList(docSeqList);
if (ValidationUtil.isEmpty(resList)) {
throw new DataNotFound("数据不存在");
}
for (KnowledgeDocContentModel oldDoc : resList) {
if (ValidationUtil.equals(oldDoc.getAuditStatus(), DOC_AUDIT_STATUS_SUBMITTED)) {
//更新审核状态
oldDoc.setAuditStatus(DOC_AUDIT_STATUS_PASSED);
oldDoc.setAuditorUserId(RequestContext.getExeUserId());
//更新文档发布状态
oldDoc.setDocStatus(DocContentService.DOC_STATUS_PUBLISHED);
service.updateWithModel(oldDoc);
} else {
throw new RequestForbidden("只允许对待审核状态的文档执行此操作");
}
}
QuoteCountFlushTiming.needFlushTag();
QuoteCountFlushTiming.needRulePush();
//记录需要统计的标签项
// statisticsRecordService.addDocRecords(resList);
//保存到ES存储
eSDocService.savePublishedDoc(resList);
return resList;
}
/**
* 文档审核驳回
*
* @param id 文档ID
* @param rejectionComment 驳回意见
* @return List
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public KnowledgeDocContentModel reject(Long id, String rejectionComment) {
KnowledgeDocContentModel oldDoc = service.queryBySeq(id);
if (ValidationUtil.isEmpty(oldDoc)) {
throw new DataNotFound("数据不存在");
}
if (ValidationUtil.equals(oldDoc.getAuditStatus(), DOC_AUDIT_STATUS_SUBMITTED)) {
//更新审核状态&文档状态
oldDoc.setAuditStatus(DOC_AUDIT_STATUS_REJECTED);
oldDoc.setRejectionComment(rejectionComment);
oldDoc.setAuditorUserId(RequestContext.getExeUserId());
oldDoc.setDocStatus(DocContentService.DOC_STATUS_UNPUBLISHED);
return service.updateWithModel(oldDoc);
} else {
throw new RequestForbidden("只允许对待审核状态的文档执行此操作");
}
}
/**
* 推送取消发布的文档信息至数字预案
*
* @param resList
*/
public void pushDeletedDocs2DigitalPlanByMQ(List<KnowledgeDocContentModel> resList) {
List<Long> ids = BaseUtil.getModelIds(resList);
try {
emqKeeper.getMqttClient().publish(DELETE_SYNC_PLAN_TOPIC, ClazzUtils.serializableObject(ids), RuleConfig.DEFAULT_QOS, false);
logger.info("文档" + ids.toString() + "取消发布,已推送消息至数字预案服务");
} catch (Exception e) {
logger.fatal("文档" + ids.toString() + "取消发布未能成功推送至数字预案服务", e);
}
}
/**
* 推送文档至规则服务
*/
public void pushDocs2RuleByMQ() {
List<Long> allPublishedDocIds = service.getAllPublishedDocIds();
int index = 0;
int size = allPublishedDocIds.size();
ServiceInstance serviceInstance = this.loadBalancerClient.choose("AMOS-API-RULE");
String host = serviceInstance.getHost();
String topic = Topic.getTopicStr(Topic.RULE_UPDATE_DEFINITION, host);
DefinitionModel definitionModel = new DefinitionModel();
definitionModel.setAgencyCode(configLoader.getAgencyCode());
List<ConstantCategoryModel> allCategoryModel = new ArrayList<>();
if (!allPublishedDocIds.isEmpty()) {
while (index < size) {
int num = Math.min(index + 50, size);
List<Long> curDocIds = allPublishedDocIds.subList(index, index + num);
index += num;
List<KnowledgeDocContentModel> docContentModels = docLibraryService.efficientList(curDocIds);
List<ConstantCategoryModel> constantCategoryModels = docs2RuleEntities(docContentModels, configLoader);
Iterator<ConstantCategoryModel> iterator = constantCategoryModels.iterator();
while (iterator.hasNext()) {
ConstantCategoryModel categoryModel = iterator.next();
if (ValidationUtil.isEmpty(categoryModel.getConstant())) {
iterator.remove();
}
}
allCategoryModel.addAll(constantCategoryModels);
}
}
if (!allCategoryModel.isEmpty()) {
definitionModel.setResources(allCategoryModel);
// 推mq消息给规则服务
try {
emqKeeper.getMqttClient().publish(topic, ClazzUtils.serializableObject(definitionModel), RuleConfig.DEFAULT_QOS, false);
} catch (Exception e) {
logger.fatal("同步文档至规则服务出错", e);
}
}
}
private static List<ConstantCategoryModel> docs2RuleEntities(Collection<KnowledgeDocContentModel> docContentModels, ConfigLoader configLoader) {
List<ConstantCategoryModel> resList = new ArrayList<>();
String projects = configLoader.getProjects();
if (!ValidationUtil.isEmpty(projects)) {
String[] projectArr = projects.split(",");
if (!ValidationUtil.isEmpty(docContentModels) && !ValidationUtil.isEmpty(projectArr)) {
docContentModels.forEach(docContentModel -> {
List<ConstantModel> constantModelList = tags2RuleEntities(docContentModel.getDocContentTags(), configLoader);
if (!ValidationUtil.isEmpty(constantModelList)) {
for (String projectName : projectArr) {
ConstantCategoryModel constantCategoryModel = new ConstantCategoryModel();
constantCategoryModel.setConstant(constantModelList);
constantCategoryModel.setName(docContentModel.getDocTitle());
constantCategoryModel.setTitle(constantCategoryModel.getName());
constantCategoryModel.setProjectName(projectName);
resList.add(constantCategoryModel);
}
}
});
}
}
return resList;
}
private static List<ConstantModel> tags2RuleEntities(Collection<KnowledgeTagInstanceModel> tagInstanceModels, ConfigLoader configLoader) {
List<ConstantModel> resList = new ArrayList<>();
String tags = configLoader.getTags();
boolean tagWithName = configLoader.isTagWithName();
if (!ValidationUtil.isEmpty(tags)) {
List<Long> tagIdList = new ArrayList<>();
try {
tagIdList = StringUtil.String2LongList(tags);
} catch (Exception e) {
}
if (!ValidationUtil.isEmpty(tagInstanceModels) && !tagIdList.isEmpty()) {
List<Long> finalTagIdList = tagIdList;
tagInstanceModels.forEach(instanceModel -> {
if (finalTagIdList.contains(instanceModel.getTagSeq())) {
ConstantModel constantModel = new ConstantModel();
String tagValueStr = getTagValueStrFromValues(instanceModel.getTagValues());
if (!ValidationUtil.isEmpty(tagValueStr)) {
if (tagWithName) {
constantModel.setLabel(instanceModel.getTagName() + ":" + tagValueStr);
} else {
constantModel.setLabel(tagValueStr);
}
constantModel.setValue(getLabel4TagInstance(instanceModel));
constantModel.setType("String");
resList.add(constantModel);
}
}
});
}
}
return resList;
}
private static String getTagValueStrFromValues(List<KnowledgeTagValueModel> values) {
AtomicReference<String> resLeft = new AtomicReference<>("");
AtomicBoolean isRange = new AtomicBoolean(false);
AtomicReference<String> resRight = new AtomicReference<>("");
AtomicReference<String> unit = new AtomicReference<>("");
if (!ValidationUtil.isEmpty(values.isEmpty())) {
values.forEach(value -> {
if (TagValueService.VALUE_TAG_FIELD_RANGE_MAX.equals(value.getFieldName())) {
resRight.set(value.getTagValue());
} else {
resLeft.set(value.getTagValue());
}
if (TagValueService.VALUE_TAG_FIELD_RANGE_MAX.equals(value.getFieldName())
|| TagValueService.VALUE_TAG_FIELD_RANGE_MIN.equals(value.getFieldName())) {
isRange.set(true);
}
unit.set(ValidationUtil.isEmpty(value.getUnit()) || "null".equals(value.getUnit()) ? "" : value.getUnit());
});
}
if (isRange.get()) {
if (!ValidationUtil.isEmpty(resLeft.get()) || !ValidationUtil.isEmpty(resRight.get())) {
return ValidationUtil.isEmpty(resLeft.get()) ? "?" : resLeft.get() + " - "
+ (ValidationUtil.isEmpty(resRight.get()) ? "?" : resRight.get()) + unit.get();
} else {
return "";
}
} else {
return resLeft.get() + unit.get();
}
}
private static String getLabel4TagInstance(KnowledgeTagInstanceModel instanceModel) {
String frontEndConfig = instanceModel.getFrontEndConfig();
if (!ValidationUtil.isEmpty(frontEndConfig)) {
try {
JSONObject configObject = JSON.parseObject(frontEndConfig);
return (String) configObject.get(TAG_INSTANCE_LABEL);
} catch (Exception e) {
}
}
return null;
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocCategoryModel;
import com.yeejoin.amos.knowledgebase.face.model.MultipleNodeModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.DocCategoryMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocCategory;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTag;
import com.yeejoin.amos.knowledgebase.face.util.BaseUtil;
import com.yeejoin.amos.knowledgebase.face.util.TreeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.TreeBuilder;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.exception.instance.RequestForbidden;
import java.util.*;
/**
* <p>
* 知识库文档分类 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DocCategoryService extends BaseService<KnowledgeDocCategoryModel, KnowledgeDocCategory, DocCategoryMapper> {
public static final Long ROOT = 0L;
@Autowired
private DocContentService docContentService;
/**
* 分页查询
*/
public Page<KnowledgeDocCategoryModel> queryForKnowledgeDocCategoryPage(Page page, String agencyCode) {
return this.queryForPage(page, null, false, agencyCode);
}
/**
* 列表查询 示例
*/
public List<KnowledgeDocCategoryModel> queryForKnowledgeDocCategoryList(Long parentId) {
QueryWrapper<KnowledgeDocCategory> wrapper = new QueryWrapper<>();
if (null != parentId) {
wrapper.eq("PARENT_ID", parentId);
}
// wrapper.eq("AGENCY_CODE", RequestContext.getAgencyCode());
List<KnowledgeDocCategory> list = this.list(wrapper);
if (list.isEmpty()) {
return Collections.emptyList();
}
return Bean.toModels(list, KnowledgeDocCategoryModel.class);
}
/**
* @return java.util.Collection<com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocCategoryModel>
* @author 吴俊凯
* @description 查询知识库文档分类树结构
* @Param [agencyCode]
**/
public Collection<KnowledgeDocCategoryModel> queryDocCategoryTree(String agencyCode, Long root) {
List<KnowledgeDocCategoryModel> list = this.queryForKnowledgeDocCategoryList(null);
Map<Object, KnowledgeDocCategoryModel> map = Bean.listToMap(list, "sequenceNbr", KnowledgeDocCategoryModel.class);
SortedSet<KnowledgeDocCategoryModel> completeList = new TreeSet<>();
for (KnowledgeDocCategoryModel model : list) {
completeList.addAll(buildWithParent(model, map));
}
return TreeBuilder.buildByRecursive(completeList, root);
}
/**
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocCategoryModel>
* @author 吴俊凯
* @description 构建不完整的树
* @Param [groupModel, map]
**/
private List<KnowledgeDocCategoryModel> buildWithParent(KnowledgeDocCategoryModel groupModel, Map<Object, KnowledgeDocCategoryModel> map) {
List<KnowledgeDocCategoryModel> completeList = new ArrayList<>();
completeList.add(groupModel);
if (groupModel.getParentId().equals(ROOT)) {
completeList.add(groupModel);
return completeList;
}
KnowledgeDocCategoryModel parent = map.get(groupModel.getParentId());
if (ValidationUtil.isEmpty(parent)) {
parent = this.queryBySeq(groupModel.getParentId());
if (ValidationUtil.isEmpty(parent)) {
return completeList;
}
}
completeList.add(parent);
completeList.addAll(this.buildWithParent(parent, map));
return completeList;
}
/**
* @return java.util.List<java.lang.Long>
* @author 杨博超
* @description 删除分类
* @Param [ids]
**/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<Long> deleteDocCategory(String ids) {
List<Long> seqs = StringUtil.String2LongList(ids);
for (Long seq : seqs) {
KnowledgeDocCategoryModel DocCategoryModel = this.queryBySeq(seq);
//所有子分类
List<Long> childGroupSequenceList = getChildGroupSequenceList(DocCategoryModel);
List<Long> existTags = this.queryDocListWithCategory(seq, null, null, null);
if (!ValidationUtil.isEmpty(existTags)) {
throw new RequestForbidden("分类下存在文档,不允许删除!");
}
this.deleteBatchSeq(childGroupSequenceList);
}
return seqs;
}
/**
* 条件查询--标签分组下及所有子分组下的标签
*/
public List<Long> queryDocListWithCategory(Long groupSeq, String tagName, String tagCode, String tagStatus) {
QueryWrapper<KnowledgeTag> wrapper = new QueryWrapper<>();
List<Long> tagSeqList = null;
if (!ValidationUtil.isEmpty(groupSeq)
&& !ValidationUtil.equals(groupSeq, TagGroupService.ROOT)) {
KnowledgeDocCategoryModel DocCategoryModel = this.queryBySeq(groupSeq);
if (!ValidationUtil.isEmpty(DocCategoryModel)) {
List<Long> childGroupSequenceList = getChildGroupSequenceList(DocCategoryModel);
tagSeqList = docContentService.queryContentSeqListByCategorySeqList(childGroupSequenceList);
// if (!ValidationUtil.isEmpty(tagSeqList)) {
// wrapper.in("sequence_nbr", tagSeqList);
// } else {
// return Collections.EMPTY_LIST;
// }
}
}
return tagSeqList;
}
/**
* 获取标签分组的所有子分组id
*
* @param parentTagGroupModel
* @return
*/
public List<Long> getChildGroupSequenceList(KnowledgeDocCategoryModel parentTagGroupModel) {
List<Long> sequenceList = new ArrayList<>();
List<KnowledgeDocCategoryModel> childList = new ArrayList<>();
this.getAllChildList(parentTagGroupModel, childList);
for (KnowledgeDocCategoryModel tagGroupModel : childList) {
sequenceList.add(tagGroupModel.getSequenceNbr());
}
return sequenceList;
}
private void getAllChildList(KnowledgeDocCategoryModel currentTagGroupModel, List<KnowledgeDocCategoryModel> resList) {
if (null == currentTagGroupModel) {
return;
}
Long parentId = currentTagGroupModel.getSequenceNbr();
List<KnowledgeDocCategoryModel> childList = queryByParentId(parentId);
if (!childList.isEmpty()) {
for (KnowledgeDocCategoryModel tagGroupModel : childList) {
this.getAllChildList(tagGroupModel, resList);
}
}
resList.add(currentTagGroupModel);
}
private List<KnowledgeDocCategoryModel> queryByParentId(Long parentId) {
return this.queryForList("", false, parentId);
}
public Collection queryDocCategoryTreeExtra(String agencyCode, Long root, Boolean onlyPublish) {
KnowledgeDocCategoryModel rootCategory = null;
if (root != null && !ROOT.equals(root)) {
rootCategory = this.queryBySeq(root);
}
Collection<KnowledgeDocCategoryModel> categoryTree = this.queryDocCategoryTree(agencyCode, root);
if (null != rootCategory) {
rootCategory.setChildren(categoryTree);
categoryTree = Arrays.asList(rootCategory);
}
if (!categoryTree.isEmpty()) {
List<KnowledgeDocCategoryModel> allChildren = TreeUtil.getAllChildren(categoryTree);
if (!allChildren.isEmpty()) {
List<Long> directoryIds = BaseUtil.getModelIds(allChildren);
List<MultipleNodeModel> multipleNodeModels = this.baseMapper.queryDocAndCategoryTree(directoryIds, onlyPublish ? DocContentService.DOC_STATUS_PUBLISHED : null);
return TreeBuilder.buildByRecursive(multipleNodeModels, null == rootCategory ? root : rootCategory.getParentId());
}
}
return Collections.emptyList();
}
public KnowledgeDocCategoryModel createOne(KnowledgeDocCategoryModel model) {
if (ValidationUtil.isEmpty(model) || ValidationUtil.isEmpty(model.getCategoryName())) {
throw new BadRequest("数据格式错误");
}
if (model.getParentId() == null) {
model.setParentId(ROOT);
}
model.setAgencyCode(RequestContext.getAgencyCode());
KnowledgeDocCategoryModel oldModel = this.queryByNameAndParent(model.getCategoryName(), model.getParentId());
if (!ValidationUtil.isEmpty(oldModel)) {
throw new BadRequest("同级目录下已存在此分类名称.");
}
this.createWithModel(model);
return null;
}
public KnowledgeDocCategoryModel updateOne(KnowledgeDocCategoryModel model) {
if (ValidationUtil.isEmpty(model) || ValidationUtil.isEmpty(model.getCategoryName())) {
throw new BadRequest("数据格式错误");
}
KnowledgeDocCategoryModel oldModel = this.queryBySeq(model.getSequenceNbr());
if (ValidationUtil.isEmpty(oldModel)) {
throw new BadRequest("原数据不存在");
}
if (!model.getCategoryName().equals(oldModel.getCategoryName())) {
KnowledgeDocCategoryModel targetModel = this.queryByNameAndParent(model.getCategoryName(), model.getParentId());
if (!ValidationUtil.isEmpty(targetModel)) {
throw new BadRequest("同级目录下已存在此分类名称.");
}
}
Bean.copyExistPropertis(model, oldModel);
return this.updateWithModel(oldModel);
}
private KnowledgeDocCategoryModel queryByNameAndParent(@Condition(Operator.eq) String categoryName, @Condition(Operator.eq) Long parentId) {
List<KnowledgeDocCategoryModel> categoryModelList = this.queryForList(null, true, categoryName, parentId);
return categoryModelList.isEmpty() ? null : categoryModelList.get(0);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.enumeration.OperateType;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocCommentsModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeInteractionRecordModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.DocCommentsMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocComments;
import com.yeejoin.amos.knowledgebase.face.util.RemoteData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.Date;
import java.util.List;
/**
* <p>
* 知识库评论信息 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DocCommentsService extends BaseService<KnowledgeDocCommentsModel, KnowledgeDocComments, DocCommentsMapper> {
public static final Long ROOT = 0L;
@Autowired
private InteractionRecordService interactionRecordService;
/**
* @author 杨博超
* @description 创建评论信息
* @Param [commentsModel]
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocCommentsModel
**/
public KnowledgeDocCommentsModel createComments(KnowledgeDocCommentsModel commentsModel) {
commentsModel.setAgencyCode(RequestContext.getAgencyCode());
commentsModel.setUserId(RequestContext.getExeUserId());
if (ValidationUtil.isEmpty(commentsModel.getParentId())) {
commentsModel.setParentId(ROOT);
}
return this.createWithModel(commentsModel);
}
/**
* @return boolean
* @author 杨博超
* @description 给评论点赞
* @Param [sequenceNbr]
**/
public boolean like(Long sequenceNbr) {
KnowledgeInteractionRecordModel recordModel = createLikeRecord(sequenceNbr);
KnowledgeInteractionRecordModel oldModel = interactionRecordService.queryUniqueModel(recordModel.getUserId(),recordModel.getEntityType(),recordModel.getEntityId(),recordModel.getOperateType());
if (!ValidationUtil.isEmpty(oldModel)) {
interactionRecordService.deleteInteractionRecord(oldModel);
} else {
interactionRecordService.createInteractionRecord(recordModel);
}
return true;
}
/**
* 获取文档的评论总数
* @param docSeq
* @return
*/
public int getCommentsTotal(Long docSeq) {
return this.queryCount(docSeq);
}
/** 分页查询文档评论 */
public Page queryDocCommentsPage(Page page, String agencyCode,Long docSeq) {
Page commentsPage = this.queryForPage(page, "REC_DATE", false, agencyCode, docSeq);
List<KnowledgeDocCommentsModel> records = commentsPage.getRecords();
if (!ValidationUtil.isEmpty(records)) {
for (KnowledgeDocCommentsModel commentsModel : records) {
setLikeAndCount(commentsModel);
}
}
return commentsPage;
}
private KnowledgeInteractionRecordModel createLikeRecord(Long sequenceNbr){
KnowledgeInteractionRecordModel recordModel = new KnowledgeInteractionRecordModel();
recordModel.setAgencyCode(RequestContext.getAgencyCode());
recordModel.setUserId(RequestContext.getExeUserId());
recordModel.setEntityType(KnowledgeDocCommentsModel.class.getSimpleName());
recordModel.setEntityId(String.valueOf(sequenceNbr));
recordModel.setOperateType(OperateType.LIKE.name());
recordModel.setRecUserId(RequestContext.getExeUserId());
recordModel.setRecDate(new Date());
return recordModel;
}
private void setLikeAndCount (KnowledgeDocCommentsModel commentsModel){
KnowledgeInteractionRecordModel recordModel = createLikeRecord(commentsModel.getSequenceNbr());
KnowledgeInteractionRecordModel oldRecordModel = interactionRecordService.queryUniqueModel(recordModel.getUserId(),recordModel.getEntityType(),recordModel.getEntityId(),recordModel.getOperateType());
int likedNum = interactionRecordService.countByInstance(OperateType.LIKE.name(), KnowledgeDocCommentsModel.class.getSimpleName(), commentsModel.getSequenceNbr().toString());
commentsModel.setLike(!ValidationUtil.isEmpty(oldRecordModel));
commentsModel.setLikedNum(likedNum);
// 加入用户姓名
commentsModel.setUsername(RemoteData.getUserRealNamById(commentsModel.getUserId()));
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.component.feign.model.FeignClientResult;
import com.yeejoin.amos.component.feign.utils.FeignUtil;
import com.yeejoin.amos.feign.systemctl.Systemctl;
import com.yeejoin.amos.feign.systemctl.model.FileInfoModel;
import com.yeejoin.amos.knowledgebase.face.enumeration.DynamicsFunctional;
import com.yeejoin.amos.knowledgebase.face.enumeration.KnowledgeRoleName;
import com.yeejoin.amos.knowledgebase.face.enumeration.OperateType;
import com.yeejoin.amos.knowledgebase.face.model.*;
import com.yeejoin.amos.knowledgebase.face.orm.dao.DocContentMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.util.DataFillter;
import com.yeejoin.amos.knowledgebase.face.util.DocSortUtil;
import com.yeejoin.amos.knowledgebase.face.util.QuoteCountFlushTiming;
import com.yeejoin.amos.knowledgebase.face.util.RemoteData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import org.typroject.tyboot.core.restful.exception.instance.RequestForbidden;
import java.util.*;
/**
* <p>
* 知识库文档存储 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DocContentService extends BaseService<KnowledgeDocContentModel, KnowledgeDocContent, DocContentMapper> implements DataFillter {
public static final String DOC_STATUS_UNPUBLISHED = "UNPUBLISHED";//文档发布状态--未发布
public static final String DOC_STATUS_PUBLISHED = "PUBLISHED"; //文档发布状态--已发布
private final String orderBy = new StringBuilder().append("ORDER BY FIELD(audit_status, '").append(DocAuditService.DOC_AUDIT_STATUS_SAVED).append("', '")
.append(DocAuditService.DOC_AUDIT_STATUS_SUBMITTED).append("', '").append(DocAuditService.DOC_AUDIT_STATUS_REJECTED).append("', '")
.append(DocAuditService.DOC_AUDIT_STATUS_PASSED).append("') ASC, create_time DESC").toString();
@Autowired
private DynamicsValueService dynamicsValueService;
@Autowired
private InteractionCountService interactionCountService;
@Autowired
private InteractionRecordService interactionRecordService;
@Autowired
private TagService tagService;
@Autowired
private TagInstanceService tagInstanceService;
@Autowired
private DynamicsGroupService dynamicsGroupService;
@Autowired
private TagValueService tagValueService;
@Autowired
private
DocLibraryService docLibraryService;
@Autowired
private Sequence sequence;
public Page queryDocPage(int offset, int end, Map<String, String[]> paramMap, String[] auditStatus, String[] docStatus,
Date createTimeLeft, Date createTimeRight) {
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
if (!ValidationUtil.isEmpty(auditStatus)) {
wrapper.in("audit_status", Arrays.asList(auditStatus));
}
if (!ValidationUtil.isEmpty(docStatus)) {
wrapper.in("doc_status", Arrays.asList(docStatus));
}
if (!ValidationUtil.isEmpty(createTimeLeft)) {
wrapper.ge("create_time", createTimeLeft);
}
if (!ValidationUtil.isEmpty(createTimeRight)) {
wrapper.le("create_time", createTimeRight);
}
//动态字段过滤
if (!ValidationUtil.isEmpty(paramMap)) {
wrapper = assembleFilterWithDynamics(wrapper, paramMap);
}
// 角色权限过滤
wrapper = assembleFilterWithRole(wrapper);
Page page = queryDocPageByWrapper(offset, end, wrapper);
if (!ValidationUtil.isEmpty(page.getRecords())) {
List<Map<Object, KnowledgeDynamicsValueModel>> returnList = new ArrayList<>();
for (Object obj : page.getRecords()) {
KnowledgeDocContentModel contentModel = (KnowledgeDocContentModel) obj;
contentModel.setSummary(null);
contentModel.setHtmlContent(null);
Map contentMap = Bean.BeantoMap(contentModel);
List<KnowledgeDynamicsValueModel> listByInstance = dynamicsValueService.queryByInstanceId(contentModel.getSequenceNbr());
Map<Object, Object> returnMap = Bean.listToMap(listByInstance, "fieldName", "fieldValue", KnowledgeDynamicsValueModel.class);
contentMap.putAll(returnMap);
returnList.add(contentMap);
}
page.setRecords(returnList);
}
return page;
}
/**
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocContentModel
* @author 杨博超
* @description 创建文档
* @Param [docContentModel]
**/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public KnowledgeDocContentModel createDoc(KnowledgeDocContentModel docContentModel) {
Long sequenceNbr = sequence.nextId();
docContentModel.setAgencyCode(RequestContext.getAgencyCode());
docContentModel.setUserId(RequestContext.getExeUserId());
docContentModel.setCreateTime(new Date());
docContentModel.setDocStatus(DOC_STATUS_UNPUBLISHED);
docContentModel.setAuditStatus(DocAuditService.DOC_AUDIT_STATUS_SAVED);
docContentModel.setSequenceNbr(sequenceNbr);
String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName());
if (ValidationUtil.isEmpty(inputerOrg)) {
throw new RequestForbidden("非录入者角色用户无权录入");
}
docContentModel.setOrgCode(inputerOrg);
String textContent = String.valueOf(docContentModel.getTextContent());
docContentModel.setSummary(textContent.substring(0,Math.min(300, textContent.length())));
if (ValidationUtil.isEmpty(docContentModel.getHaveAttachment())) {
docContentModel.setHaveAttachment(false);
}
//保存基础信息
dynamicsValueService.saveValueList(docContentModel.getDocBaseInfo(), sequenceNbr, DynamicsFunctional.DOC_BASEINFO, RequestContext.getAppKey());
// 保存标签实例
List<KnowledgeTagInstanceModel> docTags = tagInstanceService.saveInstance(docContentModel.getDocTags(), sequenceNbr, TagInstanceService.MARKING_TYPE_DOC);
tagInstanceService.saveInstance(docContentModel.getDocContentTags(), sequenceNbr, TagInstanceService.MARKING_TYPE_CONTENT);
QuoteCountFlushTiming.needFlushTag();
//保存附件信息
saveAttachments(docContentModel.getAttachments(), sequenceNbr);
//生成排序字段信息
docContentModel.setSortStr(DocSortUtil.getSortStr(docTags));
docLibraryService.fillDirectoryName(Arrays.asList(docContentModel));
return this.createWithModel(docContentModel);
}
private boolean saveAttachments(List<AttachmentModel> attachmentModels, Long docSeq) {
if (!ValidationUtil.isEmpty(attachmentModels)) {
for (AttachmentModel attachmentModel : attachmentModels) {
FileInfoModel fileInfoModel = new FileInfoModel();
fileInfoModel.setAgencyCode(RequestContext.getAgencyCode());
fileInfoModel.setEntityId(String.valueOf(docSeq));
fileInfoModel.setEntityType(KnowledgeDocContentModel.class.getSimpleName());
fileInfoModel.setFilename(attachmentModel.getFilename());
fileInfoModel.setOriginalFileName(attachmentModel.getOriginalFileName());
fileInfoModel.setFileType(attachmentModel.getFileType());
FeignClientResult<FileInfoModel> result = Systemctl.fileInfoClient.createByEntity(fileInfoModel);
}
}
return true;
}
private boolean deleteAttachments(Long docSeq) {
try {
List<FileInfoModel> fileInfoModels = FeignUtil.remoteCall(() -> Systemctl.fileInfoClient.queryByEntity(RequestContext.getAgencyCode(), KnowledgeDocContentModel.class.getSimpleName(), String.valueOf(docSeq)));
if (!ValidationUtil.isEmpty(fileInfoModels)) {
Map<Long, Object> map = Bean.listToMap(fileInfoModels, "sequenceNbr", "filename", FileInfoModel.class);
String ids = this.seperotorStrCollection(map.keySet());
Systemctl.fileInfoClient.deleteFileInfo(ids);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("删除文件出错.");
}
return true;
}
private KnowledgeDocContentModel fillAttachments(KnowledgeDocContentModel docContentModel) {
try {
List<FileInfoModel> fileInfoModels = FeignUtil.remoteCall(() -> Systemctl.fileInfoClient.queryByEntity(RequestContext.getAgencyCode(), KnowledgeDocContentModel.class.getSimpleName(), String.valueOf(docContentModel.getSequenceNbr())));
if (!ValidationUtil.isEmpty(fileInfoModels)) {
List<AttachmentModel> attachments = new ArrayList<>();
for (FileInfoModel fileInfoModel : fileInfoModels) {
AttachmentModel attachmentModel = new AttachmentModel();
attachmentModel.setFilename(fileInfoModel.getFilename());
attachmentModel.setFileType(fileInfoModel.getFileType());
attachmentModel.setOriginalFileName(fileInfoModel.getOriginalFileName());
attachmentModel.setFileUrl(fileInfoModel.getFileUrl());
attachments.add(attachmentModel);
}
docContentModel.setAttachments(attachments);
}
} catch (Exception e) {
e.printStackTrace();
}
return docContentModel;
}
private String seperotorStrCollection(Collection<Long> stringCollection) {
String returnStr = "";
if (!ValidationUtil.isEmpty(stringCollection)) {
for (Long seq : stringCollection) {
returnStr += String.valueOf(seq) + ",";
}
returnStr = returnStr.substring(0, returnStr.length() - 1);
}
return returnStr;
}
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public KnowledgeDocContentModel updateDoc(KnowledgeDocContentModel docContentModel) {
KnowledgeDocContentModel oldModel = this.queryOneDocDetail(docContentModel.getSequenceNbr());
if (ValidationUtil.isEmpty(oldModel)) {
throw new DataNotFound("找不到指定的文档.");
}
//判断文档的可编辑状态。
if (DOC_STATUS_PUBLISHED.equals(oldModel.getDocStatus())
|| DocAuditService.DOC_AUDIT_STATUS_PASSED.equals(oldModel.getAuditStatus())
|| DocAuditService.DOC_AUDIT_STATUS_SUBMITTED.equals(oldModel.getAuditStatus())) {
throw new BadRequest("当前文档状态不可编辑.");
}
//如果文档为驳回状态,更改为待提交
if (ValidationUtil.equals(DocAuditService.DOC_AUDIT_STATUS_REJECTED, oldModel.getAuditStatus())) {
oldModel.setAuditStatus(DocAuditService.DOC_AUDIT_STATUS_SAVED);
}
if (!ValidationUtil.isEmpty(docContentModel.getHaveAttachment())) {
oldModel.setHaveAttachment(docContentModel.getHaveAttachment());
}
String textContent = String.valueOf(docContentModel.getTextContent());
docContentModel.setSummary(textContent.substring(0,Math.min(300, textContent.length())));
//保存基础信息
dynamicsValueService.saveValueList(docContentModel.getDocBaseInfo(), docContentModel.getSequenceNbr(), DynamicsFunctional.DOC_BASEINFO, RequestContext.getAppKey());
// 保存标签实例
tagInstanceService.deleteByTargetSeq(oldModel.getSequenceNbr());//删除已有的标签
List<KnowledgeTagInstanceModel> docTags = tagInstanceService.saveInstance(docContentModel.getDocTags(), oldModel.getSequenceNbr(), TagInstanceService.MARKING_TYPE_DOC);
tagInstanceService.saveInstance(docContentModel.getDocContentTags(), oldModel.getSequenceNbr(), TagInstanceService.MARKING_TYPE_CONTENT);
// 重新保存附件信息
deleteAttachments(oldModel.getSequenceNbr());//删除已有的文件信息
saveAttachments(docContentModel.getAttachments(), oldModel.getSequenceNbr());//保存新的文件信息.
oldModel.setDocTitle(docContentModel.getDocTitle());
oldModel.setDirectoryId(docContentModel.getDirectoryId());
docLibraryService.fillDirectoryName(Arrays.asList(oldModel));
oldModel.setHtmlContent(docContentModel.getHtmlContent());
//生成排序字段信息
oldModel.setSortStr(DocSortUtil.getSortStr(docTags));
docLibraryService.fillDirectoryName(Arrays.asList(oldModel));
this.updateWithModel(oldModel);
return Bean.copyExistPropertis(oldModel, docContentModel);
}
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<Long> deleteDoc(List<Long> idList) {
for (Long id : idList) {
KnowledgeDocContentModel docContentModel = this.queryBySeq(id);
if (ValidationUtil.isEmpty(docContentModel)) {
throw new BadRequest("指定的文档不存在.");
}
if (DOC_STATUS_PUBLISHED.equals(docContentModel.getDocStatus())
|| DocAuditService.DOC_AUDIT_STATUS_PASSED.equals(docContentModel.getAuditStatus())
|| DocAuditService.DOC_AUDIT_STATUS_SUBMITTED.equals(docContentModel.getAuditStatus())) {
throw new BadRequest("当前文档状态不可删除.");
}
this.dynamicsValueService.deleteByInstanceId(docContentModel.getSequenceNbr());
this.tagInstanceService.deleteByTargetSeq(docContentModel.getSequenceNbr());
this.deleteBySeq(id);
}
return idList;
}
public KnowledgeDocContentModel queryOneDocDetail(Long sequenceNbr) {
KnowledgeDocContentModel docContentModel = this.queryBySeq(sequenceNbr);
if (!ValidationUtil.isEmpty(docContentModel)) {
//填充基础信息字段
List<KnowledgeDynamicsValueModel> dynamicsValueModels = this.dynamicsValueService.queryByInstanceId(sequenceNbr);
Map<String, Object> map = Bean.listToMap(dynamicsValueModels, "fieldName", "fieldValue", KnowledgeDynamicsValueModel.class);
docContentModel.setDocBaseInfo(map);
//文档标签
List<KnowledgeTagInstanceModel> docTags = new ArrayList<>();
//文档内容标签
List<KnowledgeTagInstanceModel> docContentTags = new ArrayList<>();
// 获取文档相关的所有标签
List<KnowledgeTagInstanceModel> tagInstanceModelList = tagInstanceService.queryListByTargetSeq(docContentModel.getSequenceNbr());
if (!tagInstanceModelList.isEmpty()) {
Map<Object, KnowledgeTagInstanceModel> instanceModelMap = Bean.listToMap(tagInstanceModelList, "sequenceNbr", KnowledgeTagInstanceModel.class);
// 获取所有的标签的值
List<KnowledgeTagValueModel> tagValueModelList = tagValueService.queryTagValuesByDocId(docContentModel.getSequenceNbr());
tagValueModelList.forEach(tagValue -> {
KnowledgeTagInstanceModel instanceModel = instanceModelMap.get(tagValue.getInstanceSeq());
if (instanceModel != null) {
List<KnowledgeTagValueModel> tagValues = instanceModel.getTagValues();
if (tagValues == null) {
tagValues = new ArrayList<>();
instanceModel.setTagValues(tagValues);
}
tagValues.add(tagValue);
}
});
tagInstanceModelList.forEach(instanceModel -> {
switch (instanceModel.getMarkingType()) {
case TagInstanceService.MARKING_TYPE_DOC:
docTags.add(instanceModel);
break;
default:
docContentTags.add(instanceModel);
}
});
}
KnowledgeInteractionRecordModel recordModel = interactionRecordService.queryUniqueModel(RequestContext.getExeUserId(), KnowledgeDocContentModel.class.getSimpleName(),
String.valueOf(docContentModel.getSequenceNbr()), OperateType.COLLECT.name());
fillAttachments(docContentModel);
docContentModel.setDocTags(docTags);
docContentModel.setDocContentTags(docContentTags);
docContentModel.setCollected(!ValidationUtil.isEmpty(recordModel));
docContentModel.setUserName(RemoteData.getUserRealNamById(docContentModel.getUserId()));
docLibraryService.fillDirectoryName(Arrays.asList(docContentModel));
}
return docContentModel;
}
/**
* @return boolean
* @author 杨博超
* @description 给文档点赞
* @Param [sequenceNbr]
**/
public Map<String, Object> like(Long sequenceNbr) {
excludeOperate(sequenceNbr, OperateType.LIKE, OperateType.DIS_LIKE);
return queryLikeOrDis(sequenceNbr);
}
/**
* @return boolean
* @author 杨博超
* @description 给文档吐槽
* @Param [sequenceNbr]
**/
public Map<String, Object> disLike(Long sequenceNbr) {
excludeOperate(sequenceNbr, OperateType.DIS_LIKE, OperateType.LIKE);
return queryLikeOrDis(sequenceNbr);
}
/**
* 互斥操作
*
* @param sequenceNbr 文档id
* @param expect 期望操作类型
* @param exclusions 互斥操作类型
*/
private void excludeOperate(Long sequenceNbr, OperateType expect, OperateType... exclusions) {
KnowledgeInteractionRecordModel recordModel = initInteractionRecordModel(sequenceNbr, expect);
KnowledgeInteractionRecordModel oldModel = interactionRecordService.queryUniqueModel(recordModel.getUserId(), recordModel.getEntityType(), recordModel.getEntityId(), recordModel.getOperateType());
if (ValidationUtil.isEmpty(oldModel)) {
interactionRecordService.createInteractionRecord(recordModel);
for (OperateType exclusion : exclusions) {
recordModel = initInteractionRecordModel(sequenceNbr, exclusion);
oldModel = interactionRecordService.queryUniqueModel(recordModel.getUserId(), recordModel.getEntityType(), recordModel.getEntityId(), recordModel.getOperateType());
if (!ValidationUtil.isEmpty(oldModel)) {
interactionRecordService.deleteInteractionRecord(oldModel);
}
}
} else {
interactionRecordService.deleteInteractionRecord(oldModel);
}
}
private KnowledgeInteractionRecordModel initInteractionRecordModel(Long sequenceNbr, OperateType operateType) {
KnowledgeInteractionRecordModel recordModel = new KnowledgeInteractionRecordModel();
recordModel.setAgencyCode(RequestContext.getAgencyCode());
recordModel.setUserId(RequestContext.getExeUserId());
recordModel.setEntityType(KnowledgeDocContentModel.class.getSimpleName());
recordModel.setEntityId(String.valueOf(sequenceNbr));
recordModel.setOperateType(operateType.name());
recordModel.setRecUserId(RequestContext.getExeUserId());
return recordModel;
}
/**
* 分页查询文档,按审核状态+创建时间排序
*
* @param offset 起始
* @param end 终止
* @param wrapper 查询条件
* @return
*/
public Page queryDocPageByWrapper(int offset, int end, QueryWrapper<KnowledgeDocContent> wrapper) {
Page page = new Page();
int count = this.count(wrapper);
page.setTotal(count);
if (count > 0) {
wrapper.last(orderBy + " LIMIT " + offset + ", " + end);
List<KnowledgeDocContent> list = this.list(wrapper);
page.setRecords(Bean.toModels(list, KnowledgeDocContentModel.class));
}
return page;
}
public Page queryDocPageByIdsAndParams(Page page, String docStatus, Collection<Long> sequenceNbr, Date createTimeLeft, Date createTimeRight) {
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.in("sequence_nbr", sequenceNbr).eq("doc_status", docStatus);
if (!ValidationUtil.isEmpty(createTimeLeft)) {
wrapper.ge("create_time", createTimeLeft);
}
if (!ValidationUtil.isEmpty(createTimeRight)) {
wrapper.le("create_time", createTimeRight);
}
wrapper.orderByDesc("sequence_nbr");
page = (Page) this.page(page, wrapper);
if (!ValidationUtil.isEmpty(page.getRecords())) {
page.setRecords(Bean.toModels(page.getRecords(), KnowledgeDocContentModel.class));
}
return page;
}
/**
* 根据ID列表查询文档列表
*
* @param sequenceNbr ID列表
* @return List
*/
public List<KnowledgeDocContentModel> queryByIds(@Condition(Operator.in) Collection<Long> sequenceNbr) {
return this.queryForList(null, false, sequenceNbr);
}
/**
* 获取文档被引用数量
*
* @param sequenceNbr 文档ID
* @return 数量
*/
public int getReference(Long sequenceNbr) {
return interactionCountService.getOperateCount(InteractionCountService.QUOTE_TYPE_ALL, InteractionCountService.QUOTE_ENTITY_DOCUMENT, sequenceNbr.toString());
}
/**
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocContentModel>
* @author 杨博超
* @description 根据字符串模糊查询文档(搜索项为标签名和文档名)
* @Param [queryString]
**//*
public List<KnowledgeDocContentModel> searchForDoc(Page page, String queryString) {
List<KnowledgeDocContentModel> list = new ArrayList<>();
if (!ValidationUtil.isEmpty(queryString)) {
Map<String, Object> dataFillterParams = DataFillter.dataFillterByRoleName(this);
String[] docStatus = (String[]) dataFillterParams.get(DataFillter.docStatus);
String[] auditStatus = (String[]) dataFillterParams.get(DataFillter.docStatus);
;
String userId = (String) dataFillterParams.get(DataFillter.userId);
String orgCode = (String) dataFillterParams.get(DataFillter.orgCode);
List<Map<String, Long>> docIds = this.getBaseMapper().searchForDocIds(RequestContext.getAgencyCode(),
queryString, docStatus, auditStatus, userId, orgCode, page.offset(), page.getSize());
if (!ValidationUtil.isEmpty(docIds)) {
for (Map<String, Long> map : docIds) {
Long docId = map.get("docSeq");
KnowledgeDocContentModel contentModel = this.queryOneDocDetail(docId);
List<KnowledgeTagInstanceModel> tagsToShow = new ArrayList<>();
for (KnowledgeTagInstanceModel contentTag : contentModel.getDocContentTags()) {
if (contentTag.getTagName().contains(queryString)) {
tagsToShow.add(contentTag);
}
}
for (KnowledgeTagInstanceModel docTag : contentModel.getDocTags()) {
if (docTag.getTagName().contains(queryString)) {
tagsToShow.add(docTag);
}
}
contentModel.setTagsToShow(tagsToShow);
contentModel.setDocContentTags(null);
contentModel.setDocTags(null);
contentModel.setHtmlContent(null);
list.add(contentModel);
}
}
}
return list;
}*/
//智能检索数据过滤
@Override
public Map<String, Object> assembleParams(List<String> roleNameList, String orgCode) {
Map<String, Object> dataPrivilegemap = new HashMap<>();
if (!ValidationUtil.isEmpty(roleNameList)) {
Set<String> auditStatusSet = new HashSet<>();
Set<String> docStatusSet = new HashSet<>();
KnowledgeRoleName knowledgeRoleName = KnowledgeRoleName.getMaxScore(roleNameList, Comparator.comparingInt(KnowledgeRoleName::getSearchScore));
if (ValidationUtil.isEmpty(knowledgeRoleName)) {
switch (knowledgeRoleName) {
case TAG_MANAGER:
dataPrivilegemap.put("noData", true);
break;
case AUDITOR:
case INPUTER:
case VIEWER:
auditStatusSet.add(DocAuditService.DOC_AUDIT_STATUS_PASSED);
docStatusSet.add(DocContentService.DOC_STATUS_PUBLISHED);
dataPrivilegemap.put(docStatus, docStatusSet.toArray(new String[docStatusSet.size()]));
dataPrivilegemap.put(auditStatus, auditStatusSet.toArray(new String[auditStatusSet.size()]));
break;
default:
throw new BadRequest("错误的用户角色.");
}
}
}
return dataPrivilegemap;
}
public Map<String, Object> queryLikeOrDis(Long sequenceNbr) {
Map<String, Object> res = new HashMap<>();
KnowledgeInteractionRecordModel recordModel = new KnowledgeInteractionRecordModel();
recordModel.setUserId(RequestContext.getExeUserId());
recordModel.setEntityType(KnowledgeDocContentModel.class.getSimpleName());
recordModel.setEntityId(sequenceNbr.toString());
recordModel.setOperateType(OperateType.LIKE.name());
KnowledgeInteractionRecordModel myLike = interactionRecordService.queryUniqueModel(recordModel.getUserId(), recordModel.getEntityType(), recordModel.getEntityId(), recordModel.getOperateType());
int likeNum = interactionRecordService.countByInstance(recordModel.getOperateType(), recordModel.getEntityType(), recordModel.getEntityId());
recordModel.setOperateType(OperateType.DIS_LIKE.name());
KnowledgeInteractionRecordModel myDislike = interactionRecordService.queryUniqueModel(recordModel.getUserId(), recordModel.getEntityType(), recordModel.getEntityId(), recordModel.getOperateType());
int dislikeNum = interactionRecordService.countByInstance(recordModel.getOperateType(), recordModel.getEntityType(), recordModel.getEntityId());
res.put("like", !ValidationUtil.isEmpty(myLike));
res.put("disLike", !ValidationUtil.isEmpty(myDislike));
res.put("likeNum", likeNum);
res.put("dislikeNum", dislikeNum);
return res;
}
/**
* 查询最新文档
*
* @param top 条数
* @param docStatus 文档状态
* @return
*/
public List<KnowledgeDocContentModel> queryNewDocsWithStatus(int top, String docStatus) {
return this.queryForTopList(top, "rec_date", false, docStatus);
}
public List<KnowledgeDocContent> queryIdListByStatus(String docStatus) {
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.eq("doc_status", docStatus);
wrapper.select("SEQUENCE_NBR");
return getBaseMapper().selectList(wrapper);
}
public KnowledgeDocContent updateHtmlContent(Long id, String htmlContent) {
KnowledgeDocContent docContent = this.getById(id);
if (ValidationUtil.isEmpty(docContent)) {
throw new DataNotFound("没有找到文档");
}
docContent.setHtmlContent(htmlContent);
this.updateById(docContent);
return docContent;
}
/**
* 根据角色数据权限过滤
*/
public QueryWrapper<KnowledgeDocContent> assembleFilterWithRole(QueryWrapper<KnowledgeDocContent> wrapper) {
//获取用户录入者角色部门
String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName());
//获取用户审核者角色部门
String auditorOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.AUDITOR.getRoleName());
if (!ValidationUtil.isEmpty(inputerOrg) || !ValidationUtil.isEmpty(auditorOrg)) {
//可查看自己的数据
wrapper.and(w -> {
if (!ValidationUtil.isEmpty(inputerOrg)) {
w.eq("user_id", RequestContext.getExeUserId());
if (!ValidationUtil.isEmpty(auditorOrg)) {
w.or();
}
}
if (!ValidationUtil.isEmpty(auditorOrg)) {
String[] auditStatus = {DocAuditService.DOC_AUDIT_STATUS_PASSED, DocAuditService.DOC_AUDIT_STATUS_SUBMITTED};
w.likeRight("org_code", auditorOrg).in("audit_status", Arrays.asList(auditStatus));
}
});
} else {
throw new RequestForbidden("用户角色错误");
}
return wrapper;
}
/**
* 动态字段过滤
*/
public QueryWrapper<KnowledgeDocContent> assembleFilterWithDynamics(QueryWrapper<KnowledgeDocContent> wrapper, Map<String, String[]> paramMap) {
KnowledgeDynamicsGroupModel groupModel = dynamicsGroupService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name());
if (ValidationUtil.isEmpty(groupModel)) {
throw new DataNotFound("缺少动态字段配置");
}
Set<Long> instanceIds = dynamicsValueService.intersection(RequestContext.getAgencyCode(), groupModel.getSequenceNbr(), paramMap);
if (ValidationUtil.isEmpty(instanceIds)) {
//没有任何数据
wrapper.eq("sequence_nbr", 1).eq("sequence_nbr", 0);
} else {
wrapper.in("sequence_nbr", instanceIds);
}
return wrapper;
}
public List<Long> getAllPublishedDocIds(){
return this.baseMapper.getAllPublishedDocIds();
}
//根据分类id列表查询所有的文档id
public List queryContentSeqListByCategorySeqList(List<Long> groupSeqList) {
List<KnowledgeDocContentModel> refModelList = queryListByCategorySeqList(groupSeqList);
Set<Object> docCotentId = Bean.listToMap(refModelList, "sequenceNbr", KnowledgeDocContentModel.class).keySet();
return new ArrayList(docCotentId);
}
//根据分组id列表查询所有的关系
private List<KnowledgeDocContentModel> queryListByCategorySeqList(@Condition(Operator.in) List<Long> directoryId) {
return this.queryForList(null, false, directoryId);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.feign.systemctl.model.DictionarieValueModel;
import com.yeejoin.amos.knowledgebase.face.enumeration.DynamicsFunctional;
import com.yeejoin.amos.knowledgebase.face.enumeration.KnowledgeRoleName;
import com.yeejoin.amos.knowledgebase.face.enumeration.OperateType;
import com.yeejoin.amos.knowledgebase.face.enumeration.OptionDataType;
import com.yeejoin.amos.knowledgebase.face.model.*;
import com.yeejoin.amos.knowledgebase.face.orm.entity.ESDocEntity;
import com.yeejoin.amos.knowledgebase.face.orm.entity.ESTagEntity;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTag;
import com.yeejoin.amos.knowledgebase.face.util.*;
import com.yeejoin.amos.knowledgebase.face.util.FileExporter.FileType;
import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelImportConfig;
import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelParser;
import com.yeejoin.amos.knowledgebase.face.util.pdf.PdfBuilder;
import com.yeejoin.amos.knowledgebase.face.util.sql.BaseSqlCondition;
import com.yeejoin.amos.knowledgebase.face.util.word.DocxBuilder;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.TreeBuilder;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import org.typroject.tyboot.core.restful.exception.instance.RequestForbidden;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.*;
import static com.yeejoin.amos.knowledgebase.face.util.DataTransformator.htmlContent2Text;
import static com.yeejoin.amos.knowledgebase.face.util.FileExporter.FileType.getInstance;
import static com.yeejoin.amos.knowledgebase.face.util.excel.ExcelParser.convertCellValueToString;
/**
* <p>
* 文档库管理服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DocLibraryService {
@Autowired
private InteractionRecordService interactionRecordService;
@Autowired
private DocContentService docContentService;
@Autowired
private DynamicsValueService dynamicsValueService;
@Autowired
private InteractionCountService interactionCountService;
// @Autowired
// private DynamicsGroupService dynamicsGroupService;
@Autowired
private DynamicsOptionService dynamicsOptionService;
@Autowired
private DocCommentsService docCommentsService;
@Autowired
private TagService tagService;
@Autowired
private ESDocService esDocService;
@Autowired
private TagInstanceService tagInstanceService;
@Autowired
private TagValueService tagValueService;
@Autowired
private Sequence sequence;
@Autowired
private DocCategoryService docCategoryService;
private static final Integer BATCH_IMPORT_ONCE_NUM = 200;
private static final List auditStatusList;
static {
List<String> list = new ArrayList<>();
list.add(DocAuditService.DOC_AUDIT_STATUS_SUBMITTED);
list.add(DocAuditService.DOC_AUDIT_STATUS_PASSED);
auditStatusList = Collections.unmodifiableList(list);
}
/**
* 收藏/取消
*
* @param id 被收藏的文档
* @param favor 收藏/取消收藏
* @return
*/
public boolean favorite(Long id, boolean favor) {
KnowledgeDocContentModel docContentModel = docContentService.queryBySeq(id);
if (ValidationUtil.isEmpty(docContentModel)) {
return false;
}
KnowledgeInteractionRecordModel recordModel = new KnowledgeInteractionRecordModel();
recordModel.setOperateType(OperateType.COLLECT.name());
recordModel.setUserId(RequestContext.getExeUserId());
recordModel.setEntityType(KnowledgeDocContentModel.class.getSimpleName());
recordModel.setEntityId(String.valueOf(id));
KnowledgeInteractionRecordModel oldModel = interactionRecordService.queryUniqueModel(recordModel.getUserId(), recordModel.getEntityType(), recordModel.getEntityId(), recordModel.getOperateType());
if (favor) {
if (ValidationUtil.isEmpty(oldModel)) {
recordModel.setAgencyCode(RequestContext.getAgencyCode());
interactionRecordService.createWithModel(recordModel);
}
} else {
if (!ValidationUtil.isEmpty(oldModel)) {
interactionRecordService.deleteBySeq(oldModel.getSequenceNbr());
}
}
return true;
}
public Page queryDocList(int offset, int end, Long directoryId, String docTitle, String[] auditStatus, String docStatus,
Map<String, String[]> requestMap, String createTimeLeft, String createTimeRight, boolean favor, boolean permission) {
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("userId", RequestContext.getExeUserId());
paramsMap.put("start", offset);
paramsMap.put("limit", end > offset ? end - offset + 1 : 50);
// 封装权限过滤条件
if (permission) {
addPermissionFilters(paramsMap);
}
List<Long> directoryIdList = new ArrayList<>();
if (directoryId != null) {
Collection<KnowledgeDocCategoryModel> childCategoryModels = docCategoryService.queryDocCategoryTree(RequestContext.getAgencyCode(), directoryId);
if (!childCategoryModels.isEmpty()) {
directoryIdList.addAll(BaseUtil.getModelIds(TreeUtil.getAllChildren(childCategoryModels)));
}
//获取所有子分类ID
directoryIdList.add(directoryId);
}
// 封装基本筛选条件
addCommonFilters(paramsMap, directoryIdList, docTitle, docStatus, auditStatus, createTimeLeft, createTimeRight);
// 是否收藏作为过滤条件
if (favor) {
paramsMap.put("collect", "COLLECT");
}
// 封装动态字段及动态条件过滤
addExtraFieldsAndFilters(paramsMap, requestMap);
Page page = new Page();
int total = docContentService.getBaseMapper().queryDocBaseInfoTotal(paramsMap);
page.setTotal(total);
if (total > 0 && total > offset) {
List<Map<String, Object>> list = docContentService.getBaseMapper().queryDocBaseInfoList(paramsMap);
page.setRecords(list);
}
return page;
}
private void addExtraFieldsAndFilters(Map<String, Object> paramsMap, Map<String, String[]> requestMap) {
List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name());
if (ValidationUtil.isEmpty(optionModels)) {
return;
}
List<String> extraFields = new ArrayList<>();
List<String> extraStrFilters = new ArrayList<>();
paramsMap.put("extraFields", extraFields);
paramsMap.put("extraStrFilters", extraStrFilters);
for (KnowledgeDynamicsOptionModel optionModel : optionModels) {
String fieldName = optionModel.getFieldName();
extraFields.add(fieldName);
if (requestMap.containsKey(fieldName)) {
String filterStr = buildFilterStr(fieldName, requestMap.get(fieldName), optionModel.getDataType(), optionModel.getQueryStrategy());
if (!ValidationUtil.isEmpty(filterStr)) {
extraStrFilters.add(filterStr);
}
}
}
}
private String buildFilterStr(String fieldName, String[] values, String dataType, String queryStrategy) {
switch (OptionDataType.valueOf(dataType)) {
case Enum:
case String:
break;
case Double:
fieldName = "CONVERT(" + fieldName + ",DECIMAL)";
case Integer:
fieldName = "CONVERT(" + fieldName + ",SIGNED)";
break;
case datetime:
fieldName = "STR_TO_DATE(" + fieldName + ", '%Y-%m-%d %H:%i:%s')";
break;
case Date:
fieldName = "STR_TO_DATE(" + fieldName + ", '%Y-%m-%d')";
break;
default:
throw new RuntimeException("错误的数据类型");
}
switch (Operator.valueOf(queryStrategy)) {
case eq:
return ValidationUtil.isEmpty(values[0]) ? null : fieldName + " = \"" + values[0] + "\"";
case like:
return ValidationUtil.isEmpty(values[0]) ? null : fieldName + " LIKE \"%" + values[0] + "%\"";
case between:
if (ValidationUtil.isEmpty(values[0]) && ValidationUtil.isEmpty(values[1])) {
return null;
}
StringBuilder builder = new StringBuilder();
if (!ValidationUtil.isEmpty(values[0])) {
builder.append(fieldName).append(" >= \"").append(values[0]).append("\"");
if (values.length>1 && !ValidationUtil.isEmpty(values[1])) {
builder.append(" AND ");
}
}
if (values.length>1 && !ValidationUtil.isEmpty(values[1])) {
builder.append(fieldName).append(" <= \"").append(values[1]).append("\"");
}
return builder.toString();
default:
throw new RuntimeException("动态字段查询方式有误.");
}
}
private void addPermissionFilters(Map<String, Object> paramsMap) {
Map<String, Object> permissionFiltersMap = new HashMap<>();
paramsMap.put("permissionFilters", permissionFiltersMap);
String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName());
String auditorOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.AUDITOR.getRoleName());
if (ValidationUtil.isEmpty(inputerOrg) && ValidationUtil.isEmpty(auditorOrg)) {
throw new RequestForbidden("用户角色错误");
}
if (!ValidationUtil.isEmpty(inputerOrg)) {
permissionFiltersMap.put("userId", RequestContext.getExeUserId());
}
if (!ValidationUtil.isEmpty(auditorOrg)) {
permissionFiltersMap.put("orgCode", auditorOrg);
permissionFiltersMap.put("auditStatusList", auditStatusList);
}
}
private void addCommonFilters(Map<String, Object> paramsMap, List<Long> directoryIdList, String docTitle, String docStatus, String[] auditStatus, String createTimeLeft, String createTimeRight) {
Map<String, Object> commonFiltersMap = new HashMap<>(16);
paramsMap.put("commonFilters", commonFiltersMap);
if (!ValidationUtil.isEmpty(directoryIdList)) {
commonFiltersMap.put("directoryIdList", directoryIdList);
}
if (!ValidationUtil.isEmpty(docTitle)) {
commonFiltersMap.put("docTitle", docTitle);
}
if (!ValidationUtil.isEmpty(docStatus)) {
commonFiltersMap.put("docStatus", docStatus);
}
if (!ValidationUtil.isEmpty(auditStatus)) {
commonFiltersMap.put("auditStatus", Arrays.asList(auditStatus));
}
try {
if (!ValidationUtil.isEmpty(createTimeLeft)) {
commonFiltersMap.put("createTimeLeft", DateUtil.formatStringToDate(createTimeLeft, null));
}
if (!ValidationUtil.isEmpty(createTimeRight)) {
commonFiltersMap.put("createTimeLeft", DateUtil.formatStringToDate(createTimeRight, null));
}
} catch (Exception e) {
throw new BadRequest("时间范围参数格式有误");
}
}
/**
* 高级检索
*
* @param page 分页信息
* @param queryParams sql条件
* @return 分页数据
*/
public Page searchAdvanced(Page page, Map<String, Object> queryParams) {
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.select("SEQUENCE_NBR")
.eq("DOC_STATUS", DocContentService.DOC_STATUS_PUBLISHED)
.orderByAsc("SORT_STR");
BaseSqlCondition sqlCondition = BaseSqlCondition.getInstance(queryParams);
if (sqlCondition.getTotalStatement() > 0) {
sqlCondition.compose(wrapper);
}
IPage<KnowledgeDocContent> iPage = docContentService.page(page, wrapper);
List<ESDocEntity> esList = new ArrayList<>();
iPage.getRecords().forEach(doc -> {
ESDocEntity esDocEntity = esDocService.queryById(doc.getSequenceNbr());
if (ValidationUtil.isEmpty(esDocEntity)) {
throw new BadRequest("ES库数据丢失,请联系管理员协助解决");
}
Set<String> involvedTagIds = sqlCondition.getTagSeqs();
deleteRepeatedTags(esDocEntity.getDocTags(), involvedTagIds);
deleteRepeatedTags(esDocEntity.getContentTags(), involvedTagIds);
esList.add(esDocEntity);
});
fillDirectoryName(esList);
return page.setRecords(esList).setCurrent(iPage.getCurrent()).setSize(iPage.getSize()).setTotal(iPage.getTotal());
}
/**
* 删除未命中的标签,带去重功能
*/
private static void deleteRepeatedTags(List<ESTagEntity> list, Set<String> tagIdSet) {
if (ValidationUtil.isEmpty(list) || ValidationUtil.isEmpty(tagIdSet)) {
return;
}
Iterator<ESTagEntity> tagIterator = list.iterator();
while (tagIterator.hasNext()) {
ESTagEntity tag = tagIterator.next();
String tid = tag.getTagSeq().toString();
if (tagIdSet.contains(tid)) {
tagIdSet.remove(tid);
tag.setTagInfo(null);
} else {
tagIterator.remove();
}
}
}
// public Page queryDocPage(Page page, Map<String, String[]> paramMap, boolean filterByCollection, Date createTimeLeft, Date createTimeRight) {
// List<Long> collecion = getMyFavoriteDocIdList();
// Page resPage = queryDocPageByCollection(page, RequestContext.getAppKey(), paramMap, new ArrayList<>(collecion), filterByCollection, createTimeLeft, createTimeRight);
// List<Map<String, Object>> records = resPage.getRecords();
// for (Map<String, Object> record : records) {
// Long sequenceNbr = (Long) record.get("sequenceNbr");
// record.put("collect", collecion.contains(sequenceNbr));
// record.put("referenceNum", getReferenceCount(sequenceNbr));
// record.put("collectionNum", getCollectionCount(sequenceNbr));
// }
// return resPage;
// }
// private Page queryDocPageByCollection(Page page, String appKey, Map<String, String[]> paramMap, List<Long> myFavorites, boolean filterByCollection, Date createTimeLeft, Date createTimeRight) {
// KnowledgeDynamicsGroupModel groupModel = dynamicsGroupService.queryByFunctional(appKey, DynamicsFunctional.DOC_BASEINFO.name());
// Set<Long> instanceIds = intersection(groupModel.getSequenceNbr(), paramMap);
// if (!ValidationUtil.isEmpty(instanceIds)) {
// Set<Long> idCollection = dynamicsValueService.withCollection(instanceIds, filterByCollection, myFavorites);
// if (!ValidationUtil.isEmpty(idCollection)) {
// page = docContentService.queryDocPageByIdsAndParams(page, DocContentService.DOC_STATUS_PUBLISHED, idCollection, createTimeLeft, createTimeRight);
// }
// }
// List<KnowledgeDocContentModel> records = page.getRecords();
// fillDirectoryName(records);
// List<Map> returnList = fillDynamics(records, true);
// page.setRecords(returnList);
// return page;
// }
// private Set<Long> intersection(Long groupSeq, Map<String, String[]> paramMap) {
// Set<Long> set = new HashSet<>();
// List<KnowledgeDynamicsValue> entities;
// if (ValidationUtil.isEmpty(paramMap)) {
// QueryWrapper<KnowledgeDynamicsValue> wrapper = asymbleWrapper(groupSeq, paramMap);
// wrapper.select("INSTANCE_ID");
// entities = dynamicsValueService.list(wrapper);
// if (!ValidationUtil.isEmpty(entities)) {
// Map map = Bean.listToMap(entities, "instanceId", KnowledgeDynamicsValue.class);
// set = map.keySet();
// }
// } else {
// List<Set<Long>> setList = new ArrayList<>();
// for (String key : paramMap.keySet()) {
// Map<String, String[]> newParams = new HashMap<>();
// newParams.put(key, paramMap.get(key));
// QueryWrapper<KnowledgeDynamicsValue> wrapper = asymbleWrapper(groupSeq, newParams);
// wrapper.select("INSTANCE_ID");
// entities = dynamicsValueService.list(wrapper);
// if (!ValidationUtil.isEmpty(entities)) {
// Map map = Bean.listToMap(entities, "instanceId", KnowledgeDynamicsValue.class);
// Set<Long> newSet = map.keySet();
// setList.add(newSet);
// } else {
// setList.add(new HashSet<>());
// }
// }
// set = new HashSet<>(dynamicsValueService.intersection(setList));
// }
// return set;
// }
// private QueryWrapper<KnowledgeDynamicsValue> asymbleWrapper(Long groupSeq, Map<String, String[]> paramMap) {
// QueryWrapper<KnowledgeDynamicsValue> wrapper = new QueryWrapper<>();
// wrapper.eq("GROUP_SEQ", groupSeq);
// if (!ValidationUtil.isEmpty(paramMap)) {
// wrapper.and(innerWrapper -> {
// List<KnowledgeDynamicsValueModel> list = dynamicsValueService.queryByGroupWithoutAgency(groupSeq);
// if (!ValidationUtil.isEmpty(list)) {
// for (int i = 0, count = 0; i < list.size(); i++) {
// KnowledgeDynamicsValueModel valueModel = list.get(i);
// if (paramMap.keySet().contains(valueModel.getFieldName())) {
// dynamicsValueService.asymbleWrapper(innerWrapper, valueModel, paramMap, count);
// count++;
// }
// }
// }
// });
// }
//
// return wrapper;
// }
public Map<String, Object> countDoc(Long id) {
Map<String, Object> res = new HashMap<>();
res.put("commentsNum", docCommentsService.getCommentsTotal(id));
res.put("collectionNum", getCollectionCount(id));
return res;
}
//获取我的文档收藏列表
private List<Long> getMyFavoriteDocIdList() {
List<KnowledgeInteractionRecordModel> recordModelList = interactionRecordService.queryListByUser(RequestContext.getExeUserId(), OperateType.COLLECT.name(), KnowledgeDocContentModel.class.getSimpleName(), RequestContext.getAgencyCode());
List<Long> idList = new ArrayList<>();
for (KnowledgeInteractionRecordModel recordModel : recordModelList) {
idList.add(Long.valueOf(recordModel.getEntityId()));
}
return idList;
}
//获取文档被收藏总数
public int getCollectionCount(Long sequenceNbr) {
return interactionRecordService.countByInstance(OperateType.COLLECT.name(), KnowledgeDocContentModel.class.getSimpleName(), sequenceNbr.toString());
}
//获取文档被引用总数
public int getReferenceCount(Long sequenceNbr) {
return interactionCountService.getOperateCount(InteractionCountService.QUOTE_TYPE_PUBLISH, InteractionCountService.QUOTE_ENTITY_DOCUMENT, sequenceNbr.toString());
}
/**
* 根据关键字联想标签名称和文档名称
*
* @param queryStr 关键字
* @return
*/
public List<String> associate(String queryStr) {
List resList = new ArrayList<>();
List<KnowledgeTag> tagList = tagService.getBaseMapper().queryTagByNameInPublishedDoc(queryStr);
resList.addAll(Bean.listToMap(tagList, "tagName", KnowledgeTag.class).keySet());
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<KnowledgeDocContent>()
.select("DOC_TITLE").eq("DOC_STATUS", DocContentService.DOC_STATUS_PUBLISHED).like("DOC_TITLE", queryStr);
List<KnowledgeDocContent> docContentList = docContentService.list(wrapper);
docContentList.forEach(doc -> {
if (!resList.contains(doc.getDocTitle())) {
resList.add(doc.getDocTitle());
}
});
return resList;
}
/**
* 统计所有文档数与最新文档数
*
* @return
*/
public Map<String, Integer> count(int days) {
Map<String, Integer> res = new HashMap<>();
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.eq("doc_status", DocContentService.DOC_STATUS_PUBLISHED);
res.put("totalAll", docContentService.count(wrapper));
Date rightRange = new Date();
Date leftRange = getDateBeforeDays(rightRange, days - 1);
wrapper.between("rec_date", leftRange, rightRange);
res.put("totalNew", docContentService.count(wrapper));
return res;
}
/**
* 查询最新文档列表
*
* @param top 前top条
* @return
*/
public List queryNewDocs(int top) {
List<KnowledgeDocContentModel> list = docContentService.queryNewDocsWithStatus(top, DocContentService.DOC_STATUS_PUBLISHED);
fillDirectoryName(list);
return fillDynamics(list, false);
}
/**
* 查询我的收藏列表
*
* @return
*/
public List queryMyCollectedDocs() {
List<Long> myFavoriteDocIdList = getMyFavoriteDocIdList();
if (ValidationUtil.isEmpty(myFavoriteDocIdList)) {
return Collections.emptyList();
}
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.in("sequence_nbr", myFavoriteDocIdList).orderByDesc("rec_date");
List<KnowledgeDocContent> list = docContentService.list(wrapper);
List<KnowledgeDocContentModel> docContentModels = Bean.toModels(list, KnowledgeDocContentModel.class);
fillDirectoryName(docContentModels);
return fillDynamics(docContentModels, false);
}
/**
* 填充动态字段
*/
private List<Map> fillDynamics(List<KnowledgeDocContentModel> list, boolean simple) {
List<Map> returnList = new ArrayList<>();
if (!ValidationUtil.isEmpty(list)) {
Set userSet = Bean.listToMap(list, "userId", KnowledgeDocContentModel.class).keySet();
Map<String, String> userMap = new HashMap<>();
if (!simple) {
userMap = RemoteData.getUserMap(userSet);
}
for (KnowledgeDocContentModel contentModel : list) {
if (simple) {
contentModel.setSummary(null);
}
contentModel.setHtmlContent(null);
Map contentMap = Bean.BeantoMap(contentModel);
List<KnowledgeDynamicsValueModel> listByInstance = dynamicsValueService.queryByInstanceId(contentModel.getSequenceNbr());
Map<Object, Object> returnMap = Bean.listToMap(listByInstance, "fieldName", "fieldValue", KnowledgeDynamicsValueModel.class);
if (!simple) {
returnMap.put("referenceNum", getReferenceCount(contentModel.getSequenceNbr()));
returnMap.put("collectionNum", getCollectionCount(contentModel.getSequenceNbr()));
returnMap.put("userName", userMap.get(contentModel.getUserId()));
}
contentMap.putAll(returnMap);
returnList.add(contentMap);
}
}
return returnList;
}
private Date getDateBeforeDays(Date date, int days) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(Calendar.DAY_OF_MONTH, -days);
return calendar.getTime();
}
public void export(long id, String type, HttpServletResponse response) {
KnowledgeDocContent docContent = docContentService.getById(id);
if (ValidationUtil.isEmpty(docContent)) {
throw new DataNotFound("文档不存在");
}
String docTitle = docContent.getDocTitle();
byte[] bytes;
FileType fileType = getInstance("." + type.trim());
switch (fileType) {
case docx:
bytes = new DocxBuilder(docContent.getHtmlContent()).build();
break;
case pdf:
bytes = PdfBuilder.html2Pdf(docContent.getHtmlContent(), docTitle);
break;
default:
throw new BadRequest("不识别的导出类型");
}
FileExporter.exportFile(fileType, docTitle, bytes, response);
}
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List importExcel(MultipartFile file, ExcelImportConfig excelConfig) {
String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName());
if (ValidationUtil.isEmpty(inputerOrg)) {
throw new RequestForbidden("非录入者角色用户无权录入");
}
int finishedNum = 0;
if (!excelConfig.check()) {
throw new BadRequest("模板配置数据有误");
}
Workbook workbook = getBookWithFile(file);
Sheet sheet = workbook.getSheetAt(0);
if (sheet == null) {
throw new BadRequest("文档sheet页为空");
}
int rowNumber = getRowNumber(sheet, excelConfig);
if (rowNumber <= 0) {
throw new BadRequest("数据条目为零");
}
Set<Long> involvedTagIds = excelConfig.getTagColumns().keySet();
// 组装标签信息Map
Map<Long, KnowledgeTagModel> tagMap = new HashMap();
if (!ValidationUtil.isEmpty(involvedTagIds)) {
List<KnowledgeTagModel> tagModelList = tagService.queryByIds(involvedTagIds);
for (KnowledgeTagModel tagModel : tagModelList) {
tagMap.put(tagModel.getSequenceNbr(), tagModel);
}
}
// 组装文档动态字段数据类型Map
Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap = new HashMap<>();
List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name());
for (KnowledgeDynamicsOptionModel optionModel : optionModels) {
fieldTypeMap.put(optionModel.getFieldName(), optionModel);
}
// 组装标签值类型Map
Map<Long, String> tagValueTypeMap = new HashMap<>();
if (!ValidationUtil.isEmpty(involvedTagIds)) {
List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "valueType");
for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
tagValueTypeMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
}
}
// 组装字典中英文Map
Map<String, Map<String, String>> enumCnEnMap = new HashMap<>();
Set<String> enumNameList = new HashSet<>(excelConfig.getEnumMap().values());
for (String enumName : enumNameList) {
try {
List<DictionarieValueModel> dictList = RemoteData.queryDict(enumName);
Map<String, String> cnEnMap = new HashMap<>();
for (DictionarieValueModel dictionarieValueModel : dictList) {
cnEnMap.put(dictionarieValueModel.getDictDataValue(), dictionarieValueModel.getDictDataKey());
}
enumCnEnMap.put(enumName, cnEnMap);
} catch (Exception e) {
throw new RequestForbidden("获取字典数据出错,解析无法进行");
}
}
// 组装标签单位Map
Map<Long, String> tagUnitMap = new HashMap<>();
if (!ValidationUtil.isEmpty(involvedTagIds)) {
List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "unit");
for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
tagUnitMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
}
}
ExcelParser excelParser = new ExcelParser(tagMap, excelConfig, fieldTypeMap, tagValueTypeMap, enumCnEnMap, tagUnitMap, this.sequence, inputerOrg);
// 逐行解析
while (finishedNum < rowNumber) {
for (int i = 0; i < BATCH_IMPORT_ONCE_NUM && finishedNum < rowNumber; i++, finishedNum++) {
Row row = sheet.getRow(excelConfig.getStartRowIndex() + finishedNum);
excelParser.parseRow(row);
}
batchInsertDocDataAll(excelParser.getAndFlushDatas());
QuoteCountFlushTiming.needFlushTag();
}
return excelParser.getImportResults();
}
void batchInsertDocDataAll(ExcelParser.TablesDataList datas) {
docContentService.saveBatch(datas.getDocContentList());
dynamicsValueService.saveBatch(datas.getDynamicsValueList());
tagInstanceService.saveBatch(datas.getTagInstanceList());
tagValueService.saveBatch(datas.getTagValueList());
}
public List<KnowledgeDocContentModel> efficientList(Collection<Long> docSeqList) {
if (ValidationUtil.isEmpty(docSeqList)) {
return Collections.emptyList();
}
List<KnowledgeDocContentModel> contentModelList = docContentService.queryByIds(docSeqList);
fillDirectoryName(contentModelList);
Map<Object, KnowledgeDocContentModel> docContentModelMap = Bean.listToMap(contentModelList, "sequenceNbr", KnowledgeDocContentModel.class);
if (!contentModelList.isEmpty()) {
List<KnowledgeTagInstanceModel> tagInstanceModelList = tagInstanceService.queryListByTargetSeqs(docSeqList);
Map<Object, KnowledgeTagInstanceModel> tagInstanceModelMap = Bean.listToMap(tagInstanceModelList, "sequenceNbr", KnowledgeTagInstanceModel.class);
List<KnowledgeTagValueModel> tagValueModelList = tagValueService.queryTagValuesByDocIds(docSeqList);
List<KnowledgeDynamicsValueModel> dynamicsValueModelList = dynamicsValueService.queryByInstanceIds(docSeqList);
// 标签值组装到标签实例
tagValueModelList.forEach(tagValueModel -> {
KnowledgeTagInstanceModel instanceModel = tagInstanceModelMap.get(tagValueModel.getInstanceSeq());
if (null != instanceModel) {
List<KnowledgeTagValueModel> tagValues = instanceModel.getTagValues();
if (null == tagValues) {
tagValues = new ArrayList<>();
instanceModel.setTagValues(tagValues);
}
tagValues.add(tagValueModel);
}
});
// 标签实例组装到文档实例
tagInstanceModelList.forEach(tagInstanceModel -> {
KnowledgeDocContentModel docContentModel = docContentModelMap.get(tagInstanceModel.getTargetSeq());
if (null != docContentModel) {
boolean isDoc = TagInstanceService.MARKING_TYPE_DOC.equals(tagInstanceModel.getMarkingType());
List<KnowledgeTagInstanceModel> tagList = isDoc ? docContentModel.getDocTags() : docContentModel.getDocContentTags();
if (null == tagList) {
tagList = new ArrayList<>();
if (isDoc) {
docContentModel.setDocTags(tagList);
} else {
docContentModel.setDocContentTags(tagList);
}
}
tagList.add(tagInstanceModel);
}
});
// 动态字段组装到文档实例
dynamicsValueModelList.forEach(dynamicsValueModel -> {
KnowledgeDocContentModel docContentModel = docContentModelMap.get(dynamicsValueModel.getInstanceId());
if (null != docContentModel) {
Map<String, Object> docBaseInfo = docContentModel.getDocBaseInfo();
if (null == docBaseInfo) {
docBaseInfo = new HashMap<>();
docContentModel.setDocBaseInfo(docBaseInfo);
}
docBaseInfo.put(dynamicsValueModel.getFieldName(), dynamicsValueModel.getFieldValue());
}
});
}
return contentModelList;
}
/**
* 根据文件获得workbook对象
*
* @param file 文件
* @return 对象
*/
private Workbook getBookWithFile(MultipartFile file) {
String fileName = file.getOriginalFilename();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
try {
if ("xls".equals(fileType)) {
return new HSSFWorkbook(new ByteArrayInputStream(file.getBytes()));
} else if ("xlsx".equals(fileType)) {
return new XSSFWorkbook(new ByteArrayInputStream(file.getBytes()));
} else {
throw new BadRequest("不支持的文件格式");
}
} catch (IOException e) {
throw new BadRequest("文件内容错误");
}
}
/**
* 获取有效行数行数
*
* @param sheet
* @param excelConfig
*/
private int getRowNumber(Sheet sheet, ExcelImportConfig excelConfig) {
int res = 0;
for (int rowIndex = excelConfig.getStartRowIndex(); rowIndex < sheet.getPhysicalNumberOfRows(); rowIndex++) {
Row row = sheet.getRow(rowIndex);
if (row == null) {
break;
}
Cell cell = row.getCell(excelConfig.getStopColIndex());
if (cell == null || ValidationUtil.isEmpty(convertCellValueToString(cell))) {
break;
}
res++;
}
return res;
}
/**
* 获取字典数据中英文
*
* @return
*/
public Map<String, Map<String, String>> getBaseEnumMap() {
Map<String, Map<String, String>> resMap = new HashMap<>();
List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name());
for (KnowledgeDynamicsOptionModel optionModel : optionModels) {
if ("Enum".equals(optionModel.getDataType())) {
String fieldName = optionModel.getFieldName();
String frontEndConfig = optionModel.getFrontEndConfig();
if (ValidationUtil.isEmpty(frontEndConfig)) {
continue;
}
try {
String enumName = (String) JSON.parseObject(frontEndConfig).get("typeData");
List<DictionarieValueModel> dictList = RemoteData.queryDict(enumName);
Map<String, String> enCnMap = new HashMap<>();
for (DictionarieValueModel dictionarieValueModel : dictList) {
enCnMap.put(dictionarieValueModel.getDictDataKey(), dictionarieValueModel.getDictDataValue());
}
resMap.put(fieldName, enCnMap);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return resMap;
}
/**
* 刷新历史文档数据以支持高级检索
*
* @return
*/
public boolean init() {
int count = docContentService.count();
int finishNmu = 0;
int current = 0;
while (count > finishNmu) {
com.baomidou.mybatisplus.extension.plugins.pagination.Page page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page(current++, 30);
IPage resPage = docContentService.page(page);
List<KnowledgeDocContent> records = resPage.getRecords();
records.forEach(doc -> {
if (ValidationUtil.isEmpty(doc.getTextContent()) && ValidationUtil.isEmpty(doc.getSortStr())) {
doc.setTextContent(htmlContent2Text(doc.getHtmlContent()));
doc.setSortStr(DocSortUtil.getSortStr(tagInstanceService.queryByTargetAndType(null, doc.getSequenceNbr(), TagInstanceService.MARKING_TYPE_DOC)));
}
});
docContentService.updateBatchById(records);
finishNmu += records.size();
}
return true;
}
/**
* 为文档添加分类名称
*
* @param docList 文档列表
* @param <T> 集合类型
*/
public <T extends Collection> void fillDirectoryName(T docList) {
if (ValidationUtil.isEmpty(docList)) {
return;
}
List<KnowledgeDocCategoryModel> categoryModelList = docCategoryService.queryForKnowledgeDocCategoryList(null);
if (ValidationUtil.isEmpty(categoryModelList)) {
return;
}
Map<Object, KnowledgeDocCategoryModel> categoryModelMap = Bean.listToMap(categoryModelList, "sequenceNbr", KnowledgeDocCategoryModel.class);
docList.forEach(doc -> {
if (doc instanceof KnowledgeDocContentModel) {
KnowledgeDocContentModel doc1 = (KnowledgeDocContentModel) doc;
KnowledgeDocCategoryModel categoryModel = categoryModelMap.get(doc1.getDirectoryId());
doc1.setDirectoryName(ValidationUtil.isEmpty(categoryModel) ? null : categoryModel.getCategoryName());
} else if (doc instanceof ESDocEntity) {
ESDocEntity doc1 = (ESDocEntity) doc;
KnowledgeDocCategoryModel categoryModel = categoryModelMap.get(doc1.getDirectoryId());
doc1.setDirectoryName(ValidationUtil.isEmpty(categoryModel) ? null : categoryModel.getCategoryName());
}
});
}
public Page queryDocPage(Page page, String docTitle, String code) {
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.eq("DOC_STATUS", DocContentService.DOC_STATUS_PUBLISHED);
if (!ValidationUtil.isEmpty(docTitle)) {
wrapper.like("DOC_TITLE", docTitle);
}
if (!ValidationUtil.isEmpty(code)) {
wrapper.inSql("SEQUENCE_NBR", "SELECT INSTANCE_ID FROM KNOWLEDGE_DYNAMICS_VALUE kdv WHERE kdv.FIELD_NAME = 'code' AND kdv.FIELD_VALUE LIKE '%" + code.replace("'", "''") + "%'");
}
page = (Page) docContentService.page(page, wrapper);
if (!page.getRecords().isEmpty()) {
ArrayList list = Bean.toModels(page.getRecords(), KnowledgeDocContentModel.class);
fillDirectoryName(list);
page.setRecords(fillDynamics(list, false));
}
return page;
}
public List selectByDirsRand(List<Long> directoryList, Integer total) {
Set<Long> directoryIdSet = new HashSet<>();
List<KnowledgeDocCategoryModel> categoryList = Bean.toModels(docCategoryService.list(), KnowledgeDocCategoryModel.class);
directoryList.forEach(
directoryId -> {
directoryIdSet.addAll(BaseUtil.getModelIds(TreeUtil.getAllChildren(TreeBuilder.bulid(categoryList, directoryId))));
if (!directoryId.equals(DocCategoryService.ROOT)) {
directoryIdSet.add(directoryId);
}
}
);
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.eq("DOC_STATUS", DocContentService.DOC_STATUS_PUBLISHED)
.in("DIRECTORY_ID", directoryIdSet);
if (total != null) {
wrapper.last("ORDER BY RAND() LIMIT "+ total);
}
List<KnowledgeDocContent> contentList = docContentService.list(wrapper);
List<KnowledgeDocContentModel> list = Bean.toModels(contentList, KnowledgeDocContentModel.class);
fillDirectoryName(list);
return fillDynamics(list, false);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsGroupModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.DynamicsGroupMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.List;
/**
* <p>
* 知识库系统动态选项配置的分组,用于区分不同功能的字段列表 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DynamicsGroupService extends BaseService<KnowledgeDynamicsGroupModel, KnowledgeDynamicsGroup, DynamicsGroupMapper> {
// @Autowired
// private DynamicsOptionService dynamicsOptionService;
public KnowledgeDynamicsGroupModel queryByFunctional(String appKey,String functional) {
return this.queryModelByParamsWithCache(appKey,functional);
}
public List<KnowledgeDynamicsGroupModel> queryGroupList(String appKey) {
return this.queryForList("", false, appKey);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.enumeration.DynamicsFunctional;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsGroupModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsOptionModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.DynamicsOptionMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsOption;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import java.util.List;
/**
* <p>
* 知识库系统动态选项配置,多用于动态字段配置 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DynamicsOptionService extends BaseService<KnowledgeDynamicsOptionModel, KnowledgeDynamicsOption, DynamicsOptionMapper> {
@Autowired
private DynamicsGroupService dynamicsGroupService;
@Autowired
private DynamicsValueService dynamicsValueService;
public KnowledgeDynamicsOptionModel createOption(KnowledgeDynamicsOptionModel model) {
model.setAgencyCode(RequestContext.getAgencyCode());
model.setFunctional(DynamicsFunctional.DOC_BASEINFO.name());
if (ValidationUtil.isEmpty(model.getQueryStrategy())) {
model.setQueryStrategy(Operator.eq.name());
}
model = fillGroupInfo(model);
return this.createWithModel(model);
}
public KnowledgeDynamicsOptionModel udpateOption(KnowledgeDynamicsOptionModel model) {
KnowledgeDynamicsOptionModel oldModel = this.queryBySeq(model.getSequenceNbr());
if (ValidationUtil.isEmpty(oldModel)) {
throw new DataNotFound("找不到制定的动态字段.");
}
oldModel = Bean.copyExistPropertis(model, oldModel);
oldModel = fillGroupInfo(oldModel);
return this.updateWithModel(oldModel);
}
public boolean deleteOption(Long sequenceNbr) {
KnowledgeDynamicsOptionModel oldModel = this.queryBySeq(sequenceNbr);
if (ValidationUtil.isEmpty(oldModel)) {
throw new DataNotFound("找不到制定的动态字段.");
}
List<KnowledgeDynamicsValueModel> valueModels = dynamicsValueService.queryByOptionSeq(oldModel.getSequenceNbr());
if (!ValidationUtil.isEmpty(valueModels)) {
throw new BadRequest("字段已经被引用.");
}
this.deleteBySeq(oldModel.getSequenceNbr());
return true;
}
/**
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsOptionModel
* @author 杨博超
* @description 填充字段分组信息.
* @Param [model]
**/
private KnowledgeDynamicsOptionModel fillGroupInfo(KnowledgeDynamicsOptionModel model) {
KnowledgeDynamicsGroupModel groupModel = dynamicsGroupService.queryBySeq(model.getGroupSeq());
if (ValidationUtil.isEmpty(groupModel)) {
throw new BadRequest("字段分组不存在.");
}
if (!groupModel.getAppKey().equals(RequestContext.getAppKey())) {
throw new BadRequest("分组选择有误.");
}
model.setFunctional(groupModel.getFunctional());
model.setAppKey(groupModel.getAppKey());
return model;
}
/**
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsOptionModel>
* @author 杨博超
* @description 根据分组编号获取
* @Param [groupCode]
**/
public List<KnowledgeDynamicsOptionModel> queryByFunctional( String appKey, String functional) {
return this.queryForList("", false, appKey, functional);
}
public List<KnowledgeDynamicsOptionModel> queryByGroupSeq(Long groupSeq) {
return this.queryForList("", false, groupSeq);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yeejoin.amos.knowledgebase.face.enumeration.DynamicsFunctional;
import com.yeejoin.amos.knowledgebase.face.enumeration.KnowledgeRoleName;
import com.yeejoin.amos.knowledgebase.face.enumeration.OptionDataType;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsOptionModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.DynamicsValueMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsValue;
import com.yeejoin.amos.knowledgebase.face.util.DataFillter;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.util.*;
/**
* <p>
* 知识库系统动态选项配置的实例值 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class DynamicsValueService extends BaseService<KnowledgeDynamicsValueModel, KnowledgeDynamicsValue, DynamicsValueMapper> implements DataFillter {
@Autowired
private DynamicsOptionService dynamicsOptionService;
/**
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsValueModel>
* @author 杨博超
* @description 创建动态字段的值
* @Param [valueOfMap, instanceId]
**/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<KnowledgeDynamicsValueModel> saveValueList(Map<String, Object> valueMap, Long instanceId, DynamicsFunctional functional, String appKey) {
List<KnowledgeDynamicsValueModel> returnList = new ArrayList<>();
//删除已经存在的
deleteByInstanceId(instanceId);
if (ValidationUtil.isEmpty(valueMap)) {
return returnList;
}
List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService.queryByFunctional(appKey, functional.name());
for (KnowledgeDynamicsOptionModel optionModel : optionModels) {
Object value = valueMap.get(optionModel.getFieldName());
if (ValidationUtil.isEmpty(value)) {
continue;
}
KnowledgeDynamicsValueModel valueModel = new KnowledgeDynamicsValueModel();
valueModel.setFieldValue(String.valueOf(value));
valueModel.setFieldName(optionModel.getFieldName());
valueModel.setDataType(optionModel.getDataType());
valueModel.setAgencyCode(RequestContext.getAgencyCode());
valueModel.setFieldLabel(optionModel.getFieldLabel());
valueModel.setGroupSeq(optionModel.getGroupSeq());
valueModel.setQueryStrategy(optionModel.getQueryStrategy());
valueModel.setInstanceId(instanceId);
valueModel.setOptionSeq(optionModel.getSequenceNbr());
this.createWithModel(valueModel);
returnList.add(valueModel);
}
return returnList;
}
public Set<Long> intersection(String agencyCode, Long groupSeq, Map<String, String[]> paramMap) {
Set<Long> set = new HashSet<>();
List<KnowledgeDynamicsValue> entities;
if (ValidationUtil.isEmpty(paramMap)) {
QueryWrapper<KnowledgeDynamicsValue> wrapper = this.asymbleWrapper(agencyCode, groupSeq, paramMap);
wrapper.select("INSTANCE_ID");
entities = this.list(wrapper);
if (!ValidationUtil.isEmpty(entities)) {
Map map = Bean.listToMap(entities, "instanceId", KnowledgeDynamicsValue.class);
set = map.keySet();
}
} else {
List<Set<Long>> setList = new ArrayList<>();
for (String key : paramMap.keySet()) {
Map<String, String[]> newParams = new HashMap<>();
newParams.put(key, paramMap.get(key));
QueryWrapper<KnowledgeDynamicsValue> wrapper = this.asymbleWrapper(agencyCode, groupSeq, newParams);
wrapper.select("INSTANCE_ID");
entities = this.list(wrapper);
if (!ValidationUtil.isEmpty(entities)) {
Map map = Bean.listToMap(entities, "instanceId", KnowledgeDynamicsValue.class);
Set<Long> newSet = map.keySet();
setList.add(newSet);
}
}
set = new HashSet<>(intersection(setList));
}
return set;
}
protected Collection intersection(List<Set<Long>> setList) {
Collection list = new ArrayList();
if (!ValidationUtil.isEmpty(setList)) {
list = new ArrayList(setList.get(0));
for (int i = 0; i < setList.size(); i++) {
if (i + 1 >= setList.size()) {
break;
}
list = CollectionUtils.intersection(list, setList.get(i + 1));
}
}
return list;
}
@Override
public Map<String, Object> assembleParams(List<String> roleNameList, String orgCode) {
Map<String, Object> dataPrivilegemap = new HashMap<>();
if (!ValidationUtil.isEmpty(roleNameList)) {
Set<String> auditStatusSet = new HashSet<>();
Set<String> docStatusSet = new HashSet<>();
for (String roleName : roleNameList) {
KnowledgeRoleName knowledgeRoleName = KnowledgeRoleName.getInstance(roleName);
if (ValidationUtil.isEmpty(knowledgeRoleName)) {
continue;
}
switch (knowledgeRoleName) {
case AUDITOR:
auditStatusSet.add(DocAuditService.DOC_AUDIT_STATUS_PASSED);
auditStatusSet.add(DocAuditService.DOC_AUDIT_STATUS_SUBMITTED);
dataPrivilegemap.put(DataFillter.orgCode, orgCode);
dataPrivilegemap.put(auditStatus, auditStatusSet.toArray(new String[auditStatusSet.size()]));
break;
case INPUTER:
dataPrivilegemap.put(DataFillter.userId, RequestContext.getExeUserId());
break;
case TAG_MANAGER:
dataPrivilegemap.put(DataFillter.noData, true);
break;
case VIEWER:
auditStatusSet.add(DocAuditService.DOC_AUDIT_STATUS_PASSED);
docStatusSet.add(DocContentService.DOC_STATUS_PUBLISHED);
dataPrivilegemap.put(docStatus, docStatusSet.toArray(new String[docStatusSet.size()]));
dataPrivilegemap.put(auditStatus, auditStatusSet.toArray(new String[auditStatusSet.size()]));
break;
default:
throw new BadRequest("错误的用户角色.");
}
break;// TODO 多角色处理
}
}
return dataPrivilegemap;
}
/*protected Set<Long> withCollection(Set<Long> instanceIds, boolean filterByCollection, List<Long> myFavorites) {
//与我的收藏取交集
if (filterByCollection) {
if (ValidationUtil.isEmpty(myFavorites)) {
instanceIds.clear();
} else {
Iterator<Long> iterator = instanceIds.iterator();
while (iterator.hasNext()) {
if (!myFavorites.contains(iterator.next())) {
iterator.remove();
}
}
}
}
return instanceIds;
}
*/
/**
* @return com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsValue>
* @author 杨博超
* @description 组装查询条件
* @Param [agencyCode, groupCode, paramMap]
**/
private QueryWrapper<KnowledgeDynamicsValue> asymbleWrapper(String agencyCode, Long groupSeq, Map<String, String[]> paramMap) {
QueryWrapper<KnowledgeDynamicsValue> wrapper = new QueryWrapper<>();
wrapper.eq("AGENCY_CODE", agencyCode);
wrapper.eq("GROUP_SEQ", groupSeq);
if (!ValidationUtil.isEmpty(paramMap)) {
wrapper.and(innerWrapper -> {
List<KnowledgeDynamicsValueModel> list = queryByGroup(agencyCode, groupSeq);
if (!ValidationUtil.isEmpty(list)) {
for (int i = 0, count = 0; i < list.size(); i++) {
KnowledgeDynamicsValueModel valueModel = list.get(i);
if (paramMap.keySet().contains(valueModel.getFieldName())) {
asymbleWrapper(innerWrapper, valueModel, paramMap, count);
count++;
}
}
}
});
}
return wrapper;
}
/**
* @return com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsValue>
* @author 杨博超
* @description 组装查询条件
* @Param [wrapper, valueModel, paramMap, i]
**/
protected QueryWrapper<KnowledgeDynamicsValue> asymbleWrapper(QueryWrapper<KnowledgeDynamicsValue> wrapper, KnowledgeDynamicsValueModel valueModel, Map<String, String[]> paramMap, int count) {
OptionDataType dataType = OptionDataType.valueOf(valueModel.getDataType());
String fieldName = valueModel.getFieldName();
String columName = "FIELD_VALUE";
switch (dataType) {
case Enum:
case String:
break;
case Double:
columName = "CONVERT(" + columName + ",DECIMAL)";
case Integer:
columName = "CONVERT(" + columName + ",SIGNED)";
break;
case datetime:
columName = "STR_TO_DATE(" + columName + ", '%Y-%m-%d %H:%i:%s')";
break;
case Date:
columName = "STR_TO_DATE(" + columName + ", '%Y-%m-%d')";
break;
default:
throw new RuntimeException("错误的数据类型");
}
wrapper = this.asymbleWrapper(wrapper, fieldName, columName, valueModel.getQueryStrategy(), paramMap, count);
return wrapper;
}
private QueryWrapper<KnowledgeDynamicsValue> asymbleWrapper(QueryWrapper<KnowledgeDynamicsValue> wrapper, String fieldName, String columName, String queryStrategy, Map<String, String[]> paramMap, int count) {
String fieldValue = paramMap.get(fieldName)[0];
Operator operator = Operator.valueOf(queryStrategy);
if (count == 0) {
switch (operator) {
case eq:
wrapper.eq(columName, fieldValue)
.eq("FIELD_NAME", fieldName);
break;
case like:
wrapper.like(columName, fieldValue)
.eq("FIELD_NAME", fieldName);
break;
case between:
String fieldValueArr[] = paramMap.get(fieldName);
if (!ValidationUtil.isEmpty(fieldValueArr[0]))
wrapper.ge(columName, fieldValueArr[0]).eq("FIELD_NAME", fieldName);
if (!ValidationUtil.isEmpty(fieldValueArr[1]))
wrapper.le(columName, fieldValueArr[1]).eq("FIELD_NAME", fieldName);
//wrapper.between(columName, fieldValueArr[0], fieldValueArr[1])
// .eq("FIELD_NAME", fieldName);
default:
throw new RuntimeException("动态字段查询方式有误.");
}
} else {
switch (operator) {
case eq:
wrapper.or((i) -> i.eq(columName, fieldValue)
.eq("FIELD_NAME", fieldName));
break;
case like:
wrapper.or((i) -> i.like(columName, fieldValue)
.eq("FIELD_NAME", fieldName));
break;
case between:
String fieldValueArr[] = paramMap.get(fieldName);
wrapper.or((i) -> i.between(columName, fieldValueArr[0], fieldValueArr[1])
.eq("FIELD_NAME", fieldName));
default:
throw new RuntimeException("动态字段查询方式有误.");
}
}
return wrapper;
}
/**
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsValueModel>
* @author 杨博超
* @description 根据分组编号查询动态字段值列表
* @Param [agencyCode, groupCode]
**/
public List<KnowledgeDynamicsValueModel> queryByGroup(String agencyCode, Long groupSeq) {
return this.queryForListWithCache("", false, agencyCode, groupSeq);
}
/* public List<KnowledgeDynamicsValueModel> queryByGroupWithoutAgency(Long groupSeq) {
return this.queryForListWithCache("", false, groupSeq);
}*/
/**
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsValueModel>
* @author 杨博超
* @description 根据实例id查询动态字值段列表
* @Param [instanceId]
**/
public List<KnowledgeDynamicsValueModel> queryByInstanceId(Long instanceId) {
// return this.queryForListWithCache("", false, instanceId);
return this.queryForList("", false, instanceId);
}
public List<KnowledgeDynamicsValueModel> queryByOptionSeq(Long optionSeq) {
return this.queryForTopList(1, "", false, optionSeq);
}
/**
* 根据实例id删除动态值列表
*
* @param instanceId 实例id
* @return
*/
@Transactional
public List<Long> deleteByInstanceId(Long instanceId) {
List<Long> deleteList = new ArrayList<>();
List<KnowledgeDynamicsValueModel> existValues = queryByInstanceId(instanceId);
if (!ValidationUtil.isEmpty(existValues)) {
for (KnowledgeDynamicsValueModel existValue : existValues) {
this.deleteBySeq(existValue.getSequenceNbr());
deleteList.add(existValue.getSequenceNbr());
}
}
return deleteList;
}
public List<KnowledgeDynamicsValueModel> queryFieldValueByIds(@Condition(Operator.in) Collection<String> instanceId, String fieldName) {
return this.queryForList("", false, instanceId, fieldName);
}
public List<KnowledgeDynamicsValueModel> queryByInstanceIds(@Condition(Operator.in) Collection<Long> instanceId) {
return this.queryForList("", false, instanceId);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocContentModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsValueModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.ESDocRepository;
import com.yeejoin.amos.knowledgebase.face.orm.entity.ESDocEntity;
import com.yeejoin.amos.knowledgebase.face.orm.entity.ESTagEntity;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.util.RemoteData;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.RequestForbidden;
import java.util.*;
/**
* ES检索服务
*
* @author tiantao
*/
@Service
public class ESDocService {
@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Autowired
private ESDocRepository esDocRepository;
@Autowired
private DocContentService docContentService;
@Autowired
private DocLibraryService docLibraryService;
@Autowired
private DynamicsValueService dynamicsValueService;
public static final String COMMON_FORMAT = "yyyy年MM月dd日HH时mm分";
/**
* 批量保存
*
* @param list 文档列表
*/
public void saveAll(List<ESDocEntity> list) {
esDocRepository.saveAll(list);
}
/**
* 查询所有,根据发布时间倒叙排列
*
* @param current 页码
* @param size 页面大小
* @return Page对象
*/
@SuppressWarnings("rawtypes")
public Page<ESDocEntity> findAll(int current, int size) {
// 创建查询构造器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder()
// 分页
.withPageable(PageRequest.of(current, size))
// 排序
.withSort(SortBuilders.fieldSort("sortStr.keyword").order(SortOrder.DESC));
List<ESDocEntity> list = new LinkedList<>();
try
{
SearchHits<ESDocEntity> searchHits =elasticsearchTemplate.search(queryBuilder.build(), ESDocEntity.class);
for (SearchHit searchHit : searchHits.getSearchHits())
{
ESDocEntity docEntity = (ESDocEntity)searchHit.getContent();
list.add(docEntity);
}
return new AggregatedPageImpl<>(list, PageRequest.of(current, size), searchHits.getTotalHits());
}
catch (Exception e)
{
return new AggregatedPageImpl<>(list, PageRequest.of(current, size), 0);
}
}
/**
* 根据id查询ES存储对象
*
* @param sequenceNbr id
* @return ES实例
*/
public ESDocEntity queryById(Long sequenceNbr) {
return esDocRepository.findById(sequenceNbr).orElse(null);
}
/**
* 根据关键字查询文档,关键字不为空时按相关性从大到小排序
*
* @param queryStr 关键字
* @param current 当前页码
* @param size 页面大小
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public Page<ESDocEntity> queryByKeys(String queryStr, int current, int size) {
List<String> keys = queryStr2List(queryStr);
if (ValidationUtil.isEmpty(keys)) {
return findAll(current, size);
}
// 条件构造,多条件循环匹配
BoolQueryBuilder boolMust = QueryBuilders.boolQuery();
for (String key : keys) {
boolMust.must(
QueryBuilders.boolQuery().minimumShouldMatch(1)
.should(QueryBuilders.matchQuery("docTitle", key))
.should(QueryBuilders.matchQuery("docInfo", key))
.should(QueryBuilders.matchQuery("author", key))
.should(QueryBuilders.matchQuery("textContent", key))
.should(QueryBuilders.matchQuery("docTags.tagInfo", key))
.should(QueryBuilders.matchQuery("contentTags.tagInfo", key))
);
}
// 创建查询构造器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder()
// 高亮字段
.withHighlightFields(
new HighlightBuilder.Field("docTitle").preTags("").postTags("").numOfFragments(0),
new HighlightBuilder.Field("textContent").preTags("").postTags("").numOfFragments(1).fragmentSize(200).noMatchSize(100).order("score"),
new HighlightBuilder.Field("docTags.tagInfo").preTags("").postTags("").numOfFragments(0),
new HighlightBuilder.Field("contentTags.tagInfo").preTags("").postTags("").numOfFragments(0)
)
// 分页
.withPageable(PageRequest.of(current, size))
// 排序
.withSort(SortBuilders.fieldSort("sortStr.keyword").order(SortOrder.ASC))
//过滤条件
.withQuery(boolMust);
// 对高亮词条进行操作
List<ESDocEntity> list = new ArrayList<>();
try
{
SearchHits<ESDocEntity> searchHits = elasticsearchTemplate.search(queryBuilder.build(), ESDocEntity.class);
for (SearchHit searchHit : searchHits.getSearchHits()) {
ESDocEntity docEntity = (ESDocEntity)searchHit.getContent();
searchHit.getHighlightFields();
// 文档标题
List<String> docTitle = searchHit.getHighlightField("docTitle");
if (!ValidationUtil.isEmpty(docTitle)) {
StringBuilder sb = new StringBuilder();
for (String fragment : docTitle) {
sb.append(fragment);
}
docEntity.setDocTitle(sb.toString());
}
// 文档内容
List<String> textContent = searchHit.getHighlightField("textContent");
if (!ValidationUtil.isEmpty(textContent)) {
StringBuilder sb = new StringBuilder();
for (String fragment : textContent) {
sb.append(fragment);
}
docEntity.setSummary(sb.toString());
}
Set<String> tagInfoSet = new HashSet<>();
// 文档标签
List<String> docTagsInfo = searchHit.getHighlightField("docTags.tagInfo");
if (!ValidationUtil.isEmpty(docTagsInfo)) {
for (String fragment : docTagsInfo) {
tagInfoSet.add(fragment);
}
}
List<String> contentTagsInfo = searchHit.getHighlightField("contentTags.tagInfo");
if (!ValidationUtil.isEmpty(contentTagsInfo)) {
for (String fragment : contentTagsInfo) {
tagInfoSet.add(fragment);
}
}
// 删除不匹配的和重复的标签
deleteRepeatedTags(docEntity.getDocTags(), tagInfoSet);
deleteRepeatedTags(docEntity.getContentTags(), tagInfoSet);
list.add(docEntity);
}
return new AggregatedPageImpl<>(list, PageRequest.of(current, size), searchHits.getTotalHits());
}
catch (Exception e)
{
return new AggregatedPageImpl<>(list, PageRequest.of(current, size), 0);
}
}
/**
* 将搜索词转换为词组
*
* @param queryStr 关键词
* @return 词组
*/
private List<String> queryStr2List(String queryStr) {
List<String> resList = new ArrayList<>();
if (!ValidationUtil.isEmpty(queryStr)) {
String[] keys = queryStr.trim().split("\\s");
for (String key : keys) {
if (!ValidationUtil.isEmpty(key)) {
resList.add(key);
}
}
}
return resList;
}
/**
* 删除未命中的标签&去重
*
* @param list 标签列表
* @param tagInfoSet 命中的tagInfo
*/
private static void deleteRepeatedTags(List<ESTagEntity> list, Set<String> tagInfoSet) {
Iterator<ESTagEntity> tagIterator = list.iterator();
while (tagIterator.hasNext()) {
ESTagEntity tag = tagIterator.next();
if (tagInfoSet.contains(tag.getTagInfo())) {
tagInfoSet.remove(tag.getTagInfo());
tag.setTagInfo(null);
} else {
tagIterator.remove();
}
}
}
/**
* 为搜索结果添加人名翻译/汇总信息
*
* @param key 查询关键字
* @param current 页码
* @param size 每页数量
* @return Page对象
*/
public Page queryAndDetail(String key, int current, int size) {
List<Map<String, Object>> resList = new ArrayList<>();
Page<ESDocEntity> entityPage = queryByKeys(key, current, size);
List<ESDocEntity> docEntityList = entityPage.getContent();
docLibraryService.fillDirectoryName(docEntityList);
Set<String> userSet = new HashSet<>();
for (ESDocEntity esDocEntity : docEntityList) {
KnowledgeDocContentModel contentModel = JSON.parseObject(esDocEntity.getDocJson(), KnowledgeDocContentModel.class);
List<KnowledgeDynamicsValueModel> listByInstance = dynamicsValueService.queryByInstanceId(contentModel.getSequenceNbr());
Map<String, Object> fieldMap = Bean.listToMap(listByInstance, "fieldName", "fieldValue", KnowledgeDynamicsValueModel.class);
Map<String, Object> map = Bean.BeantoMap(esDocEntity);
// 收藏数/引用数
map.put("referenceNum", docLibraryService.getReferenceCount(contentModel.getSequenceNbr()));
map.put("collectionNum", docLibraryService.getCollectionCount(contentModel.getSequenceNbr()));
map.put("userId", contentModel.getUserId());
userSet.add(contentModel.getUserId());
map.putAll(fieldMap);
resList.add(map);
}
Map<String, String> userMap = RemoteData.getUserMap(userSet);
for (Map<String, Object> map : resList) {
map.put("userName", userMap.get(map.get("userId")));
map.remove("htmlContent");
map.remove("docJson");
}
return new AggregatedPageImpl<>(resList, PageRequest.of(current, size), entityPage.getTotalElements());
}
/**
* 保存文档至ES库
*/
public boolean savePublishedDoc(List<KnowledgeDocContentModel> docs) {
if (!ValidationUtil.isEmpty(docs)) {
saveDocToESWithDetailModels(docs);
}
return true;
}
/**
* 批量保存文档
*
* @param docs 填充字段完毕的文档实例列表
*/
private void saveDocToESWithDetailModels(List<KnowledgeDocContentModel> docs) {
if (!ValidationUtil.isEmpty(docs)) {
// 组装字典中英文Map
Map<String, Map<String, String>> enumCnEnMap = docLibraryService.getBaseEnumMap();
List<ESDocEntity> esDocs = new ArrayList<>();
for (KnowledgeDocContentModel docDetail : docs) {
if (ValidationUtil.equals(docDetail.getDocStatus(), DocContentService.DOC_STATUS_PUBLISHED)) {
List<ESTagEntity> docTags = buildESTagsByInstanceList(docDetail.getDocTags());
List<ESTagEntity> contentTags = buildESTagsByInstanceList(docDetail.getDocContentTags());
ESDocEntity esDocEntity = new ESDocEntity()
.setSequenceNbr(docDetail.getSequenceNbr())
.setDocTitle(docDetail.getDocTitle())
.setDirectoryId(docDetail.getDirectoryId())
.setDirectoryName(docDetail.getDirectoryName())
.setLastUpdateTime(docDetail.getLastUpdateTime())
.setSummary(docDetail.getSummary())
.setHtmlContent(docDetail.getHtmlContent())
.setDocTags(docTags)
.setContentTags(contentTags)
.setDocJson(JSON.toJSONString(docDetail))
.setAuthor(docDetail.getUserName())
.setTextContent(docDetail.getTextContent())
.setSortStr(docDetail.getSortStr())
.setDocInfo(baseInfo2Str(docDetail.getDocBaseInfo(), enumCnEnMap));
esDocs.add(esDocEntity);
}
}
this.saveAll(esDocs);
}
}
/**
* 将文档基本信息转为关键字符串
*
* @param baseInfo 基本信息
* @param enumCnEnMap 枚举字典数据
* @return
*/
private String baseInfo2Str(Map<String, Object> baseInfo, Map<String, Map<String, String>> enumCnEnMap) {
StringBuilder infoStr = new StringBuilder();
if (!ValidationUtil.isEmpty(baseInfo)) {
for (String field : baseInfo.keySet()) {
if (enumCnEnMap.containsKey(field)) {
String enumCn = enumCnEnMap.get(field).get(baseInfo.get(field));
if (!ValidationUtil.isEmpty(enumCn)) {
infoStr.append(enumCn).append(" ");
}
} else {
Object value = baseInfo.get(field);
if (!ValidationUtil.isEmpty(value)) {
infoStr.append(value.toString()).append(" ");
}
}
}
}
return infoStr.toString().trim();
}
/**
* 根据标签实例列表创建ES标签列表
*/
private List<ESTagEntity> buildESTagsByInstanceList(List<KnowledgeTagInstanceModel> instanceList) {
List<ESTagEntity> tags = new ArrayList<>();
if (!ValidationUtil.isEmpty(instanceList)) {
for (KnowledgeTagInstanceModel instanceModel : instanceList) {
ESTagEntity tag = new ESTagEntity()
.setSequenceNbr(instanceModel.getSequenceNbr())
.setTagSeq(instanceModel.getTagSeq())
.setTagName(instanceModel.getTagName())
.setTagInfo(getTagInfoStr(instanceModel))
.setTagJson(JSON.toJSONString(instanceModel));
tags.add(tag);
}
}
return tags;
}
/**
* 获取标签信息:标签名&值
*
* @param instanceModel 标签实例
* @return 信息文本
*/
private String getTagInfoStr(KnowledgeTagInstanceModel instanceModel) {
StringBuilder infoStr = new StringBuilder();
infoStr.append(instanceModel.getTagName()).append(" ");
if (TagService.TAG_TYPE_TEXT.equals(instanceModel.getTagType())
|| ValidationUtil.isEmpty(instanceModel.getTagValues())) {
return infoStr.toString().trim();
}
for (KnowledgeTagValueModel valueModel : instanceModel.getTagValues()) {
String fieldName = valueModel.getFieldName();
String tagValue = valueModel.getTagValue();
switch (fieldName) {
case TagValueService.VALUE_TAG_FIELD_DATE_H:
infoStr.append(tagValue).append(" ");
try {
Date date = DateUtil.formatStringToDate(tagValue, null);
infoStr.append(DateUtil.formatDate(date, DateUtil.YMD)).append(" ");
infoStr.append(DateUtil.formatDate(date, DateUtil.YMDHM)).append(" ");
infoStr.append(DateUtil.formatDate(date, DateUtil.ymd)).append(" ");
infoStr.append(DateUtil.formatDate(date, DateUtil.Y_M_D)).append(" ");
infoStr.append(DateUtil.formatDate(date, COMMON_FORMAT)).append(" ");
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
infoStr.append(tagValue).append(" ");
}
}
return infoStr.toString().trim();
}
/**
* 从ES库批量删除文档
*
* @param docs 文档列表
* @return 删除成功
*/
public boolean deleteDocById(List<KnowledgeDocContentModel> docs) {
if (!ValidationUtil.isEmpty(docs)) {
try {
for (KnowledgeDocContentModel doc : docs) {
Long sequenceNbr = doc.getSequenceNbr();
if (esDocRepository.existsById(sequenceNbr)) {
esDocRepository.deleteById(sequenceNbr);
}
}
} catch (Exception e) {
throw new RequestForbidden("删除ES库文档出错");
}
}
return true;
}
/**
* 重建索引
*/
public boolean init() {
esDocRepository.deleteAll();
//保存所有已发布文档
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.eq("doc_status", DocContentService.DOC_STATUS_PUBLISHED);
int count = docContentService.count(wrapper);
int finishNmu = 0;
int current = 0;
while (count > finishNmu) {
com.baomidou.mybatisplus.extension.plugins.pagination.Page page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page(current++, 30);
IPage resPage = docContentService.page(page, wrapper);
List<KnowledgeDocContent> records = resPage.getRecords();
Set ids = Bean.listToMap(records, "sequenceNbr", KnowledgeDocContent.class).keySet();
List<KnowledgeDocContentModel> list = docLibraryService.efficientList(ids);
saveDocToESWithDetailModels(list);
finishNmu += records.size();
}
return true;
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeInteractionCountModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.InteractionCountMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeInteractionCount;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* <p>
* 知识库内容交互计数表 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class InteractionCountService extends BaseService<KnowledgeInteractionCountModel, KnowledgeInteractionCount, InteractionCountMapper> {
/*@Autowired
private TagInstanceService tagInstanceService;*/
@Autowired
private Sequence sequence;
/**
* 统计方式-标签全部引用
*/
public static final String QUOTE_TYPE_ALL = "ALL";
/**
* 统计方式-标签发布引用
*/
public static final String QUOTE_TYPE_PUBLISH = "PUBLISH";
/**
* 统计目标类型-标签
*/
public static final String QUOTE_ENTITY_TAG = "TAG";
/**
* 统计目标类型-文档
*/
public static final String QUOTE_ENTITY_DOCUMENT = "DOCUMENT";
/**
* 获取统计数
*
* @param operateType 统计类型
* @param entityType 关联对象类型
* @param entityId 关联对象id
* @return 数量
*/
public int getOperateCount(String operateType, String entityType, String entityId) {
KnowledgeInteractionCountModel model = queryByEntity(operateType, entityType, entityId);
return ValidationUtil.isEmpty(model) ? 0 : model.getOperateCount();
}
/**
* 文档引用总数改变
*
* @param tagSeq 标签id
* @param changeNum 改变数量
*/
/*public void changeOneDocumentCount(Long tagSeq, int changeNum) {
KnowledgeInteractionCountModel countModel = queryByEntity(QUOTE_TYPE_ALL, QUOTE_ENTITY_DOCUMENT, tagSeq.toString());
int count;
if (ValidationUtil.isEmpty(countModel)) {
count = changeNum;
} else {
count = countModel.getOperateCount() + changeNum;
}
updateOneCount(QUOTE_TYPE_ALL, QUOTE_ENTITY_DOCUMENT, tagSeq.toString(), count);
}*/
/*public void flushOneTagCountAll(Long tagSeq) {
int count = tagInstanceService.queryCountByTagSeq(tagSeq);
//更新
updateOneCount(QUOTE_TYPE_ALL, QUOTE_ENTITY_TAG, tagSeq.toString(), count);
}
public void flushOneTagCountPublished(Set targets, Long tagSeq) {
int count = tagInstanceService.countByTagSeqAndTargetSeqs(tagSeq, targets);
//更新
updateOneCount(QUOTE_TYPE_PUBLISH, QUOTE_ENTITY_TAG, tagSeq.toString(), count);
}*/
//刷新某个统计目标的引用数
private void updateOneCount(String operateType, String entityType, String entityId, int count) {
KnowledgeInteractionCountModel countModel = queryByEntity(operateType, entityType, entityId);
if (ValidationUtil.isEmpty(countModel)) {
countModel = new KnowledgeInteractionCountModel();
countModel.setOperateType(operateType);
countModel.setEntityType(entityType);
countModel.setEntityId(entityId);
countModel.setOperateCount(count);
countModel.setAgencyCode(RequestContext.getAgencyCode());
this.createWithModel(countModel);
} else {
countModel.setOperateCount(count);
this.updateWithModel(countModel);
}
}
private KnowledgeInteractionCountModel queryByEntity(String operateType, String entityType, String entityId) {
List<KnowledgeInteractionCountModel> list = this.queryForTopList(1, null, false, operateType, entityType, entityId);
if (list.isEmpty()) {
return null;
}
return list.get(0);
}
/**
* 获取总数前top个
*/
public List<KnowledgeInteractionCountModel> queryTop(int top, String operateType, String entityType, String agencyCode) {
return this.queryForTopList(top, "operate_count", false, operateType, entityType, agencyCode);
}
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public void deleteByEntity(String entityType, String entityId) {
List<KnowledgeInteractionCountModel> countModels = this.queryForList(null, false, entityType, entityId);
for (KnowledgeInteractionCountModel countModel : countModels) {
this.deleteBySeq(countModel.getSequenceNbr());
}
}
public void deleteAllTagQuote() {
this.getBaseMapper().deleteByEntityType(QUOTE_ENTITY_TAG);
}
public List<KnowledgeInteractionCount> getAllTagQuoteRecords() {
List<KnowledgeInteractionCount> resList = new ArrayList<>();
List<KnowledgeInteractionCount> tagQuoteAll = this.getBaseMapper().queryTagQuoteAll();
List<KnowledgeInteractionCount> tagQuotePublish = this.getBaseMapper().queryTagQuotePublish();
resList.addAll(interactionCountList2ModelList(tagQuoteAll, QUOTE_ENTITY_TAG, QUOTE_TYPE_ALL));
resList.addAll(interactionCountList2ModelList(tagQuotePublish, QUOTE_ENTITY_TAG, QUOTE_TYPE_PUBLISH));
return resList;
}
private List<KnowledgeInteractionCount> interactionCountList2ModelList(List<KnowledgeInteractionCount> list, String entityType, String operateType) {
Date now = new Date();
List<KnowledgeInteractionCount> modelList = new ArrayList<>();
if (!ValidationUtil.isEmpty(list)) {
list.forEach(model -> {
model.setSequenceNbr(sequence.nextId());
model.setRecDate(now);
model.setRecUserId("system");
model.setEntityType(entityType);
model.setOperateType(operateType);
});
modelList = list;
}
return modelList;
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeInteractionRecordModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.InteractionRecordMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeInteractionRecord;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.Date;
import java.util.List;
/**
* <p>
* 知识库内容交互记录 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class InteractionRecordService extends BaseService<KnowledgeInteractionRecordModel, KnowledgeInteractionRecord, InteractionRecordMapper> {
public void createInteractionRecord(KnowledgeInteractionRecordModel interactionRecordModel) {
interactionRecordModel.setRecDate(new Date());
this.createWithModel(interactionRecordModel);
}
public void deleteInteractionRecord(KnowledgeInteractionRecordModel interactionRecordModel) {
this.deleteBySeq(interactionRecordModel.getSequenceNbr());
}
public KnowledgeInteractionRecordModel queryUniqueModel(String userId, String entityType, String entityId, String operateType) {
return this.queryModelByParams(userId, entityType, entityId, operateType);
}
/**
* 获取用户对某类对象的操作记录列表
*
* @param userId 用户名
* @param operateType 操作类型
* @param entityType 操作对象
* @param agencyCode
* @return
*/
public List<KnowledgeInteractionRecordModel> queryListByUser(String userId, String operateType, String entityType, String agencyCode) {
return this.queryForList(null, false, userId, operateType, entityType, agencyCode);
}
/**
* 某个对象被操作的数量统计
*
* @param operateType 操作类型
* @param entityType 操作对象
* @param entityId 对象Id
* @return
*/
public int countByInstance(String operateType, String entityType, String entityId) {
return this.queryCount(operateType, entityType, entityId);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeMessagePersonalModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.MessagePersonalMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeMessagePersonal;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.rdbms.service.BaseService;
/**
* <p>
* 标签库 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class MessagePersonalService extends BaseService<KnowledgeMessagePersonalModel, KnowledgeMessagePersonal, MessagePersonalMapper> {
/**
* 消息状态-已读
*/
public static final int MESSAGE_STATUS_READ = 1;
/**
* 消息状态-未读
*/
public static final int MESSAGE_STATUS_UNREAD = 0;
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeMessageModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.MessageMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeMessage;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeMessagePersonal;
import com.yeejoin.amos.knowledgebase.face.util.RemoteData;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.component.emq.EmqKeeper;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import java.util.*;
/**
* <p>
* 标签库 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class MessageService extends BaseService<KnowledgeMessageModel, KnowledgeMessage, MessageMapper> {
/**
* 消息类型-要点推送
*/
public static final String MESSAGE_TYPE_PUSH = "ESSENTIAL_PUSH";
/**
* 消息类型-战例分享
*/
public static final String MESSAGE_TYPE_SHARE = "DOC_SHARE";
/**
* 消息主题前缀
*/
public static final String TOPIC_PREFIX = "knowledge_message_";
public static final String SHARE_WAY_APP = "app";
private final String userTypeUser = "user";
private final String userTypeGroup = "group";
@Autowired
private MessagePersonalService messagePersonalService;
@Autowired
private EmqKeeper emqKeeper;
@Autowired
private Sequence sequence;
/**
* 根据用户查询消息列表
*/
public List<Map> queryByOwner(String userId, String messageType) {
try {
List<Map> res = this.getBaseMapper().selectMessageListByOwner(userId, messageType);
//翻译用户姓名
Set<String> a = new HashSet<>();
for (Map mesMap : res) {
if (ValidationUtil.isEmpty(mesMap.get("sponsor"))) {
continue;
}
a.add(mesMap.get("sponsor").toString());
}
Map<String, String> userMap = RemoteData.getUserMap(a);
for (Map mesMap : res) {
if (ValidationUtil.isEmpty(mesMap.get("sponsor"))) {
continue;
}
mesMap.put("sponsorRealName", userMap.get(mesMap.get("sponsor").toString()));
}
return res;
} catch (Exception e) {
throw new DataNotFound("查询数据出错");
}
}
/**
* 根据消息id查询消息
*/
public Map queryById(Long seq) {
try {
Map mesMap = this.getBaseMapper().selectMessageBySeq(seq);
//翻译用户姓名
mesMap.put("sponsorRealName", RemoteData.getUserRealNamById(mesMap.get("sponsor").toString()));
return mesMap;
} catch (Exception e) {
throw new DataNotFound("查询数据出错");
}
}
/**
* 战例分享
*/
@Transactional(rollbackFor = {BaseException.class, Exception.class})
public boolean shareDoc(List<Map<String, Object>> users, List<Map<String, Object>> docs, String way) {
if (ValidationUtil.equalsIgnoreCase(way, SHARE_WAY_APP)) {
for (Map<String, Object> doc : docs) {
//创建消息
if (ValidationUtil.isEmpty(doc) || ValidationUtil.isEmpty(doc.get("sequenceNbr"))) {
throw new BadRequest("分享内容缺失");
}
String messageTitle = String.valueOf(doc.get("docTitle"));
KnowledgeMessageModel message = createMessage(MESSAGE_TYPE_SHARE, Long.valueOf(doc.get("sequenceNbr").toString()), messageTitle, String.valueOf(doc.get("summary")));
Set<String> userIdSet = new HashSet<>();
userIdSet = parseUserMapToIdList(users, userIdSet);
//创建个人消息
createPersonalMessage(userIdSet, message.getSequenceNbr());
//推送个人消息
for (String userId : userIdSet) {
publishMessage(userId, message.getSequenceNbr());
}
}
}
return true;
}
/**
* 要点推送
*/
@Transactional(rollbackFor = {BaseException.class, Exception.class})
public boolean pushEssential(List<Map<String, Object>> users, String messageTitle, String content, Long docSeq) {
//创建消息
KnowledgeMessageModel message = createMessage(MESSAGE_TYPE_PUSH, docSeq, messageTitle, content);
Set<String> userIdSet = new HashSet<>();
userIdSet = parseUserMapToIdList(users, userIdSet);
//创建个人消息
createPersonalMessage(userIdSet, message.getSequenceNbr());
//推送个人消息
for (String userId : userIdSet) {
publishMessage(userId, message.getSequenceNbr());
}
return true;
}
/**
* 消息已读
*/
@Transactional(rollbackFor = {BaseException.class, Exception.class})
public List<KnowledgeMessagePersonal> readMessage(List<Long> ids) {
QueryWrapper<KnowledgeMessagePersonal> queryWrapper = new QueryWrapper();
queryWrapper.in("SEQUENCE_NBR", ids);
List<KnowledgeMessagePersonal> messagePersonalModelList = messagePersonalService.list(queryWrapper);
if (messagePersonalModelList.size() < 1) {
throw new DataNotFound("找不到数据");
}
for (int i = 0; i < messagePersonalModelList.size(); i++) {
messagePersonalModelList.get(i).setMessageStatus(MessagePersonalService.MESSAGE_STATUS_READ);
}
messagePersonalService.updateBatchById(messagePersonalModelList);
return messagePersonalModelList;
}
/**
* 消息全读
*/
@Transactional(rollbackFor = {BaseException.class, Exception.class})
public boolean readAllMessageByUserId(String userId) {
KnowledgeMessagePersonal messagePersonal = new KnowledgeMessagePersonal();
messagePersonal.setMessageStatus(MessagePersonalService.MESSAGE_STATUS_READ);
UpdateWrapper<KnowledgeMessagePersonal> wrapper = new UpdateWrapper();
wrapper.eq("MESSAGE_OWNER", userId);
return messagePersonalService.update(messagePersonal, wrapper);
}
/**
* 创建消息
*/
private KnowledgeMessageModel createMessage(String messageType, Long targetSeq, String messageTitle, String messageContent) {
KnowledgeMessageModel messageModel = new KnowledgeMessageModel();
messageModel.setMessageType(messageType);
messageModel.setTargetSeq(targetSeq);
messageModel.setMessageTitle(messageTitle);
messageModel.setMessageContent(messageContent);
return this.createWithModel(messageModel);
}
/**
* 创建个人消息
*/
private boolean createPersonalMessage(Collection<String> ownerList, Long messageSeq) {
if (!ValidationUtil.isEmpty(messageSeq)) {
List<KnowledgeMessagePersonal> messageList = new ArrayList<>();
Date now = new Date();
String userId = RequestContext.getExeUserId();
ownerList.forEach(owner -> {
KnowledgeMessagePersonal message = new KnowledgeMessagePersonal();
message.setSequenceNbr(sequence.nextId());
message.setRecDate(now);
message.setRecUserId(userId);
message.setMessageOwner(owner);
message.setMessageSeq(messageSeq);
message.setMessageStatus(MessagePersonalService.MESSAGE_STATUS_UNREAD);
messageList.add(message);
});
messagePersonalService.saveBatch(messageList);
}
return true;
}
/**
* 用户/分组列表转为用户列表
*/
private Set<String> parseUserMapToIdList(List<Map<String, Object>> users, Set<String> res) {
if (!ValidationUtil.isEmpty(users)) {
for (Map<String, Object> user : users) {
String type = String.valueOf(user.get("type"));
if (ValidationUtil.equalsIgnoreCase(userTypeUser, type)) {
String id = String.valueOf(user.get("id"));
res.add(id);
} else if (ValidationUtil.equalsIgnoreCase(userTypeGroup, type)) {
if (user.containsKey("children")) {
Object childrenObj = user.get("children");
if (!ValidationUtil.isEmpty(childrenObj) && childrenObj instanceof List) {
List<Map<String, Object>> list = (List<Map<String, Object>>) childrenObj;
parseUserMapToIdList(list, res);
}
}
}
}
}
return res;
}
/**
* 发布消息
*/
private void publishMessage(String owner, Long messageSeq) {
try {
emqKeeper.getMqttClient().publish(getTopic(owner), messageSeq.toString().getBytes(), 2, false);
} catch (MqttException e) {
log.error("消息推送失败:接收人" + owner + ",消息id:" + messageSeq);
}
}
/**
* 获取用户的主题
*/
private String getTopic(String userId) {
return TOPIC_PREFIX + String.valueOf(userId);
}
/**
* 分页查询消息
*/
public List<Map> queryByPage(String userId, int current, int size, String messageType) {
try {
Map<String, Object> param = new HashMap<>();
param.put("owner", userId);
param.put("current", (current - 1) * size);
param.put("size", size);
param.put("messageType", messageType);
List<Map> res = this.getBaseMapper().selectMessageListByPage(param);
//翻译用户姓名
Set<String> a = new HashSet<>();
for (Map mesMap : res) {
if (ValidationUtil.isEmpty(mesMap.get("sponsor"))) {
continue;
}
a.add(mesMap.get("sponsor").toString());
}
Map<String, String> userMap = RemoteData.getUserMap(a);
for (Map mesMap : res) {
if (ValidationUtil.isEmpty(mesMap.get("sponsor"))) {
continue;
}
mesMap.put("sponsorRealName", userMap.get(mesMap.get("sponsor").toString()));
}
return res;
} catch (Exception e) {
throw new DataNotFound("查询数据出错");
}
}
/**
* 分页查询消息总数
*/
public Integer queryByPageCount(String userId, String messageType) {
try {
Map<String, Object> param = new HashMap<>();
param.put("owner", userId);
param.put("messageType", messageType);
return this.getBaseMapper().selectMessageListByCount(param);
} catch (Exception e) {
throw new DataNotFound("查询数据出错");
}
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDocContentModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowlegeStatisticsRecordModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.StatisticsRecordMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowlegeStatisticsRecord;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.util.*;
/**
* <p>
* 标签分组 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class StatisticsRecordService extends BaseService<KnowlegeStatisticsRecordModel, KnowlegeStatisticsRecord, StatisticsRecordMapper> {
/*@Autowired
private DocContentService docContentService;
private final Logger logger = LogManager.getLogger(StatisticsRecordService.class);
*//**
* 灾情标记
*//*
public static final String TAG_NAME_TIME = "时间";
public static final String STATISTICS_DISASTER_COUNT = "DISASTER_RECORD";
*//**
* 燃烧物质分类
*//*
public static final String TAG_NAME_BURNING = "燃烧物质";
public static final String STATISTICS_BURNING_CATEGORY = "BURNING_RECORD";
*//**
* 参战车辆统计
*//*
public static final String TAG_NAME_POWER = "参战车辆";
public static final String STATISTICS_POWER_SUM = "POWER_RECORD";
*//**
* 伤亡人数统计
*//*
public static final String TAG_NAME_CASUALTIES = "人员伤亡情况 含亡人";
public static final String STATISTICS_CASUALTIES_SUM = "CASUALTIES_RECORD";
*//**
* 灭火药剂统计
*//*
public static final String TAG_NAME_EXTINGUISHING = "使用的灭火药剂数量";
public static final String STATISTICS_EXTINGUISHING_SUM = "EXTINGUISHING_RECORD";
*//**
* 过火面积统计
*//*
public static final String TAG_NAME_AREA = "过火面积";
public static final String STATISTICS_AREA_COUNT = "FIRE_AREA_RECORD";
*//**
* 到场时间分类
*//*
public static final String TAG_NAME_PICKUP = "接警时间";
public static final String TAG_NAME_PRESENT = "到场时间";
public static final String STATISTICS_PRESENT_CATEGORY = "PRESENT_TIME_RECORD";
public static final String DATE_GROUP_BY_DAY = "day";
public static final String DATE_GROUP_BY_MONTH = "month";
@Value("${diy-config.report.record-data}")
private boolean needRecord;
*//** 根据文档标签添加对应的记录 *//*
private void addRecordWithDocValueTag(List<KnowledgeTagInstanceModel> docTags, Long docSeq) {
//找出预定义的所有标签
Map<Object, KnowledgeTagInstanceModel> tagMap = Bean.listToMap(docTags, "tagName", KnowledgeTagInstanceModel.class);
KnowledgeTagInstanceModel tagTime = tagMap.get(TAG_NAME_TIME);
if (ValidationUtil.isEmpty(tagTime)) {
return;
}
Object timeObj = getValueFromTag(tagTime);
if (ValidationUtil.isEmpty(timeObj) || !(timeObj instanceof Date)) {
return;
}
Date disasterTime = (Date) timeObj;
//记录灾情
insertSumTypeRecord(docSeq, disasterTime, STATISTICS_DISASTER_COUNT, 1.0, 1);
//记录燃烧物质
KnowledgeTagInstanceModel tagBurning = tagMap.get(TAG_NAME_BURNING);
if (!ValidationUtil.isEmpty(tagBurning)) {
insertCategoryTypeRecord(docSeq, disasterTime, STATISTICS_BURNING_CATEGORY, getValueFromTag(tagBurning));
}
//记录参战车辆
KnowledgeTagInstanceModel tagPower = tagMap.get(TAG_NAME_POWER);
if (!ValidationUtil.isEmpty(tagPower)) {
insertSumTypeRecord(docSeq, disasterTime, STATISTICS_POWER_SUM, getValueFromTag(tagPower), 1);
}
//记录伤亡人数
KnowledgeTagInstanceModel tagCasualties = tagMap.get(TAG_NAME_CASUALTIES);
if (!ValidationUtil.isEmpty(tagCasualties)) {
insertSumTypeRecord(docSeq, disasterTime, STATISTICS_CASUALTIES_SUM, getValueFromTag(tagCasualties), 1);
}
//记录灭火药剂数量
KnowledgeTagInstanceModel tagExtinguishing = tagMap.get(TAG_NAME_EXTINGUISHING);
if (!ValidationUtil.isEmpty(tagExtinguishing)) {
insertSumTypeRecord(docSeq, disasterTime, STATISTICS_EXTINGUISHING_SUM, getValueFromTag(tagExtinguishing), 1);
}
//记录过火面积
KnowledgeTagInstanceModel tagArea = tagMap.get(TAG_NAME_AREA);
if (!ValidationUtil.isEmpty(tagArea)) {
insertSumTypeRecord(docSeq, disasterTime, STATISTICS_AREA_COUNT, getValueFromTag(tagArea), 1);
}
//记录到场时间
KnowledgeTagInstanceModel tagPickup = tagMap.get(TAG_NAME_PICKUP);
KnowledgeTagInstanceModel tagPresent = tagMap.get(TAG_NAME_PRESENT);
if (!ValidationUtil.isEmpty(tagPickup) && !ValidationUtil.isEmpty(tagPresent)) {
Object pickTimeObj = getValueFromTag(tagPickup);
Object presentTimeObj = getValueFromTag(tagPresent);
if (!ValidationUtil.isEmpty(pickTimeObj) && pickTimeObj instanceof Date
&& !ValidationUtil.isEmpty(presentTimeObj) && presentTimeObj instanceof Date) {
long presentTimeByMinute = (long) Math.ceil((((Date) presentTimeObj).getTime() - ((Date) pickTimeObj).getTime()) / 1000.0 / 60.0);
insertCategoryTypeRecord(docSeq, disasterTime, STATISTICS_PRESENT_CATEGORY, presentTimeByMinute);
}
}
}
*//** 获取标签值 *//*
private Object getValueFromTag(KnowledgeTagInstanceModel tag) {
if (ValidationUtil.isEmpty(tag)
|| !ValidationUtil.equals(tag.getTagType(), TagService.TAG_TYPE_VALUE)
|| ValidationUtil.isEmpty(tag.getTagValues())) {
return null;
}
String fieldName = tag.getTagValues().get(0).getFieldName();
String tagValue = tag.getTagValues().get(0).getTagValue();
if (ValidationUtil.isEmpty(fieldName)
|| ValidationUtil.isEmpty(tagValue)) {
return null;
}
switch (fieldName) {
case TagValueService.VALUE_TAG_FIELD_DATE_H:
try {
return DateUtil.formatStringToDate(tagValue, null);
} catch (Exception e) {
logger.error("报表统计:时间格式标签值解析出错");
return null;
}
case TagValueService.VALUE_TAG_FIELD_SINGLEVALUE:
try {
return Double.parseDouble(tagValue);
} catch (Exception e) {
logger.error("报表统计:数字格式标签值解析出错");
return null;
}
case TagValueService.VALUE_TAG_FIELD_TEXT:
return tagValue;
default:
return null;
}
}
*//** 插入分类统计记录 *//*
private void insertCategoryTypeRecord(Long docSeq, Date disasterTime, String recordName, Object category) {
KnowlegeStatisticsRecordModel recordModel = new KnowlegeStatisticsRecordModel();
recordModel.setDocSeq(docSeq);
recordModel.setDisasterTime(disasterTime);
recordModel.setRecordName(recordName);
recordModel.setCategoryValue(String.valueOf(category));
recordModel.setValueWeight(1);
recordModel.setCountValue(1L);
this.createWithModel(recordModel);
}
*//** 插入数量统计记录 *//*
private void insertSumTypeRecord(Long docSeq, Date disasterTime, String recordName, Object numObj, Integer weight) {
if (!ValidationUtil.isEmpty(numObj) && numObj instanceof Double) {
Long num = ((Double) numObj).longValue();
KnowlegeStatisticsRecordModel recordModel = new KnowlegeStatisticsRecordModel();
recordModel.setDocSeq(docSeq);
recordModel.setDisasterTime(disasterTime);
recordModel.setRecordName(recordName);
recordModel.setCountValue(num);
recordModel.setValueWeight(weight);
this.createWithModel(recordModel);
}
}
*//**
* 根据文档id删除相关记录
*//*
public void deleteRecordsByDocIds(List<KnowledgeDocContentModel> docs) {
if (!ValidationUtil.isEmpty(docs)) {
Set ids = Bean.listToMap(docs, "sequenceNbr", KnowledgeDocContentModel.class).keySet();
QueryWrapper<KnowlegeStatisticsRecord> wrapper = new QueryWrapper<>();
wrapper.in("doc_seq", ids);
this.getBaseMapper().delete(wrapper);
}
}
*//**
* 初始化统计数据记录
*
* @return
*//*
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public boolean init() {
this.getBaseMapper().deleteAll();
//扫描所有已发布文档相关的统计型标签
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<>();
wrapper.eq("doc_status", DocContentService.DOC_STATUS_PUBLISHED);
int count = docContentService.count(wrapper);
int finishNmu = 0;
int current = 0;
while (count > finishNmu) {
Page page = new Page(current++, 30);
IPage resPage = docContentService.page(page, wrapper);
List<KnowledgeDocContent> records = resPage.getRecords();
Set ids = Bean.listToMap(records, "sequenceNbr", KnowledgeDocContent.class).keySet();
saveRecordsByDocIds(ids);
finishNmu += records.size();
}
return true;
}
public boolean addDocRecords(List<KnowledgeDocContentModel> docs) {
if (!ValidationUtil.isEmpty(docs)) {
Set ids = Bean.listToMap(docs, "sequenceNbr", KnowledgeDocContentModel.class).keySet();
saveRecordsByDocIds(ids);
}
return true;
}
private void saveRecordsByDocIds(Collection ids) {
if (!needRecord) {
return;
}
for (Object id : ids) {
KnowledgeDocContentModel docContentModel = docContentService.queryOneDocDetail((Long) id);
if (ValidationUtil.isEmpty(docContentModel)) {
continue;
}
addRecordWithDocValueTag(docContentModel.getDocTags(), docContentModel.getSequenceNbr());
}
}
*//**
* 查询灾情统计/同比/环比
*
* @return
*//*
public Map<String, Object> selectDisasterCount() {
return this.getBaseMapper().selectDisasterCount();
}
public List<Map<String, Object>> selectCategoryByName(String recordName) {
return this.getBaseMapper().selectCategoryByName(recordName);
}
*//**
* 分类汇总
*//*
public List<Map<String, Object>> selectCountByTypeAndDateRange(String dateType, String dateRangeLeft, String dateRangeRight, String recordName) {
Map<String, Object> queryMap = new HashMap<>();
switch (dateType) {
case DATE_GROUP_BY_MONTH:
queryMap.put("format", "%Y-%m");
break;
default:
queryMap.put("format", "%Y-%m-%d");
break;
}
if(!ValidationUtil.isEmpty(dateRangeLeft)){
try {
queryMap.put("dateRangeLeft", DateUtil.formatStringToDate(dateRangeLeft, null));
} catch (Exception e) {
throw new BadRequest("时间参数格式有误");
}
}
if(!ValidationUtil.isEmpty(dateRangeRight)){
try {
queryMap.put("dateRangeRight", DateUtil.formatStringToDate(dateRangeRight, null));
} catch (Exception e) {
throw new BadRequest("时间参数格式有误");
}
}
queryMap.put("recordName", recordName);
return this.getBaseMapper().selectCountByNameAndDateRange(queryMap);
}*/
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupRefModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.TagGroupRefMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagGroupRef;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* <p>
* 标签分组 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class TagGroupRefService extends BaseService<KnowledgeTagGroupRefModel, KnowledgeTagGroupRef, TagGroupRefMapper> {
//创建某个标签的分组关系
@Transactional
public void createGroupRefForTag(Long tagSeq, List<Long> tagGroupSeqs) {
for (Long groupSeq : tagGroupSeqs) {
KnowledgeTagGroupRefModel refModel = new KnowledgeTagGroupRefModel();
refModel.setTagSeq(tagSeq);
refModel.setGroupSeq(groupSeq);
this.createWithModel(refModel);
}
}
public void deleteRefsByTagSeq(Long tagSeq) {
List<KnowledgeTagGroupRefModel> oldRefs = this.queryListByTagSeq(tagSeq);
for (KnowledgeTagGroupRefModel oldRef : oldRefs) {
this.deleteBySeq(oldRef.getSequenceNbr());
}
}
//根据标签id查询关系数据
public List<KnowledgeTagGroupRefModel> queryListByTagSeq(Long tagSeq) {
return this.queryForList(null, false, tagSeq);
}
//根据分组id列表查询所有的标签ID
public List queryTagSeqListByGroupSeqList(List<Long> groupSeqList) {
List<KnowledgeTagGroupRefModel> refModelList = queryListByGroupSeqList(groupSeqList);
Set<Object> tagSeq = Bean.listToMap(refModelList, "tagSeq", KnowledgeTagGroupRefModel.class).keySet();
return new ArrayList(tagSeq);
}
//根据分组id列表查询所有的关系
private List<KnowledgeTagGroupRefModel> queryListByGroupSeqList(@Condition(Operator.in) List<Long> groupSeq) {
return this.queryForList(null, false, groupSeq);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.TagGroupMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTag;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.TreeBuilder;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import org.typroject.tyboot.core.restful.exception.instance.RequestForbidden;
import java.util.*;
/**
* <p>
* 标签分组 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class TagGroupService extends BaseService<KnowledgeTagGroupModel, KnowledgeTagGroup, TagGroupMapper> {
public static final Long ROOT = 0L;
@Autowired
private TagService tagService;
/**
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupModel
* @author 杨博超
* @description 创建标签分类
* @Param [groupModel]
**/
public KnowledgeTagGroupModel createGroup(KnowledgeTagGroupModel groupModel) {
KnowledgeTagGroupModel oldModel = this.queryByGroupName(RequestContext.getAgencyCode(), groupModel.getGroupName());
if (!ValidationUtil.isEmpty(oldModel)) {
throw new BadRequest("分类名称已存在.");
}
groupModel.setAgencyCode(RequestContext.getAgencyCode());
if (ValidationUtil.isEmpty(groupModel.getParentId())) {
groupModel.setParentId(ROOT);
}
return this.createWithModel(groupModel);
}
/**
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupModel
* @author 杨博超
* @description 更新分组.
* @Param [groupModel]
**/
public KnowledgeTagGroupModel updateGroup(KnowledgeTagGroupModel groupModel) {
KnowledgeTagGroupModel oldModel = this.queryBySeq(groupModel.getSequenceNbr());
if (ValidationUtil.isEmpty(oldModel)) {
throw new DataNotFound("找不到指定的分组.");
}
KnowledgeTagGroupModel oldModelByName = this.queryByGroupName(RequestContext.getAgencyCode(), groupModel.getGroupName());
if (!ValidationUtil.isEmpty(oldModelByName) && !oldModelByName.getSequenceNbr().equals(oldModel.getSequenceNbr())) {
throw new BadRequest("分类名称已存在.");
}
Bean.copyExistPropertis(groupModel, oldModel);
return this.updateWithModel(oldModel);
}
/**
* @return java.util.List<java.lang.Long>
* @author 杨博超
* @description 删除分类
* @Param [ids]
**/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<Long> deleteGroup(String ids) {
List<Long> seqs = StringUtil.String2LongList(ids);
for (Long seq : seqs) {
KnowledgeTagGroupModel tagGroupModel = this.queryBySeq(seq);
//所有子分类
List<Long> childGroupSequenceList = getChildGroupSequenceList(tagGroupModel);
List<KnowledgeTag> existTags = tagService.queryTagListWithGroup(seq, null, null, null);
if (!ValidationUtil.isEmpty(existTags)) {
throw new RequestForbidden("分组下存在标签,不允许删除!");
}
this.deleteBatchSeq(childGroupSequenceList);
}
return seqs;
}
private List<KnowledgeTagGroupModel> queryByParentId(Long parentId) {
return this.queryForList("", false, parentId);
}
/**
* @return com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupModel
* @author 杨博超
* @description 根据名称查询分类
* @Param [groupName]
**/
public KnowledgeTagGroupModel queryByGroupName(String agencyCode, String groupName) {
return this.queryModelByParams(agencyCode, groupName);
}
/**
* @return java.util.Collection<com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupModel>
* @author 杨博超
* @description 查询标签分类树结构
* @Param [agencyCode]
**/
public Collection<KnowledgeTagGroupModel> queryGroupTree(String agencyCode, @Condition(Operator.like) String groupName) {
List<KnowledgeTagGroupModel> list = this.queryForList("GROUP_NAME", true, agencyCode, groupName);
Map<Object, KnowledgeTagGroupModel> map = Bean.listToMap(list, "sequenceNbr", KnowledgeTagGroupModel.class);
SortedSet<KnowledgeTagGroupModel> completeList = new TreeSet<>();
for (KnowledgeTagGroupModel model : list) {
completeList.addAll(buildWithParent(model, map));
}
return TreeBuilder.buildByRecursive(completeList, ROOT);
}
/**
* @author 杨博超
* @description 构建不完整的树
* @Param [groupModel, map]
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagGroupModel>
**/
private List<KnowledgeTagGroupModel> buildWithParent(KnowledgeTagGroupModel groupModel, Map<Object, KnowledgeTagGroupModel> map) {
List<KnowledgeTagGroupModel> completeList = new ArrayList<>();
completeList.add(groupModel);
if (groupModel.getParentId().equals(ROOT)) {
completeList.add(groupModel);
return completeList;
}
KnowledgeTagGroupModel parent = map.get(groupModel.getParentId());
if (ValidationUtil.isEmpty(parent)) {
parent = this.queryBySeq(groupModel.getParentId());
if (ValidationUtil.isEmpty(parent)) {
return completeList;
}
}
completeList.add(parent);
completeList.addAll(this.buildWithParent(parent, map));
return completeList;
}
/**
* 获取标签分组的所有子分组id
*
* @param parentTagGroupModel
* @return
*/
public List<Long> getChildGroupSequenceList(KnowledgeTagGroupModel parentTagGroupModel) {
List<Long> sequenceList = new ArrayList<>();
List<KnowledgeTagGroupModel> childList = new ArrayList<>();
this.getAllChildList(parentTagGroupModel, childList);
for (KnowledgeTagGroupModel tagGroupModel : childList) {
sequenceList.add(tagGroupModel.getSequenceNbr());
}
return sequenceList;
}
private void getAllChildList(KnowledgeTagGroupModel currentTagGroupModel, List<KnowledgeTagGroupModel> resList) {
if (null == currentTagGroupModel) {
return;
}
Long parentId = currentTagGroupModel.getSequenceNbr();
List<KnowledgeTagGroupModel> childList = queryByParentId(parentId);
if (!childList.isEmpty()) {
for (KnowledgeTagGroupModel tagGroupModel : childList) {
this.getAllChildList(tagGroupModel, resList);
}
}
resList.add(currentTagGroupModel);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsValueModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.TagInstanceMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.*;
/**
* <p>
* 标签实例 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class TagInstanceService extends BaseService<KnowledgeTagInstanceModel, KnowledgeTagInstance, TagInstanceMapper> {
public static final String MARKING_TYPE_DOC = "DOC"; // 标记类型--文档标签
public static final String MARKING_TYPE_CONTENT = "CONTENT";// 标记类型--内容标签
@Autowired
private TagValueService tagValueService;
@Autowired
private TagService tagService;
@Autowired
private Sequence sequence;
@Autowired
private DynamicsValueService dynamicsValueService;
/**
* @return java.util.List<com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel>
* @author 杨博超
* @description 保存标签实例
* @Param [tagInstance]
**/
public List<KnowledgeTagInstanceModel> saveInstance(List<KnowledgeTagInstanceModel> tagInstanceList, Long targetSeq, String markingType) {
List<KnowledgeTagInstanceModel> savedInstances = new ArrayList<>();
if (!ValidationUtil.isEmpty(tagInstanceList)) {
for (KnowledgeTagInstanceModel instanceModel : tagInstanceList) {
KnowledgeTagModel tagModel = this.tagService.queryBySeq(instanceModel.getTagSeq());
Long instanceSeq = sequence.nextId();
instanceModel.setSequenceNbr(instanceSeq);
instanceModel.setAgencyCode(RequestContext.getAgencyCode());
instanceModel.setMarkingType(markingType);
instanceModel.setTargetSeq(targetSeq);
instanceModel.setTagName(tagModel.getTagName());
instanceModel.setTagType(tagModel.getTagType());
//值标签保存标签的具体值
List<KnowledgeTagValueModel> valueModels = instanceModel.getTagValues();
if (TagService.TAG_TYPE_VALUE.equals(tagModel.getTagType()) && !ValidationUtil.isEmpty(valueModels)) {
List<KnowledgeDynamicsValueModel> valueTagConfigs = dynamicsValueService.queryByInstanceId(tagModel.getSequenceNbr());
Map<String,Object> valueTagConfigMap = Bean.listToMap(valueTagConfigs,"fieldName","fieldValue",KnowledgeDynamicsValueModel.class);
String unit = String.valueOf(valueTagConfigMap.get("unit"));
List<KnowledgeTagValueModel> savedValues = this.tagValueService.saveInstanceValue(instanceSeq, valueModels,unit);
instanceModel.setTagValues(savedValues);
}
this.createWithModel(instanceModel);
savedInstances.add(instanceModel);
}
}
return savedInstances;
}
public void deleteByTargetSeq(Long targetSeq) {
List<KnowledgeTagInstanceModel> list = this.queryForList("", false, targetSeq);
if (!ValidationUtil.isEmpty(list)) {
for (KnowledgeTagInstanceModel model : list) {
tagValueService.deleteByInstanceId(model.getSequenceNbr());
this.deleteBySeq(model.getSequenceNbr());
}
}
}
// /**
// * 根据标签ID和目标ID列表统计标签实例数量
// *
// * @param tagSeq 标签ID
// * @param targetSeq 目标ID列表
// * @return 数量
// */
// public int countByTagSeqAndTargetSeqs(Long tagSeq, @Condition(Operator.in) Collection<Long> targetSeq) {
// return this.queryCount(tagSeq, targetSeq);
// }
/** 根据标签ID统计标签实例数量 */
public int queryCountByTagSeq(Long tagSeq) {
return this.queryCount(tagSeq);
}
// /** 根据标签ID和文档id列表查询标签实例列表 */
// public List<KnowledgeTagInstanceModel> queryListByTagSeq(Long tagSeq, @Condition(Operator.in) Collection<Long> targetSeq) {
// return this.queryForList("", false, tagSeq, targetSeq);
// }
// //TODO 使用统计方法 this.queryCount
// public Map<Long, Integer> countByTagSeqWithTargetSeq(Long targetSeq) {
// Map<Long, Integer> resMap = new HashMap<>();
// List<KnowledgeTagInstanceModel> instanceModelList = queryListByTargetSeq(targetSeq);
// for (KnowledgeTagInstanceModel instanceModel : instanceModelList) {
// Long tagSeq = instanceModel.getTagSeq();
// Integer count = resMap.containsKey(tagSeq) ? resMap.get(tagSeq) + 1 : 1;
// resMap.put(tagSeq, count);
// }
// return resMap;
// }
public List<KnowledgeTagInstanceModel> queryByTargetAndType(String agencyCode, Long targetSeq, String markingType) {
List<KnowledgeTagInstanceModel> instanceModels = this.queryForList(null, false, agencyCode, targetSeq,markingType);
if (!ValidationUtil.isEmpty(instanceModels)) {
for (KnowledgeTagInstanceModel instanceModel : instanceModels) {
if (TagService.TAG_TYPE_VALUE.equals(instanceModel.getTagType())) {
List<KnowledgeTagValueModel> list = this.tagValueService.queryByInstance(instanceModel.getSequenceNbr());
instanceModel.setTagValues(list);
}
}
}
return instanceModels;
}
public List<KnowledgeTagInstanceModel> queryListByTargetSeq(Long targetSeq) {
return this.queryForList(null, false, targetSeq);
}
public List<KnowledgeTagInstanceModel> queryListByTargetSeqs(@Condition(Operator.in) Collection<Long> targetSeq) {
return this.queryForList(null, false, targetSeq);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.yeejoin.amos.knowledgebase.face.enumeration.DynamicsFunctional;
import com.yeejoin.amos.knowledgebase.face.model.*;
import com.yeejoin.amos.knowledgebase.face.orm.dao.TagMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTag;
import com.yeejoin.amos.knowledgebase.face.util.ConfigLoader;
import com.yeejoin.amos.knowledgebase.face.util.RemoteData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.StringUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import org.typroject.tyboot.core.restful.exception.instance.RequestForbidden;
import java.util.*;
/**
* <p>
* 标签库 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class TagService extends BaseService<KnowledgeTagModel, KnowledgeTag, TagMapper> {
/**
* 标签状态-激活
*/
public static final String TAG_STATUS_ACTIVATE = "ACTIVATED";
/**
* 标签状态-禁用
*/
public static final String TAG_STATUS_DEACTIVATE = "DEACTIVATED";
/**
* 标签类型-文本标签
*/
public static final String TAG_TYPE_TEXT = "TEXT_TAG";
/**
* 标签类型-值标签
*/
public static final String TAG_TYPE_VALUE = "VALUE_TAG";
public static final String APPKEY_ALL = "ALL";
@Autowired
private TagGroupService tagGroupService;
@Autowired
private InteractionCountService interactionCountService;
@Autowired
private TagGroupRefService tagGroupRefService;
@Autowired
private DynamicsValueService dynamicsValueService;
@Autowired
private TagInstanceService tagInstanceService;
@Autowired
private Sequence sequence;
@Autowired
private DocContentService docContentService;
@Autowired
private ConfigLoader configLoader;
/**
* 创建标签
*
* @param model 标签信息
* @return
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public KnowledgeTagModel createTag(KnowledgeTagModel model) {
//判断标签名是否冲突
if (!tagNameIsExist(model.getTagName(), null)) {
throw new BadRequest("标签名称不可重复");
}
Long sequenceNbr = sequence.nextId();
model.setSequenceNbr(sequenceNbr);
model.setTagStatus(TAG_STATUS_DEACTIVATE);
model.setAgencyCode(RequestContext.getAgencyCode());
model.setCreator(RequestContext.getExeUserId());
//创建标签-分组关联关系
tagGroupRefService.createGroupRefForTag(sequenceNbr, model.getTagGroup());
//刷新动态字段值
restoreDynamicsValues(sequenceNbr, model);
return this.createWithModel(model);
}
/**
* 修改标签
*
* @param model 标签信息
* @return
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public KnowledgeTagModel updateTag(KnowledgeTagModel model) {
KnowledgeTagModel oldTagModel = this.queryBySeq(model.getSequenceNbr());
if (ValidationUtil.isEmpty(oldTagModel)) {
throw new DataNotFound("找不到指定的标签");
}
//判断标签名是否冲突
if (!tagNameIsExist(model.getTagName(), oldTagModel.getSequenceNbr())) {
throw new BadRequest("标签名称不可重复");
}
//判断标签状态
if (ValidationUtil.equals(oldTagModel.getTagStatus(), TAG_STATUS_ACTIVATE)) {
throw new BadRequest("启用状态的标签不允许编辑");
}
Long sequenceNbr = oldTagModel.getSequenceNbr();
//重建标签-分组关联关系
tagGroupRefService.deleteRefsByTagSeq(sequenceNbr);
tagGroupRefService.createGroupRefForTag(sequenceNbr, model.getTagGroup());
//刷新动态字段值
restoreDynamicsValues(sequenceNbr, model);
Bean.copyExistPropertis(model, oldTagModel);
return this.updateWithModel(oldTagModel);
}
private void restoreDynamicsValues(Long sequenceNbr, KnowledgeTagModel model) {
if (ValidationUtil.equals(TAG_TYPE_VALUE, model.getTagType())) {
Map<String, Object> tagValues = model.getTagValues();
if (!ValidationUtil.isEmpty(tagValues)) {
dynamicsValueService.saveValueList(tagValues, sequenceNbr,
DynamicsFunctional.VALUE_TAG_CONFIG,
APPKEY_ALL);
}
}
}
/**
* 查询详情
*
* @param sequenceNbr 标签id
* @return
*/
public Map<String, Object> detailTag(Long sequenceNbr) {
KnowledgeTagModel tagModel = this.queryBySeq(sequenceNbr);
if (ValidationUtil.isEmpty(tagModel)) {
throw new DataNotFound("找不到指定的标签");
}
//加入引用数量
tagModel.setReferenceNumber(getAllReference(tagModel.getSequenceNbr()));
//查询动态字段map
tagAddDynamicsValues(tagModel);
Map<String, Object> tagMap = Bean.BeantoMap(tagModel);
//查询所属分组
List<KnowledgeTagGroupRefModel> groupRefModels = tagGroupRefService.queryListByTagSeq(tagModel.getSequenceNbr());
Set<Long> groupSeqSet = new HashSet<>();
for (KnowledgeTagGroupRefModel groupRefModel : groupRefModels) {
groupSeqSet.add(groupRefModel.getGroupSeq());
}
tagMap.put("tagGroup", groupSeqSet);
//加入创建人姓名
tagMap.put("creatorName", RemoteData.getUserRealNamById(tagModel.getCreator()));
return tagMap;
}
/**
* 条件查询,并以首字母作为key的Map结构封装数据
*
* @param groupSeq 标签分组id
* @param tagName 标签名称
* @param tagCode 标签代码
* @param tagStatus 标签状态
* @return Map<首字母String , 列表List>
*/
public Map<String, List<KnowledgeTagModel>> queryTagMap(Long groupSeq, String tagName, String tagCode, String tagStatus) {
Map<String, List<KnowledgeTagModel>> resMap = new TreeMap<>();
List<KnowledgeTag> tagList = queryTagListWithGroup(groupSeq, tagName, tagCode, tagStatus);
for (KnowledgeTag tag : tagList) {
KnowledgeTagModel tagModel = Bean.toModel(tag, new KnowledgeTagModel());
//加入引用数量
tagModel.setReferenceNumber(getAllReference(tagModel.getSequenceNbr()));
//获取拼音首字母
String pinyin;
try {
String headWord = tagModel.getTagName().trim().substring(0, 1);
pinyin = StringUtil.converterToFirstSpell(headWord).toUpperCase();
} catch (Exception e) {
System.out.println(e);
pinyin = "#";
}
char initials = pinyin.charAt(0);
if (initials < 65 || initials > 90) {
initials = '#';
}
//将标签加入首字母对应的列表
List<KnowledgeTagModel> list = resMap.get(String.valueOf(initials));
if (ValidationUtil.isEmpty(list)) {
list = new ArrayList<>();
resMap.put(String.valueOf(initials), list);
}
list.add(tagModel);
}
return resMap;
}
/**
* 条件查询--标签分组下及所有子分组下的标签
*/
public List<KnowledgeTag> queryTagListWithGroup(Long groupSeq, String tagName, String tagCode, String tagStatus) {
QueryWrapper<KnowledgeTag> wrapper = new QueryWrapper<>();
if (!ValidationUtil.isEmpty(groupSeq)
&& !ValidationUtil.equals(groupSeq, TagGroupService.ROOT)) {
KnowledgeTagGroupModel tagGroupModel = tagGroupService.queryBySeq(groupSeq);
if (!ValidationUtil.isEmpty(tagGroupModel)) {
List<Long> childGroupSequenceList = tagGroupService.getChildGroupSequenceList(tagGroupModel);
List<Long> tagSeqList = tagGroupRefService.queryTagSeqListByGroupSeqList(childGroupSequenceList);
if (!ValidationUtil.isEmpty(tagSeqList)) {
wrapper.in("sequence_nbr", tagSeqList);
} else {
return Collections.EMPTY_LIST;
}
}
}
if (!ValidationUtil.isEmpty(tagName)) {
wrapper.like("tag_name", tagName.trim());
}
if (!ValidationUtil.isEmpty(tagCode)) {
wrapper.like("tag_code", tagCode.trim());
}
if (!ValidationUtil.isEmpty(tagStatus)) {
wrapper.eq("tag_status", tagStatus);
}
return this.list(wrapper);
}
/**
* 批量删除标签
*
* @param idList 标签id列表
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<Long> delete(List<Long> idList) {
List<Long> resList = new ArrayList<>();
List<KnowledgeTagModel> tagModels = this.queryByIds(idList);
String tags = configLoader.getTags();
List<Long> tagIdList = new ArrayList<>();
if (!ValidationUtil.isEmpty(tags)) {
tagIdList = StringUtil.String2LongList(tags);
}
for (KnowledgeTagModel tagModel : tagModels) {
if (ValidationUtil.equals(tagModel.getTagStatus(), TAG_STATUS_ACTIVATE)) {
throw new RequestForbidden("包含启用状态的标签,不允许删除");
}
if (tagIsQuoted(tagModel.getSequenceNbr())) {
throw new RequestForbidden("包含被引用的标签,不允许删除");
}
if (configLoader.isTagWithName() && tagIdList.contains(tagModel.getSequenceNbr())) {
throw new RequestForbidden("包含规则系统预定义的标签,不允许删除");
}
this.deleteBySeq(tagModel.getSequenceNbr());
//删除分组关系
tagGroupRefService.deleteRefsByTagSeq(tagModel.getSequenceNbr());
resList.add(tagModel.getSequenceNbr());
}
return resList;
}
/**
* 更新标签状态
*
* @param idList 标签id列表
* @param active 启用/禁用
* @return
*/
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<KnowledgeTagModel> updateTagStatus(List<Long> idList, String active) {
List<KnowledgeTagModel> tagModels = this.queryByIds(idList);
for (KnowledgeTagModel tagModel : tagModels) {
tagModel.setTagStatus(active);
this.updateWithModel(tagModel);
}
return tagModels;
}
/**
* 获取标签被所有文档引用数量
*
* @param sequenceNbr 标签id
* @return 数量
*/
public int getAllReference(Long sequenceNbr) {
return getTagReferenceCount(sequenceNbr.toString(), InteractionCountService.QUOTE_TYPE_ALL);
}
public boolean tagIsQuoted(Long sequenceNbr) {
int count = tagInstanceService.queryCountByTagSeq(sequenceNbr);
boolean res = count > 0;
if (res) {
KnowledgeInteractionCountModel interactionCountModel = new KnowledgeInteractionCountModel();
interactionCountModel.setEntityType(InteractionCountService.QUOTE_ENTITY_TAG);
interactionCountModel.setOperateType(InteractionCountService.QUOTE_TYPE_ALL);
interactionCountModel.setEntityId(sequenceNbr.toString());
interactionCountModel.setOperateCount(count);
interactionCountModel.setAgencyCode(configLoader.getAgencyCode());
interactionCountService.createWithModel(interactionCountModel);
}
return res;
}
// /**
// * 获取标签被已发布文档引用数量
// *
// * @param sequenceNbr 标签id
// * @return 数量
// */
// public int getpublishedReference(Long sequenceNbr) {
// return this.getTagReferenceCount(sequenceNbr.toString(), InteractionCountService.QUOTE_TYPE_PUBLISH);
// }
private int getTagReferenceCount(String sequenceNbr, String quoteType) {
return interactionCountService.getOperateCount(quoteType, InteractionCountService.QUOTE_ENTITY_TAG, sequenceNbr);
}
/**
* 标签名称是否可用
*
* @param tagName 标签名称
* @return boolean
*/
public boolean tagNameIsExist(String tagName, Long sequenceNbr) {
QueryWrapper<KnowledgeTag> wrapper = new QueryWrapper<>();
if (!ValidationUtil.isEmpty(sequenceNbr)) {
wrapper.ne("sequence_nbr", sequenceNbr);
}
wrapper.eq("tag_name", tagName);
return this.count(wrapper) == 0;
}
// /**
// * 批量更新标签引用统计数
// * @param tagIds 标签id列表
// * @param isAll 全部引用还是发布引用
// */
// public void batchFlushTagCount(Collection<Long> tagIds, boolean isAll) {
// if (ValidationUtil.isEmpty(tagIds)) {
// return;
// }
// if (isAll) {
// tagIds.forEach(tagId -> interactionCountService.flushOneTagCountAll(tagId));
// }else {
// List<KnowledgeDocContent> docContents = docContentService.queryIdListByStatus(DocContentService.DOC_STATUS_PUBLISHED);
// Set targetSeqs = Bean.listToMap(docContents, "sequenceNbr", KnowledgeDocContent.class).keySet();
// if (!ValidationUtil.isEmpty(targetSeqs)) {
// tagIds.forEach(tagId -> interactionCountService.flushOneTagCountPublished(targetSeqs, tagId));
// }
// }
// }
public List<KnowledgeTagModel> queryByIds(@Condition(Operator.in) Collection<Long> sequenceNbr) {
return this.queryForList(null, false, sequenceNbr);
}
/**
* 获取被已发布文档引用数top15的标签
*
* @return
*/
public List<KnowledgeTagModel> queryTopList(boolean isAll) {
List<KnowledgeTagModel> res = new LinkedList<>();
String operateType = isAll ? InteractionCountService.QUOTE_TYPE_ALL : InteractionCountService.QUOTE_TYPE_PUBLISH;
List<KnowledgeInteractionCountModel> countModels = interactionCountService.queryTop(15, operateType, InteractionCountService.QUOTE_ENTITY_TAG, RequestContext.getAgencyCode());
for (KnowledgeInteractionCountModel countModel : countModels) {
if (countModel.getOperateCount() > 0) {
KnowledgeTagModel tagModel = this.queryBySeq(Long.valueOf(countModel.getEntityId()));
if (!ValidationUtil.isEmpty(tagModel)) {
res.add(tagModel);
}
} else {
break;
}
}
for (KnowledgeTagModel tagModel : res) {
tagAddDynamicsValues(tagModel);
}
return res;
}
public List<KnowledgeTagModel> queryTagDetailList(String tagName) {
List<KnowledgeTag> tagList = queryTagListWithGroup(null, tagName, null, TAG_STATUS_ACTIVATE);
List<KnowledgeTagModel> res = new ArrayList<>();
for (KnowledgeTag tag : tagList) {
KnowledgeTagModel tagModel = new KnowledgeTagModel();
Bean.copyExistPropertis(tag, tagModel);
res.add(tagModel);
}
for (KnowledgeTagModel tagModel : res) {
tagAddDynamicsValues(tagModel);
}
return res;
}
private void tagAddDynamicsValues(KnowledgeTagModel tagModel) {
if (ValidationUtil.equals(TAG_TYPE_VALUE, tagModel.getTagType())) {
List<KnowledgeDynamicsValueModel> valueModels = dynamicsValueService.queryByInstanceId(tagModel.getSequenceNbr());
if (!ValidationUtil.isEmpty(valueModels)) {
Map fieldsMap = Bean.listToMap(valueModels, "fieldName", KnowledgeDynamicsValueModel.class);
tagModel.setTagValues(fieldsMap);
}
}
}
// public List<KnowledgeTagModel> queryByTagName(@Condition(Operator.like) String tagName, String tagStatus) {
// return this.queryForList(null, false, tagName, tagStatus);
// }
/**
* 查询标签关联的文档
*
* @param sequenceNbr 标签id
* @return
*/
public List queryRelatedDocList(Long sequenceNbr) {
if (sequenceNbr == null) {
throw new BadRequest("参数有误");
}
QueryWrapper<KnowledgeDocContent> wrapper = new QueryWrapper<KnowledgeDocContent>()
.eq("DOC_STATUS", DocContentService.DOC_STATUS_PUBLISHED)
.inSql("SEQUENCE_NBR", "SELECT DISTINCT TARGET_SEQ FROM knowledge_tag_instance WHERE TAG_SEQ = " + sequenceNbr);
return docContentService.list(wrapper);
}
}
package com.yeejoin.amos.knowledgebase.face.service;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.dao.TagValueMapper;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagValue;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.annotation.Condition;
import org.typroject.tyboot.core.rdbms.annotation.Operator;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 值标签的实例值 服务类
* </p>
*
* @author 子杨
* @since 2020-08-05
*/
@Component
public class TagValueService extends BaseService<KnowledgeTagValueModel, KnowledgeTagValue, TagValueMapper> {
public static final String VALUE_TAG_FIELD_SINGLEVALUE = "singleValue";//单值字段名
public static final String VALUE_TAG_FIELD_RANGE_MAX = "rangeMax";//范围值 上界
public static final String VALUE_TAG_FIELD_RANGE_MIN = "rangeMin";//范围值 下界
public static final String VALUE_TAG_FIELD_TEXT = "text";//文本值
public static final String VALUE_TAG_FIELD_DATE_H = "dateH";//时间,年月日时分秒
public static final String VALUE_TAG_FIELD_ENUM_NAME = "enumName";// 枚举类型字段名
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public List<KnowledgeTagValueModel> saveInstanceValue(Long instanceSeq, List<KnowledgeTagValueModel> valueModels, String unit) {
this.deleteByInstanceId(instanceSeq);
if (!ValidationUtil.isEmpty(valueModels)) {
for (KnowledgeTagValueModel model : valueModels) {
model.setAgencyCode(RequestContext.getAgencyCode());
model.setInstanceSeq(instanceSeq);
model.setUnit(unit);
this.createWithModel(model);
}
}
return valueModels;
}
public boolean deleteByInstanceId(Long instanceSeq) {
List<KnowledgeTagValueModel> list = queryByInstance(instanceSeq);
if (!ValidationUtil.isEmpty(list)) {
for (KnowledgeTagValueModel model : list) {
this.deleteBySeq(model.getSequenceNbr());
}
}
return true;
}
public List<KnowledgeTagValueModel> queryByInstance(Long instanceSeq) {
return this.queryForList("", false, instanceSeq);
}
public List<KnowledgeTagValueModel> queryTagValuesByDocId(Long docSeq) {
return Bean.toModels(this.getBaseMapper().queryTagValuesByDocId(docSeq), KnowledgeTagValueModel.class);
}
public List<KnowledgeTagValueModel> queryTagValuesByDocIds(Collection<Long> docSeqList) {
return Bean.toModels(this.getBaseMapper().queryTagValuesByDocIds(docSeqList), KnowledgeTagValueModel.class);
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* <h1><h1>
*
* @author tiantao
* @date 2020/12/7 11:47
*/
public class BaseUtil {
public static List<Long> getEntityIds(Collection<? extends BaseEntity> entityList){
List<Long> idList = new ArrayList<>();
if (!ValidationUtil.isEmpty(entityList)) {
entityList.forEach(entity -> idList.add(entity.getSequenceNbr()));
}
return idList;
}
public static List<Long> getModelIds(Collection<? extends BaseModel> entityList){
List<Long> idList = new ArrayList<>();
if (!ValidationUtil.isEmpty(entityList)) {
entityList.forEach(entity -> idList.add(entity.getSequenceNbr()));
}
return idList;
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* <h1>定制化配置信息加载器<h1>
*
* @author tiantao
* @date 2021/1/7 9:33
*/
@Getter
@Component
@PropertySource(value = "classpath:customization.properties", encoding = "UTF-8")
public class ConfigLoader {
private boolean sync;
private String tags;
private String projects;
private boolean tagWithName;
private String agencyCode;
@Value("${system-conf.rule.sync}")
public void setSync(boolean sync) {
this.sync = sync;
}
@Value("${system-conf.rule.source.tags}")
public void setTags(String tags) {
this.tags = tags;
}
@Value("${system-conf.rule.target.projects}")
public void setProjects(String projects) {
this.projects = projects;
}
@Value("${system-conf.rule.source.tag-with-name}")
public void setTagWithName(boolean tagWithName) {
this.tagWithName = tagWithName;
}
@Value("${system-conf.rule.target.agency-code}")
public void setAgencyCode(String agencyCode) {
this.agencyCode = agencyCode;
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import com.yeejoin.amos.component.feign.utils.FeignUtil;
import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
import com.yeejoin.amos.feign.privilege.model.RoleModel;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import sun.util.resources.cldr.vai.CalendarData_vai_Latn_LR;
import java.util.*;
/**
* @author 杨博超
* @ClassName DataFillter
* @Deacription 文档数据过参数组装
**/
public interface DataFillter {
String auditStatus = "auditStatus";
String docStatus = "docStatus";
String orgCode = "orgCode";
String noData = "noData";
String userId = "userId";
Map<String, Object> assembleParams(List<String> roleNameList, String orgCode);
/**
* @return java.util.Map<java.lang.String, java.lang.String>
* @author 杨博超
* @description 根据角色过滤数据
* @Param [auditStatus, docStatus]
**/
static Map<String, Object> dataFillterByRoleName(DataFillter dataFillter) {
Map<String, Object> dataPrivilegemap = new HashMap<>();
try {
AgencyUserModel agencyUserModel = FeignUtil.remoteCall(() -> Privilege.agencyUserClient.queryByUserId(RequestContext.getExeUserId()));
Map<Long, List<RoleModel>> map = agencyUserModel.getOrgRoles();
Collection<List<RoleModel>> roleCollection = map.values();
List<String> roleNameList = new ArrayList<>();
for (List<RoleModel> list : roleCollection)
for (RoleModel roleModel : list)
roleNameList.add(roleModel.getRoleName());
String orgCodce = null;
if (!ValidationUtil.isEmpty(agencyUserModel.getCompanyDepartments())
&& !ValidationUtil.isEmpty(agencyUserModel.getCompanyDepartments().values())
&& agencyUserModel.getCompanyDepartments().values().size() > 0
&& !ValidationUtil.isEmpty(agencyUserModel.getCompanyDepartments().values().iterator().next().iterator().next())) { //TODO 多部门多公司处理
orgCodce = agencyUserModel.getCompanyDepartments().values().iterator().next().iterator().next().getOrgCode();
} else if (!ValidationUtil.isEmpty(agencyUserModel.getCompanys())) {
orgCodce = agencyUserModel.getCompanys().iterator().next().getOrgCode();
}
if(ValidationUtil.isEmpty(orgCodce))
throw new RuntimeException("用户部门信息有误.");
dataPrivilegemap.put(DataFillter.orgCode, orgCodce);
if (!ValidationUtil.isEmpty(dataFillter))
dataPrivilegemap = dataFillter.assembleParams(roleNameList, orgCodce);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("获取数据用户角色信息失败.");
}
return dataPrivilegemap;
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import java.io.*;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class DataTransformator {
/**
* 多个集合合并成一个
*
* @param list
* @return
*/
public static Set<Long> objSet2LongSet(List<Set> list) {
Set<Long> res = new HashSet<>();
for (Set set : list) {
for (Object o : set) {
if (o instanceof Long) {
res.add((Long) o);
} else {
res.add(Long.parseLong(o.toString()));
}
}
}
return res;
}
/**
* html内容转text
*
* @param htmlContent html文本
* @return 文本
*/
public static String htmlContent2Text(String htmlContent) {
String res = "";
try {
Element body = Jsoup.parseBodyFragment(htmlContent, "UTF-8").body();
body.getElementsByTag("h1").remove();
res = body.text();
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
/**
* 文件对象转字节数组
*
* @throws IOException
*/
public static byte[] file2Bytes(File file) throws IOException {
try (FileInputStream fis = new FileInputStream(file)) {
return inputStream2Bytes(fis);
}
}
public static byte[] inputStream2Bytes(InputStream is) throws IOException {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
// 10M
byte[] bytes = new byte[1024 * 1024 * 10];
int len;
while ((len = is.read(bytes)) > 0) {
bos.write(bytes, 0, len);
}
return bos.toByteArray();
}
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import com.alibaba.fastjson.JSON;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.service.TagValueService;
import lombok.Data;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
/**
* 文档根据标签定制化排序
*
* @author tiantao
*/
public class DocSortUtil {
public static List<DocTagConfig> tagConfigList;
/**
* 正数恒定大于负数,1开头表正数,0开头表负数
*/
private static final String POSITIVE = "1";
private static final String NEGATIVE = "0";
private static final DecimalFormat LONG_FORMAT = new DecimalFormat("0000000000000000000");
static {
loadConfig();
}
public static void loadConfig() {
Object configObj = JSON.parse("{\n" +
" \"docTag\": [\n" +
" {\n" +
" \"sort\": 1,\n" +
" \"name\": \"死亡/失踪人数总和\",\n" +
" \"desc\": true,\n" +
" \"formula\": \"1319951584694317058+1319952328386359297+1319951672883752961+1319952397084864513\"\n" +
" },\n" +
" {\n" +
" \"sort\": 2,\n" +
" \"name\": \"受伤人数总和\",\n" +
" \"desc\": true,\n" +
" \"formula\": \"1319951506357301249+1319952269997453314+1319951885195227138+1319952474897592321\"\n" +
" },\n" +
" {\n" +
" \"sort\": 3,\n" +
" \"name\": \"参战总人数\",\n" +
" \"desc\": true,\n" +
" \"formula\": \"1319953830182072322\"\n" +
" },\n" +
" {\n" +
" \"sort\": 4,\n" +
" \"name\": \"处置时间\",\n" +
" \"desc\": true,\n" +
" \"formula\": \"1320181702299004930-1320181277285986305\"\n" +
" }\n" +
" ]\n" +
"}");
tagConfigList = new ArrayList<>();
if (configObj instanceof Map) {
Object docTag = ((Map) configObj).get("docTag");
if (docTag instanceof List) {
((List) docTag).forEach(tag -> {
try {
DocTagConfig docTagConfig = JSON.parseObject(JSON.toJSONString(tag), DocTagConfig.class);
tagConfigList.add(docTagConfig);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
tagConfigList.sort(Comparator.comparingInt(o -> o.sort));
}
public static String getSortStr(List<KnowledgeTagInstanceModel> docTags) {
Map<Object, KnowledgeTagInstanceModel> docTagsMap = Bean.listToMap(docTags, "tagSeq", KnowledgeTagInstanceModel.class);
StringBuilder res = new StringBuilder();
final boolean[] flag = {false};
tagConfigList.forEach(docTagConfig -> {
String formula = docTagConfig.formula;
List<String> tagSeqs = trimArray(formula.split("\\D"));
long sortValue = 0L;
for (int i = 0; i < tagSeqs.size(); i++) {
Long tagValue = getTagLongValue(tagSeqs.get(i), docTagsMap);
if (i > 0) {
String operator = formula.substring(formula.indexOf(tagSeqs.get(i - 1)) + tagSeqs.get(i - 1).length(), formula.indexOf(tagSeqs.get(i)));
switch (operator.trim()) {
case "+":
sortValue += tagValue;
break;
case "-":
sortValue -= tagValue;
break;
default:
throw new BadRequest("排序规则错误,无法识别的运算符");
}
} else {
sortValue = tagValue;
}
}
if (flag[0]) {
res.append("_");
}else {
flag[0] = true;
}
res.append(formatLong2SortStr(sortValue, docTagConfig.desc));
});
return res.toString();
}
/**
* 依据正负数/正倒序转换数值为字符串正整数
* @param sortValue 数值
* @param desc 是否倒序排列
* @return 字符串
*/
private static String formatLong2SortStr(long sortValue, boolean desc) {
if (desc) {
if (sortValue < 0) {
sortValue = 0 - sortValue;
return POSITIVE + LONG_FORMAT.format(sortValue);
} else {
sortValue = Long.MAX_VALUE - sortValue;
return NEGATIVE + LONG_FORMAT.format(sortValue);
}
} else {
if (sortValue < 0) {
sortValue = Long.MAX_VALUE - (0 - sortValue);
return NEGATIVE + LONG_FORMAT.format(sortValue);
} else {
return POSITIVE + LONG_FORMAT.format(sortValue);
}
}
}
/**
* 获取不同数据格式转化的long数值
* @param ts 标签实例id
* @param docTagsMap 标签实例map
* @return long值
*/
private static Long getTagLongValue(String ts, Map<Object, KnowledgeTagInstanceModel> docTagsMap) {
Long res = 0L;
try {
Long tagSeq = Long.valueOf(ts.trim());
KnowledgeTagInstanceModel instanceModel = docTagsMap.get(tagSeq);
if (null == instanceModel) {
return res;
}
List<KnowledgeTagValueModel> tagValues = instanceModel.getTagValues();
if (tagValues != null && tagValues.size() > 0) {
String fieldName = tagValues.get(0).getFieldName();
String tagValue = tagValues.get(0).getTagValue();
switch (fieldName) {
case TagValueService.VALUE_TAG_FIELD_DATE_H:
res = DateUtil.formatStringToDate(tagValue, null).getTime();
break;
case TagValueService.VALUE_TAG_FIELD_SINGLEVALUE:
res = Long.valueOf(tagValue);
break;
default:
throw new BadRequest("排序规则错误,不支持的数据类型");
}
}
} catch (BaseException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
/**
* 去除数组中的空值
* @param arr 数组
* @param <T> 泛型
* @return List
*/
private static <T> List<T> trimArray(T[] arr) {
List<T> res = new ArrayList<>();
for (T t : arr) {
if (!ValidationUtil.isEmpty(t)) {
res.add(t);
}
}
return res;
}
@Data
private static class DocTagConfig {
// 排序优先级
private int sort;
// 排序名称,方便读懂json与逻辑无关
private String name;
// 是否倒序
private boolean desc;
// 算法公式,格式为标签id用数学运算符连接,目前仅支持加减
private String formula;
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
public class FileExporter {
public static void exportFile(FileType fileType, String fileName, byte[] data, HttpServletResponse response) {
try {
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType(fileType.getContentType());
fileName = fileName.replaceAll("\\.", "·");
fileName = URLEncoder.encode(fileName + fileType.getFileSufix(), "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + "");
response.getOutputStream().write(data);
response.getOutputStream().flush();
} catch (Exception e) {
throw new BadRequest("导出文档出错");
} finally {
try {
response.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 文件类型
*/
public enum FileType {
// word文档
docx(".docx", "application/msword"),
// pdf文档
pdf(".pdf", "application/pdf");
private String fileSufix;
private String contentType;
private FileType(String fileSufix, String contentType) {
this.fileSufix = fileSufix;
this.contentType = contentType;
}
public String getFileSufix() {
return fileSufix;
}
public String getContentType() {
return contentType;
}
public static FileType getInstance(String fileSufix) {
FileType knowledgeRoleName = null;
for (FileType fileType : FileType.values()) {
if (fileType.getFileSufix().equals(fileSufix)) {
knowledgeRoleName = fileType;
}
}
return knowledgeRoleName;
}
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import org.docx4j.XmlUtils;
import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart;
import org.docx4j.wml.Numbering;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* 导入导出配置
* @author tiantao
*/
public class IOConfig {
/**
* 列表样式与前端匹配
*/
public static final Map<String, Long> NUM_MAP;
public static final Map<String, Long> ILV1_MAP;
/**
* 列表样式
*/
public static final NumberingDefinitionsPart INIT_NUMBERING_DEFINITION;
/**
* 图片服务器路径
*/
public static String PIC_URI = "http://39.98.246.31:8888/";
/**
* 图片服务器路由
*/
public static String PIC_ROUTER = "/fileURI/";
static {
Map<String, Long> tmp1 = new HashMap<>();
tmp1.put("ul", 1L);
tmp1.put("ol", 2L);
NUM_MAP = Collections.unmodifiableMap(tmp1);
Map<String, Long> tmp2 = new HashMap<>();
tmp2.put("square", 1L);
tmp2.put("disc", 2L);
tmp2.put("circle", 3L);
tmp2.put("lower-alpha", 1L);
tmp2.put("lower-roman", 2L);
tmp2.put("upper-alpha", 3L);
tmp2.put("upper-roman", 4L);
tmp2.put("lower-greek", 1L);
ILV1_MAP = Collections.unmodifiableMap(tmp2);
NumberingDefinitionsPart numberingDefinitionsPart = null;
try {
numberingDefinitionsPart = new NumberingDefinitionsPart();
InputStream is = IOConfig.class.getClassLoader().getResourceAsStream("office/listStyle.xml");
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuilder builder = new StringBuilder();
String str;
while ((str = reader.readLine()) != null) {
builder.append(str);
}
Numbering numbering = (Numbering) XmlUtils.unmarshalString(builder.toString());
numberingDefinitionsPart.setJaxbElement(numbering);
} catch (Exception e) {
e.printStackTrace();
}
INIT_NUMBERING_DEFINITION = numberingDefinitionsPart;
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class PropertiesLoader {
/**
* 图片服务器地址
*/
@Value("${pic-server.uri}")
private String picUri;
/**
* 图片服务器路由标识
*/
@Value("${pic-server.router}")
private String picRouter;
@PostConstruct
public void savePropertiesData(){
IOConfig.PIC_URI = picUri;
IOConfig.PIC_ROUTER = picRouter;
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeInteractionCount;
import com.yeejoin.amos.knowledgebase.face.service.DocAuditService;
import com.yeejoin.amos.knowledgebase.face.service.InteractionCountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 定时刷新标签等引用数量
*
* @author tiantao
*/
@Component
public class QuoteCountFlushTiming {
private static final AtomicBoolean needFlush = new AtomicBoolean(true);
private static final AtomicBoolean needPush2Rule = new AtomicBoolean(false);
@Autowired
private InteractionCountService interactionCountService;
@Autowired
private DocAuditService docAuditService;
@Autowired
private ConfigLoader configLoader;
public static void needFlushTag() {
needFlush.set(true);
}
public static void needRulePush() {
needPush2Rule.set(true);
}
@Scheduled(fixedRate = 5 * 1000)
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public void flushTagQuoteCount() {
if (needFlush.get()) {
needFlush.set(false);
interactionCountService.deleteAllTagQuote();
List<KnowledgeInteractionCount> allTagQuoteRecords = interactionCountService.getAllTagQuoteRecords();
if (!allTagQuoteRecords.isEmpty()) {
allTagQuoteRecords.forEach(e -> e.setAgencyCode(configLoader.getAgencyCode()));
boolean finished = interactionCountService.saveBatch(allTagQuoteRecords);
System.out.println("定时-刷新标签引用数-" + (finished ? "完成" : "失败"));
}
}
}
@Scheduled(fixedRate = 3 * 1000)
@Transactional(rollbackFor = {Exception.class, BaseException.class})
public void pushDocs2Rule() {
if (needPush2Rule.get()) {
needPush2Rule.set(false);
docAuditService.pushDocs2RuleByMQ();
System.out.println("定时-同步规则-完成");
}
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import com.google.common.base.Joiner;
import com.yeejoin.amos.component.feign.utils.FeignUtil;
import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
import com.yeejoin.amos.feign.privilege.model.CompanyModel;
import com.yeejoin.amos.feign.privilege.model.DepartmentModel;
import com.yeejoin.amos.feign.privilege.model.RoleModel;
import com.yeejoin.amos.feign.systemctl.Systemctl;
import com.yeejoin.amos.feign.systemctl.model.DictionarieValueModel;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.DataNotFound;
import java.util.*;
import java.util.stream.Collectors;
public class RemoteData {
/**
* 根据用户id Set集合查询对应的用户姓名
*
* @param userIds
* @return Map
*/
public static Map<String, String> getUserMap(Set<String> userIds) {
String join = Joiner.on(",").join(userIds);
try {
List<AgencyUserModel> agencyUserModelList = FeignUtil.remoteCall(() -> Privilege.agencyUserClient.queryByIds(join, false));
Map<String, String> userMap = agencyUserModelList.stream().collect(Collectors.toMap(AgencyUserModel::getUserId, AgencyUserModel::getRealName, (k1, k2) -> k2));
return userMap;
} catch (Exception e) {
}
return Collections.emptyMap();
}
/**
* 根据用户id查询对应的用户姓名
*
* @param userId
* @return Map
*/
public static String getUserRealNamById(String userId) {
if (ValidationUtil.isEmpty(userId)) {
return null;
}
try {
AgencyUserModel user = FeignUtil.remoteCall(() -> Privilege.agencyUserClient.queryByUserId(userId));
if (!ValidationUtil.isEmpty(user)) {
return user.getRealName();
}
} catch (Exception e) {
}
return null;
}
public static List<DictionarieValueModel> queryDict(String enumName) throws Exception {
return FeignUtil.remoteCall(() -> Systemctl.dictionarieClient.dictValues(enumName));
}
/**
* 获取当前操作者对应角色下的部门信息
*
* @param roleName 角色名
* @return 部门
*/
public static String getOrgWithCurUserAndRole(String roleName) {
Map<String, String> roleOrgMap = getCurUserOrgRoleMap();
return roleOrgMap.get(roleName);
}
private static Map<String, String> getCurUserOrgRoleMap() {
Map<String, String> resMap = new HashMap<>();
try {
AgencyUserModel agencyUserModel = FeignUtil.remoteCall(() -> Privilege.agencyUserClient.queryByUserId(RequestContext.getExeUserId()));
Map<Long, List<RoleModel>> rolesMap = agencyUserModel.getOrgRoles();
//组装部门信息为Map
Map<Long, DepartmentModel> departmentMap = new HashMap<>();
for (List<DepartmentModel> departments : agencyUserModel.getCompanyDepartments().values()) {
if (ValidationUtil.isEmpty(departments)) {
continue;
}
Iterator<DepartmentModel> iterator = departments.iterator();
while (iterator.hasNext()) {
DepartmentModel next = iterator.next();
if (!ValidationUtil.isEmpty(next)) {
departmentMap.put(next.getSequenceNbr(), next);
}
}
}
//组装单位信息为Map
Map<Long, CompanyModel> companyMap = new HashMap(Bean.listToMap(agencyUserModel.getCompanys(), "sequenceNbr", CompanyModel.class));
Map<Long, List<Long>> orgRoleMap = agencyUserModel.getOrgRoleSeqs();
for (Long orgKey : orgRoleMap.keySet()) {
List<RoleModel> roleModels = rolesMap.get(orgKey);
for (RoleModel roleModel : roleModels) {
String orgCode = null;
if (departmentMap.containsKey(orgKey)) {
orgCode = departmentMap.get(orgKey).getOrgCode();
} else if (companyMap.containsKey(orgKey)) {
orgCode = companyMap.get(orgKey).getOrgCode();
} else {
throw new DataNotFound("用户角色数据丢失");
}
resMap.put(roleModel.getRoleName(), orgCode);
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
return resMap;
}
}
package com.yeejoin.amos.knowledgebase.face.util;
import org.typroject.tyboot.core.foundation.utils.TreeNode;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* <h1><h1>
*
* @author tiantao
* @date 2020/12/7 14:23
*/
public class TreeUtil {
public static<T extends TreeNode> List<T> getAllChildren(Collection<T> trees) {
List<T> childrenNodes = new ArrayList<>();
if (!ValidationUtil.isEmpty(trees)) {
trees.forEach(node->{
childrenNodes.add(node);
if (!ValidationUtil.isEmpty(node.getChildren())) {
childrenNodes.addAll(getAllChildren(node.getChildren()));
}
});
}
return childrenNodes;
}
}
package com.yeejoin.amos.knowledgebase.face.util.excel;
import lombok.Data;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import java.util.List;
import java.util.Map;
@Data
public class ExcelImportConfig {
/**
* 终止行号
*/
private Integer stopColIndex;
/**
* 起始行
*/
private Integer startRowIndex;
/**
* 标签与列对应关系
*/
private Map<Long, List<Integer>> tagColumns;
/**
* 基本信息与列对应关系
*/
private Map<String, Integer> basicColumns;
/**
* 列数据格式化方式
*/
private Map<Integer, String> formatMap;
/**
* 列数据对应枚举
*/
private Map<Integer, String> enumMap;
/**
* 文档正文模板
*/
private String htmlModule;
/**
* 文档摘要模板
*/
private String summaryModule;
/**
* 文档标题列
*/
private Integer titleColumn;
/**
* 文档分类列
*/
private String directoryColumn;
/**
* 完整性检查
*
* @return 是否完整
*/
public boolean check() {
if (ValidationUtil.isEmpty(startRowIndex)
|| null == tagColumns
|| null == basicColumns
|| null == formatMap
|| null == enumMap
|| null == titleColumn
|| null == directoryColumn
|| ValidationUtil.isEmpty(htmlModule)) {
return false;
}
for (List<Integer> colIndexList : tagColumns.values()) {
if (ValidationUtil.isEmpty(colIndexList)
|| ValidationUtil.isEmpty(colIndexList.get(0))) {
return false;
}
for (Integer colIndex : colIndexList) {
if (ValidationUtil.isEmpty(colIndex)) {
return false;
}
}
}
for (Integer value : basicColumns.values()) {
if (ValidationUtil.isEmpty(value)) {
return false;
}
}
return true;
}
}
package com.yeejoin.amos.knowledgebase.face.util.excel;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsOptionModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsValue;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagInstance;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagValue;
import com.yeejoin.amos.knowledgebase.face.service.DocAuditService;
import com.yeejoin.amos.knowledgebase.face.service.DocContentService;
import com.yeejoin.amos.knowledgebase.face.service.TagInstanceService;
import com.yeejoin.amos.knowledgebase.face.service.TagValueService;
import com.yeejoin.amos.knowledgebase.face.util.DocSortUtil;
import lombok.Data;
import lombok.Getter;
import lombok.NonNull;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.text.DecimalFormat;
import java.util.*;
import java.util.regex.Pattern;
/**
* excel格式的战例解析--定制化
*
* @author tiantao
*/
public class ExcelParser {
private static final Pattern NUMBER_STRING_PATTEN = Pattern.compile("^[-\\+]?[\\d]*$");
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String DATE_FORMAT4_HTML = "yyyy-MM-dd HH:mm";
private static String getHolderRegex(Integer index) {
return "#\\{knowledge-" + index + "\\}";
}
private static String getHolderAllRegex() {
return "#\\{knowledge-\\d+\\}";
}
private static String removeAllHolder(String str) {
return str.replaceAll(getHolderAllRegex(), "");
}
private static String replaceHolder(String str, Integer index, String text) {
if (text == null) {
text = "";
}
return str.replaceAll(getHolderRegex(index), text);
}
/**
* 配置信息中涉及的标签列表以id为key
*/
private final Map<Long, KnowledgeTagModel> tagMap;
/**
* 导入配置
*/
private final ExcelImportConfig excelConfig;
/**
* 文档动态字段数据类型Map
*/
private final Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap;
/**
* 标签的值类型
*/
private final Map<Long, String> tagValueTypeMap;
/**
* 涉及的枚举信息,以分组为外层key,中文值为内层key,英文值为value
*/
private final Map<String, Map<String, String>> enumCnEnMap;
/**
* 标签的单位
*/
private final Map<Long, String> tagUnitMap;
/**
* 解析的数据及返回结果数据
*/
private List<ImportResult> ImportResults = new ArrayList<>();
private TablesDataList tablesDataList = new TablesDataList();
private Sequence sequence;
public List<ImportResult> getImportResults() {
return ImportResults;
}
private Date now = new Date();
private final String orgCode;
public ExcelParser(@NonNull Map<Long, KnowledgeTagModel> tagMap, @NonNull ExcelImportConfig excelConfig,
Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap, @NonNull Map<Long, String> tagValueTypeMap,
@NonNull Map<String, Map<String, String>> enumCnEnMap, @NonNull Map<Long, String> tagUnitMap,
@NonNull Sequence sequence, String orgCode) {
this.tagMap = Collections.unmodifiableMap(tagMap);
this.excelConfig = excelConfig;
this.fieldTypeMap = Collections.unmodifiableMap(fieldTypeMap);
this.tagValueTypeMap = Collections.unmodifiableMap(tagValueTypeMap);
this.enumCnEnMap = Collections.unmodifiableMap(enumCnEnMap);
this.tagUnitMap = Collections.unmodifiableMap(tagUnitMap);
this.sequence = sequence;
this.orgCode = orgCode;
}
/**
* 解析表格行
*
* @param row 表格行对象
*/
public void parseRow(Row row) {
try {
String docTitle = convertCellValueToString(row.getCell(excelConfig.getTitleColumn()));
// String docDirectory = convertCellValueToString(row.getCell(excelConfig.getDirectoryColumn()));
String docDirectory = excelConfig.getDirectoryColumn();
if (ValidationUtil.isEmpty(docTitle) || ValidationUtil.isEmpty(docDirectory)) {
throw new BadRequest("缺少基本信息");
}
Long directoryId = Long.parseLong(docDirectory);
// 创建文档
KnowledgeDocContent docContent = getNewDoc();
// 设置文档分类
docContent.setDocTitle(docTitle);
docContent.setDirectoryId(directoryId);
// 创建动态字段
List<KnowledgeDynamicsValue> dynamicsValues = getDynamicsValueList(row, docContent);
// 创建标签实例
List<KnowledgeTagInstance> tagInstances = new ArrayList<>();
// 以及标签值实例
List<KnowledgeTagValue> tagValues = new ArrayList<>();
Map<Long, List<Integer>> tagColumns = excelConfig.getTagColumns();
Map<Integer, String> formatMap = excelConfig.getFormatMap();
for (Long tagSeq : tagColumns.keySet()) {
if (!tagMap.containsKey(tagSeq) || !tagValueTypeMap.containsKey(tagSeq)) {
continue;
}
String valueType = tagValueTypeMap.get(tagSeq);
KnowledgeTagInstance tagInstance = getTagInstance(tagMap.get(tagSeq), docContent.getSequenceNbr());
switch (valueType) {
case "single": {
Integer valueColIndex = tagColumns.get(tagSeq).get(0);
String cellValue = convertCellValueToString(row.getCell(valueColIndex));
if (ValidationUtil.isEmpty(cellValue) || !NUMBER_STRING_PATTEN.matcher(cellValue).matches()) {
continue;
}
tagValues.add(getTagValue(tagInstance, TagValueService.VALUE_TAG_FIELD_SINGLEVALUE, cellValue));
replaceHtmlHolder(docContent, valueColIndex, cellValue, cellValue);
break;
}
case "date": {
Integer valueColIndex = tagColumns.get(tagSeq).get(0);
String cellValue = convertCellValueToString(row.getCell(valueColIndex));
if (ValidationUtil.isEmpty(cellValue) || !formatMap.containsKey(valueColIndex)) {
continue;
}
try {
Date date = DateUtil.formatStringToDate(cellValue, formatMap.get(valueColIndex));
cellValue = DateUtil.formatDate(date, DATE_FORMAT);
String htmlDateStr = DateUtil.formatDate(date, DATE_FORMAT4_HTML);
tagValues.add(getTagValue(tagInstance, TagValueService.VALUE_TAG_FIELD_DATE_H, cellValue));
replaceHtmlHolder(docContent, valueColIndex, htmlDateStr, cellValue);
} catch (Exception e) {
continue;
}
break;
}
case "text": {
Integer valueColIndex = tagColumns.get(tagSeq).get(0);
String cellValue = convertCellValueToString(row.getCell(valueColIndex));
if (ValidationUtil.isEmpty(cellValue)) {
continue;
}
tagValues.add(getTagValue(tagInstance, TagValueService.VALUE_TAG_FIELD_TEXT, cellValue));
replaceHtmlHolder(docContent, valueColIndex, cellValue, cellValue);
break;
}
case "range":
if (tagColumns.get(tagSeq).size() > 1) {
Integer valueColIndex1 = tagColumns.get(tagSeq).get(0);
String cellValue1 = convertCellValueToString(row.getCell(valueColIndex1));
Integer valueColIndex2 = tagColumns.get(tagSeq).get(1);
String cellValue2 = convertCellValueToString(row.getCell(valueColIndex2));
if (ValidationUtil.isEmpty(cellValue1) && ValidationUtil.isEmpty(cellValue2)
|| !NUMBER_STRING_PATTEN.matcher(cellValue1).matches() || !NUMBER_STRING_PATTEN.matcher(cellValue2).matches()) {
continue;
}
if (!ValidationUtil.isEmpty(cellValue1)) {
tagValues.add(getTagValue(tagInstance, TagValueService.VALUE_TAG_FIELD_RANGE_MIN, cellValue1));
replaceHtmlHolder(docContent, valueColIndex1, cellValue1, cellValue1);
}
if (!ValidationUtil.isEmpty(cellValue2)) {
tagValues.add(getTagValue(tagInstance, TagValueService.VALUE_TAG_FIELD_RANGE_MAX, cellValue2));
replaceHtmlHolder(docContent, valueColIndex2, cellValue2, cellValue2);
}
} else {
continue;
}
break;
default:
break;
}
tagInstances.add(tagInstance);
}
if(ValidationUtil.isEmpty(excelConfig.getTitleColumn())) {
throw new BadRequest("缺少标题所在的索引信息");
}
replaceHtmlHolder(docContent, excelConfig.getTitleColumn(), docTitle, docTitle);
docContent.setHtmlContent(removeAllHolder(docContent.getHtmlContent()));
docContent.setTextContent(removeAllHolder(docContent.getTextContent()));
String textContent = String.valueOf(docContent.getTextContent());
docContent.setSummary(textContent.substring(0,Math.min(300, textContent.length())));
List<KnowledgeTagInstanceModel> docTags = stuffTagValues(tagInstances, tagValues);
docContent.setSortStr(DocSortUtil.getSortStr(docTags));
this.tablesDataList.getDocContentList().add(docContent);
this.tablesDataList.getDynamicsValueList().addAll(dynamicsValues);
this.tablesDataList.getTagInstanceList().addAll(tagInstances);
this.tablesDataList.getTagValueList().addAll(tagValues);
this.ImportResults.add(new ImportResult(row.getRowNum()));
} catch (BaseException e) {
this.ImportResults.add(new ImportResult(row.getRowNum(), e.getMessage()));
} catch (Exception e) {
this.ImportResults.add(new ImportResult(row.getRowNum(), e.getStackTrace()[0].getMethodName()));
}
}
private List<KnowledgeTagInstanceModel> stuffTagValues(List<KnowledgeTagInstance> tagInstances, List<KnowledgeTagValue> tagValues) {
if (ValidationUtil.isEmpty(tagInstances)) {
return Collections.emptyList();
}
ArrayList<KnowledgeTagInstanceModel> resList = Bean.toModels(tagInstances, KnowledgeTagInstanceModel.class);
Map<Object, KnowledgeTagInstanceModel> instanceModelMap = Bean.listToMap(resList, "sequenceNbr", KnowledgeTagInstanceModel.class);
if (!ValidationUtil.isEmpty(tagValues)) {
tagValues.forEach(tagValue->{
KnowledgeTagInstanceModel instanceModel = instanceModelMap.get(tagValue.getInstanceSeq());
List<KnowledgeTagValueModel> tagValueModels = instanceModel.getTagValues();
if (null == tagValueModels) {
tagValueModels = new ArrayList<>();
instanceModel.setTagValues(tagValueModels);
}
tagValueModels.add(Bean.toModel(tagValue, new KnowledgeTagValueModel()));
});
}
return resList;
}
private void replaceHtmlHolder(KnowledgeDocContent docContent, Integer colIndex, String contentValue, String textValue) {
docContent.setHtmlContent(replaceHolder(docContent.getHtmlContent(), colIndex, contentValue));
docContent.setTextContent(replaceHolder(docContent.getTextContent(), colIndex, textValue));
}
/**
* 获取解析到的数据列表,并刷新以备下一波解析
*
* @return 数据列表合集
*/
public TablesDataList getAndFlushDatas() {
TablesDataList res = this.tablesDataList;
this.tablesDataList = new TablesDataList();
return res;
}
/**
* 创建一个新的文档
*
* @return
*/
private KnowledgeDocContent getNewDoc() {
KnowledgeDocContent docContent = new KnowledgeDocContent();
docContent.setSequenceNbr(sequence.nextId());
docContent.setRecDate(now);
docContent.setRecUserId(RequestContext.getExeUserId());
docContent.setUserId(RequestContext.getExeUserId());
docContent.setCreateTime(now);
docContent.setAgencyCode(RequestContext.getAgencyCode());
docContent.setOrgCode(this.orgCode);
docContent.setHtmlContent(excelConfig.getHtmlModule());
docContent.setTextContent(excelConfig.getSummaryModule());
docContent.setDocStatus(DocContentService.DOC_STATUS_UNPUBLISHED);
docContent.setAuditStatus(DocAuditService.DOC_AUDIT_STATUS_SAVED);
docContent.setHaveAttachment(false);
return docContent;
}
private List<KnowledgeDynamicsValue> getDynamicsValueList(Row row, KnowledgeDocContent docContent) {
List<KnowledgeDynamicsValue> dynamicsValues = new ArrayList<>();
Map<String, Integer> basicColumns = excelConfig.getBasicColumns();
Map<Integer, String> enumMap = excelConfig.getEnumMap();
for (String fieldName : basicColumns.keySet()) {
Integer colIndex = basicColumns.get(fieldName);
Cell cell = row.getCell(colIndex);
KnowledgeDynamicsOptionModel optionModel = fieldTypeMap.get(fieldName);
if (null == optionModel) {
throw new BadRequest("无法识别的字段名:" + fieldName);
}
String type = fieldTypeMap.get(fieldName).getDataType();
String cellValue = convertCellValueToString(cell);
if (type.toUpperCase().equals("ENUM")) {
if (!enumMap.containsKey(colIndex)) {
throw new BadRequest("缺少枚举字段的配置信息:" + fieldName);
}
String enumName = enumMap.get(colIndex);
cellValue = enumCnEnMap.get(enumName).get(cellValue);
}
dynamicsValues.add(getNewDynamicsField(optionModel, cellValue, docContent.getSequenceNbr()));
// 替换模板占位字符
replaceHtmlHolder(docContent, colIndex, cellValue, cellValue);
}
return dynamicsValues;
}
private KnowledgeDynamicsValue getNewDynamicsField(KnowledgeDynamicsOptionModel optionModel, String cellValue, Long docSequenceNbr) {
KnowledgeDynamicsValue dynamicsValue = new KnowledgeDynamicsValue();
dynamicsValue.setSequenceNbr(sequence.nextId());
dynamicsValue.setRecDate(now);
dynamicsValue.setRecUserId(RequestContext.getExeUserId());
dynamicsValue.setFieldName(optionModel.getFieldName());
dynamicsValue.setFieldValue(ValidationUtil.isEmpty(cellValue) ? "" : cellValue);
dynamicsValue.setDataType(optionModel.getDataType());
dynamicsValue.setAgencyCode(RequestContext.getAgencyCode());
dynamicsValue.setFieldLabel(optionModel.getFieldLabel());
dynamicsValue.setGroupSeq(optionModel.getGroupSeq());
dynamicsValue.setQueryStrategy(optionModel.getQueryStrategy());
dynamicsValue.setInstanceId(docSequenceNbr);
dynamicsValue.setOptionSeq(optionModel.getSequenceNbr());
return dynamicsValue;
}
KnowledgeTagInstance getTagInstance(KnowledgeTagModel tagModel, Long docSequenceNbr) {
KnowledgeTagInstance tagInstance = new KnowledgeTagInstance();
tagInstance.setSequenceNbr(sequence.nextId());
tagInstance.setRecDate(now);
tagInstance.setRecUserId(RequestContext.getExeUserId());
tagInstance.setAgencyCode(RequestContext.getAgencyCode());
tagInstance.setTagSeq(tagModel.getSequenceNbr());
tagInstance.setTargetSeq(docSequenceNbr);
tagInstance.setTagType(tagModel.getTagType());
tagInstance.setTagName(tagModel.getTagName());
tagInstance.setMarkingType(TagInstanceService.MARKING_TYPE_DOC);
return tagInstance;
}
/**
* 创建一个新的标签值实例
*
* @param tagInstance 实例对象
* @param value 值
* @return Model
*/
private KnowledgeTagValue getTagValue(KnowledgeTagInstance tagInstance, String fieldName, String value) {
KnowledgeTagValue tagValue = new KnowledgeTagValue();
tagValue.setSequenceNbr(sequence.nextId());
tagValue.setRecDate(now);
tagValue.setRecUserId(RequestContext.getExeUserId());
tagValue.setAgencyCode(RequestContext.getAgencyCode());
tagValue.setInstanceSeq(tagInstance.getSequenceNbr());
tagValue.setFieldName(fieldName);
tagValue.setTagValue(value);
tagValue.setUnit(tagUnitMap.get(tagInstance.getTagSeq()));
return tagValue;
}
/**
* 获取单元格的文本内容
*
* @param cell
* @return
*/
public static String convertCellValueToString(Cell cell) {
if (cell == null) {
return null;
}
String returnValue = null;
switch (cell.getCellType()) {
//数字
case NUMERIC:
Double doubleValue = cell.getNumericCellValue();
// 格式化科学计数法,取一位整数
DecimalFormat df = new DecimalFormat("0");
returnValue = df.format(doubleValue);
break;
//字符串
case STRING:
returnValue = cell.getStringCellValue().trim();
break;
//布尔
case BOOLEAN:
Boolean booleanValue = cell.getBooleanCellValue();
returnValue = booleanValue.toString();
break;
// 空值
case BLANK:
break;
// 公式
case FORMULA:
returnValue = cell.getCellFormula();
break;
// 故障
case ERROR:
break;
default:
}
return returnValue;
}
/**
* 数据涉及对象列表缓存
*/
@Getter
public class TablesDataList {
private List<KnowledgeDocContent> docContentList = new ArrayList<>();
private List<KnowledgeTagInstance> tagInstanceList = new ArrayList<>();
private List<KnowledgeTagValue> tagValueList = new ArrayList<>();
private List<KnowledgeDynamicsValue> dynamicsValueList = new ArrayList<>();
}
@Data
class ImportResult {
// 行号
private Integer rowIndex;
// 是否导入成功
private boolean success;
// 错误信息
private String errorMessege;
ImportResult(Integer rowIndex, String errorMessege) {
this.rowIndex = rowIndex;
this.success = false;
this.errorMessege = errorMessege;
}
ImportResult(Integer rowIndex) {
this.rowIndex = rowIndex;
this.success = true;
}
}
}
package com.yeejoin.amos.knowledgebase.face.util.pdf;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.IBlockElement;
import com.itextpdf.layout.element.IElement;
import com.itextpdf.layout.font.FontProvider;
import com.yeejoin.amos.knowledgebase.face.util.IOConfig;
import org.apache.commons.io.FileUtils;
import org.apache.xmlbeans.impl.validator.ValidatorUtil;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;
import org.springframework.core.io.ClassPathResource;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.List;
import static com.yeejoin.amos.knowledgebase.face.util.DataTransformator.file2Bytes;
import static com.yeejoin.amos.knowledgebase.face.util.DataTransformator.inputStream2Bytes;
/**
* pdf导出工具
*
* @author tiantao
*/
public class PdfBuilder {
private static final ConverterProperties CP;
static {
CP = new ConverterProperties();
// 设置字体
FontProvider fontProvider = new DefaultFontProvider(false, false, false);
boolean success = false;
try(InputStream font = PdfBuilder.class.getClassLoader().getResourceAsStream("fonts/msyh.ttf")) {
fontProvider.addFont(inputStream2Bytes(font));
success = true;
} catch (IOException e) {
e.printStackTrace();
}
if (!success) {
fontProvider.addStandardPdfFonts();
}
CP.setFontProvider(fontProvider);
CP.setCharset("utf-8");
}
public static byte[] html2Pdf(String html, String docTitle) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
org.jsoup.nodes.Document htmlDocument = Jsoup.parseBodyFragment(html, "UTF-8");
for (Element imgDocument : htmlDocument.getElementsByTag("img")) {
String src = imgDocument.attr("src");
if (null != src && src.length() > 0 && src.startsWith(IOConfig.PIC_ROUTER)) {
imgDocument.attr("src", src.replaceFirst(IOConfig.PIC_ROUTER, IOConfig.PIC_URI));
}
}
replaceElement(htmlDocument);
String htmlStr = htmlDocument.html();
PdfDocument pd = new PdfDocument(new PdfWriter(os));
pd.getDocumentInfo().setTitle(docTitle);
Document document = new Document(pd, PageSize.A4);
try {
// 设置页面边距 必须先设置边距,再添加内容,否则页边距无效
document.setMargins(20, 32, 20, 32);
List<IElement> list = HtmlConverter.convertToElements(htmlStr, CP);
for (IElement ie : list) {
document.add((IBlockElement) ie);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
document.close();
}
return os.toByteArray();
}
/**
* 替换显示效果不好的页面元素
*
* @param element body
*/
static void replaceElement(Element element) {
Elements inputs = element.getElementsByTag("input");
inputs.forEach(input -> {
String type = input.attr("type");
String value = input.attr("value");
if (type != null) {
switch (type.trim()) {
case "datetime-local":
input.removeAttr("type");
if (value != null && value.trim().length() > 0) {
input.attr("value", value.trim().replaceAll("/", "-").replaceAll("T", " "));
}
break;
case "text":
break;
default:
}
}
});
Elements textareas = element.getElementsByTag("textarea");
textareas.forEach(textarea -> {
String value = textarea.attr("value");
textarea.tagName("div").clearAttributes().attr("style", "font-size: 14px; line-height: 30px; padding: 0 7px; border-radius: 4px; border: solid 1px #dedede;");
String text = "";
if (value != null) {
text += text + value;
}
textarea.appendChild(new TextNode(text));
});
}
}
package com.yeejoin.amos.knowledgebase.face.util.sql;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Getter;
import java.util.Map;
import java.util.Set;
/**
* 自定义查询体
* @author tiantao
*/
@Getter
abstract public class BaseSqlCondition {
/**
* 条件类型
*/
private static final String CONDITION_TYPE = "conditionType";
private static final String BLOCK = "block";
private static final String CONDITION = "condition";
/**
* 逻辑关系
*/
private String logic;
BaseSqlCondition(Map<String, Object> resourceMap) {
this.logic = (String) resourceMap.get("logic");
}
public static BaseSqlCondition getInstance(Map<String, Object> resourceMap) {
String type = (String) resourceMap.get(CONDITION_TYPE);
BaseSqlCondition sqlCondition;
if (BLOCK.equals(type)) {
sqlCondition = new SqlBlock(resourceMap);
} else if (CONDITION.equals(type)) {
sqlCondition = new SqlStatement(resourceMap);
} else {
throw new RuntimeException("条件格式错误");
}
if (!sqlCondition.validate()) {
throw new RuntimeException("条件格式错误");
}
return sqlCondition;
}
public <T> void compose(QueryWrapper<T> queryWrapper) {
composeWrapper(queryWrapper, "and");
}
/**
* 组装条件到QueryWrapper
*
* @param queryWrapper 查询语句
* @param logic 与上个条件的逻辑关系
* @param <T> 泛型
*/
abstract <T> void composeWrapper(QueryWrapper<T> queryWrapper, String logic);
/**
* 检查数据格式及完整性
* @return 是否合格
*/
abstract boolean validate();
public abstract Set<String> getTagSeqs();
public abstract int getTotalStatement();
}
package com.yeejoin.amos.knowledgebase.face.util.sql;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.*;
/**
* 查询条件块
*/
class SqlBlock extends BaseSqlCondition {
private List<BaseSqlCondition> conditions;
SqlBlock(Map<String, Object> resourceMap) {
super(resourceMap);
this.conditions = new ArrayList<>();
Object children = resourceMap.get("children");
if (children instanceof List) {
try {
((List<Map<String, Object>>) children).forEach(map -> this.conditions.add(BaseSqlCondition.getInstance(map)));
} catch (ClassCastException e) {
throw new RuntimeException("条件格式错误");
}
} else {
throw new RuntimeException("条件格式错误");
}
}
@Override
<T> void composeWrapper(QueryWrapper<T> queryWrapper, String logic) {
switch (logic) {
case "or":
queryWrapper.or(this::composeChild);
break;
case "and":
default:
queryWrapper.and(this::composeChild);
break;
}
}
@Override
boolean validate() {
return conditions != null && !conditions.isEmpty();
}
@Override
public Set<String> getTagSeqs() {
Set<String> set = new HashSet<>();
conditions.forEach(condition -> set.addAll(condition.getTagSeqs()));
return set;
}
@Override
public int getTotalStatement() {
return conditions.stream().mapToInt(BaseSqlCondition::getTotalStatement).sum();
}
private <T> void composeChild(QueryWrapper<T> wrapper) {
final String[] nextLogic = {"and"};
conditions.forEach(condition -> {
condition.composeWrapper(wrapper, nextLogic[0]);
nextLogic[0] = condition.getLogic();
});
}
}
package com.yeejoin.amos.knowledgebase.face.util.sql;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Pattern;
/**
* 查询条件语句
*
* @author tiantao
*/
@Setter
@Accessors(chain = true)
class SqlStatement extends BaseSqlCondition {
static {
Map<String, String[]> map = new HashMap<>();
map.put(ValueType.date.name(), str2array("dateH"));
map.put(ValueType.text.name(), str2array("text"));
map.put(ValueType.single.name(), str2array("singleValue"));
map.put(ValueType.range.name(), str2array("rangeMin", "rangeMax"));
valueTypeFieldMap = Collections.unmodifiableMap(map);
map = new HashMap<>();
map.put(ValueType.date.name(), str2array(", MAX(CASE `tv`.`FIELD_NAME` WHEN 'dateH' THEN `tv`.`TAG_VALUE` ELSE NULL END) AS `dateH`"));
map.put(ValueType.text.name(), str2array(", MAX(CASE `tv`.`FIELD_NAME` WHEN 'text' THEN `tv`.`TAG_VALUE` ELSE NULL END) AS `text`"));
map.put(ValueType.single.name(), str2array(", MAX(CASE `tv`.`FIELD_NAME` WHEN 'singleValue' THEN `tv`.`TAG_VALUE` ELSE NULL END) AS `singleValue`"));
map.put(ValueType.range.name(), str2array(", MAX(CASE `tv`.`FIELD_NAME` WHEN 'rangeMin' THEN `tv`.`TAG_VALUE` ELSE NULL END) AS `rangeMin`",
", MAX(CASE `tv`.`FIELD_NAME` WHEN 'rangeMax' THEN `tv`.`TAG_VALUE` ELSE NULL END) AS `rangeMax`"));
valueTagFieldSqlMap = Collections.unmodifiableMap(map);
}
private static final Map<String, String[]> valueTypeFieldMap;
private static final Map<String, String[]> valueTagFieldSqlMap;
private static final Pattern numberPattern = Pattern.compile("^[-\\+]?[\\d]+[.]?[\\d]*$");
private static final Pattern datePattern = Pattern.compile("^[\\d]{4}-[\\d]{2}-[\\d]{2} [\\d]{2}:[\\d]{2}:[\\d]{2}$");
/**
* 字段类型
*/
private FieldType fieldType;
/**
* 字段名/标签id
*/
private String expandField;
/**
* 值类型
*/
private ValueType valueType;
/**
* 值
*/
private List<String> values;
/**
* 模糊匹配
*/
private boolean fuzzy;
private static String[] str2array(String... str) {
return str;
}
SqlStatement(Map<String, Object> resourceMap) {
super(resourceMap);
this.setFieldType(FieldType.valueOf((String) resourceMap.get("fieldType")))
.setExpandField((String) resourceMap.get("expandFiled"))
.setValues((List<String>) resourceMap.get("values"))
.setFuzzy(Boolean.parseBoolean(String.valueOf(resourceMap.get("fuzzy"))));
if (this.fieldType != FieldType.textTag) {
this.setValueType(ValueType.valueOf((String) resourceMap.get("valueType")));
}
}
@Override
<T> void composeWrapper(QueryWrapper<T> queryWrapper, String logic) {
switch (logic) {
case "or":
queryWrapper.or();
case "and":
default:
composeThis(queryWrapper);
break;
}
}
@Override
boolean validate() {
if (fieldType == null || expandField == null || values == null) {
return false;
}
if (fieldType != FieldType.textTag && valueType == null) {
return false;
}
boolean emptyVal = ValidationUtil.isEmpty(values);
if (fieldType != FieldType.textTag) {
switch (valueType) {
case text:
//格式化
if (!emptyVal && !ValidationUtil.isEmpty(values.get(0))) {
values.add(0, stringParamFormat(values.get(0)));
values.remove(1);
}
break;
case date:
// 校验并格式化
if (!emptyVal && !ValidationUtil.isEmpty((values.get(0)))) {
paramValidate(datePattern, values.get(0));
values.add(0, stringParamFormat(values.get(0)));
values.remove(1);
}
if (!emptyVal && values.size() > 1 && !ValidationUtil.isEmpty((values.get(1)))) {
paramValidate(datePattern, values.get(1));
values.add(1, stringParamFormat(values.get(1)));
values.remove(2);
}
break;
case range:
case single:
// 校验
if (!emptyVal && !ValidationUtil.isEmpty((values.get(0)))) {
paramValidate(numberPattern, values.get(0));
}
if (!emptyVal && values.size() > 1 && !ValidationUtil.isEmpty((values.get(1)))) {
paramValidate(numberPattern, values.get(1));
}
break;
default:
}
}
if (valuesIsEmpty(true)) {
switch (this.fieldType) {
case valueTag:
this.fieldType = FieldType.textTag;
break;
case textTag:
break;
case content:
case baseInfo:
throw new BadRequest("条件搜索值为空");
default:
}
}
return true;
}
@Override
public Set<String> getTagSeqs() {
Set<String> set = new HashSet<>();
if (fieldType == FieldType.textTag || fieldType == FieldType.valueTag) {
set.add(expandField);
}
return set;
}
@Override
public int getTotalStatement() {
return 1;
}
/**
* value判空
*
* @param all 全空
* @return
*/
private boolean valuesIsEmpty(boolean all) {
if (all) {
if (ValidationUtil.isEmpty(values)) {
return true;
} else {
boolean empty0 = ValidationUtil.isEmpty(values.get(0));
if (values.size() > 1) {
return empty0 && ValidationUtil.isEmpty(values.get(1));
}
return empty0;
}
} else {
if (ValidationUtil.isEmpty(values)) {
return true;
} else {
boolean empty0 = ValidationUtil.isEmpty(values.get(0));
if (values.size() > 1) {
return !(empty0 || ValidationUtil.isEmpty(values.get(1)));
}
return empty0;
}
}
}
private <T> void composeThis(QueryWrapper<T> queryWrapper) {
switch (fieldType) {
case content:
composeContentCondition(queryWrapper);
break;
case baseInfo:
queryWrapper.inSql("SEQUENCE_NBR", buildBaseInfoSql());
break;
case textTag:
queryWrapper.inSql("SEQUENCE_NBR", buildTagExistSql());
break;
case valueTag:
queryWrapper.inSql("SEQUENCE_NBR", buildTagValueSql());
break;
default:
}
}
private <T> void composeContentCondition(QueryWrapper<T> wrapper) {
switch (valueType) {
case text: {
String text = "";
if (values != null && values.get(0) != null) {
text = values.get(0);
}
if (fuzzy) {
wrapper.like(expandField, text);
} else {
wrapper.eq(expandField, text);
}
break;
}
case date: {
String min = values.get(0);
String max = values.get(1);
paramValidate(datePattern, min, max);
if (min != null) {
wrapper.ge(expandField, min);
}
if (max != null) {
wrapper.le(expandField, max);
}
break;
}
default:
}
}
private String buildBaseInfoSql() {
StringBuilder builder = new StringBuilder("SELECT INSTANCE_ID FROM `knowledge_dynamics_value` WHERE FIELD_NAME = '")
.append(expandField).append("'");
getChildCondition("FIELD_VALUE").forEach(child -> builder.append(" AND ").append(child));
return builder.toString();
}
private String buildTagValueSql() {
StringBuilder builder = new StringBuilder("SELECT TARGET_SEQ FROM (SELECT `ti`.`SEQUENCE_NBR` AS `SEQUENCE_NBR`, `ti`.`TAG_SEQ` AS `TAG_SEQ`, `ti`.`TARGET_SEQ` AS `TARGET_SEQ`");
Arrays.asList(valueTagFieldSqlMap.get(valueType.name())).forEach(fieldSql -> builder.append(fieldSql));
builder.append(" FROM `knowledge_tag_instance` `ti` INNER JOIN `knowledge_tag_value` `tv` ON `ti`.`SEQUENCE_NBR` = `tv`.`INSTANCE_SEQ` WHERE `ti`.`MARKING_TYPE` = 'DOC' AND `ti`.`TAG_SEQ` = ")
.append(expandField).append(" AND (");
AtomicBoolean needOr = new AtomicBoolean(false);
Arrays.asList(valueTypeFieldMap.get(valueType.name())).forEach(fieldName -> {
if (needOr.get()) {
builder.append(" OR");
} else {
needOr.set(true);
}
builder.append(" `tv`.FIELD_NAME = '").append(fieldName).append("'");
});
builder.append(")").append(" GROUP BY `ti`.`SEQUENCE_NBR`) AS tmp").append(" WHERE");
AtomicBoolean needAnd = new AtomicBoolean(false);
getChildCondition(valueTypeFieldMap.get(valueType.name())).forEach(child -> {
if (needAnd.get()) {
builder.append(" AND");
} else {
needAnd.set(true);
}
builder.append(" ").append(child);
});
return builder.toString();
}
private String buildTagExistSql() {
return "SELECT TARGET_SEQ FROM `knowledge_tag_instance` WHERE TAG_SEQ = " + expandField;
}
private List<String> getChildCondition(String... fields) {
List<String> res = new ArrayList<>();
switch (valueType) {
case text: {
if (fuzzy) {
res.add(fields[0] + " like '%" + stringParamFormat(values.get(0)) + "%'");
} else {
res.add(fields[0] + " = '" + stringParamFormat(values.get(0)) + "'");
}
break;
}
case single: {
String min = values.get(0);
String max = values.get(1);
if (min != null && min.length() > 0) {
res.add("CONVERT(" + fields[0] + ",DECIMAL)" + " >= " + min);
}
if (max != null && max.length() > 0) {
res.add("CONVERT(" + fields[0] + ",DECIMAL)" + " <= " + max);
}
break;
}
case date: {
String min = values.get(0);
if (min != null && min.length() > 0) {
res.add(fields[0] + " >= '" + min + "'");
}
if (values.size() > 1) {
String max = values.get(1);
if (max != null && max.length() > 0) {
res.add(fields[0] + " <= '" + max + "'");
}
}
break;
}
case range: {
String min = values.get(0);
String max = values.get(1);
if (fuzzy) {
if (min != null && min.length() > 0) {
res.add(fields[1] + " >= " + min);
}
if (max != null && max.length() > 0) {
res.add(fields[0] + " <= " + max);
}
} else {
if (min != null && min.length() > 0) {
res.add(fields[0] + " <= " + min);
}
if (max != null && max.length() > 0) {
res.add(fields[1] + " >= " + max);
}
}
break;
}
default:
}
return res;
}
/**
* sql参数防注入格式化
*/
private static String stringParamFormat(String str) {
if (null != str) {
return str.replace("'", "''");
} else {
return "null";
}
}
// 参数格式校验
private static void paramValidate(Pattern pattern, String... numbers) {
for (String number : numbers) {
if (number == null || number.length() == 0) {
continue;
}
if (!pattern.matcher(number).matches()) {
throw new RuntimeException("数值格式有误");
}
}
}
enum FieldType {
/**
* 文档表字段
*/
content,
/**
* 动态字段
*/
baseInfo,
/**
* 文本标签
*/
textTag,
/**
* 标签值
*/
valueTag
}
enum ValueType {
text, date, single, range
}
}
package com.yeejoin.amos.knowledgebase.face.util.word;
import com.yeejoin.amos.knowledgebase.face.util.IOConfig;
import lombok.Data;
import lombok.experimental.Accessors;
import org.docx4j.XmlUtils;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.openpackaging.parts.relationships.Namespaces;
import org.docx4j.relationships.Relationship;
import org.docx4j.wml.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;
import javax.xml.bind.JAXBException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
/**
* word导出工具
* @author tiantao
*/
public class DocxBuilder {
private WordprocessingMLPackage wordMLPackage;
private ObjectFactory factory;
private int docPrId = 1;
private int cNvPrId = 2;
public DocxBuilder(String html) {
Document document = Jsoup.parseBodyFragment(html, "UTF-8");
try {
wordMLPackage = WordprocessingMLPackage.createPackage();
factory = Context.getWmlObjectFactory();
wordMLPackage.getMainDocumentPart().addTargetPart(IOConfig.INIT_NUMBERING_DEFINITION);
addElement(wordMLPackage.getMainDocumentPart(), null, document.body(), new TextStyle(), new ParagraphStyle());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成word字节数据
*
* @return 字节数组
*/
public byte[] build() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
wordMLPackage.save(outputStream);
} catch (Docx4JException e) {
e.printStackTrace();
}
return outputStream.toByteArray();
}
/**
* 递归解析html元素,根据不同的标签名插入不同数据到word中
*
* @param parent word区域
* @param current 当前操作行
* @param node html元素节点
* @param textStyle 当前文本样式
* @param paragraphStyle 当前段落样式
*/
private void addElement(ContentAccessor parent, ContentAccessor current, Node node, TextStyle textStyle, ParagraphStyle paragraphStyle) {
if (node instanceof TextNode) {
addText(current, ((TextNode) node).text().trim(), textStyle);
} else {
switch (node.nodeName()) {
case "body":
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "div":
if (!(parent instanceof Tc)) {
paragraphStyle = getDivParagraphStyle(node.attr("data-level"), node.attr("style"));
}
if (isTableDiv(node)) {
addChildElement(parent, current, node, textStyle, paragraphStyle);
} else {
textStyle = getDivTextStyle(node.attr("data-level"));
current = factory.createP();
((P) current).setPPr(paragraphStyle.getPPr());
addChildElement(parent, current, node, textStyle, paragraphStyle);
parent.getContent().add(current);
}
break;
case "h1":
case "h2":
case "h3":
case "h4":
case "h5":
case "h6":
case "h7":
case "h8":
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "em":
textStyle = new TextStyle(textStyle).setItalic(true);
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "span":
textStyle = getSpanTextStyle(textStyle, node.attr("style"));
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "strong":
textStyle = new TextStyle(textStyle).setBold(true);
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "sup":
textStyle = new TextStyle(textStyle).setTextScript("superscript");
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "sub":
textStyle = new TextStyle(textStyle).setTextScript("subscript");
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "label":
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "ul":
case "ol":
paragraphStyle = getListParagraphStyle(node.nodeName(), node.attr("style"));
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "li":
current = factory.createP();
((P) current).setPPr(paragraphStyle.getPPr());
addChildElement(parent, current, node, textStyle, paragraphStyle);
parent.getContent().add(current);
break;
case "table":
addChildElement(parent, current, node, textStyle, paragraphStyle);
break;
case "caption":
paragraphStyle = getTableCaptionParagraphStyle();
textStyle = new TextStyle().setFontSize("14").setAsciiFont("黑体").setBold(true).setUnderscore(true);
current = factory.createP();
((P) current).setPPr(paragraphStyle.getPPr());
addChildElement(parent, current, node, textStyle, paragraphStyle);
parent.getContent().add(current);
break;
case "tbody":
addTable(parent, node);
break;
case "img":
addImg(parent, current, node.attr("src"), node.attr("alt"));
break;
case "a":
addA(current, node.attr("href"), ((Element) node).text());
break;
default:
System.err.println(node.nodeName());
}
}
}
private void addChildElement(ContentAccessor parent, ContentAccessor current, Node node, TextStyle textStyle, ParagraphStyle paragraphStyle) {
for (Node child : node.childNodes()) {
addElement(parent, current, child, textStyle, paragraphStyle);
}
}
/**
* 加入文字
*
* @param current 当前行
* @param text 文本
* @param textStyle 文字样式
*/
private void addText(ContentAccessor current, String text, TextStyle textStyle) {
if (text.length() > 0) {
R r = getR(text, textStyle);
if (current instanceof P) {
P p = (P) current;
p.getContent().add(r);
}
}
}
/**
* 加入表格
*
* @param parent word区域
* @param node table元素
*/
private void addTable(ContentAccessor parent, Node node) {
// 二维元素列表
List<LinkedList<Element>> elementCollection = new ArrayList<>();
// 二维Tc列表
List<List<Tc>> tcCollection = new ArrayList<>();
// 元素坐标-偏移量
Map<TcPosition, Integer> positionOffsetMap = new HashMap<>();
// 待合并单元格
Map<TcPosition, List<TcPosition>> mergeMap = new HashMap<>();
// 拆解表格数据并分析表格合并项
disassembleAndMergeAnalysis(node, elementCollection, positionOffsetMap, mergeMap);
// TODO-表格样式解析
Tbl table = factory.createTbl();
// 采用默认表格样式
setTableStyle(table, !(parent instanceof Tc));
parent.getContent().add(table);
// 解析二维元素列表
parseTdList2Table(table, elementCollection, tcCollection);
// 单元格合并
mergeTc(mergeMap, tcCollection);
}
/**
* 拆解表格数据并分析表格合并项
*
* @param node html表格元素
* @param elementCollection 二维元素列表
* @param positionOffsetMap 元素坐标-偏移量
* @param mergeMap 待合并单元格
*/
private void disassembleAndMergeAnalysis(Node node, List<LinkedList<Element>> elementCollection, Map<TcPosition, Integer> positionOffsetMap, Map<TcPosition, List<TcPosition>> mergeMap) {
// 最大列数
int maxColNum = 0;
Elements trs = ((Element) node).getElementsByTag("tr");
List<Element> trList = new ArrayList<>();
for (Element tr : trs) {
if (tr.parent() == node) {
trList.add(tr);
}
}
for (int row = 0; row < trList.size(); row++) {
LinkedList<Element> nodeList = new LinkedList<>();
elementCollection.add(nodeList);
Element tr = trList.get(row);
Elements tds = tr.getElementsByTag("td");
List<Element> tdList = new ArrayList<>();
Iterator<Element> tdIterator = tds.iterator();
while (tdIterator.hasNext()) {
Element td = tdIterator.next();
if (td.parent() == tr) {
tdList.add(td);
}
}
maxColNum = Math.max(maxColNum, tdList.size());
for (int col = 0; col <= maxColNum; col++) {
TcPosition position = new TcPosition(row, col);
if (positionOffsetMap.containsKey(position)) {
Integer count = positionOffsetMap.get(position);
for (int i = 0; i < count; i++) {
nodeList.add(null);
}
}
if (col >= tdList.size()) {
continue;
}
Element td = tdList.get(col);
nodeList.add(td);
int rowspan = 1;
int colspan = 1;
if (td.attributes().hasKey("rowspan")) {
rowspan = Integer.parseInt(td.attributes().get("rowspan"));
}
if (td.attributes().hasKey("colspan")) {
colspan = Integer.parseInt(td.attributes().get("colspan"));
}
if (rowspan > 1 || colspan > 1) {
List<TcPosition> voidTcPositionList = new ArrayList<>();
for (int i = 0; i < rowspan; i++) {
for (int j = 0; j < colspan; j++) {
TcPosition newPosition = new TcPosition(row + i, col + j);
if (!newPosition.equals(position)) {
voidTcPositionList.add(newPosition);
}
if (i == 0 && j == 1) {
positionOffsetMap.put(newPosition, colspan - 1);
}
if (j == 0 && i > 0) {
positionOffsetMap.put(newPosition, colspan);
}
}
}
mergeMap.put(position, voidTcPositionList);
}
}
}
}
/**
* 解析二维td元素列表
*
* @param table word表格对象
* @param elementCollection 二维td元素列表
* @param tcCollection Tc对象存储
*/
private void parseTdList2Table(Tbl table, List<LinkedList<Element>> elementCollection, List<List<Tc>> tcCollection) {
for (LinkedList<Element> elementList : elementCollection) {
Tr tr = factory.createTr();
table.getContent().add(tr);
List<Tc> tcList = new ArrayList<>();
tcCollection.add(tcList);
for (Element element : elementList) {
// TODO-单元格样式解析
Tc tc = factory.createTc();
// 默认单元格样式
setTcStyle(tc);
tr.getContent().add(tc);
tcList.add(tc);
ParagraphStyle paragraphStyle = new ParagraphStyle().setLineIndentation(0L).setTcLine(true).setLineAlign("center");
if (isTableDiv(element)) {
addChildElement(tc, null, element, new TextStyle(), paragraphStyle);
// 必须增加空行,否则文件打开报错
tc.getContent().add(factory.createP());
} else if (isDivParent(element)) {
addChildElement(tc, null, element, new TextStyle(), paragraphStyle);
} else {
P p = factory.createP();
p.setPPr(paragraphStyle.getPPr());
tc.getContent().add(p);
if (null != element) {
addChildElement(tc, p, element, new TextStyle(), paragraphStyle);
}
}
}
}
}
// 表格单元格合并
private void mergeTc(Map<TcPosition, List<TcPosition>> mergeMap, List<List<Tc>> tcCollection) {
for (TcPosition startPosition : mergeMap.keySet()) {
TcPr tcpr = getTcPr(tcCollection.get(startPosition.row).get(startPosition.col));
TcPrInner.VMerge vMerge = factory.createTcPrInnerVMerge();
vMerge.setVal("restart");
tcpr.setVMerge(vMerge);
TcPrInner.HMerge hMerge = factory.createTcPrInnerHMerge();
hMerge.setVal("restart");
tcpr.setHMerge(hMerge);
List<TcPosition> continuesPositions = mergeMap.get(startPosition);
for (TcPosition continuePosition : continuesPositions) {
tcpr = getTcPr(tcCollection.get(continuePosition.row).get(continuePosition.col));
if (continuePosition.col.equals(startPosition.col)) {
vMerge = factory.createTcPrInnerVMerge();
vMerge.setVal("continue");
tcpr.setVMerge(vMerge);
hMerge = factory.createTcPrInnerHMerge();
hMerge.setVal("restart");
tcpr.setHMerge(hMerge);
} else {
hMerge = factory.createTcPrInnerHMerge();
hMerge.setVal("continue");
tcpr.setHMerge(hMerge);
}
}
}
}
/**
* 判断元素是否为table父节点
*
* @param node 元素
* @return 是否为table父节点
*/
private boolean isTableDiv(Node node) {
if (null == node) {
return false;
}
for (Node child : node.childNodes()) {
if ("table".equals(child.nodeName())) {
return true;
}
}
return false;
}
/**
* 判断元素是否为div父节点
*
* @param node 元素
* @return 是否为div父节点
*/
private boolean isDivParent(Node node) {
if (null == node) {
return false;
}
for (Node child : node.childNodes()) {
if ("div".equals(child.nodeName())) {
return true;
}
}
return false;
}
/**
* 加入图片
*
* @param parent word区域
* @param current 当前块
* @param src 图片地址
* @param alt 图片名
*/
private void addImg(ContentAccessor parent, ContentAccessor current, String src, String alt) {
if (null != src) {
try {
byte[] bytes = getRemotePic2Bytes(src);
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
Inline inline = imagePart.createImageInline(alt, alt, docPrId++, cNvPrId++, false, 5000);
Drawing drawing = factory.createDrawing();
drawing.getAnchorOrInline().add(inline);
if (current != null) {
if (current instanceof P) {
current.getContent().add(drawing);
} else {
P p = factory.createP();
current.getContent().add(p);
p.getContent().add(drawing);
}
} else {
P p = factory.createP();
parent.getContent().add(p);
p.getContent().add(drawing);
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 加入超链接
*
* @param current 当前行
* @param href 链接地址
* @param text 文本
*/
private void addA(ContentAccessor current, String href, String text) {
if (null == current) {
return;
}
Relationship relationship = new org.docx4j.relationships.ObjectFactory().createRelationship();
wordMLPackage.getMainDocumentPart().getRelationshipsPart().addRelationship(relationship);
relationship.setType(Namespaces.HYPERLINK);
relationship.setTarget(href);
relationship.setTargetMode("External");
StringBuilder builder = new StringBuilder();
builder.append("<w:hyperlink r:id=\"");
builder.append(relationship.getId());
builder.append("\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" ");
builder.append("xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" >");
builder.append("<w:r><w:rPr><w:rStyle w:val=\"Hyperlink\" />");
builder.append("<w:rFonts w:ascii=\"");
builder.append("Times New Roman");
builder.append("\" w:hAnsi=\"");
builder.append("Times New Roman");
builder.append("\" w:eastAsia=\"");
builder.append("宋体");
builder.append("\" w:hint=\"eastAsia\"/>");
builder.append("<w:sz w:val=\"");
builder.append("24");
builder.append("\"/><w:szCs w:val=\"");
builder.append("24");
builder.append("\"/></w:rPr><w:t>");
builder.append(text);
builder.append("</w:t></w:r></w:hyperlink>");
try {
P.Hyperlink link = (P.Hyperlink) XmlUtils.unmarshalString(builder.toString());
current.getContent().add(link);
} catch (JAXBException e) {
e.printStackTrace();
}
}
private R getR(String textVal, TextStyle textStyle) {
Text text = factory.createText();
text.setValue(textVal);
R r = factory.createR();
r.setRPr(textStyle.getRPr());
r.getContent().add(text);
return r;
}
/**
* 获取远程图片转为字节数组
*
* @param picUrl 图片链接
* @return 包含图片字节数据的字节数组
*/
private static byte[] getRemotePic2Bytes(String picUrl) {
byte[] picBytes = {};
try {
if (picUrl.startsWith(IOConfig.PIC_ROUTER)) {
picUrl = picUrl.replaceFirst(IOConfig.PIC_ROUTER, IOConfig.PIC_URI);
}
URL url = new URL(picUrl);
URLConnection con = url.openConnection();
// 设置请求超时为5s
con.setConnectTimeout(5 * 1000);
// 输入流
InputStream is = con.getInputStream();
// 1K的数据缓冲
byte[] current = new byte[1024];
// 读取到的数据长度
int len;
while ((len = is.read(current)) != -1) {
picBytes = Arrays.copyOf(picBytes, picBytes.length + len);
System.arraycopy(current, 0, picBytes, picBytes.length - len, len);
}
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return picBytes;
}
private ParagraphStyle getDivParagraphStyle(String level, String style) {
ParagraphStyle paragraphStyle = new ParagraphStyle();
if (null != level && level.trim().length() > 0) {
long lv = Long.parseLong(level.trim());
if (lv == 1L) {
paragraphStyle.setLineAlign("center");
} else {
paragraphStyle.setLineLv(lv - 2L);
}
if (lv < 4) {
paragraphStyle.setLineIndentation(0L);
}
return paragraphStyle;
} else {
Map<String, String> styleMap = styleStr2Map(style);
if (styleMap.containsKey("text-align")) {
paragraphStyle.setLineAlign(styleMap.get("text-align"));
}
}
return paragraphStyle;
}
private ParagraphStyle getListParagraphStyle(String listType, String style) {
String listStyle = styleStr2Map(style).get("list-style-type");
Long numId =1L;
if (IOConfig.NUM_MAP.containsKey(listType)) {
numId = IOConfig.NUM_MAP.get(listType);
}
Long ilv1Id = 1L;
if (IOConfig.NUM_MAP.containsKey(listStyle)) {
ilv1Id = IOConfig.NUM_MAP.get(listStyle);
}
numId = IOConfig.INIT_NUMBERING_DEFINITION.restart(numId == null ? 1L : numId, ilv1Id == null ? 1L : ilv1Id, 1L);
return new ParagraphStyle()
.setList(true)
.setNumId(numId).setIlv1Id(ilv1Id);
}
private ParagraphStyle getTableCaptionParagraphStyle() {
return new ParagraphStyle().setLineAlign("center").setLineIndentation(0L);
}
private TextStyle getDivTextStyle(String level) {
TextStyle textStyle = new TextStyle();
if (null != level && level.trim().length() > 0) {
switch (level.trim()) {
case "1":
textStyle.setFontSize("24px").setBold(true).setEastAsiaFont("黑体");
break;
case "2":
textStyle.setFontSize("18px").setBold(true).setEastAsiaFont("黑体");
break;
default:
}
}
return textStyle;
}
private TextStyle getSpanTextStyle(TextStyle textStyle, String style) {
textStyle = new TextStyle(textStyle);
Map<String, String> spanStyleMap = styleStr2Map(style);
for (String key : spanStyleMap.keySet()) {
switch (key.trim().toLowerCase()) {
case "text-decoration":
textStyle.setUnderscore(true);
break;
case "color":
textStyle.setFontColor(spanStyleMap.get(key));
break;
case "font-size":
textStyle.setFontSize(spanStyleMap.get(key));
break;
default:
System.err.println(key);
break;
}
}
return textStyle;
}
/**
* 设置表格默认样式
*
* @param table 表格对象
* @param needInd 是否缩进
*/
private void setTableStyle(Tbl table, boolean needInd) {
TblPr tablePr = factory.createTblPr();
table.setTblPr(tablePr);
TblBorders borders = factory.createTblBorders();
tablePr.setTblBorders(borders);
CTBorder border = new CTBorder();
border.setColor("auto");
border.setSz(new BigInteger("4"));
border.setSpace(new BigInteger("0"));
border.setVal(STBorder.SINGLE);
borders.setBottom(border);
borders.setLeft(border);
borders.setRight(border);
borders.setTop(border);
borders.setInsideH(border);
borders.setInsideV(border);
if (needInd) {
TblWidth tblInd = factory.createTblWidth();
tblInd.setW(new BigInteger("600"));
tablePr.setTblInd(tblInd);
}
}
/**
* 设置表格默认样式
*
* @param tc 单元格格对象
*/
private void setTcStyle(Tc tc) {
CTVerticalJc vjc = factory.createCTVerticalJc();
vjc.setVal(STVerticalJc.CENTER);
getTcPr(tc).setVAlign(vjc);
}
private TcPr getTcPr(Tc tc) {
TcPr tcpr = tc.getTcPr();
if (null == tcpr) {
tcpr = factory.createTcPr();
tc.setTcPr(tcpr);
}
return tcpr;
}
/**
* style属性字符串转map
*
* @param style style属性值
* @return Map
*/
private static Map<String, String> styleStr2Map(String style) {
Map<String, String> styleMap = new HashMap<>();
if (null != style) {
String[] styleItems = style.split(";");
for (String styleItem : styleItems) {
String[] styleEntry = styleItem.split(":");
if (styleEntry.length == 2) {
styleMap.put(styleEntry[0].trim(), styleEntry[1].trim());
}
}
}
return styleMap;
}
/**
* 文本样式
*/
@Data
@Accessors(chain = true)
class TextStyle {
// 加粗
private boolean bold;
// 斜体
private boolean italic;
// 下划线
private boolean underscore;
// 角标
private String textScript;
// 中文字体
private String asciiFont = "Times New Roman";
// 英文字体
private String eastAsiaFont = "宋体";
// 字体大小
private String fontSize = "16px";
// 字体颜色
private String fontColor;
TextStyle() {
}
TextStyle(TextStyle old) {
this.setBold(old.bold)
.setFontColor(old.fontColor)
.setFontSize(old.fontSize)
.setItalic(old.italic)
.setUnderscore(old.underscore)
.setTextScript(old.textScript);
}
RPr getRPr() {
RPr rpr = factory.createRPr();
// 字体
RFonts font = new RFonts();
rpr.setRFonts(font);
font.setAscii(asciiFont);
font.setEastAsia(eastAsiaFont);
// 字号
HpsMeasure measure = new HpsMeasure();
rpr.setSzCs(measure);
rpr.setSz(measure);
measure.setVal(BigInteger.valueOf((Long.parseLong(fontSize.toLowerCase().replaceAll("px", "")) - 4) * 2));
// 加粗/斜体/下划线
if (this.bold) {
rpr.setB(new BooleanDefaultTrue());
}
if (this.italic) {
rpr.setI(new BooleanDefaultTrue());
}
if (this.underscore) {
U u = factory.createU();
u.setVal(UnderlineEnumeration.SINGLE);
rpr.setU(u);
}
// 字体颜色
Color color = factory.createColor();
rpr.setColor(color);
color.setVal(this.fontColor);
// 设置角标
if (null != this.textScript) {
CTVerticalAlignRun ctVerticalAlignRun = factory.createCTVerticalAlignRun();
STVerticalAlignRun stVerticalAlignRun = STVerticalAlignRun.fromValue(textScript);
ctVerticalAlignRun.setVal(stVerticalAlignRun);
rpr.setVertAlign(ctVerticalAlignRun);
}
return rpr;
}
}
/**
* 段落样式
*/
@Data
@Accessors(chain = true)
class ParagraphStyle {
// 缩进
private Long lineIndentation = 200L;
// 对齐方式
private String lineAlign = "left";
// 大纲级别
private Long lineLv;
private boolean isTcLine;
// 是否为列表
private boolean list;
// 列表样式
private Long numId;
private Long ilv1Id;
PPr getPPr() {
PPr ppr = factory.createPPr();
// 列表样式
if (this.list) {
PPrBase.NumPr numPr = factory.createPPrBaseNumPr();
ppr.setNumPr(numPr);
// The <w:numId> element
PPrBase.NumPr.NumId numIdElement = factory.createPPrBaseNumPrNumId();
numPr.setNumId(numIdElement);
numIdElement.setVal(BigInteger.valueOf(this.numId));
// The <w:ilv> element
PPrBase.NumPr.Ilvl ilvlElement = factory.createPPrBaseNumPrIlvl();
numPr.setIlvl(ilvlElement);
ilvlElement.setVal(BigInteger.valueOf(this.ilv1Id));
}
// 文本对齐
Jc jc = factory.createJc();
ppr.setJc(jc);
switch (lineAlign) {
case "center":
jc.setVal(JcEnumeration.CENTER);
break;
case "right":
jc.setVal(JcEnumeration.RIGHT);
break;
default:
jc.setVal(JcEnumeration.LEFT);
}
// 首行缩进
PPrBase.Ind ind = factory.createPPrBaseInd();
ppr.setInd(ind);
ind.setFirstLineChars(BigInteger.valueOf(lineIndentation));
// 大纲级别
if (null != lineLv) {
PPrBase.OutlineLvl outlineLvl = factory.createPPrBaseOutlineLvl();
ppr.setOutlineLvl(outlineLvl);
outlineLvl.setVal(BigInteger.valueOf(this.lineLv));
}
PPrBase.Spacing spacing = factory.createPPrBaseSpacing();
// 行间距 [自动auto] [最小atLeast] [固定exact 1磅=20 1行=100 单倍行距=240]
spacing.setLineRule(STLineSpacingRule.AUTO);
if (isTcLine) {
spacing.setBefore(BigInteger.valueOf(100L));
spacing.setAfter(BigInteger.valueOf(100L));
}
ppr.setSpacing(spacing);
return ppr;
}
}
/**
* 表格单元格坐标
*/
class TcPosition {
private Integer row;
private Integer col;
public TcPosition(Integer row, Integer col) {
this.row = row;
this.col = col;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof TcPosition)) {
return false;
}
TcPosition that = (TcPosition) o;
return Objects.equals(row, that.row) &&
Objects.equals(col, that.col);
}
@Override
public int hashCode() {
return Objects.hash(row, col);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>amos-biz-boot</artifactId>
<groupId>com.amosframework.boot</groupId>
<version>1.0.0</version>
</parent>
<artifactId>amos-boot-system-knowledgebase</artifactId>
<dependencies>
<dependency>
<groupId>com.amosframework.boot</groupId>
<artifactId>amos-boot-module-knowledgebase-biz</artifactId>
<version>${amos-biz-boot.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.yeejoin.amos;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.typroject.tyboot.core.restful.exception.GlobalExceptionHandler;
/**
* Created by magintursh on 2017-05-03.
*/
@EnableScheduling
@EnableAsync
@MapperScan({"com.yeejoin.amos.knowledgebase.face.orm.dao*",
"org.typroject.tyboot.face.*.orm.dao*",
"org.typroject.tyboot.core.auth.face.orm.dao*",
"org.typroject.tyboot.component.*.face.orm.dao*"})
@SpringBootApplication(scanBasePackages = {"com.yeejoin.amos","org.typroject"})
public class KnowledgebaseApplication {
private static final Logger logger = LoggerFactory.getLogger(KnowledgebaseApplication.class);
public static void main(String[] args) throws UnknownHostException{
ConfigurableApplicationContext context = new SpringApplicationBuilder(KnowledgebaseApplication.class).web(WebApplicationType.SERVLET).run(args);
GlobalExceptionHandler.setAlwaysOk(true);
Environment env = context.getEnvironment();
String ip = InetAddress.getLocalHost().getHostAddress();
String port = env.getProperty("server.port");
String path = env.getProperty("server.servlet.context-path");
GlobalExceptionHandler.setAlwaysOk(true);
logger.info("\n----------------------------------------------------------\n\t" +
"Application Amos-Biz-Boot is running! Access URLs:\n\t" +
"Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" +
"----------------------------------------------------------");
}
}
##开发环境配置文件
# jdbc_config
spring.datasource.url=jdbc:mysql://172.16.10.66:3306/knowledge_base?characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#not support for spring-boot v1.5+, use org.apache.tomcat.jdbc.pool.DataSource by default.
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
# REDIS (RedisProperties)
spring.redis.database=0
spring.redis.host=172.16.10.85
spring.redis.port=6379
spring.redis.password=amos2019Redis
spring.redis.timeout=0
#注册中心地址
eureka.client.service-url.defaultZone =http://172.16.10.72:10001/eureka/
eureka.instance.prefer-ip-address=true
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
eureka.instance.health-check-url=http://172.16.3.75:${server.port}${server.servlet.context-path}/actuator/health
eureka.instance.metadata-map.management.context-path=${server.servlet.context-path}/actuator
eureka.instance.status-page-url=http://172.16.3.75:${server.port}${server.servlet.context-path}/actuator/info
eureka.instance.metadata-map.management.api-docs=http://172.16.3.75:${server.port}${server.servlet.context-path}/swagger-ui.html
#ES
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
#emqx v4.0
emqx.clean-session=true
emqx.client-id=${spring.application.name}-${random.int[1024,65536]}
emqx.broker=tcp://172.16.10.66:1883
emqx.user-name=super
emqx.password=a123456
emqx.max-inflight=1000
#DIY
diy-config.report.record-data=false
#pic server uri
pic-server.uri=http://39.98.246.31:8888/
#pic router mark
pic-server.router=/fileURI/
\ No newline at end of file
##测试环境配置文件
# jdbc_config
spring.datasource.url=jdbc:mysql://172.16.10.85:3306/knowledge_base?characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=knowledge_base
spring.datasource.password=knowledge_base
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#not support for spring-boot v1.5+, use org.apache.tomcat.jdbc.pool.DataSource by default.
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
# REDIS (RedisProperties)
spring.redis.database=0
spring.redis.host=172.16.10.85
spring.redis.port=6379
spring.redis.password=amos2019Redis
spring.redis.timeout=0
#注册中心地址
eureka.client.service-url.defaultZone =http://172.16.10.72:10001/eureka/
eureka.instance.prefer-ip-address=true
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
eureka.instance.health-check-url=http://172.16.3.75:${server.port}${server.servlet.context-path}/actuator/health
eureka.instance.metadata-map.management.context-path=${server.servlet.context-path}/actuator
eureka.instance.status-page-url=http://172.16.3.75:${server.port}${server.servlet.context-path}/actuator/info
eureka.instance.metadata-map.management.api-docs=http://172.16.3.75:${server.port}${server.servlet.context-path}/swagger-ui.html
#ES
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
#emqx v4.0
emqx.clean-session=true
emqx.client-id=${spring.application.name}-${random.int[1024,65536]}
emqx.broker=tcp://172.16.10.85:1883
emqx.user-name=super
emqx.password=a123456
emqx.max-inflight=1000
#DIY
diy-config.report.record-data=false
#pic server uri
pic-server.uri=http://39.98.246.31:8888/
#pic router mark
pic-server.router=/fileURI/
\ No newline at end of file
##测试环境配置文件
# jdbc_config
spring.datasource.url=jdbc:mysql://172.16.10.66:3306/knowledge_base?characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#not support for spring-boot v1.5+, use org.apache.tomcat.jdbc.pool.DataSource by default.
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
# REDIS (RedisProperties)
spring.redis.database=0
spring.redis.host=172.16.10.85
spring.redis.port=6379
spring.redis.password=amos2019Redis
spring.redis.timeout=0
#注册中心地址
eureka.client.service-url.defaultZone =http://172.16.10.72:10001/eureka/
eureka.instance.prefer-ip-address=true
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
eureka.instance.health-check-url=http://172.16.3.75:${server.port}${server.servlet.context-path}/actuator/health
eureka.instance.metadata-map.management.context-path=${server.servlet.context-path}/actuator
eureka.instance.status-page-url=http://172.16.3.75:${server.port}${server.servlet.context-path}/actuator/info
eureka.instance.metadata-map.management.api-docs=http://172.16.3.75:${server.port}${server.servlet.context-path}/swagger-ui.html
#ES
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=172.16.10.66:9300
spring.elasticsearch.rest.uris=http://172.16.10.66:9200
#emqx v4.0
emqx.clean-session=true
emqx.client-id=${spring.application.name}-${random.int[1024,65536]}
emqx.broker=tcp://172.16.10.85:1883
emqx.user-name=super
emqx.password=a123456
emqx.max-inflight=1000
#DIY
diy-config.report.record-data=true
#pic server uri
pic-server.uri=http://39.98.246.31:8888/
#pic router mark
pic-server.router=/fileURI/
\ No newline at end of file
spring.application.name=AMOS-API-KNOWLEDGEBASE
server.port=30009
server.servlet.context-path=/knowledgebase
spring.profiles.active=dev
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
#默认就是2048 byte
server.compression.min-response-size=2048
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#spring.jackson.default-property-inclusion=non_null
logging.config=classpath:logback-${spring.profiles.active}.xml
# mybatis-plus
mybatis-plus.type-aliases-super-type=org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity
mybatis-plus.global-config.db-config.id-type=id_worker
mybatis-plus.mapper-locations=classpath:mapper/*
\ No newline at end of file
##############################
# 系统定制化参数配置
##############################
# 1.文档标签推送至规则
# 文档发布是否同步至规则系统
system-conf.rule.sync=true
# 当前运行项目的AgencyCode
system-conf.rule.target.agency-code=STATE_GRID
# 同步至规则系统的哪些包下
system-conf.rule.target.projects=消防设备维保规范,消防设备巡查规范
# 哪些标签要同步至规则系统
system-conf.rule.source.tags=1347462653454360577
# 规则条目对应标签的名称+值,还是只是标签值
system-conf.rule.source.tag-with-name=false
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/** 知识库系统换流站基础数据 */
INSERT INTO knowledge_dynamics_group (SEQUENCE_NBR,REC_DATE,REC_USER_ID,GROUP_NAME,FRONT_END_CONFIG,FUNCTIONAL,AGENCY_CODE,APP_KEY) VALUES
(5434532453,'2020-08-05 00:51:01','super','换流站-消防知识基础信息',NULL,'DOC_BASEINFO','STATE_GRID','studio_normalapp_2681691'),
(76543543543,'2020-08-05 00:51:01','super','值标签配置信息',NULL,'VALUE_TAG_CONFIG','STATE_GRID','ALL');
INSERT INTO knowledge_dynamics_option (SEQUENCE_NBR,REC_DATE,REC_USER_ID,FIELD_NAME,FIELD_LABEL,DATA_TYPE,FUNCTIONAL,FRONT_END_CONFIG,AGENCY_CODE,APP_KEY,GROUP_SEQ,QUERY_STRATEGY) VALUES
(7346543654,'2020-08-14 01:28:27','super','valueTagCode','代码','String','VALUE_TAG_CONFIG',NULL,'STATE_GRID','ALL',76543543543,'eq'),
(7654643654,'2020-08-14 01:28:27','super','unit','计量单位','String','VALUE_TAG_CONFIG',NULL,'STATE_GRID','ALL',76543543543,'eq'),
(654365432543,'2020-08-14 01:28:27','super','valueType','值类型','Enum','VALUE_TAG_CONFIG',NULL,'STATE_GRID','ALL',76543543543,'eq'),
(654564278743,'2020-08-14 01:28:27','super','focus','重点关注','Enum','VALUE_TAG_CONFIG',NULL,'STATE_GRID','ALL',76543543543,'eq'),
(1340895557509468161,'2020-12-21 13:43:08','1675605','releaseDate','发布日期','datetime','DOC_BASEINFO','{"typeData":"","showTable":true,"showFilter":true,"required":true,"order":3,"tableWidth":200}','STATE_GRID','studio_normalapp_2681691',5434532453,'between'),
(1340895818688778242,'2020-12-21 13:44:10','1675605','excuteDate','实施日期','datetime','DOC_BASEINFO','{"typeData":"","showTable":true,"showFilter":true,"required":true,"order":4,"tableWidth":150}','STATE_GRID','studio_normalapp_2681691',5434532453,'between');
/** 知识库系统基础数据 */
-- ----------------------------
-- Records of knowledge_dynamics_group
-- ----------------------------
insert into `knowledge_dynamics_group` (`SEQUENCE_NBR`, `REC_DATE`, `REC_USER_ID`, `GROUP_NAME`, `FRONT_END_CONFIG`, `FUNCTIONAL`, `AGENCY_CODE`, `APP_KEY`) values('323453543','2020-08-05 00:51:01','super','江西电建-文档基础信息',NULL,'DOC_BASEINFO','JEPCC','studio_normalapp_2075166');
insert into `knowledge_dynamics_group` (`SEQUENCE_NBR`, `REC_DATE`, `REC_USER_ID`, `GROUP_NAME`, `FRONT_END_CONFIG`, `FUNCTIONAL`, `AGENCY_CODE`, `APP_KEY`) values('76543543543','2020-08-05 00:51:01','super','值标签配置信息',NULL,'VALUE_TAG_CONFIG','JEPCC','ALL');
-- ----------------------------
-- Records of knowledge_dynamics_option
-- ----------------------------
INSERT INTO `knowledge_dynamics_option` VALUES ('7346543654', '2020-08-14 01:28:27', 'super', 'valueTagCode', '代码', 'String', 'VALUE_TAG_CONFIG', null, 'JEPCC', 'ALL', '76543543543', 'eq');
INSERT INTO `knowledge_dynamics_option` VALUES ('7654643654', '2020-08-14 01:28:27', 'super', 'unit', '计量单位', 'String', 'VALUE_TAG_CONFIG', null, 'JEPCC', 'ALL', '76543543543', 'eq');
INSERT INTO `knowledge_dynamics_option` VALUES ('654365432543', '2020-08-14 01:28:27', 'super', 'valueType', '值类型', 'Enum', 'VALUE_TAG_CONFIG', null, 'JEPCC', 'ALL', '76543543543', 'eq');
INSERT INTO `knowledge_dynamics_option` VALUES ('654564278743', '2020-08-14 01:28:27', 'super', 'focus', '重点关注', 'Enum', 'VALUE_TAG_CONFIG', null, 'JEPCC', 'ALL', '76543543543', 'eq');
INSERT INTO `knowledge_dynamics_option` VALUES ('1298523118831329281', '2020-08-26 15:39:26', '1764021', 'docTitle', '名称', 'String', 'DOC_BASEINFO', '{\"typeData\":\"\",\"showTable\":true,\"showFilter\":true,\"required\":true,\"order\":1,\"tableWidth\":200}', 'JEPCC', 'studio_normalapp_2075166', '323453543', 'like');
INSERT INTO `knowledge_dynamics_option` VALUES ('1298523383538049026', '2020-08-26 15:31:15', '1764021', 'code', '编码', 'String', 'DOC_BASEINFO', '{\"typeData\":\"\",\"showTable\":true,\"showFilter\":true,\"required\":true,\"order\":2,\"tableWidth\":100}', 'JEPCC', 'studio_normalapp_2075166', '323453543', 'like');
INSERT INTO `knowledge_dynamics_option` VALUES ('1298525405276463105', '2020-08-26 15:39:17', '1764021', 'industryType', '行业类型', 'Enum', 'DOC_BASEINFO', '{\"typeData\":\"INDUSTRY_TYPE\",\"showTable\":true,\"showFilter\":true,\"required\":true,\"order\":3,\"tableWidth\":100}', 'JEPCC', 'studio_normalapp_2075166', '323453543', 'eq');
INSERT INTO `knowledge_dynamics_option` VALUES ('1298525933062512641', '2020-08-26 15:41:23', '1764021', 'type', '文件类型', 'Enum', 'DOC_BASEINFO', '{\"typeData\":\"FILE_TYPE\",\"showTable\":true,\"showFilter\":true,\"required\":true,\"order\":4,\"tableWidth\":120}', 'JEPCC', 'studio_normalapp_2075166', '323453543', 'eq');
INSERT INTO `knowledge_dynamics_option` VALUES ('1299312756790472705', '2020-08-28 19:47:56', '2148609', 'docTitle', '战例名称', 'String', 'DOC_BASEINFO', '{\"typeData\":\"\",\"showTable\":true,\"showFilter\":true,\"required\":true,\"order\":1,\"tableWidth\":200}', 'SXS', 'studio_normalapp_2198572', '5434532453', 'like');
INSERT INTO `knowledge_dynamics_option` VALUES ('1299313207984336898', '2020-08-28 19:49:44', '2148609', 'type', '警情类型', 'Enum', 'DOC_BASEINFO', '{\"typeData\":\"POLICE_CASES_TYPE\",\"showTable\":true,\"showFilter\":true,\"required\":true,\"order\":3,\"tableWidth\":100}', 'SXS', 'studio_normalapp_2198572', '5434532453', 'eq');
INSERT INTO `knowledge_dynamics_option` VALUES ('1299313211968925697', '2020-08-28 19:49:44', '2148609', 'address', '警情地点', 'String', 'DOC_BASEINFO', '{\"typeData\":\"\",\"showTable\":true,\"showFilter\":true,\"required\":true,\"order\":2,\"tableWidth\":200}', 'SXS', 'studio_normalapp_2198572', '5434532453', 'like');
/* 表结构 */
-- ----------------------------
-- Table structure for knowledge_doc_category
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_doc_category`;
CREATE TABLE `knowledge_doc_category` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`CATEGORY_NAME` varchar(100) NOT NULL COMMENT '分组名称',
`PARENT_ID` bigint(20) NOT NULL,
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='知识库文档分类';
-- ----------------------------
-- Table structure for knowledge_doc_comments
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_doc_comments`;
CREATE TABLE `knowledge_doc_comments` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`DOC_SEQ` bigint(20) NOT NULL COMMENT '文档id',
`USER_ID` varchar(64) NOT NULL COMMENT '发表评论的用户id',
`COMMENTS_CONTENT` varchar(500) NOT NULL COMMENT '评论内容',
`PARENT_ID` bigint(20) NOT NULL COMMENT '父级评论id',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='知识库评论信息';
-- ----------------------------
-- Table structure for knowledge_doc_content
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_doc_content`;
CREATE TABLE `knowledge_doc_content` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) DEFAULT NULL,
`HTML_CONTENT` mediumtext NOT NULL COMMENT '富文本内容存储',
`DOC_STATUS` varchar(32) NOT NULL COMMENT '文档状态:发布,未发布',
`USER_ID` varchar(64) NOT NULL COMMENT '发布者',
`CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
`HAVE_ATTACHMENT` bit(1) NOT NULL COMMENT '是否有附件',
`SUMMARY` varchar(500) NOT NULL COMMENT '摘要',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
`AUDIT_STATUS` varchar(64) DEFAULT NULL COMMENT '审核状态:通过,驳回,待审核,待提交',
`REJECTION_COMMENT` varchar(500) DEFAULT NULL COMMENT '驳回意见',
`AUDITOR_USER_ID` varchar(64) DEFAULT NULL COMMENT '审核人id',
`ORG_CODE` varchar(64) NOT NULL COMMENT '数据过滤选项',
`TEXT_CONTENT` MEDIUMTEXT NULL COMMENT '纯文本内容',
`SORT_STR` VARCHAR(200) NULL COMMENT '自定义排序规则生成文本值',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='知识库文档存储';
-- ----------------------------
-- Table structure for knowledge_dynamics_group
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_dynamics_group`;
CREATE TABLE `knowledge_dynamics_group` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`GROUP_NAME` varchar(100) NOT NULL COMMENT '分组名称',
`FRONT_END_CONFIG` text COMMENT '前端配置',
`FUNCTIONAL` varchar(100) NOT NULL COMMENT '功能标识',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
`APP_KEY` varchar(100) NOT NULL COMMENT 'APPKEY',
PRIMARY KEY (`SEQUENCE_NBR`),
UNIQUE KEY `knowledge_dynamics_group_FUNCTIONAL_IDX` (`FUNCTIONAL`,`APP_KEY`) USING BTREE
) ENGINE=InnoDB COMMENT='知识库系统动态选项配置的分组,用于区分不同功能的字段列表';
-- ----------------------------
-- Table structure for knowledge_dynamics_option
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_dynamics_option`;
CREATE TABLE `knowledge_dynamics_option` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`FIELD_NAME` varchar(100) NOT NULL COMMENT '字段名',
`FIELD_LABEL` varchar(100) NOT NULL COMMENT '中文名',
`DATA_TYPE` varchar(100) NOT NULL COMMENT '数据类型:文本,数字,枚举,日期',
`FUNCTIONAL` varchar(64) NOT NULL COMMENT '功能标识',
`FRONT_END_CONFIG` varchar(1000) DEFAULT NULL,
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
`APP_KEY` varchar(100) NOT NULL COMMENT '业务项目标识',
`GROUP_SEQ` bigint(20) NOT NULL COMMENT '字段分组主键',
`QUERY_STRATEGY` varchar(100) DEFAULT NULL COMMENT '查询策略;全等,模糊,区间',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='知识库系统动态选项配置,多用于动态字段配置';
-- ----------------------------
-- Table structure for knowledge_dynamics_value
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_dynamics_value`;
CREATE TABLE `knowledge_dynamics_value` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`FIELD_NAME` varchar(100) NOT NULL COMMENT '字段名',
`FIELD_LABEL` varchar(100) NOT NULL COMMENT '中文名',
`DATA_TYPE` varchar(100) NOT NULL COMMENT '数据类型:文本,数字,枚举,日期',
`GROUP_SEQ` bigint(20) NOT NULL COMMENT '字段分组id',
`FIELD_VALUE` varchar(500) NOT NULL COMMENT '动态配置字段的值',
`INSTANCE_ID` bigint(20) NOT NULL COMMENT '关联的对象id,即文档id',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
`OPTION_SEQ` bigint(20) NOT NULL COMMENT '字段定义信息的主键',
`QUERY_STRATEGY` varchar(100) NOT NULL COMMENT '查询策略;全等,模糊,区间',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='知识库系统动态选项配置的实例值';
-- ----------------------------
-- Table structure for knowledge_interaction_count
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_interaction_count`;
CREATE TABLE `knowledge_interaction_count` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`OPERATE_TYPE` varchar(64) NOT NULL COMMENT '操作类型(标签所有情况引用,标签被已审核/已发布文档引用,文档引用)',
`ENTITY_TYPE` varchar(100) NOT NULL COMMENT '关联对象类型',
`ENTITY_ID` varchar(100) NOT NULL COMMENT '关联对象id',
`OPERATE_COUNT` int(11) NOT NULL COMMENT '计数',
`AGENCY_CODE` varchar(100) DEFAULT NULL COMMENT '机构编号',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='知识库内容交互计数表';
-- ----------------------------
-- Table structure for knowledge_interaction_record
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_interaction_record`;
CREATE TABLE `knowledge_interaction_record` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`USER_ID` varchar(64) NOT NULL COMMENT '用户id',
`OPERATE_TYPE` varchar(64) NOT NULL COMMENT '操作类型(点赞,吐槽,收藏)',
`ENTITY_TYPE` varchar(100) NOT NULL COMMENT '关联对象类型',
`ENTITY_ID` varchar(100) NOT NULL COMMENT '关联对象id',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='知识库内容交互记录';
-- ----------------------------
-- Table structure for knowledge_tag
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_tag`;
CREATE TABLE `knowledge_tag` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`TAG_NAME` varchar(100) NOT NULL COMMENT '标签名称',
`TAG_CODE` varchar(100) DEFAULT NULL COMMENT '标签编码',
`TAG_TYPE` varchar(100) NOT NULL COMMENT '标签分类:文本标签,值标签,',
`TAG_STATUS` varchar(32) NOT NULL COMMENT '标签状态:启用,禁用',
`TAG_REMARK` varchar(100) DEFAULT NULL COMMENT '标签备注',
`CREATOR` varchar(32) NOT NULL COMMENT '创建人',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
PRIMARY KEY (`SEQUENCE_NBR`) USING BTREE
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='标签库';
-- ----------------------------
-- Table structure for knowledge_tag_group
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_tag_group`;
CREATE TABLE `knowledge_tag_group` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`GROUP_NAME` varchar(100) NOT NULL COMMENT '标签分类名称',
`PARENT_ID` bigint(20) NOT NULL COMMENT '父级分类id',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='标签分组';
-- ----------------------------
-- Table structure for knowledge_tag_group_ref
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_tag_group_ref`;
CREATE TABLE `knowledge_tag_group_ref` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`GROUP_SEQ` bigint(20) NOT NULL COMMENT '标签分组id',
`TAG_SEQ` bigint(20) NOT NULL COMMENT '标签id',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='标签分组关系表';
-- ----------------------------
-- Table structure for knowledge_tag_instance
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_tag_instance`;
CREATE TABLE `knowledge_tag_instance` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`TAG_SEQ` bigint(20) NOT NULL COMMENT '标签id',
`TARGET_SEQ` bigint(20) NOT NULL COMMENT '标签标记的目标id',
`TAG_NAME` varchar(100) NOT NULL COMMENT '标签名称',
`MARKING_TYPE` varchar(100) NOT NULL COMMENT '标记方式:文档,内容',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
`TAG_TYPE` varchar(100) NOT NULL COMMENT '标签类型',
`FRONT_END_CONFIG` varchar(255) DEFAULT NULL COMMENT '前端配置存储',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='标签实例';
-- ----------------------------
-- Table structure for knowledge_tag_value
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_tag_value`;
CREATE TABLE `knowledge_tag_value` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`INSTANCE_SEQ` bigint(20) NOT NULL COMMENT '标签实例id',
`FIELD_NAME` varchar(100) NOT NULL COMMENT '值标签的扩展字段名,内容标签文本位置,值标签文本内容/单值/日期,值标签范围最大值-最小值',
`TAG_VALUE` varchar(2000) NOT NULL COMMENT '值标签扩展字段的值',
`AGENCY_CODE` varchar(100) NOT NULL COMMENT '机构编号',
`UNIT` varchar(16) DEFAULT NULL COMMENT '计量单位',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='值标签的实例值';
-- ----------------------------
-- Table structure for knowlege_statistics_record
-- ----------------------------
DROP TABLE IF EXISTS `knowlege_statistics_record`;
CREATE TABLE `knowlege_statistics_record` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) DEFAULT NULL,
`DOC_SEQ` bigint(20) NOT NULL COMMENT '文档ID',
`DISASTER_TIME` datetime NOT NULL COMMENT '警情发生时间',
`RECORD_NAME` varchar(100) NOT NULL COMMENT '记录类型',
`CATEGORY_VALUE` varchar(200) DEFAULT NULL COMMENT '分类文本值',
`COUNT_VALUE` bigint(20) NOT NULL DEFAULT '1' COMMENT '统计数值,统一用整型存储',
`VALUE_WEIGHT` int(11) NOT NULL DEFAULT '1' COMMENT '值放大倍数',
`UNIT` varchar(30) DEFAULT NULL COMMENT '值单位(备注属性)',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='文档各项统计数据';
-- ----------------------------
-- Table structure for knowledge_doc_annotate
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_doc_annotate`;
CREATE TABLE `knowledge_doc_annotate` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) CHARACTER SET utf8mb4 NOT NULL,
`DOC_SEQ` bigint(20) NOT NULL COMMENT '文档id',
`USER_ID` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '发表评论的用户id',
`ANNOTATE_CONTENT` varchar(500) CHARACTER SET utf8mb4 NOT NULL COMMENT '评论内容',
`AGENCY_CODE` varchar(100) CHARACTER SET utf8mb4 NOT NULL COMMENT '机构编号',
`POSITION_INFO` varchar(500) CHARACTER SET utf8mb4 NOT NULL,
`CREATE_TIME` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB ;
-- ----------------------------
-- Table structure for knowledge_message
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_message`;
CREATE TABLE `knowledge_message` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`MESSAGE_TYPE` varchar(20) NOT NULL COMMENT '消息类型',
`MESSAGE_TITLE` varchar(200) NOT NULL COMMENT '消息标题',
`MESSAGE_CONTENT` text COMMENT '消息内容',
`TARGET_SEQ` bigint(20) DEFAULT NULL COMMENT '关联的文档id',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='标签分组';
-- ----------------------------
-- Table structure for knowledge_message_personal
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_message_personal`;
CREATE TABLE `knowledge_message_personal` (
`SEQUENCE_NBR` bigint(20) NOT NULL,
`REC_DATE` datetime NOT NULL,
`REC_USER_ID` varchar(32) NOT NULL,
`MESSAGE_OWNER` varchar(32) NOT NULL,
`MESSAGE_SEQ` bigint(20) NOT NULL,
`MESSAGE_STATUS` int(1) NOT NULL COMMENT '消息状态 0-未读/1-已读',
PRIMARY KEY (`SEQUENCE_NBR`)
) ENGINE=InnoDB COMMENT='标签分组';
-- 创建索引
ALTER TABLE `knowledge_doc_content`
ADD INDEX `ORG_CODE` (`ORG_CODE`),
ADD INDEX `REC_USER_ID` (`REC_USER_ID`),
ADD INDEX `DOC_STATUS` (`DOC_STATUS`),
ADD INDEX `AUDIT_STATUS` (`AUDIT_STATUS`),
ADD INDEX `SORT_STR` (`SORT_STR`);
ALTER TABLE `knowledge_dynamics_value`
ADD INDEX `INSTANCE_ID` (`INSTANCE_ID`),
ADD INDEX `FIELD_NAME` (`FIELD_NAME`);
ALTER TABLE `knowledge_interaction_count`
ADD INDEX `OP_ET_EI` (`OPERATE_TYPE`, `ENTITY_TYPE`, `ENTITY_ID`),
ADD INDEX `ENTITY_ID` (`ENTITY_ID`);
ALTER TABLE `knowledge_interaction_record`
ADD INDEX `OT_ET_EI` (`OPERATE_TYPE`, `ENTITY_TYPE`, `ENTITY_ID`),
ADD INDEX `USER_ID` (`USER_ID`),
ADD INDEX `ENTITY_ID` (`ENTITY_ID`);
ALTER TABLE `knowledge_tag_instance`
ADD INDEX `TARGET_SEQ` (`TARGET_SEQ`) USING BTREE,
ADD INDEX `TAG_SEQ` (`TAG_SEQ`) USING BTREE;
ALTER TABLE `knowledge_tag_value`
ADD INDEX `INSTANCE_SEQ` (`INSTANCE_SEQ`) USING BTREE,
ADD INDEX `FIELD_NAME` (`FIELD_NAME`) USING BTREE;
/* 增加分类,提出标题至主表涉及的数据库变更 */
-- 添加文档表字段
ALTER TABLE knowledge_doc_content ADD DIRECTORY_ID BIGINT NOT NULL COMMENT '所属目录ID';
ALTER TABLE knowledge_doc_content ADD DOC_TITLE varchar(100) NOT NULL COMMENT '文档名称';
-- 根据动态字段值填充新字段
UPDATE knowledge_doc_content SET DOC_TITLE = (
SELECT FIELD_VALUE FROM (
SELECT FIELD_VALUE, INSTANCE_ID FROM knowledge_dynamics_value kdv WHERE FIELD_NAME = 'docTitle'
) AS a WHERE INSTANCE_ID = SEQUENCE_NBR
), DIRECTORY_ID = (
SELECT DIRECTORY FROM (
SELECT CASE FIELD_VALUE WHEN 'FIRE_ FIGHTING' THEN 1 WHEN 'EMERGENCY_RESCUE' THEN 2 WHEN 'SOCIAL_ASSISTANCE' THEN 3 ELSE 0 END DIRECTORY, INSTANCE_ID FROM (
SELECT FIELD_VALUE, INSTANCE_ID FROM knowledge_dynamics_value kdv WHERE FIELD_NAME = 'type'
) AS b
) AS c WHERE INSTANCE_ID = SEQUENCE_NBR
);
-- 删除动态表中的数据
DELETE FROM knowledge_dynamics_value WHERE FIELD_NAME in ('docTitle', 'type');
-- 删除配置
DELETE FROM knowledge_dynamics_option WHERE FIELD_NAME in ('docTitle', 'type');
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="log" />
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/knowledgebase.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<!--日志文件大小-->
<MaxFileSize>30mb</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
-->
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="DEBUG"/>
<logger name="org.mybatis" level="DEBUG" />
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="org.springframework" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="log"/>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/knowledgebase.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<!--按大小分割同一天的-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
-->
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="ERROR"/>
<logger name="org.mybatis" level="ERROR"/>
<logger name="java.sql.Connection" level="ERROR"/>
<logger name="java.sql.Statement" level="ERROR"/>
<logger name="java.sql.PreparedStatement" level="ERROR"/>
<logger name="com.baomidou.mybatisplus" level="ERROR"/>
<logger name="org.typroject" level="ERROR"/>
<logger name="com.yeejoin.amos" level="ERROR"/>
<logger name="org.springframework" level="ERROR"/>
<!-- 日志输出级别 -->
<root level="ERROR">
<appender-ref ref="FILE"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="log"/>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/knowledgebase.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<!--按大小分割同一天的-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
-->
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<logger name="java.sql.Connection" level="INFO"/>
<logger name="java.sql.Statement" level="INFO"/>
<logger name="java.sql.PreparedStatement" level="INFO"/>
<logger name="com.baomidou.mybatisplus" level="INFO"/>
<logger name="org.typroject" level="INFO"/>
<logger name="com.yeejoin.amos" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.knowledgebase.face.orm.dao.DocCategoryMapper">
<select id="queryDocAndCategoryTree" parameterType="list" resultType="com.yeejoin.amos.knowledgebase.face.model.MultipleNodeModel">
SELECT
kdc.DOC_TITLE nodeTitle
, kdc.SEQUENCE_NBR nodeKey
, kdc.DIRECTORY_ID nodeParent
, 'doc' nodeType
FROM
knowledge_doc_content kdc
<where>
<if test="docStatus != null and docStatus.length > 0">
AND DOC_STATUS = #{docStatus}
</if>
<if test="categoryIds != null and categoryIds.size > 0">
AND DIRECTORY_ID IN
<foreach collection="categoryIds" separator="," item="categoryId" open="(" close=")">
#{categoryId}
</foreach>
</if>
</where>
UNION
SELECT
dc.CATEGORY_NAME nodeTitle
, dc.SEQUENCE_NBR nodeKey
, dc.PARENT_ID nodeParent
, 'category' nodeType
FROM
knowledge_doc_category dc
<where>
<if test="categoryIds != null and categoryIds.size > 0">
AND SEQUENCE_NBR IN
<foreach collection="categoryIds" separator="," item="categoryId" open="(" close=")">
#{categoryId}
</foreach>
</if>
</where>
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.knowledgebase.face.orm.dao.InteractionCountMapper">
<select id="queryTagQuoteAll" resultType="com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeInteractionCount">
select
cast(TAG_SEQ as char) entityId,
operateCount,
t.AGENCY_CODE agencyCode
from (
select
TAG_SEQ,
count(1) operateCount
from
knowledge_tag_instance
group by
TAG_SEQ ) tmp
left join knowledge_tag t on
TAG_SEQ = t.SEQUENCE_NBR
</select>
<select id="queryTagQuotePublish" resultType="com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeInteractionCount">
select
cast(TAG_SEQ as char) entityId,
operateCount,
t.AGENCY_CODE agencyCode
from
(
select
TAG_SEQ,
count(1) operateCount
from
knowledge_tag_instance ti
inner join knowledge_doc_content doc on
ti.TARGET_SEQ = doc.SEQUENCE_NBR
where
doc.DOC_STATUS = 'PUBLISHED'
group by
TAG_SEQ ) tmp
left join knowledge_tag t on
TAG_SEQ = t.SEQUENCE_NBR
</select>
<delete id="deleteByEntityType" parameterType="string">
delete from knowledge_interaction_count where ENTITY_TYPE = #{entityType}
</delete>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.knowledgebase.face.orm.dao.DocContentMapper">
<select id="searchForDocIds" resultType="map">
select
DISTINCT d.docSeq
from
(
select
t.TARGET_SEQ docSeq
from
knowledge_tag_instance t
where
t.TAG_NAME like CONCAT('%',#{queryStr},'%'
)
and t.AGENCY_CODE = #{agencyCode}
and
EXISTS(select 1 from knowledge_doc_content dc
where dc.SEQUENCE_NBR = t.TAG_SEQ
<if test="docStatus!=null and docStatus.length>0">
and dc.DOC_STATUS in
<foreach collection="docStatus" item="name" index="index" open="(" close=")" separator=",">
#{name}
</foreach>
</if>
<if test="auditStatus!=null and auditStatus.length>0">
and dc.AUDIT_STATUS in
<foreach collection="auditStatus" item="name" index="index" open="(" close=")" separator=",">
#{name}
</foreach>
</if>
<if test="userId != null and userId !=''">
and dc.USER_ID = #{userId}
</if>
<if test="orgCode != null and orgCode !=''">
and dc.ORG_CODE like '%${orgCode}%'
</if>
)
UNION ALL
SELECT
n.INSTANCE_ID docSeq
FROM
knowledge_dynamics_value n
where
n.AGENCY_CODE = #{agencyCode}
and n.FIELD_NAME = 'docTitle'
and n.FIELD_VALUE like CONCAT('%',#{queryStr},'%' )
EXISTS(select 1 from knowledge_doc_content dc
where dc.SEQUENCE_NBR = t.TAG_SEQ
<if test="docStatus!=null and docStatus.length>0">
and dc.DOC_STATUS in
<foreach collection="docStatus" item="name" index="index" open="(" close=")" separator=",">
#{name}
</foreach>
</if>
<if test="auditStatus!=null and auditStatus.length>0">
and dc.AUDIT_STATUS in
<foreach collection="auditStatus" item="name" index="index" open="(" close=")" separator=",">
#{name}
</foreach>
</if>
<if test="userId != null and userId !=''">
and dc.USER_ID = #{userId}
</if>
<if test="orgCode != null and orgCode !=''">
and dc.ORG_CODE like '%${orgCode}%'
</if>
)
)d LIMIT #{offset},#{length}
</select>
<select id="queryDocBaseInfoList" parameterType="map" resultType="map">
SELECT
SEQUENCE_NBR sequenceNbr, REC_DATE recDate, DOC_STATUS docStatus, CREATE_TIME createTime, USER_ID userId,
AUDIT_STATUS auditStatus, REJECTION_COMMENT rejectionComment, AUDITOR_USER_ID auditorUserId, ORG_CODE orgCode,
DOC_TITLE docTitle, DIRECTORY_ID directoryId,
(SELECT kdc.CATEGORY_NAME FROM knowledge_doc_category kdc WHERE kdc.SEQUENCE_NBR = DIRECTORY_ID) directoryName,
<if test="extraFields != null and extraFields.size > 0">
<foreach collection="extraFields" item="_field" >
${_field},
</foreach>
</if>
IFNULL(collectNum, 0) collectNum, IFNULL(quoteNum, 0) quoteNum, IFNULL(collect, "UNCOLLECT") collect
FROM knowledge_doc_content doct LEFT JOIN (
SELECT INSTANCE_ID
<if test="extraFields != null and extraFields.size > 0">
<foreach collection="extraFields" item="_field" >
, MAX(CASE FIELD_NAME WHEN #{_field} THEN FIELD_VALUE ELSE NULL END) AS ${_field}
</foreach>
</if>
FROM knowledge_dynamics_value
GROUP BY INSTANCE_ID
) fieldt ON doct.SEQUENCE_NBR = fieldt.INSTANCE_ID
LEFT JOIN (
SELECT ENTITY_ID, COUNT(1) collectNum FROM knowledge_interaction_record WHERE OPERATE_TYPE = "COLLECT" GROUP BY ENTITY_ID
) coll ON doct.SEQUENCE_NBR = coll.ENTITY_ID
LEFT JOIN (
SELECT ENTITY_ID, OPERATE_COUNT quoteNum FROM knowledge_interaction_count WHERE OPERATE_TYPE = "PUBLISH" AND ENTITY_TYPE = "DOC"
) quot ON doct.SEQUENCE_NBR = quot.ENTITY_ID
LEFT JOIN (
SELECT ENTITY_ID, OPERATE_TYPE collect FROM knowledge_interaction_record WHERE OPERATE_TYPE = "COLLECT" AND USER_ID = #{userId}
) favor ON doct.SEQUENCE_NBR = favor.ENTITY_ID
<where>
<if test="commonFilters != null">
<if test="commonFilters.directoryIdList != null and commonFilters.directoryIdList.size > 0">
AND DIRECTORY_ID IN
<foreach collection="commonFilters.directoryIdList" item="directoryId" separator=", " open="(" close=")">
#{directoryId}
</foreach>
</if>
<if test="commonFilters.docTitle != null and commonFilters.docTitle.length > 0">
AND DOC_TITLE LIKE CONCAT("%", #{commonFilters.docTitle}, "%")
</if>
<if test="commonFilters.docStatus != null and commonFilters.docStatus.length > 0">
AND DOC_STATUS = #{commonFilters.docStatus}
</if>
<if test="commonFilters.auditStatus != null and commonFilters.auditStatus.size > 0">
AND AUDIT_STATUS IN
<foreach collection="commonFilters.auditStatus" item="_status" separator=", " open="(" close=")">
#{_status}
</foreach>
</if>
<if test="commonFilters.createTimeLeft != null">
AND CREATE_TIME <![CDATA[>=]]> #{commonFilters.createTimeLeft}
</if>
<if test="commonFilters.createTimeRight != null">
AND CREATE_TIME <![CDATA[<=]]> #{commonFilters.createTimeRight}
</if>
</if>
<if test="collect != null">
AND collect = #{collect}
</if>
<if test="permissionFilters != null">
<if test="permissionFilters.userId != null or permissionFilters.orgCode != null">
AND (
<if test="permissionFilters.userId != null">
REC_USER_ID = #{permissionFilters.userId}
</if>
<if test="permissionFilters.userId != null and permissionFilters.orgCode != null">
OR
</if>
<if test="permissionFilters.orgCode != null">
(
ORG_CODE LIKE CONCAT(#{permissionFilters.orgCode}, "%")
AND AUDIT_STATUS IN
<foreach collection="permissionFilters.auditStatusList" item="auditStatus" open="(" close=")" separator=", ">
#{auditStatus}
</foreach>
)
</if>
)
</if>
</if>
<if test="extraStrFilters != null and extraStrFilters.size > 0">
<foreach collection="extraStrFilters" item="str">
AND ${str}
</foreach>
</if>
</where>
ORDER BY FIELD(audit_status, 'SAVED', 'SUBMITTED', 'REJECTED', 'PASSED') ASC, create_time DESC
LIMIT #{start}, #{limit}
</select>
<select id="queryDocBaseInfoTotal" parameterType="map" resultType="int">
SELECT
COUNT(1)
FROM knowledge_doc_content doct LEFT JOIN (
SELECT INSTANCE_ID
<if test="extraFields != null and extraFields.size > 0">
<foreach collection="extraFields" item="_field" >
, MAX(CASE FIELD_NAME WHEN #{_field} THEN FIELD_VALUE ELSE NULL END) AS ${_field}
</foreach>
</if>
FROM knowledge_dynamics_value
GROUP BY INSTANCE_ID
) fieldt ON doct.SEQUENCE_NBR = fieldt.INSTANCE_ID
LEFT JOIN (
SELECT ENTITY_ID, COUNT(1) collectNum FROM knowledge_interaction_record WHERE OPERATE_TYPE = "COLLECT" GROUP BY ENTITY_ID
) coll ON doct.SEQUENCE_NBR = coll.ENTITY_ID
LEFT JOIN (
SELECT ENTITY_ID, OPERATE_COUNT quoteNum FROM knowledge_interaction_count WHERE OPERATE_TYPE = "PUBLISH" AND ENTITY_TYPE = "DOC"
) quot ON doct.SEQUENCE_NBR = quot.ENTITY_ID
LEFT JOIN (
SELECT ENTITY_ID, OPERATE_TYPE collect FROM knowledge_interaction_record WHERE OPERATE_TYPE = "COLLECT" AND USER_ID = #{userId}
) favor ON doct.SEQUENCE_NBR = favor.ENTITY_ID
<where>
<if test="commonFilters != null">
<if test="commonFilters.directoryIdList != null and commonFilters.directoryIdList.size > 0">
AND DIRECTORY_ID IN
<foreach collection="commonFilters.directoryIdList" item="directoryId" separator=", " open="(" close=")">
#{directoryId}
</foreach>
</if>
<if test="commonFilters.docTitle != null and commonFilters.docTitle.length > 0">
AND DOC_TITLE LIKE CONCAT("%", #{commonFilters.docTitle}, "%")
</if>
<if test="commonFilters.docStatus != null and commonFilters.docStatus.length > 0">
AND DOC_STATUS = #{commonFilters.docStatus}
</if>
<if test="commonFilters.auditStatus != null and commonFilters.auditStatus.size > 0">
AND AUDIT_STATUS IN
<foreach collection="commonFilters.auditStatus" item="_status" separator=", " open="(" close=")">
#{_status}
</foreach>
</if>
<if test="commonFilters.createTimeLeft != null">
AND CREATE_TIME <![CDATA[>=]]> #{commonFilters.createTimeLeft}
</if>
<if test="commonFilters.createTimeRight != null">
AND CREATE_TIME <![CDATA[<=]]> #{commonFilters.createTimeRight}
</if>
</if>
<if test="collect != null">
AND collect = #{collect}
</if>
<if test="permissionFilters != null">
<if test="permissionFilters.userId != null or permissionFilters.orgCode != null">
AND (
<if test="permissionFilters.userId != null">
REC_USER_ID = #{permissionFilters.userId}
</if>
<if test="permissionFilters.userId != null and permissionFilters.orgCode != null">
OR
</if>
<if test="permissionFilters.orgCode != null">
(
ORG_CODE LIKE CONCAT(#{permissionFilters.orgCode}, "%")
AND AUDIT_STATUS IN
<foreach collection="permissionFilters.auditStatusList" item="auditStatus" open="(" close=")" separator=", ">
#{auditStatus}
</foreach>
)
</if>
)
</if>
</if>
<if test="extraStrFilters != null and extraStrFilters.size > 0">
<foreach collection="extraStrFilters" item="str">
AND ${str}
</foreach>
</if>
</where>
</select>
<select id="getAllPublishedDocIds" resultType="long">
SELECT SEQUENCE_NBR FROM knowledge_doc_content WHERE DOC_STATUS = "PUBLISHED"
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.knowledgebase.face.orm.dao.MessageMapper">
<select id="selectMessageListByOwner" parameterType="string" resultType="map">
SELECT
km.rec_user_id AS sponsor,
km.rec_date AS starttingTime,
km.message_type AS messageType,
km.message_title AS messageTitle,
km.message_content AS messageContent,
km.target_seq AS targetSeq,
kmp.message_owner AS owner,
kmp.message_status AS messageStatus,
kmp.sequence_nbr AS sequenceNbr
FROM
knowledge_message_personal kmp
LEFT JOIN knowledge_message km
ON kmp.message_seq = km.sequence_nbr
where kmp.message_owner = #{owner}
<if test="messageType!=null and messageType.length!=0">
and km.message_type = #{messageType}
</if>
ORDER BY
kmp.message_status ASC,
km.rec_date DESC
</select>
<select id="selectMessageBySeq" parameterType="long" resultType="map">
SELECT
km.rec_user_id AS sponsor,
km.rec_date AS starttingTime,
km.message_type AS messageType,
km.message_title AS messageTitle,
km.message_content AS messageContent,
km.target_seq AS targetSeq,
kmp.message_owner AS owner,
kmp.message_status AS messageStatus,
kmp.sequence_nbr AS sequenceNbr
FROM
knowledge_message_personal kmp
LEFT JOIN knowledge_message km
ON kmp.message_seq = km.sequence_nbr
where kmp.sequence_nbr = #{sequenceNbr}
</select>
<select id="selectMessageListByPage" parameterType="java.util.Map" resultType="map">
SELECT
km.rec_user_id AS sponsor,
km.rec_date AS starttingTime,
km.message_type AS messageType,
km.message_title AS messageTitle,
km.message_content AS messageContent,
km.target_seq AS targetSeq,
kmp.message_owner AS owner,
kmp.message_status AS messageStatus,
kmp.sequence_nbr AS sequenceNbr
FROM
knowledge_message_personal kmp
LEFT JOIN knowledge_message km
ON kmp.message_seq = km.sequence_nbr
where kmp.message_owner = #{owner}
<if test="messageType!=null and messageType.length!=0">
and km.message_type = #{messageType}
</if>
ORDER BY
kmp.message_status ASC,
km.rec_date DESC
LIMIT #{current},#{size}
</select>
<select id="selectMessageListByCount" parameterType="java.util.Map" resultType="java.lang.Integer">
SELECT
COUNT(*)
FROM
knowledge_message_personal kmp
LEFT JOIN knowledge_message km
ON kmp.message_seq = km.sequence_nbr
where kmp.message_owner = #{owner}
<if test="messageType!=null and messageType.length!=0">
and km.message_type = #{messageType}
</if>
ORDER BY
kmp.message_status ASC,
km.rec_date DESC
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.knowledgebase.face.orm.dao.StatisticsRecordMapper">
<update id="deleteAll">
truncate table knowlege_statistics_record
</update>
<!-- 灾情数量同比环比 -->
<select id="selectDisasterCount" resultType="java.util.Map">
SELECT
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN DATE_ADD(
CURDATE(),
INTERVAL - DAY(CURDATE()) + 1 DAY
)
AND LAST_DAY(CURDATE())) AS currentMonthCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN DATE_SUB(
CURDATE() - DAY(CURDATE()) + 1,
INTERVAL 1 MONTH
)
AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))) AS lastMonthCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN DATE_SUB(
CURDATE() - DAY(CURDATE()) + 1,
INTERVAL 2 MONTH
)
AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH))) AS last2MonthCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN DATE_SUB(
CURDATE() - DAY(CURDATE()) + 1,
INTERVAL 1 YEAR
)
AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))) AS lastYearCurrentMonthCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN DATE_SUB(
DATE_SUB(
CURDATE() - DAY(CURDATE()) + 1,
INTERVAL 1 MONTH
),
INTERVAL 1 YEAR
)
AND LAST_DAY(
DATE_SUB(
DATE_SUB(CURDATE(), INTERVAL 1 YEAR),
INTERVAL 1 MONTH
)
)) AS lastYearLastMonthCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN CONCAT(
YEAR(NOW()),
'-',
LPAD((QUARTER(CURDATE()) - 1) * 3+1, 2, '0'),
'-01'
)
AND LAST_DAY(
CONCAT(
YEAR(NOW()),
'-',
LPAD(QUARTER(NOW()) * 3, 2, 0),
'-01'
)
)) AS currentQuarterCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN DATE_SUB(
CONCAT(
YEAR(NOW()),
'-',
LPAD((QUARTER(CURDATE()) - 1) * 3+1, 2, '0'),
'-01'
),
INTERVAL 1 QUARTER
)
AND DATE_SUB(
CONCAT(
YEAR(NOW()),
'-',
LPAD((QUARTER(CURDATE()) - 1) * 3+1, 2, '0'),
'-01'
),
INTERVAL 1 DAY
)) AS lastQuarterCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN DATE_SUB(
CONCAT(
YEAR(NOW()),
'-',
LPAD((QUARTER(CURDATE()) - 1) * 3+1, 2, '0'),
'-01'
),
INTERVAL 1 YEAR
)
AND DATE_SUB(
LAST_DAY(
CONCAT(
YEAR(NOW()),
'-',
LPAD(QUARTER(NOW()) * 3, 2, 0),
'-01'
)
),
INTERVAL 1 YEAR
)) AS lastYearCurrentQuarterCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN CONCAT(YEAR(CURDATE()), '-01-01')
AND CONCAT(YEAR(CURDATE()), '-12-31')) AS currentYearCount,
(SELECT
COUNT(1)
FROM
knowlege_statistics_record
WHERE record_name = "DISASTER_RECORD"
AND DATE(disaster_time) BETWEEN CONCAT(
YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR)),
'-01-01'
)
AND CONCAT(
YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR)),
'-12-31'
)) AS lastYearCount
</select>
<!-- 燃烧物质分类查询 -->
<select id="selectCategoryByName" resultType="java.util.Map" parameterType="java.lang.String">
SELECT
category_value category, count(1) quantity
FROM
knowlege_statistics_record
WHERE record_name = #{recordName}
group by category_value
</select>
<select id="selectCountByNameAndDateRange" resultType="java.util.Map" parameterType="java.util.Map">
SELECT
DATE_FORMAT(disaster_time, #{format}) AS period,
SUM(COUNT_VALUE) quantity
FROM
knowlege_statistics_record
WHERE record_name = #{recordName}
<if test="dateRangeLeft != null">
AND DATE_FORMAT(disaster_time, #{format}) <![CDATA[ >= ]]> DATE_FORMAT(#{dateRangeLeft}, #{format})
</if>
<if test="dateRangeRight != null">
AND DATE_FORMAT(disaster_time, #{format}) <![CDATA[ <= ]]> DATE_FORMAT(#{dateRangeRight}, #{format})
</if>
GROUP BY period
ORDER BY period ASC
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.knowledgebase.face.orm.dao.TagMapper">
<select id="queryTagByNameInPublishedDoc" parameterType="string" resultType="com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTag">
SELECT
SEQUENCE_NBR sequenceNbr, REC_DATE recDate, REC_USER_ID recUserId, TAG_NAME tagName, TAG_CODE tagCode,
TAG_TYPE tagType, TAG_STATUS tagStatus, TAG_REMARK tagRemark, CREATOR creator, AGENCY_CODE agencyCode
FROM
knowledge_tag
WHERE
SEQUENCE_NBR IN (
SELECT DISTINCT TAG_SEQ FROM knowledge_tag_instance WHERE TARGET_SEQ IN (
SELECT
SEQUENCE_NBR
FROM
knowledge_doc_content
WHERE DOC_STATUS = "PUBLISHED"))
AND TAG_NAME LIKE CONCAT('%', #{tagName},'%')
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.knowledgebase.face.orm.dao.TagValueMapper">
<select id="queryTagValuesByDocId" parameterType="long" resultType="com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagValue">
SELECT
tv.`INSTANCE_SEQ` instanceSeq,
tv.`FIELD_NAME` fieldName,
tv.`TAG_VALUE` tagValue,
tv.`AGENCY_CODE` agencyCode,
tv.`UNIT` unit
FROM `knowledge_tag_instance` ti
INNER JOIN `knowledge_tag_value` tv
ON ti.`SEQUENCE_NBR` = tv.`INSTANCE_SEQ`
WHERE ti.`TARGET_SEQ` = #{docSeq}
</select>
<select id="queryTagValuesByDocIds" parameterType="collection" resultType="com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagValue">
SELECT
tv.`INSTANCE_SEQ` instanceSeq,
tv.`FIELD_NAME` fieldName,
tv.`TAG_VALUE` tagValue,
tv.`AGENCY_CODE` agencyCode,
tv.`UNIT` unit
FROM `knowledge_tag_instance` ti
INNER JOIN `knowledge_tag_value` tv
ON ti.`SEQUENCE_NBR` = tv.`INSTANCE_SEQ`
WHERE ti.`TARGET_SEQ` in
<foreach collection="docIds" open="(" close=")" separator="," item="docSeq">
#{docSeq}
</foreach>
</select>
</mapper>
<w:numbering mc:Ignorable="w14 wp14"
xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
<w:abstractNum w:abstractNumId="1">
<w:nsid w:val="191D12C1"/>
<w:multiLevelType w:val="hybridMultilevel"/>
<w:tmpl w:val="2EBE8716"/>
<!--方块-->
<w:lvl w:ilvl="1" w:tplc="04090001">
<w:start w:val="1"/>
<w:numFmt w:val="bullet"/>
<w:lvlText w:val=""/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="420" w:hanging="420"/>
</w:pPr>
<w:rPr>
<w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
</w:rPr>
</w:lvl>
<!--实心圆-->
<w:lvl w:ilvl="2" w:tplc="04090003" w:tentative="1">
<w:start w:val="1"/>
<w:numFmt w:val="bullet"/>
<w:lvlText w:val=""/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="420" w:hanging="420"/>
</w:pPr>
<w:rPr>
<w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
</w:rPr>
</w:lvl>
<!--空心圆-->
<w:lvl w:ilvl="3" w:tplc="04090005" w:tentative="1">
<w:start w:val="1"/>
<w:numFmt w:val="bullet"/>
<w:lvlText w:val=""/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="420" w:hanging="420"/>
</w:pPr>
<w:rPr>
<w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
</w:rPr>
</w:lvl>
</w:abstractNum>
<w:abstractNum w:abstractNumId="2">
<w:nsid w:val="20B6127F"/>
<w:multiLevelType w:val="hybridMultilevel"/>
<w:tmpl w:val="8EBAF23C"/>
<!--小写英文字母-->
<w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="1">
<w:start w:val="1"/>
<w:numFmt w:val="lowerLetter"/>
<w:lvlText w:val="%2."/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="420" w:hanging="420"/>
</w:pPr>
</w:lvl>
<!--小写罗马字符-->
<w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="1">
<w:start w:val="1"/>
<w:numFmt w:val="lowerRoman"/>
<w:lvlText w:val="%3."/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="420" w:hanging="420"/>
</w:pPr>
</w:lvl>
<!--大写英文字母-->
<w:lvl w:ilvl="3" w:tplc="04090015" w:tentative="1">
<w:start w:val="1"/>
<w:numFmt w:val="upperLetter"/>
<w:lvlText w:val="%4."/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="420" w:hanging="420"/>
</w:pPr>
</w:lvl>
<!--大写罗马字符-->
<w:lvl w:ilvl="4" w:tplc="5CCC8EBA" w:tentative="1">
<w:start w:val="1"/>
<w:numFmt w:val="upperRoman"/>
<w:lvlText w:val="%5."/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="420" w:hanging="420"/>
</w:pPr>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
</w:rPr>
</w:lvl>
</w:abstractNum>
<w:num w:numId="1">
<w:abstractNumId w:val="1"/>
</w:num>
<w:num w:numId="2">
<w:abstractNumId w:val="2"/>
</w:num>
</w:numbering>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment