package com.chinaunicom.base.server.document.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.MongoId;
import java.io.Serializable;
import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Builder
@Data
@org.springframework.data.mongodb.core.mapping.Document("knowledge_base_document")
public class Document implements Serializable {
@MongoId
private ObjectId objectId;
@Indexed
private String documentId;//业务id
@Indexed
private String kbaseId;//所属的知识库id
private String data;
private String author;
@Indexed
private String userId;
@Indexed
private String title;//文章标题
private Date createTime;
private Date updateTime;
private String tags;
/**
* 点赞数量
*/
private Integer likeCount;
/**
* 阅读数量
*/
private Integer readCount;
/**
* 版本号,修改的时候用户回滚使用
*/
private int versionNo;
}
@Repository
public class DocumentRepoImpl implements IDocumentRepo {
private static final Logger LOGGER = LoggerFactory.getLogger(DocumentRepoImpl.class);
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private MongoPageHelper mongoPageHelper;
@Override
public String addDocument(Document addDocumentRequest) {
String documentId = BussinessKeyGenerator.getBussinessKey();
addDocumentRequest.setDocumentId(documentId);
mongoTemplate.insert(addDocumentRequest);
return documentId;
}
@Override
public void modifyDocument(Document document) {
Query query = new Query();
query.addCriteria(Criteria.where(DocumentConstants.DOCUMENT_ID).is(document.getDocumentId()));
Update update = new Update();
// 文档数据不为空修改文档数据
if (null != document.getData()) {
update.set(DocumentConstants.DATA, document.getData());
}
// 标题不为空修改标题
if (null != document.getTitle()) {
update.set(DocumentConstants.ES_FIELD_TITLE, document.getTitle());
}
// 修改前的版本号
update.set(DocumentConstants.VERSION_NO, document.getVersionNo());
mongoTemplate.findAndModify(query, update, Document.class);
}
@Override
public List queryDocumentByDocumentIds(List documentIds) {
Query query = new Query();
query.addCriteria(Criteria.where(DocumentConstants.DOCUMENT_ID).in(documentIds));
return mongoTemplate.find(query, Document.class);
}
@Override
public void deleteDocumentByDocumentId(String documentId) {
Query query = Query.query(Criteria.where(DocumentConstants.DOCUMENT_ID).is(documentId));
// findAndRemove只会删除第一条
mongoTemplate.findAndRemove(query, Document.class);
}
@Override
public Document queryDocumentByDocumentId(String documentId) {
Query query = new Query();
query.addCriteria(Criteria.where(DocumentConstants.DOCUMENT_ID).is(documentId));
return mongoTemplate.findOne(query, Document.class);
}
@Override
public PageableResult queryDocumentByUserId(String userId, Integer currentPage, Integer pageSize) {
Query query = new Query();
query.addCriteria(Criteria.where(DocumentConstants.USER_ID).is(userId));
Field findFields = query.fields();
// 指定查询字段
List fields = new ArrayList<>();
fields.add(DocumentConstants.DOCUMENT_ID);
fields.add(DocumentConstants.TITLE);
fields.add(DocumentConstants.CREATE_TIME);
fields.add(DocumentConstants.UPDATE_TIME);
fields.add(DocumentConstants.KBASE_ID);
fields.forEach(findFields::include);
// 根据更新时间降序排序
query.with(Sort.by(Sort.Order.desc(DocumentConstants.UPDATE_TIME)));
return mongoPageHelper.pageQuery(query, Document.class, pageSize, currentPage);
}
@Override
public PageableResult queryDocumentByLibId(String libId, Integer currentPage, Integer pageSize) {
Query query = new Query();
query.addCriteria(Criteria.where(DocumentConstants.KBASE_ID).is(libId));
Field findFields = query.fields();
// 指定查询字段
List fields = new ArrayList<>();
fields.add(DocumentConstants.DOCUMENT_ID);
fields.add(DocumentConstants.TITLE);
fields.add(DocumentConstants.CREATE_TIME);
fields.add(DocumentConstants.UPDATE_TIME);
fields.add(DocumentConstants.KBASE_ID);
fields.add(DocumentConstants.AUTHOR);
fields.forEach(findFields::include);
// 根据更新时间降序排序
query.with(Sort.by(Sort.Order.desc(DocumentConstants.UPDATE_TIME)));
return mongoPageHelper.pageQuery(query, Document.class, pageSize, currentPage);
}
@Override
public List queryLibXDocuments(String libId, int queryCount, List orderList) {
Query query = new Query();
query.addCriteria(Criteria.where(DocumentConstants.KBASE_ID).is(libId));
Field findFields = query.fields();
// 指定查询字段
List fields = new ArrayList<>();
fields.add(DocumentConstants.DOCUMENT_ID);
fields.add(DocumentConstants.TITLE);
fields.add(DocumentConstants.CREATE_TIME);
fields.add(DocumentConstants.UPDATE_TIME);
fields.add(DocumentConstants.KBASE_ID);
fields.add(DocumentConstants.AUTHOR);
fields.add(DocumentConstants.LIKE_COUNT);
fields.add(DocumentConstants.READ_COUNT);
fields.forEach(findFields::include);
// 添加排序方式
if (!CollectionUtils.isEmpty(orderList)) {
for (String orderCol : orderList) {
query.with(Sort.by(Sort.Order.desc(orderCol)));
}
}
// 如果查询数量不为-1则查询指定数量
if (-1 != queryCount) {
query.limit(queryCount);
}
return mongoTemplate.find(query, Document.class);
}
@Override
public void updateDocLikeAndReadCount(int likeCount, int readCount, String docId) {
Query query = new Query();
query.addCriteria(Criteria.where(DocumentConstants.DOCUMENT_ID).is(docId));
Update update = new Update();
update.set(DocumentConstants.LIKE_COUNT, likeCount);
update.set(DocumentConstants.READ_COUNT, readCount);
mongoTemplate.findAndModify(query, update, Document.class);
}
}