!204 打卡优化

Merge pull request !204 from 德仔/xzj
This commit is contained in:
德仔
2021-04-15 12:01:47 +08:00
committed by Gitee
21 changed files with 1382 additions and 50 deletions

View File

@ -0,0 +1,43 @@
package com.stdiet.custom.domain;
import com.stdiet.common.annotation.Excel;
import com.stdiet.common.core.domain.BaseEntity;
import lombok.Data;
/**
* 营养知识小问答对象 sys_nutrition_question
*
* @author xzj
* @date 2021-04-13
*/
@Data
public class SysNutritionQuestion extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 标题 */
@Excel(name = "标题")
private String title;
/** 内容 */
@Excel(name = "内容")
private String content;
/** 关键词,逗号隔开 */
@Excel(name = "关键词,逗号隔开")
private String key;
/** 标题内容索引分词之后的关键词 */
@Excel(name = "标题内容索引分词之后的关键词")
private String titleContentIndex;
/** 是否在小程序显示0 不显示 1显示默认0 */
@Excel(name = "是否在小程序显示0 不显示 1显示默认0")
private Integer showFlag;
/** 删除标识 0未删除 1已删除 */
private Integer delFlag;
}

View File

@ -76,6 +76,9 @@ public class SysWxUserLog extends BaseEntity
//客户ID
private Long customerId;
//建议
private String remark;
/**
* 非持久化字段,客户姓名
*/
@ -123,6 +126,25 @@ public class SysWxUserLog extends BaseEntity
@Excel(name = "体型对比照")
private String bodyImages;
/** 服务建议 */
@Excel(name = "服务建议")
private String suggest;
/** 目标体重 */
@Excel(name = "目标体重")
private BigDecimal targetWeight;
/** 执行评分,五分制 */
@Excel(name = "执行评分,五分制")
private BigDecimal executionScore;
/** 点评 */
@Excel(name = "点评")
private String comment;
/** 删除标识 0未删除 1已删除 */
private Long delFlag;
//售后营养师ID
private Long afterNutritionistId;

View File

@ -0,0 +1,27 @@
package com.stdiet.custom.dto.response;
import com.stdiet.common.annotation.Excel;
import lombok.Data;
import java.io.Serializable;
@Data
public class NutritionQuestionResponse implements Serializable {
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 标题 */
@Excel(name = "标题")
private String title;
/** 内容 */
@Excel(name = "内容")
private String content;
/** 关键词,逗号隔开 */
@Excel(name = "关键词,逗号隔开")
private String key;
}

View File

@ -0,0 +1,67 @@
package com.stdiet.custom.mapper;
import java.util.List;
import com.stdiet.custom.domain.SysNutritionQuestion;
/**
* 营养知识小问答Mapper接口
*
* @author xzj
* @date 2021-04-13
*/
public interface SysNutritionQuestionMapper
{
/**
* 查询营养知识小问答
*
* @param id 营养知识小问答ID
* @return 营养知识小问答
*/
public SysNutritionQuestion selectSysNutritionQuestionById(Long id);
/**
* 查询营养知识小问答列表
*
* @param sysNutritionQuestion 营养知识小问答
* @return 营养知识小问答集合
*/
public List<SysNutritionQuestion> selectSysNutritionQuestionList(SysNutritionQuestion sysNutritionQuestion);
/**
* 新增营养知识小问答
*
* @param sysNutritionQuestion 营养知识小问答
* @return 结果
*/
public int insertSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
/**
* 修改营养知识小问答
*
* @param sysNutritionQuestion 营养知识小问答
* @return 结果
*/
public int updateSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
/**
* 删除营养知识小问答
*
* @param id 营养知识小问答ID
* @return 结果
*/
public int deleteSysNutritionQuestionById(Long id);
/**
* 批量删除营养知识小问答
*
* @param ids 需要删除的数据ID
* @return 结果
*/
public int deleteSysNutritionQuestionByIds(Long[] ids);
/**
* 根据关键词搜索对应营养知识问答
* @return
*/
public List<String> getNutritionQuestionListByKey(SysNutritionQuestion sysNutritionQuestion);
}

View File

