فهرست منبع

fix :新版faq

zzf 1 سال پیش
والد
کامیت
c0ac637e75
28فایلهای تغییر یافته به همراه453 افزوده شده و 138 حذف شده
  1. 1 0
      src/main/java/com/rf/kjb/chat/dao/domain/ChatAnswerEntity.java
  2. 7 7
      src/main/java/com/rf/kjb/chat/dao/domain/ChatQuestionEntity.java
  3. 18 0
      src/main/java/com/rf/kjb/chat/dao/domain/ChatQuestionId.java
  4. 34 0
      src/main/java/com/rf/kjb/chat/dao/domain/ResultQuestionEntity.java
  5. 1 4
      src/main/java/com/rf/kjb/chat/dao/repository/ChatAnswerRepository.java
  6. 3 3
      src/main/java/com/rf/kjb/chat/dao/repository/ChatQuestionRepository.java
  7. 9 0
      src/main/java/com/rf/kjb/chat/dao/repository/ResultQuestionRepository.java
  8. 36 64
      src/main/java/com/rf/kjb/chat/rest/ChatController.java
  9. 1 4
      src/main/java/com/rf/kjb/chat/service/ChatAnswerService.java
  10. 1 7
      src/main/java/com/rf/kjb/chat/service/ChatQuestionService.java
  11. 8 0
      src/main/java/com/rf/kjb/chat/service/ResultQuestionService.java
  12. 1 11
      src/main/java/com/rf/kjb/chat/service/impl/ChatAnswerServiceImpl.java
  13. 5 17
      src/main/java/com/rf/kjb/chat/service/impl/ChatQuestionServiceImpl.java
  14. 22 0
      src/main/java/com/rf/kjb/chat/service/impl/ResultQuestionServiceImpl.java
  15. 2 1
      src/main/java/com/rf/kjb/exception/ErrorCode.java
  16. 2 1
      src/main/java/com/rf/kjb/hospital/service/impl/HospitalServiceImpl.java
  17. 2 0
      src/main/java/com/rf/kjb/scale/dao/repository/RecordPhyRepository.java
  18. 2 3
      src/main/java/com/rf/kjb/scale/dao/repository/RecordRepository.java
  19. 2 0
      src/main/java/com/rf/kjb/scale/service/RecordPhyService.java
  20. 2 1
      src/main/java/com/rf/kjb/scale/service/RecordService.java
  21. 1 1
      src/main/java/com/rf/kjb/scale/service/impl/GameRecordServiceImpl.java
  22. 5 0
      src/main/java/com/rf/kjb/scale/service/impl/RecordPhyServiceImpl.java
  23. 8 5
      src/main/java/com/rf/kjb/scale/service/impl/RecordServiceImpl.java
  24. 3 0
      src/main/java/com/rf/kjb/user/dao/repository/UserRepository.java
  25. 52 8
      src/main/java/com/rf/kjb/user/rest/UserController.java
  26. 2 0
      src/main/java/com/rf/kjb/user/service/UserService.java
  27. 7 1
      src/main/java/com/rf/kjb/user/service/impl/UserServiceImpl.java
  28. 216 0
      src/main/resources/logback.xml

+ 1 - 0
src/main/java/com/rf/kjb/chat/dao/domain/ChatAnswerEntity.java

@@ -2,6 +2,7 @@ package com.rf.kjb.chat.dao.domain;
 
 import com.rf.kjb.base.model.BaseEntry;
 import lombok.*;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;

+ 7 - 7
src/main/java/com/rf/kjb/chat/dao/domain/ChatQuestionEntity.java

@@ -1,11 +1,8 @@
 package com.rf.kjb.chat.dao.domain;
 
-import com.rf.kjb.base.model.BaseEntry;
 import lombok.*;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * @Author:zzf
@@ -13,7 +10,6 @@ import javax.persistence.Table;
  * @Description:
  */
 @Entity
-
 @Data
 @Getter
 @Setter
@@ -21,8 +17,11 @@ import javax.persistence.Table;
 @AllArgsConstructor
 @Table(name = "t_chat_question")
 @org.hibernate.annotations.Table(appliesTo = "t_chat_question", comment = "对话问题表")
-public class ChatQuestionEntity extends BaseEntry {
-
+@IdClass(ChatQuestionId.class)
+public class ChatQuestionEntity   {
+    @Id
+    @Column(name = "id", columnDefinition = "varchar(36) COMMENT '数据ID'")
+    private String id;
     @Column(name = "question",columnDefinition = "varchar(50) not null comment '问题'")
     private String question;
 
@@ -32,6 +31,7 @@ public class ChatQuestionEntity extends BaseEntry {
     @Column(name = "question_type",columnDefinition = "varchar(200) not null comment '答案信息'")
     private String questionType;
 
+    @Id
     @Column(name = "label",columnDefinition = "varchar(2) not null comment '分类:1-焦虑;2-抑郁;3-失眠;4-压力'")
     private String label;
 

+ 18 - 0
src/main/java/com/rf/kjb/chat/dao/domain/ChatQuestionId.java

@@ -0,0 +1,18 @@
+package com.rf.kjb.chat.dao.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @Author:zzf
+ * @Date:2023/9/13:09:26
+ * @Description:
+ */
+@Data
+@NoArgsConstructor
+public class ChatQuestionId implements Serializable {
+    String id;
+    String label;
+}

+ 34 - 0
src/main/java/com/rf/kjb/chat/dao/domain/ResultQuestionEntity.java

@@ -0,0 +1,34 @@
+package com.rf.kjb.chat.dao.domain;
+
+import com.rf.kjb.base.model.BaseEntry;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * @Author:zzf
+ * @Date:2023/9/6:10:58
+ * @Description: 根据量表的测试结果查询下一问题编号
+ */
+@Entity
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "result_question")
+@org.hibernate.annotations.Table(appliesTo = "result_question", comment = "根据量表的测试结果查询下一问题编号")
+@DynamicUpdate
+public class ResultQuestionEntity extends BaseEntry {
+    @Column(name = "label",columnDefinition = "varchar(2) not null comment '分类:1-焦虑;2-抑郁;3-失眠;4-压力'")
+    private String label;
+
+    @Column(name = "result",columnDefinition = "varchar(50) not null comment '量表测试结果'")
+    private String result;
+
+    @Column(name = "next_question_no",columnDefinition = "varchar(50) not null comment '下一问题编号'")
+    private String nextQuestionNo;
+}

+ 1 - 4
src/main/java/com/rf/kjb/chat/dao/repository/ChatAnswerRepository.java

@@ -3,14 +3,11 @@ package com.rf.kjb.chat.dao.repository;
 
 import com.rf.kjb.base.repository.BaseRepository;
 import com.rf.kjb.chat.dao.domain.ChatAnswerEntity;
+
 import java.util.List;
 
 public interface ChatAnswerRepository extends BaseRepository<ChatAnswerEntity,String> {
     List<ChatAnswerEntity> findByQuestionNo(String questionNo);
 
     List<ChatAnswerEntity> findByQuestionNoAndLabel(String questionNo, String label);
-
-    void deleteByLabel(String label);
-
-    //void saveBatch(List<ChatAnswerEntity> chatAnswerEntityList);
 }

+ 3 - 3
src/main/java/com/rf/kjb/chat/dao/repository/ChatQuestionRepository.java

@@ -1,10 +1,10 @@
 package com.rf.kjb.chat.dao.repository;
 
+
 import com.rf.kjb.base.repository.BaseRepository;
 import com.rf.kjb.chat.dao.domain.ChatQuestionEntity;
+import com.rf.kjb.chat.dao.domain.ChatQuestionId;
 
-public interface ChatQuestionRepository extends BaseRepository<ChatQuestionEntity,String> {
+public interface ChatQuestionRepository extends BaseRepository<ChatQuestionEntity, ChatQuestionId> {
     ChatQuestionEntity findByIdAndLabel(String id, String label);
-
-    void deleteByLabel(String label);
 }

+ 9 - 0
src/main/java/com/rf/kjb/chat/dao/repository/ResultQuestionRepository.java

@@ -0,0 +1,9 @@
+package com.rf.kjb.chat.dao.repository;
+
+
+import com.rf.kjb.base.repository.BaseRepository;
+import com.rf.kjb.chat.dao.domain.ResultQuestionEntity;
+
+public interface ResultQuestionRepository extends BaseRepository<ResultQuestionEntity,String> {
+    ResultQuestionEntity findByLabelAndResult(String label, String result);
+}

+ 36 - 64
src/main/java/com/rf/kjb/chat/rest/ChatController.java

@@ -3,113 +3,85 @@ package com.rf.kjb.chat.rest;
 import com.rf.kjb.base.rest.BaseController;
 import com.rf.kjb.chat.dao.domain.ChatAnswerEntity;
 import com.rf.kjb.chat.dao.domain.ChatQuestionEntity;
+import com.rf.kjb.chat.dao.domain.ResultQuestionEntity;
 import com.rf.kjb.chat.service.ChatAnswerService;
 import com.rf.kjb.chat.service.ChatQuestionService;
-import com.rf.kjb.excel.ExcelUtil;
+import com.rf.kjb.chat.service.ResultQuestionService;
+import com.rf.kjb.exception.ErrorCode;
 import com.rf.kjb.utils.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
+
 import java.util.List;
-import java.util.Objects;
-import java.util.UUID;
 
 @Slf4j
 @RestController
 @RequestMapping("/chat")
-@Api(tags = "智能对话")
+@Api(tags = "对话")
 public class ChatController extends BaseController {
+
     @Autowired
     private ChatQuestionService questionService;
 
     @Autowired
     private ChatAnswerService answerService;
 
+    @Autowired
+    private ResultQuestionService resultQuestionService;
+
+
     /**
      * 查询会话问题
      */
-    @GetMapping("/getQuestion")
-    @ApiOperation("查询问题信息:首次查询时,id传空字符串即可查询出第一道题目;questionType=0表示选择题,questionType=1表示填空题;当改问题的nextQuestionNo 不为空是,则表示改题为陈述,没有答案,直接在显示此问题之后再次请求该接口显示questionNo对应的题目信息即可;label:分类:1-焦虑;2-抑郁;3-失眠;4-压力")
-    public Result getQuestion(String id ,String label){
+
+    @GetMapping("/getQuestion/{label}")
+    @ApiOperation("查询问题信息:首次查询时,id传空字符串即可查询出第一道题目;questionType=0表示选择题,questionType=1表示填空题;当改问题的nextQuestionNo 不为空是,则表示改题为陈述,没有答案,直接在显示此问题之后再次请求该接口显示questionNo对应的题目信息即可")
+    public Result getQuestion(String id , @PathVariable String label){
 
         if(StringUtils.isBlank(id)){
             id = "1";
         }
-        if(StringUtils.isBlank(label)){
-            id = "1";
-        }
-
         ChatQuestionEntity questionEntity = this.questionService.findByIdAndLabel(id,label);
         return success(questionEntity);
     }
+
+
     @GetMapping("/getAnswer/{questionNo}/{label}")
     @ApiOperation("查询答案列表,questionNo为问题的id字段,nextQuestionNo 为此答案被选中后的下一个应该呈现的问题")
-    public Result getAnswer(@PathVariable String questionNo, @PathVariable String label){
+    public Result getAnswer(@PathVariable String questionNo,@PathVariable String label){
         List<ChatAnswerEntity> answerEntities = this.answerService.findByQuestionNoAndLabel(questionNo,label);
         return success(answerEntities);
     }
-    @PostMapping("/import/{label}/faq")
-    @ApiOperation("智能问答导入")
-    public Result importQuestionAndAnswer( @RequestPart("file") MultipartFile file, @PathVariable String label){
-//        FileInputStream fileInputStream = new FileInputStream(file);
-        String [] fileNames = Objects.requireNonNull(file.getOriginalFilename()).split("\\.");
-        File targetFile = null;
-        List<ChatQuestionEntity> chatQuestionEntityList = new ArrayList<>();
-        List<ChatAnswerEntity> chatAnswerEntityList = new ArrayList<>();
-        try {
-//            targetFile = new File("./"+fileNames[0]+ UUID.randomUUID()+"."+fileNames[1]);
-//            FileUtils.copyInputStreamToFile(file.getInputStream(),targetFile);
-            targetFile = File.createTempFile(fileNames[0],"."+fileNames[1]);
-            file.transferTo(targetFile);
-            List<List<List<Object>>> datas = ExcelUtil.getBankListByExcelSheet(Files.newInputStream(Paths.get(targetFile.getAbsolutePath())), targetFile.getName());
-            List<List<Object>> questionList  = datas.get(0);
-            List<List<Object>> answerList  = datas.get(1);
-            questionList.forEach(item ->{
-                ChatQuestionEntity chatQuestionEntity = new ChatQuestionEntity();
-                chatQuestionEntity.setId((String) item.get(0));
-                chatQuestionEntity.setQuestion((String) item.get(1));
-                chatQuestionEntity.setNextQuestionNo((String) item.get(2));
-                chatQuestionEntity.setQuestionType((String) item.get(3));
-                chatQuestionEntity.setScaleFlag((String) item.get(4));
-                chatQuestionEntity.setLabel(label);
-                chatQuestionEntityList.add(chatQuestionEntity);
-            });
-            answerList.forEach(item ->{
-                ChatAnswerEntity chatAnswerEntity = new ChatAnswerEntity();
-                chatAnswerEntity.setQuestionNo((String) item.get(0));
-                chatAnswerEntity.setNextQuestionNo((String) item.get(1));
-                chatAnswerEntity.setAnswer((String) item.get(2));
-                chatAnswerEntity.setLabel(label);
-                chatAnswerEntityList.add(chatAnswerEntity);
-            });
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
 
-        if(chatQuestionEntityList.size()>0 && chatAnswerEntityList.size()>0){
-            this.questionService.deleteByLabel(label);
-            this.answerService.deleteByLabel(label);
+    @GetMapping("/getNextQuestionByScaleResult")
+    @ApiOperation("根据量表测试结果查询下一问题编号")
+    public Result getNextQuestionByScaleResult(String label,String result){
 
-            this.questionService.saveBatch(chatQuestionEntityList);
-            this.answerService.saveBatch(chatAnswerEntityList);
+        ResultQuestionEntity resultQuestionEntity =  this.resultQuestionService.findByLabelAndResult(label,result);
+        if (resultQuestionEntity == null){
+            return fail(ErrorCode.NEXT_QUESTION_NO_NOT_FOUND);
+        }
+        ChatQuestionEntity byIdAndLabel = this.questionService.findByIdAndLabel(resultQuestionEntity.getNextQuestionNo(), label);
+        if(byIdAndLabel == null){
+            return fail(ErrorCode.NEXT_QUESTION_NO_ERROR);
         }
+        return success(resultQuestionEntity);
+    }
 
+    @PostMapping("/complete/chat")
+    @ApiOperation(value = "结束会话,保存会话记录",notes = "identifier:用户编号;label:只能对话分类 1-焦虑;2-抑郁;3-失眠;4-压力;chatDetail:会话详情")
+    public Result completeChat(@RequestBody String json ){
 
-        return success();
 
+        return success();
     }
 
 
+
+
+
 }

+ 1 - 4
src/main/java/com/rf/kjb/chat/service/ChatAnswerService.java

@@ -1,5 +1,6 @@
 package com.rf.kjb.chat.service;
 
+
 import com.rf.kjb.chat.dao.domain.ChatAnswerEntity;
 
 import java.util.List;
@@ -8,8 +9,4 @@ public interface ChatAnswerService {
     List<ChatAnswerEntity> findByQuestionNo(String questionNo);
 
     List<ChatAnswerEntity> findByQuestionNoAndLabel(String questionNo, String label);
-
-    void deleteByLabel(String label);
-
-    void saveBatch(List<ChatAnswerEntity> chatAnswerEntityList);
 }

+ 1 - 7
src/main/java/com/rf/kjb/chat/service/ChatQuestionService.java

@@ -3,19 +3,13 @@ package com.rf.kjb.chat.service;
 
 import com.rf.kjb.chat.dao.domain.ChatQuestionEntity;
 
-import java.util.List;
-
 /**
  * @Author:zzf
  * @Date:2022/10/21:01:04
  * @Description:
  */
 public interface ChatQuestionService {
-    ChatQuestionEntity findById(String id);
+//    ChatQuestionEntity findById(String id);
 
     ChatQuestionEntity findByIdAndLabel(String id, String label);
-
-    void deleteByLabel(String label);
-
-    void saveBatch(List<ChatQuestionEntity> chatQuestionEntityList);
 }

+ 8 - 0
src/main/java/com/rf/kjb/chat/service/ResultQuestionService.java

@@ -0,0 +1,8 @@
+package com.rf.kjb.chat.service;
+
+
+import com.rf.kjb.chat.dao.domain.ResultQuestionEntity;
+
+public interface ResultQuestionService {
+    ResultQuestionEntity findByLabelAndResult(String label, String result);
+}

+ 1 - 11
src/main/java/com/rf/kjb/chat/service/impl/ChatAnswerServiceImpl.java

@@ -25,16 +25,6 @@ public class ChatAnswerServiceImpl implements ChatAnswerService {
 
     @Override
     public List<ChatAnswerEntity> findByQuestionNoAndLabel(String questionNo, String label) {
-        return this.answerRepository.findByQuestionNoAndLabel( questionNo,  label);
-    }
-
-    @Override
-    public void deleteByLabel(String label) {
-        this.answerRepository.deleteByLabel(label);
-    }
-
-    @Override
-    public void saveBatch(List<ChatAnswerEntity> chatAnswerEntityList) {
-        this.answerRepository.saveAll(chatAnswerEntityList);
+        return this.answerRepository.findByQuestionNoAndLabel(questionNo,label);
     }
 }

+ 5 - 17
src/main/java/com/rf/kjb/chat/service/impl/ChatQuestionServiceImpl.java

@@ -6,8 +6,6 @@ import com.rf.kjb.chat.service.ChatQuestionService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-
 /**
  * @Author:zzf
  * @Date:2022/10/21:01:04
@@ -18,23 +16,13 @@ public class ChatQuestionServiceImpl implements ChatQuestionService {
 
     @Autowired
     private ChatQuestionRepository questionRepository;
-    @Override
-    public ChatQuestionEntity findById(String id) {
-        return this.questionRepository.findById(id).orElse(null);
-    }
+//    @Override
+//    public ChatQuestionEntity findById(String id) {
+//        return this.questionRepository.findById(id).orElse(null);
+//    }
 
     @Override
     public ChatQuestionEntity findByIdAndLabel(String id, String label) {
-        return this.questionRepository.findByIdAndLabel( id,  label);
-    }
-
-    @Override
-    public void deleteByLabel(String label) {
-        this.questionRepository.deleteByLabel(label);
-    }
-
-    @Override
-    public void saveBatch(List<ChatQuestionEntity> chatQuestionEntityList) {
-        this.questionRepository.saveAll(chatQuestionEntityList);
+        return this.questionRepository.findByIdAndLabel(id,label);
     }
 }

+ 22 - 0
src/main/java/com/rf/kjb/chat/service/impl/ResultQuestionServiceImpl.java

@@ -0,0 +1,22 @@
+package com.rf.kjb.chat.service.impl;
+
+import com.rf.kjb.chat.dao.domain.ResultQuestionEntity;
+import com.rf.kjb.chat.dao.repository.ResultQuestionRepository;
+import com.rf.kjb.chat.service.ResultQuestionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author:zzf
+ * @Date:2023/9/6:11:03
+ * @Description:
+ */
+@Service
+public class ResultQuestionServiceImpl implements ResultQuestionService {
+    @Autowired
+    private ResultQuestionRepository repository;
+    @Override
+    public ResultQuestionEntity findByLabelAndResult(String label, String result) {
+        return repository.findByLabelAndResult(label,result);
+    }
+}

+ 2 - 1
src/main/java/com/rf/kjb/exception/ErrorCode.java

@@ -19,7 +19,8 @@ public enum ErrorCode {
     /** 量表 **/
     CATEGORY_EXIST(2001,"量表类别已存在"),
     SCALE_UNUSEFUL(2002,"量表不可用"),
-
+    NEXT_QUESTION_NO_NOT_FOUND(2003,"未设置下一问题编号"),
+    NEXT_QUESTION_NO_ERROR(2004,"下一问题编号设置错误"),
 
 
     ;

+ 2 - 1
src/main/java/com/rf/kjb/hospital/service/impl/HospitalServiceImpl.java

@@ -33,7 +33,7 @@ public class HospitalServiceImpl implements HospitalService {
     @Override
     public Page<HospitalEntity> findAll(JSONObject jsonObject) {
         Specification<HospitalEntity> specification = (root, query, criteriaBuilder) -> {
-            List<javax.persistence.criteria.Predicate> predicateList = new ArrayList<>();
+            List<Predicate> predicateList = new ArrayList<>();
             if(jsonObject.containsKey("id") && StringUtils.isNotEmpty(jsonObject.getString("id"))){
                 predicateList.add(criteriaBuilder.equal(root.get("id"),jsonObject.getString("id")));
             }
@@ -48,6 +48,7 @@ public class HospitalServiceImpl implements HospitalService {
                 predicateList.add(criteriaBuilder.like(root.get("address"),"%"+jsonObject.getString("address")+"%"));
             }
             query.where(criteriaBuilder.and(predicateList.toArray(new Predicate[0])));
+            query.orderBy(criteriaBuilder.desc(root.get("createTime")),criteriaBuilder.desc(root.get("updateTime")));
             return query.getRestriction();
         };
         int pageNum = (jsonObject.containsKey("pageNum") && jsonObject.getInteger("pageNum") >0)?jsonObject.getIntValue("pageNum"): 1;

+ 2 - 0
src/main/java/com/rf/kjb/scale/dao/repository/RecordPhyRepository.java

@@ -38,6 +38,8 @@ public interface RecordPhyRepository extends BaseRepository<RecordPhyEntry,Strin
 
     List<RecordPhyEntry> findByType(String type);
 
+    void deleteByIdentifier(String identifier);
+
 
 //    List<String> findIdentifiers(@Param("type") String type,@Param("userName") String userName,@Param("pageNum") int pageNum,@Param("pageSize") int pageSize);
 }

+ 2 - 3
src/main/java/com/rf/kjb/scale/dao/repository/RecordRepository.java

@@ -2,11 +2,8 @@ package com.rf.kjb.scale.dao.repository;
 
 import com.rf.kjb.base.repository.BaseRepository;
 import com.rf.kjb.scale.dao.model.RecordEntity;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -42,4 +39,6 @@ public interface RecordRepository extends BaseRepository<RecordEntity, String> {
             " and if (:userName is not null and :userName != '',t.identifier in (select identifier from t_user_info where user_name like :userName),1=1)" +
             "",nativeQuery = true)
     int findIdentifiersCount(@Param("flag") String flag, @Param("startDate") String startDate,@Param("userName") String userName, @Param("endDate") String endDate);
+
+    void deleteByIdentifier(String identifier);
 }

+ 2 - 0
src/main/java/com/rf/kjb/scale/service/RecordPhyService.java

@@ -22,4 +22,6 @@ public interface RecordPhyService {
     List<RecordPhyEntry> findAll(JSONObject jsonObject);
 
     List<RecordPhyEntry> findByType(String type);
+
+    void deleteByIdentifier(String identifier);
 }

+ 2 - 1
src/main/java/com/rf/kjb/scale/service/RecordService.java

@@ -1,6 +1,5 @@
 package com.rf.kjb.scale.service;
 
-import com.alibaba.fastjson.JSONObject;
 import com.rf.kjb.scale.dao.model.RecordEntity;
 import org.springframework.data.domain.Page;
 
@@ -57,4 +56,6 @@ public interface RecordService {
      * @return
      */
     List<RecordEntity> findNoPage(String json);
+
+    void deleteByIdentifier(String identifier);
 }

+ 1 - 1
src/main/java/com/rf/kjb/scale/service/impl/GameRecordServiceImpl.java

@@ -66,7 +66,7 @@ public class GameRecordServiceImpl implements GameRecordService {
                 predicateList.add(cb.equal(root.get("gameTime"),jsonObject.getString("gameTime")));
             }
             query.where(cb.and(predicateList.toArray(new Predicate[0])));
-            query.orderBy(cb.asc(root.get("saveTime")));
+            query.orderBy(cb.desc(root.get("saveTime")));
             return query.getRestriction();
         };
         return this.gameRecordRepository.findAll(specification, PageRequest.of(pageNum-1,pageSize));

+ 5 - 0
src/main/java/com/rf/kjb/scale/service/impl/RecordPhyServiceImpl.java

@@ -136,4 +136,9 @@ public class RecordPhyServiceImpl implements RecordPhyService {
     public List<RecordPhyEntry> findByType(String type) {
         return this.repository.findByType(type);
     }
+
+    @Override
+    public void deleteByIdentifier(String identifier) {
+        this.repository.deleteByIdentifier(identifier);
+    }
 }

+ 8 - 5
src/main/java/com/rf/kjb/scale/service/impl/RecordServiceImpl.java

@@ -2,14 +2,11 @@ package com.rf.kjb.scale.service.impl;
 
 
 import com.alibaba.fastjson.JSONObject;
-import com.mysql.cj.util.Util;
 import com.rf.kjb.scale.dao.model.RecordEntity;
-
 import com.rf.kjb.scale.dao.model.SubjectEntity;
 import com.rf.kjb.scale.dao.repository.RecordRepository;
 import com.rf.kjb.scale.dao.repository.SubjectRepository;
 import com.rf.kjb.scale.service.RecordService;
-import com.rf.kjb.user.dao.model.UserEntry;
 import com.rf.kjb.user.dao.repository.UserRepository;
 import com.rf.kjb.utils.Utils;
 import lombok.extern.slf4j.Slf4j;
@@ -19,6 +16,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+
 import javax.persistence.criteria.Predicate;
 import java.util.ArrayList;
 import java.util.List;
@@ -83,7 +81,7 @@ public class RecordServiceImpl implements RecordService {
         int pageNum = 1;
         int pageSize = 10;
         if(jsonObject.containsKey("pageNum")){
-            pageNum = jsonObject.getIntValue("pageNum") -1;
+            pageNum = jsonObject.getIntValue("pageNum") ;
         }
         if(jsonObject.containsKey("pageSize")){
             pageSize = jsonObject.getIntValue("pageSize");
@@ -99,7 +97,7 @@ public class RecordServiceImpl implements RecordService {
         if(jsonObject.containsKey("userName") && StringUtils.isNotBlank(jsonObject.getString("userName"))){
             userName = "%"+jsonObject.getString("userName")+"%";
         }
-        return this.userRecordRepository.findIdentifiers(flag,startDate,userName,endDate,pageNum,pageSize);
+        return this.userRecordRepository.findIdentifiers(flag,startDate,userName,endDate,(pageNum-1)*pageSize,pageSize);
 
 
     }
@@ -149,6 +147,11 @@ public class RecordServiceImpl implements RecordService {
         return this.userRecordRepository.findAll(specification);
     }
 
+    @Override
+    public void deleteByIdentifier(String identifier) {
+        this.userRecordRepository.deleteByIdentifier( identifier);
+    }
+
     private Specification<RecordEntity> createSpecification(JSONObject jsonObject) {
         return (root, query, cb) -> {
 

+ 3 - 0
src/main/java/com/rf/kjb/user/dao/repository/UserRepository.java

@@ -5,6 +5,7 @@ import com.rf.kjb.user.dao.model.UserEntry;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
+
 import javax.transaction.Transactional;
 import java.util.List;
 
@@ -20,4 +21,6 @@ public interface UserRepository extends BaseRepository<UserEntry,String> {
     List<String> findIdentifierByName(@Param("userName") String userName);
 
     UserEntry findByIdentifierAndPassword(String identifier, String password);
+
+    void deleteByIdentifier(String identifier);
 }

+ 52 - 8
src/main/java/com/rf/kjb/user/rest/UserController.java

@@ -2,10 +2,12 @@ package com.rf.kjb.user.rest;
 
 import com.alibaba.fastjson.JSONObject;
 import com.rf.kjb.base.rest.BaseController;
+import com.rf.kjb.exception.ErrorCode;
+import com.rf.kjb.scale.service.RecordPhyService;
+import com.rf.kjb.scale.service.RecordService;
 import com.rf.kjb.scale.util.DateUtil;
 import com.rf.kjb.user.dao.model.UserEntry;
 import com.rf.kjb.user.service.UserService;
-import com.rf.kjb.exception.ErrorCode;
 import com.rf.kjb.utils.Constant;
 import com.rf.kjb.utils.JWTUtil;
 import com.rf.kjb.utils.Result;
@@ -33,6 +35,12 @@ public class UserController extends BaseController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private RecordService userRecordService;
+
+    @Autowired
+    private RecordPhyService recordPhyService;
+
     /**
      * 注册
      * @param json
@@ -43,13 +51,6 @@ public class UserController extends BaseController {
     public Result save( @RequestBody String json){
         JSONObject jsonObject =JSONObject.parseObject(json);
         UserEntry userEntry = jsonObject.toJavaObject(UserEntry.class);
-        assert StringUtils.isNotBlank(userEntry.getIdentifier()):"编号为空";
-        assert StringUtils.isNotBlank(userEntry.getUserName()):"用户名为空";
-        assert userEntry.getAge() != 0 :"年龄不合法";
-        assert StringUtils.isNotBlank(userEntry.getProfession()):"职业为空";
-        assert userEntry.getGender() == 0||userEntry.getGender() == 1 : "性别不合法";
-        assert StringUtils.isNotBlank(userEntry.getPassword()) : "密码为空";
-        assert StringUtils.isNotBlank(jsonObject.getString("rePassword")) : "确认密码为空";
         if(!userEntry.getPassword().equals(jsonObject.getString("rePassword"))){
             return fail(ErrorCode.PASSWORD_DIFF);
         }
@@ -61,6 +62,49 @@ public class UserController extends BaseController {
         return success();
     }
 
+    /**
+     * 修改用户信息
+     * @param json
+     * @return
+     */
+    @PostMapping("/update")
+    @ApiOperation(value = "用户信息更新",notes = " id:用户ID;userName 用户名 字符串,identifier:用户编号 字符串,age 年龄 整数数值类型,gender 性别 0女 1男 整数数值类型,password:密码,rePassword:确认密码,profession:职业,role 角色,数值类型,0普通用户 1管理员")
+    public Result update( @RequestBody String json){
+        JSONObject jsonObject =JSONObject.parseObject(json);
+        UserEntry userEntry = jsonObject.toJavaObject(UserEntry.class);
+        assert StringUtils.isNotBlank(userEntry.getId()):"用户ID为空";
+        assertUser(jsonObject, userEntry);
+        userEntry.setUpdateTime(new Date());
+        this.userService.save(userEntry);
+        return success();
+    }
+    @DeleteMapping("/delete/{identifier}")
+    @ApiOperation(value = "删除用户",notes = "identifier:用户编号")
+    public Result delete(@PathVariable String identifier){
+        //删除用户测试记录
+        this.recordPhyService.deleteByIdentifier(identifier);
+        //删除生理记录
+        this.userRecordService.deleteByIdentifier(identifier);
+        //删除用户信息
+        this.userService.deleteByIdentifier(identifier);
+        return success();
+    }
+
+
+
+
+
+
+    private void assertUser(JSONObject jsonObject, UserEntry userEntry) {
+        assert StringUtils.isNotBlank(userEntry.getIdentifier()):"编号为空";
+        assert StringUtils.isNotBlank(userEntry.getUserName()):"用户名为空";
+        assert userEntry.getAge() != 0 :"年龄不合法";
+        assert StringUtils.isNotBlank(userEntry.getProfession()):"职业为空";
+        assert userEntry.getGender() == 0||userEntry.getGender() == 1 : "性别不合法";
+        assert StringUtils.isNotBlank(userEntry.getPassword()) : "密码为空";
+        assert StringUtils.isNotBlank(jsonObject.getString("rePassword")) : "确认密码为空";
+    }
+
     @PostMapping("/reset")
     @ApiOperation(value = "管理员重置用户密码",notes = "identifier:管理员编号;identifierInit:被重置者编号")
     public Result restPassword(@RequestBody JSONObject jsonObject){

+ 2 - 0
src/main/java/com/rf/kjb/user/service/UserService.java

@@ -43,4 +43,6 @@ public interface UserService {
     List<UserEntry> findByIdentifiers(List<String> identifiers);
 
     UserEntry findByIdentifierAndPassword(String identifier, String password);
+
+    void deleteByIdentifier(String identifier);
 }

+ 7 - 1
src/main/java/com/rf/kjb/user/service/impl/UserServiceImpl.java

@@ -82,7 +82,8 @@ public class UserServiceImpl implements UserService {
                 predicateList.add(cb.equal(root.get("role"),jsonObject.getIntValue("role")));
             }
             query.where(cb.and(predicateList.toArray(new Predicate[0])));
-            query.orderBy(cb.desc(root.get("updateTime")));
+            query.orderBy(cb.desc(root.get("createTime")),cb.desc(root.get("updateTime")));
+
             return query.getRestriction();
         };
         return  this.repository.findAll(specification, PageRequest.of(pageNum-1,pageSize));
@@ -118,4 +119,9 @@ public class UserServiceImpl implements UserService {
 
         return this.repository.findByIdentifierAndPassword( identifier,  password);
     }
+
+    @Override
+    public void deleteByIdentifier(String identifier) {
+        this.repository.deleteByIdentifier( identifier);
+    }
 }

+ 216 - 0
src/main/resources/logback.xml

@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <!--设置日志目录-->
+    <property name="LOG_HOME" value="./logs/%d{yyyy-MM-dd}"/>
+    <!--这里需要将value改成项目名称-->
+    <property name="LOG_NAME" value="kjb"/>
+    <!--控制台日志格式-->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 彩色日志 -->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{35}) |  %msg %n</pattern>
+        </layout>
+    </appender>
+    <!-- 文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
+        </encoder>
+    </appender>
+    <!-- 文件日志策略:每天生成多个日志文件-->
+    <!-- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+         <file>${LOG_HOME}/${LOG_NAME}.log</file>
+         <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">      
+             <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>  
+             <minIndex>1</minIndex>
+             <maxIndex>1000</maxIndex>
+         </rollingPolicy>
+         <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">       
+             <maxFileSize>100MB</maxFileSize>  
+         </triggeringPolicy>  
+         <encoder>    
+             <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>  
+         </encoder>
+     </appender>-->
+
+    <!-- 【实时位置同步】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
+    <appender name="POSITION_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-position-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <!--仅输出INFO日志-->
+        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 接收INFO级别和高于INFO级别的日志-->
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
+        </encoder>
+    </appender>
+
+    <!-- 【用户事件同步】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
+    <appender name="EVENT_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-event-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <!--仅输出INFO日志-->
+        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 接收INFO级别和高于INFO级别的日志-->
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
+        </encoder>
+    </appender>
+
+    <!-- 【用户轨迹同步】件日志策略:每天生成一个日志文件,保存30天的日志文件-->
+    <appender name="TRACK_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-track-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <!--仅输出INFO日志-->
+        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 接收INFO级别和高于INFO级别的日志-->
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
+        </encoder>
+    </appender>
+
+    <!-- 【事件附件同步】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
+    <appender name="FILE_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-file-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <!--仅输出INFO日志-->
+        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 接收INFO级别和高于INFO级别的日志-->
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
+        </encoder>
+    </appender>
+
+    <!-- 【系统重启服务】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
+    <appender name="RESTART_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-restart.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <!--仅输出INFO日志-->
+        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 接收INFO级别和高于INFO级别的日志-->
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
+        </encoder>
+    </appender>
+
+    <!-- 【REDIS服务】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
+    <appender name="REDIS_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-redis.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <!--仅输出INFO日志-->
+        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 接收INFO级别和高于INFO级别的日志-->
+            <level>INFO</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
+        </encoder>
+    </appender>
+
+    <!--默认日志级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF-->
+    <root level="info">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+    </root>
+    <!--特定日志级别,其中xxx为项目名称-->
+    <logger name="com.patrol.mobile.controller" level="info" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+    </logger>
+
+    <!--业务操作日志-->
+    <logger name="POSITION_LOG" level="info" additivity="false">
+        <appender-ref ref="POSITION_LOG_APPENDER"/>
+    </logger>
+    <logger name="EVENT_LOG" level="info" additivity="false">
+        <appender-ref ref="EVENT_LOG_APPENDER"/>
+    </logger>
+    <logger name="TRACK_LOG" level="info" additivity="false">
+        <appender-ref ref="TRACK_LOG_APPENDER"/>
+    </logger>
+    <logger name="FILE_LOG" level="info" additivity="false">
+        <appender-ref ref="FILE_LOG_APPENDER"/>
+    </logger>
+    <logger name="RESTART_LOG" level="info" additivity="false">
+        <appender-ref ref="RESTART_LOG_APPENDER"/>
+    </logger>
+    <logger name="REDIS_LOG" level="info" additivity="false">
+        <appender-ref ref="REDIS_LOG_APPENDER"/>
+    </logger>
+</configuration>