@ -85,4 +85,11 @@ public interface SysWxUserLogMapper
*/
List<SysWxUserLog> getWxUserLogListByCustomerId(SysWxUserLog sysWxUserLog);
/**
* 根据ID查询打卡详情
* @param sysWxUserLog
* @return
*/
WxLogInfo getWxLogInfoDetailById(SysWxUserLog sysWxUserLog);
}

View File

@ -1,14 +1,18 @@
package com.stdiet.custom.page;
import com.stdiet.common.annotation.Excel;
import com.stdiet.common.utils.DateUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
public class WxLogInfo implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String date;
private Long water;
@ -27,6 +31,8 @@ public class WxLogInfo implements Serializable {
private String defecation;
private String remark;
/** 情绪 */
private String emotion;
@ -51,6 +57,28 @@ public class WxLogInfo implements Serializable {
/** 体型对比照 */
private String bodyImages;
/** 服务建议 */
private String suggest;
/** 目标体重 */
private BigDecimal targetWeight;
/** 执行评分,五分制 */
private BigDecimal executionScore;
/** 点评 */
private String comment;
private List<String> breakfastImagesUrl;
private List<String> lunchImagesUrl;
private List<String> dinnerImagesUrl;
private List<String> extraMealImagesUrl;
private List<String> bodyImagesUrl;
public String getDate() {
return date;
}
@ -187,6 +215,94 @@ public class WxLogInfo implements Serializable {
this.bodyImages = bodyImages;
}
public String getSuggest() {
return suggest;
}
public void setSuggest(String suggest) {
this.suggest = suggest;
}
public BigDecimal getTargetWeight() {
return targetWeight;
}
public void setTargetWeight(BigDecimal targetWeight) {
this.targetWeight = targetWeight;
}
public BigDecimal getExecutionScore() {
return executionScore;
}
public void setExecutionScore(BigDecimal executionScore) {
this.executionScore = executionScore;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public List<String> getBreakfastImagesUrl() {
return breakfastImagesUrl;
}
public void setBreakfastImagesUrl(List<String> breakfastImagesUrl) {
this.breakfastImagesUrl = breakfastImagesUrl;
}
public List<String> getLunchImagesUrl() {
return lunchImagesUrl;
}
public void setLunchImagesUrl(List<String> lunchImagesUrl) {
this.lunchImagesUrl = lunchImagesUrl;
}
public List<String> getDinnerImagesUrl() {
return dinnerImagesUrl;
}
public void setDinnerImagesUrl(List<String> dinnerImagesUrl) {
this.dinnerImagesUrl = dinnerImagesUrl;
}
public List<String> getExtraMealImagesUrl() {
return extraMealImagesUrl;
}
public void setExtraMealImagesUrl(List<String> extraMealImagesUrl) {
this.extraMealImagesUrl = extraMealImagesUrl;
}
public List<String> getBodyImagesUrl() {
return bodyImagesUrl;
}
public void setBodyImagesUrl(List<String> bodyImagesUrl) {
this.bodyImagesUrl = bodyImagesUrl;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String toString() {
return "WxLogInfo{" +

View File

@ -0,0 +1,70 @@
package com.stdiet.custom.service;
import java.util.List;
import java.util.Map;
import com.stdiet.custom.domain.SysNutritionQuestion;
/**
* 营养知识小问答Service接口
*
* @author xzj
* @date 2021-04-13
*/
public interface ISysNutritionQuestionService
{
/**
* 查询营养知识小问答
*
* @param id 营养知识小问答ID
* @return 营养知识小问答
*/
public SysNutritionQuestion selectSysNutritionQuestionById(Long id);
/**
* 查询营养知识小问答列表
*
* @param sysNutritionQuestion 营养知识小问答
* @return 营养知识小问答集合
*/
public List<SysNutritionQuestion> selectSysNutritionQuestionList(SysNutritionQuestion sysNutritionQuestion);
/**
* 新增营养知识小问答
*
* @param sysNutritionQuestion 营养知识小问答
* @return 结果
*/
public int insertSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
/**
* 修改营养知识小问答
*
* @param sysNutritionQuestion 营养知识小问答
* @return 结果
*/
public int updateSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
/**
* 批量删除营养知识小问答
*
* @param ids 需要删除的营养知识小问答ID
* @return 结果
*/
public int deleteSysNutritionQuestionByIds(Long[] ids);
/**
* 删除营养知识小问答信息
*
* @param id 营养知识小问答ID
* @return 结果
*/
public int deleteSysNutritionQuestionById(Long id);
/**
* 根据关键词搜索对应营养知识问答(Lucene索引分词查询)
* @return
*/
public Map<String, Object> getNutritionQuestionListByKey(SysNutritionQuestion sysNutritionQuestion, int pageNum, int pageSize);
}

View File

@ -87,4 +87,11 @@ public interface ISysWxUserLogService
*/
List<SysWxUserLog> getWxUserLogListByCustomerId(SysWxUserLog sysWxUserLog);
/**
* 根据ID查询打卡详情
* @param sysWxUserLog
* @return
*/
WxLogInfo getWxLogInfoDetailById(SysWxUserLog sysWxUserLog);
}

View File

@ -0,0 +1,154 @@
package com.stdiet.custom.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.stdiet.common.utils.DateUtils;
import com.stdiet.common.utils.reflect.ReflectUtils;
import com.stdiet.custom.utils.LuceneIndexUtils;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.stdiet.custom.mapper.SysNutritionQuestionMapper;
import com.stdiet.custom.domain.SysNutritionQuestion;
import com.stdiet.custom.service.ISysNutritionQuestionService;
/**
* 营养知识小问答Service业务层处理
*
* @author xzj
* @date 2021-04-13
*/
@Service
public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionService
{
@Autowired
private SysNutritionQuestionMapper sysNutritionQuestionMapper;
public static final String index_path = "D:\\develop\\LuceneIndex\\nutritionQuestion";
//private static final String index_path = "";
//建立索引的字段名称
public static final String[] index_field_array = {"id", "title", "content", "key"};
/**
* 查询营养知识小问答
*
* @param id 营养知识小问答ID
* @return 营养知识小问答
*/
@Override
public SysNutritionQuestion selectSysNutritionQuestionById(Long id)
{
return sysNutritionQuestionMapper.selectSysNutritionQuestionById(id);
}
/**
* 查询营养知识小问答列表
*
* @param sysNutritionQuestion 营养知识小问答
* @return 营养知识小问答
*/
@Override
public List<SysNutritionQuestion> selectSysNutritionQuestionList(SysNutritionQuestion sysNutritionQuestion)
{
return sysNutritionQuestionMapper.selectSysNutritionQuestionList(sysNutritionQuestion);
}
/**
* 新增营养知识小问答
*
* @param sysNutritionQuestion 营养知识小问答
* @return 结果
*/
@Override
public int insertSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion)
{
sysNutritionQuestion.setCreateTime(DateUtils.getNowDate());
if(sysNutritionQuestionMapper.insertSysNutritionQuestion(sysNutritionQuestion) > 0){
return createNutritionQuestionIndex(sysNutritionQuestion) ? 1 : 0;
}
return 0;
}
/**
* 修改营养知识小问答
*
* @param sysNutritionQuestion 营养知识小问答
* @return 结果
*/
@Override
public int updateSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion)
{
sysNutritionQuestion.setUpdateTime(DateUtils.getNowDate());
return sysNutritionQuestionMapper.updateSysNutritionQuestion(sysNutritionQuestion);
}
/**
* 批量删除营养知识小问答
*
* @param ids 需要删除的营养知识小问答ID
* @return 结果
*/
@Override
public int deleteSysNutritionQuestionByIds(Long[] ids)
{
return sysNutritionQuestionMapper.deleteSysNutritionQuestionByIds(ids);
}
/**
* 删除营养知识小问答信息
*
* @param id 营养知识小问答ID
* @return 结果
*/
@Override
public int deleteSysNutritionQuestionById(Long id)
{
return sysNutritionQuestionMapper.deleteSysNutritionQuestionById(id);
}
/**
* 根据关键词搜索对应营养知识问答
* @return
*/
@Override
public Map<String, Object> getNutritionQuestionListByKey(SysNutritionQuestion sysNutritionQuestion, int pageNum, int pageSize){
//return sysNutritionQuestionMapper.getNutritionQuestionListByKey(sysNutritionQuestion);
try{
//建立索引
LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(index_path);
return luceneIndexUtils.queryByKeyword(sysNutritionQuestion.getKey(), index_field_array, pageNum, pageSize);
}catch (Exception e){
e.printStackTrace();
}
Map<String, Object> result = new HashMap<>();
result.put("total", 0);
result.put("data", new ArrayList<>());
return result;
}
/**
* 建立索引
* @param sysNutritionQuestion
* @return
*/
private boolean createNutritionQuestionIndex(SysNutritionQuestion sysNutritionQuestion){
try{
//建立索引
LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(index_path);
Document document = new Document();
for (String fieldName : index_field_array) {
document.add(new TextField(fieldName, ReflectUtils.getFieldValue(sysNutritionQuestion, fieldName)+"", Field.Store.YES));
}
return luceneIndexUtils.addIndexOne(document);
}catch (Exception e){
e.printStackTrace();
return false;
}
}
}

View File

@ -133,4 +133,13 @@ public class SysWxUserLogServiceImpl implements ISysWxUserLogService {
return sysWxUserLogMapper.getWxUserLogListByCustomerId(sysWxUserLog);
}
/**
* 根据ID查询打卡详情
* @param sysWxUserLog
* @return
*/
public WxLogInfo getWxLogInfoDetailById(SysWxUserLog sysWxUserLog){
return sysWxUserLogMapper.getWxLogInfoDetailById(sysWxUserLog);
}
}

View File

@ -0,0 +1,319 @@
package com.stdiet.custom.utils;
import com.stdiet.common.utils.StringUtils;
import com.stdiet.custom.service.impl.SysNutritionQuestionServiceImpl;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Lucene的IKAnalyzer工具类
*/
public class LuceneIndexUtils {
//分词器
private IKAnalyzer analyzer = null;
//索引库
private Directory directory = null;
//分词器工具
private IndexWriterConfig config = null;
//流
private IndexWriter indexWriter= null;
public static final String default_primary_key = "id";
public static final Integer max_select_count = 1000;
public static LuceneIndexUtils getLuceneIndexUtils(String indexPath){
LuceneIndexUtils luceneIndexUtils = new LuceneIndexUtils();
try {
//分词器
luceneIndexUtils.analyzer = new IKAnalyzer();
//使用智能分词
luceneIndexUtils.analyzer.setUseSmart(true);
//索引库
luceneIndexUtils.directory = FSDirectory.open(new File(indexPath));
//工具装配分词器
luceneIndexUtils.config = new IndexWriterConfig(Version.LUCENE_44, luceneIndexUtils.analyzer);
} catch (Exception e) {
e.printStackTrace();
}
return luceneIndexUtils;
}
/**
* 增加所有数据
* @return
* @throws IOException
*/
public int addIndexs(ArrayList<Document> documents) throws IOException {
//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);
//数据进流
indexWriter.addDocuments(documents);
try {
indexWriter.commit();
return documents.size();
}catch (Exception e){
indexWriter.rollback();
return 0;
}finally {
indexWriter.close();
indexWriter= null;
//config=null;
}
}
/**
* 增加一条数据
* @param document
* @return
* @throws IOException
*/
public boolean addIndexOne(Document document) throws IOException {
//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);
//数据进流
indexWriter.addDocument(document);
try {
indexWriter.commit();
return true;
}catch (Exception e){
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
}
}
/**
* 删除索引库所有数据
* @return
* @throws IOException
*/
public boolean deleteAllIndex() throws IOException {
try {
//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);
indexWriter.deleteAll();
indexWriter.commit();
return true;
}catch (Exception e){
e.printStackTrace();
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
}
}
/**
* 删除索引库中一条数据
* @param term
* @return
* @throws IOException
*/
public boolean deleteOne(Term term) throws IOException {
//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);
try {
indexWriter.deleteDocuments(term);
indexWriter.commit();
return true;
}catch (Exception e){
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
}
}
/**
* 修改索引库中一条数据
* 注意:此处修改为 根据查找条件修改 如果有则修改 没有则新添 多条则修改一条(索引库的底层其实做法是 先删除,后修改- -
* @param term
* @param document
* @return
* @throws IOException
*/
public boolean updateOne(Term term, Document document) throws IOException {
try {
//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);
indexWriter.updateDocument(term,document);
indexWriter.commit();
return true;
}catch (Exception e){
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
}
}
/**
* 查询索引库的数据(根据输入关键字)
* @param keyword
* @return
* @throws Exception
*/
public Map<String, Object> queryByKeyword(String keyword, String[] columns, int pageNum, int pageSize) throws Exception {
Map<String, Object> result = new HashMap<>();
//指定读取索引库的列数据
//String[] columns = {"articleId","articleName","articleImage","articleContent"};
//装配
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_44, columns, analyzer);
//解析输入关键字
Query query = StringUtils.isEmpty(keyword) ? new WildcardQuery(new Term(default_primary_key, "*")) : queryParser.parse(keyword);
//读索引库流
IndexReader reader = DirectoryReader.open(directory);
//获得读取对象
IndexSearcher indexSearcher = new IndexSearcher(reader);
//排序
SortField sortField = new SortField(default_primary_key, SortField.Type.INT, true);
Sort sort = new Sort(sortField);
//装配解析结果 指定读取量级
TopDocs search = indexSearcher.search(query, max_select_count, sort);
//获得数据地址数组
ScoreDoc[] scoreDocs = search.scoreDocs;
result.put("total", scoreDocs.length);
//创建返回集合 --> 方便装配
ArrayList<Document> list = new ArrayList<>();
int start = (pageNum - 1) * pageSize;
if(start < scoreDocs.length){
int end = pageSize * pageNum;
if (end > scoreDocs.length) {
end = scoreDocs.length;
}
for (int i = start; i < end; i++) {
//进集合 装配
list.add(indexSearcher.doc(scoreDocs[i].doc));
}
}
result.put("data", list);
return result;
}
/**
* 重置索引库 不解释
* @return
* @throws IOException
*/
public boolean resetIndexDB(ArrayList<Document> documents) throws IOException {
try {
boolean bool = deleteAllIndex();
System.out.println(bool);
int i = addIndexs(documents);
System.out.println(i);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 打印分词结果
* @param keyWord
* @throws Exception
*/
public static void printAnalysisResult(String keyWord) throws Exception {
StringReader reader = new StringReader(keyWord);
IKSegmenter ik = new IKSegmenter(reader, true);// 当为true时分词器进行最大词长切分
Lexeme lexeme = null;
while ((lexeme = ik.next()) != null) {
System.out.println(lexeme.getLexemeText());
}
}
public static void main(String[] args) throws IOException {
try{
LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(SysNutritionQuestionServiceImpl.index_path);
/*for (int i = 1 ; i < 100; i++){
Document document = new Document();
document.add(new TextField("id",i+"", Field.Store.YES));
document.add(new TextField("title","什么食物是脂肪杀手?", Field.Store.YES));
document.add(new TextField("content","黄瓜", Field.Store.YES));
document.add(new TextField("key","脂肪|杀手|食物", Field.Store.YES));
luceneIndexUtils.addIndexOne(document);
}*/
/*Document document = new Document();
document.add(new TextField("id","1", Field.Store.YES));
document.add(new TextField("title","什么食物是脂肪杀手?", Field.Store.YES));
document.add(new TextField("content","黄瓜", Field.Store.YES));
document.add(new TextField("key","脂肪|杀手|食物", Field.Store.YES));
luceneIndexUtils.addIndexOne(document);*/
String[] columns = {"key","content","title"};
Map<String,Object> map = luceneIndexUtils.queryByKeyword("猝死", SysNutritionQuestionServiceImpl.index_field_array, 1,10);
System.out.println(Long.parseLong(map.get("total").toString()));
for(Document document : (List<Document>)map.get("data")){
System.out.println(document.get("id")+"-"+document.get("key"));
}
//LuceneIndexUtils.printAnalysisResult("什么食物是脂肪杀手?");
}catch (Exception e){
e.printStackTrace();
}
}
}