Przeglądaj źródła

Merge remote-tracking branch 'origin/dev1.0' into dev1.0

lmx 9 miesięcy temu
rodzic
commit
9129c4925f
30 zmienionych plików z 372 dodań i 162 usunięć
  1. 19 0
      admin-ui/src/assets/styles/extend.scss
  2. 1 1
      admin-ui/src/views/index.vue
  3. 74 96
      admin-ui/src/views/system/role/index.vue
  4. 22 14
      admin-ui/src/views/system/user/edit.vue
  5. 1 2
      admin-ui/src/views/system/user/index.vue
  6. 0 1
      java.java
  7. 11 16
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
  8. 11 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  9. 7 2
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_FollowController.java
  10. 5 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_HomeController.java
  11. 2 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_KnowledgeController.java
  12. 2 3
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/FollowRecordController.java
  13. 8 6
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/FollowRecord.java
  14. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/User.java
  15. 17 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/ExpertVoList.java
  16. 38 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/FollowRecordVoList.java
  17. 23 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/KnowledgeVoList.java
  18. 2 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/FollowRecordMapper.java
  19. 3 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/KnowledgeMapper.java
  20. 5 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/UserMapper.java
  21. 27 4
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IFollowRecordService.java
  22. 4 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IKnowledgeService.java
  23. 7 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IUserService.java
  24. 16 3
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/FollowRecordServiceImpl.java
  25. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/KnowledgeServiceImpl.java
  26. 7 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/UserServiceImpl.java
  27. 17 6
      ruoyi-admin/src/main/resources/mapper/work/FollowRecordMapper.xml
  28. 16 1
      ruoyi-admin/src/main/resources/mapper/work/KnowledgeMapper.xml
  29. 15 0
      ruoyi-admin/src/main/resources/mapper/work/UserMapper.xml
  30. 0 3
      test.java

+ 19 - 0
admin-ui/src/assets/styles/extend.scss

@@ -450,3 +450,22 @@
     }
   }
 }
+/* 定义滚动条样式 */
+::-webkit-scrollbar {
+	width: 6px;
+	height: 5px;
+}
+
+/*定义滚动条轨道 内阴影+圆角*/
+::-webkit-scrollbar-track {
+	box-shadow: inset 0 0 0px rgba(240, 240, 240, 0.5);
+	border-radius: 10px;
+	background-color: rgba(50, 50, 50, 0.1);
+}
+
+/*定义滑块 内阴影+圆角*/
+::-webkit-scrollbar-thumb {
+	border-radius: 10px;
+	box-shadow: inset 0 0 0px rgba(240, 240, 240, 0.5);
+	background-color: #8590b3;
+}

+ 1 - 1
admin-ui/src/views/index.vue

@@ -4,7 +4,7 @@
       <span style="font-size: 19px">欢迎使用岑溪人民医院随访系统</span>
       <iframe allowtransparency="true" frameborder="0" width="180" height="36" scrolling="no" style="padding-top: 10px" src="//tianqi.2345.com/plugin/widget/index.htm?s=3&z=2&t=0&v=0&d=2&bd=0&k=&f=#545555&ltf=#545555&htf=ffffff&q=1&e=1&a=1&c=72036&w=180&h=36&align=center"></iframe>
     </div>
-    <div class="chart-wrapper">
+    <div class="chart-wrapper" v-if="user.roleName == '医生'">
       <!--个人形象-->
       <div class="pop" style="width: 65%">
         <div class="out">

+ 74 - 96
admin-ui/src/views/system/role/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" >
+    <el-form :model="queryParams" ref="queryForm" :inline="true">
       <el-form-item label="角色名称" prop="roleName">
         <el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable @keyup.enter.native="handleQuery" class="se" />
       </el-form-item>
@@ -22,13 +22,11 @@
       <el-col :span="1.5"><el-button type="success" icon="el-icon-edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:role:edit']">修改</el-button></el-col>
       <el-col :span="1.5"><el-button type="danger" icon="el-icon-delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:role:remove']">删除</el-button></el-col>
       <el-col :span="1.5"><el-button type="warning" icon="el-icon-download" @click="handleExport" v-hasPermi="['system:role:export']">导出</el-button></el-col>
-      
     </el-row>
     <el-table :data="roleList" border @selection-change="handleSelectionChange" height="calc(100vh - 273px)">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
-      <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
-      <el-table-column label="显示顺序" prop="roleSort" width="100" />
+      <el-table-column label="角色名称" prop="roleName" align="center" :show-overflow-tooltip="true" />
+      <el-table-column label="权限字符" prop="roleKey" align="center" :show-overflow-tooltip="true" width="150" />
       <el-table-column label="状态" align="center" width="100">
         <template slot-scope="scope">
           <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
@@ -39,11 +37,11 @@
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center">
+      <el-table-column label="操作" align="center" width="200">
         <template slot-scope="scope" v-if="scope.row.roleId !== 1">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']">修改</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']">删除</el-button>
-          <el-dropdown size="mini" @command="command => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
+          <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
             <span class="el-dropdown-link">
               <i class="el-icon-d-arrow-right el-icon--right"></i>
               更多
@@ -63,33 +61,23 @@
     <!-- 添加或修改角色配置对话框 -->
     <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-        <el-form-item label="角色名称" prop="roleName"><el-input v-model="form.roleName" placeholder="请输入角色名称" /></el-form-item>
+        <el-form-item label="角色名称" prop="roleName"><el-input v-model="form.roleName" placeholder="请输入角色名称" :disabled="form.roleName == '医生'" /></el-form-item>
         <el-form-item prop="roleKey">
           <span slot="label">
             <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top"><i class="el-icon-question"></i></el-tooltip>
             权限字符
           </span>
-          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" :disabled="form.roleName == '医生'" />
         </el-form-item>
-        <el-form-item label="角色顺序" prop="roleSort"><el-input-number v-model="form.roleSort" controls-position="right" :min="0" /></el-form-item>
         <el-form-item label="状态">
-          <el-radio-group v-model="form.status">
+          <el-radio-group v-model="form.status" :disabled="form.roleName == '医生'">
             <el-radio v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="菜单权限">
           <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
           <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
-          <el-tree
-            class="tree-border"
-            :data="menuOptions"
-            show-checkbox
-            ref="menu"
-            node-key="id"
-            :check-strictly="!form.menuCheckStrictly"
-            empty-text="加载中,请稍候"
-            :props="defaultProps"
-          ></el-tree>
+          <el-tree class="tree-border" :data="menuOptions" show-checkbox ref="menu" node-key="id" :check-strictly="!form.menuCheckStrictly" empty-text="加载中,请稍候" :props="defaultProps"></el-tree>
         </el-form-item>
         <el-form-item label="备注"><el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input></el-form-item>
       </el-form>
@@ -111,17 +99,7 @@
         <el-form-item label="数据权限" v-show="form.dataScope == 2">
           <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
           <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
-          <el-tree
-            class="tree-border"
-            :data="deptOptions"
-            show-checkbox
-            default-expand-all
-            ref="dept"
-            node-key="id"
-            :check-strictly="!form.deptCheckStrictly"
-            empty-text="加载中,请稍候"
-            :props="defaultProps"
-          ></el-tree>
+          <el-tree class="tree-border" :data="deptOptions" show-checkbox default-expand-all ref="dept" node-key="id" :check-strictly="!form.deptCheckStrictly" empty-text="加载中,请稍候" :props="defaultProps"></el-tree>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -133,12 +111,12 @@
 </template>
 
 <script>
-import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus, deptTreeSelect } from "@/api/system/role";
-import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu";
+import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus, deptTreeSelect } from '@/api/system/role';
+import { treeselect as menuTreeselect, roleMenuTreeselect } from '@/api/system/menu';
 
 export default {
-  name: "Role",
-  dicts: ["sys_normal_disable"],
+  name: 'Role',
+  dicts: ['sys_normal_disable'],
   data() {
     return {
       // 选中数组
@@ -154,7 +132,7 @@ export default {
       // 角色表格数据
       roleList: [],
       // 弹出层标题
-      title: "",
+      title: '',
       // 是否显示弹出层
       open: false,
       // 是否显示弹出层(数据权限)
@@ -168,24 +146,24 @@ export default {
       // 数据范围选项
       dataScopeOptions: [
         {
-          value: "1",
-          label: "全部数据权限"
+          value: '1',
+          label: '全部数据权限'
         },
         {
-          value: "2",
-          label: "自定数据权限"
+          value: '2',
+          label: '自定数据权限'
         },
         {
-          value: "3",
-          label: "本部门数据权限"
+          value: '3',
+          label: '本部门数据权限'
         },
         {
-          value: "4",
-          label: "本部门及以下数据权限"
+          value: '4',
+          label: '本部门及以下数据权限'
         },
         {
-          value: "5",
-          label: "仅本人数据权限"
+          value: '5',
+          label: '仅本人数据权限'
         }
       ],
       // 菜单列表
@@ -203,14 +181,14 @@ export default {
       // 表单参数
       form: {},
       defaultProps: {
-        children: "children",
-        label: "label"
+        children: 'children',
+        label: 'label'
       },
       // 表单校验
       rules: {
-        roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
-        roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
-        roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }]
+        roleName: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
+        roleKey: [{ required: true, message: '权限字符不能为空', trigger: 'blur' }],
+        roleSort: [{ required: true, message: '角色顺序不能为空', trigger: 'blur' }]
       }
     };
   },
@@ -220,14 +198,14 @@ export default {
   methods: {
     /** 查询角色列表 */
     getList() {
-      listRole(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+      listRole(this.addDateRange(this.queryParams, this.dateRange)).then((response) => {
         this.roleList = response.rows;
         this.total = response.total;
       });
     },
     /** 查询菜单树结构 */
     getMenuTreeselect() {
-      menuTreeselect().then(response => {
+      menuTreeselect().then((response) => {
         this.menuOptions = response.data;
       });
     },
@@ -251,31 +229,31 @@ export default {
     },
     /** 根据角色ID查询菜单树结构 */
     getRoleMenuTreeselect(roleId) {
-      return roleMenuTreeselect(roleId).then(response => {
+      return roleMenuTreeselect(roleId).then((response) => {
         this.menuOptions = response.menus;
         return response;
       });
     },
     /** 根据角色ID查询部门树结构 */
     getDeptTree(roleId) {
-      return deptTreeSelect(roleId).then(response => {
+      return deptTreeSelect(roleId).then((response) => {
         this.deptOptions = response.depts;
         return response;
       });
     },
     // 角色状态修改
     handleStatusChange(row) {
-      let text = row.status === "0" ? "启用" : "停用";
+      let text = row.status === '0' ? '启用' : '停用';
       this.$modal
         .confirm('确认要"' + text + '""' + row.roleName + '"角色吗?')
-        .then(function() {
+        .then(function () {
           return changeRoleStatus(row.roleId, row.status);
         })
         .then(() => {
-          this.$modal.msgSuccess(text + "成功");
+          this.$modal.msgSuccess(text + '成功');
         })
-        .catch(function() {
-          row.status = row.status === "0" ? "1" : "0";
+        .catch(function () {
+          row.status = row.status === '0' ? '1' : '0';
         });
     },
     // 取消按钮
@@ -302,14 +280,14 @@ export default {
           roleName: undefined,
           roleKey: undefined,
           roleSort: 0,
-          status: "0",
+          status: '0',
           menuIds: [],
           deptIds: [],
           menuCheckStrictly: true,
           deptCheckStrictly: true,
           remark: undefined
         });
-      this.resetForm("form");
+      this.resetForm('form');
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -319,22 +297,22 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.dateRange = [];
-      this.resetForm("queryForm");
+      this.resetForm('queryForm');
       this.handleQuery();
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.roleId);
+      this.ids = selection.map((item) => item.roleId);
       this.single = selection.length != 1;
       this.multiple = !selection.length;
     },
     // 更多操作触发
     handleCommand(command, row) {
       switch (command) {
-        case "handleDataScope":
+        case 'handleDataScope':
           this.handleDataScope(row);
           break;
-        case "handleAuthUser":
+        case 'handleAuthUser':
           this.handleAuthUser(row);
           break;
         default:
@@ -343,12 +321,12 @@ export default {
     },
     // 树权限(展开/折叠)
     handleCheckedTreeExpand(value, type) {
-      if (type == "menu") {
+      if (type == 'menu') {
         let treeList = this.menuOptions;
         for (let i = 0; i < treeList.length; i++) {
           this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
         }
-      } else if (type == "dept") {
+      } else if (type == 'dept') {
         let treeList = this.deptOptions;
         for (let i = 0; i < treeList.length; i++) {
           this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
@@ -357,17 +335,17 @@ export default {
     },
     // 树权限(全选/全不选)
     handleCheckedTreeNodeAll(value, type) {
-      if (type == "menu") {
+      if (type == 'menu') {
         this.$refs.menu.setCheckedNodes(value ? this.menuOptions : []);
-      } else if (type == "dept") {
+      } else if (type == 'dept') {
         this.$refs.dept.setCheckedNodes(value ? this.deptOptions : []);
       }
     },
     // 树权限(父子联动)
     handleCheckedTreeConnect(value, type) {
-      if (type == "menu") {
+      if (type == 'menu') {
         this.form.menuCheckStrictly = value ? true : false;
-      } else if (type == "dept") {
+      } else if (type == 'dept') {
         this.form.deptCheckStrictly = value ? true : false;
       }
     },
@@ -375,24 +353,24 @@ export default {
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "添加角色";
+      this.title = '添加角色';
       this.getMenuTreeselect();
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
       this.open = true;
-      this.title = "修改角色";
+      this.title = '修改角色';
       const roleId = row.roleId || this.ids;
       const roleMenu = this.getRoleMenuTreeselect(roleId);
-      getRole(roleId).then(response => {
+      getRole(roleId).then((response) => {
         this.form = response.data;
         this.form.menuCheckStrictly = true;
         this.form.deptCheckStrictly = true;
         this.$nextTick(() => {
-          roleMenu.then(res => {
+          roleMenu.then((res) => {
             let checkedKeys = res.checkedKeys;
-            checkedKeys.forEach(v => {
+            checkedKeys.forEach((v) => {
               this.$nextTick(() => {
                 this.$refs.menu.setChecked(v, true, false);
               });
@@ -403,7 +381,7 @@ export default {
     },
     /** 选择角色权限范围触发 */
     dataScopeSelectChange(value) {
-      if (value !== "2") {
+      if (value !== '2') {
         this.$refs.dept.setCheckedKeys([]);
       }
     },
@@ -411,37 +389,37 @@ export default {
     handleDataScope(row) {
       this.reset();
       const deptTreeSelect = this.getDeptTree(row.roleId);
-      getRole(row.roleId).then(response => {
+      getRole(row.roleId).then((response) => {
         this.form = response.data;
         this.openDataScope = true;
         this.$nextTick(() => {
-          deptTreeSelect.then(res => {
+          deptTreeSelect.then((res) => {
             this.$refs.dept.setCheckedKeys(res.checkedKeys);
           });
         });
-        this.title = "分配数据权限";
+        this.title = '分配数据权限';
       });
     },
     /** 分配用户操作 */
-    handleAuthUser: function(row) {
+    handleAuthUser: function (row) {
       const roleId = row.roleId;
-      this.$router.push("/system/role-auth/user/" + roleId);
+      this.$router.push('/system/role-auth/user/' + roleId);
     },
     /** 提交按钮 */
-    submitForm: function() {
-      this.$refs["form"].validate(valid => {
+    submitForm: function () {
+      this.$refs['form'].validate((valid) => {
         if (valid) {
           if (this.form.roleId != undefined) {
             this.form.menuIds = this.getMenuAllCheckedKeys();
-            updateRole(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
+            updateRole(this.form).then((response) => {
+              this.$modal.msgSuccess('修改成功');
               this.open = false;
               this.getList();
             });
           } else {
             this.form.menuIds = this.getMenuAllCheckedKeys();
-            addRole(this.form).then(response => {
-              this.$modal.msgSuccess("新增成功");
+            addRole(this.form).then((response) => {
+              this.$modal.msgSuccess('新增成功');
               this.open = false;
               this.getList();
             });
@@ -450,11 +428,11 @@ export default {
       });
     },
     /** 提交按钮(数据权限) */
-    submitDataScope: function() {
+    submitDataScope: function () {
       if (this.form.roleId != undefined) {
         this.form.deptIds = this.getDeptAllCheckedKeys();
-        dataScope(this.form).then(response => {
-          this.$modal.msgSuccess("修改成功");
+        dataScope(this.form).then((response) => {
+          this.$modal.msgSuccess('修改成功');
           this.openDataScope = false;
           this.getList();
         });
@@ -465,19 +443,19 @@ export default {
       const roleIds = row.roleId || this.ids;
       this.$modal
         .confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?')
-        .then(function() {
+        .then(function () {
           return delRole(roleIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess('删除成功');
         })
         .catch(() => {});
     },
     /** 导出按钮操作 */
     handleExport() {
       this.download(
-        "system/role/export",
+        'system/role/export',
         {
           ...this.queryParams
         },

+ 22 - 14
admin-ui/src/views/system/user/edit.vue

@@ -1,15 +1,20 @@
 <template>
   <div class="cmain">
     <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-      <el-form-item label="证件照" prop="avatar"><cropper v-model="form.avatar" :fixed_number="[1, 1.5]"></cropper></el-form-item>
+      <el-form-item label="所属角色">
+        <el-select v-model="form.roleIds" multiple placeholder="请选择角色">
+          <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="证件照" prop="avatar" v-if="form.roleIds.includes(4)"><cropper v-model="form.avatar" :fixed_number="[1, 1.4]"></cropper></el-form-item>
       <el-row>
         <el-col :span="12">
-          <el-form-item v-if="form.userId == undefined" label="账号" prop="userName">
+          <el-form-item v-if="form.userId == undefined" label="登录账号" prop="userName">
             <el-input v-model="form.userName" placeholder="请输入账号" maxlength="30" auto-complete="456" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item v-if="form.userId == undefined" label="密码">
+          <el-form-item v-if="form.userId == undefined" label="登录密码">
             <el-input placeholder="默认密码是123456" maxlength="20" :disabled="true" />
           </el-form-item>
         </el-col>
@@ -19,25 +24,28 @@
           <el-form-item label="姓名" prop="nickName"><el-input v-model="form.nickName" placeholder="请输入姓名" maxlength="30" /></el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="手机" prop="phonenumber"><el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" /></el-form-item>
+          <el-form-item label="所属科室" prop="deptId">
+            <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属科室" />
+          </el-form-item>
         </el-col>
       </el-row>
-      <el-row>
+      <el-row v-if="form.roleIds.includes(4)">
         <el-col :span="12">
-          <el-form-item label="科室" prop="deptId">
-            <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属科室" />
+          <el-form-item label="首页展示" prop="shows">
+            <el-select v-model="form.shows" placeholder="请选择">
+              <el-option label="否" :value="0"></el-option>
+              <el-option label="是" :value="1"></el-option>
+            </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="角色">
-            <el-select v-model="form.roleIds" multiple placeholder="请选择角色">
-              <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
-            </el-select>
+          <el-form-item label="显示排序" prop="views">
+            <el-input type="number" v-model="form.views" :min="0" placeholder="输入排序,数字越小越靠前" />
           </el-form-item>
         </el-col>
       </el-row>
-      <el-form-item label="简介" prop="introduce">
-        <editor v-model="form.introduce" placeholder="请输入"></editor>
+      <el-form-item label="个人简介" prop="introduce" v-if="form.roleIds.includes(4)">
+        <editor v-model="form.introduce" placeholder="请输入" :height="300"></editor>
       </el-form-item>
     </el-form>
     <div class="mfooter">
@@ -56,7 +64,7 @@ export default {
   components: { Treeselect },
   data() {
     return {
-      form: {},
+      form: { roleIds: [], vShow: 0 },
       // 岗位选项
       postOptions: [],
       // 角色选项

+ 1 - 2
admin-ui/src/views/system/user/index.vue

@@ -35,9 +35,8 @@
         </el-row>
         <el-table border :data="userList" @selection-change="handleSelectionChange" height="calc(100vh - 273px)">
           <el-table-column type="selection" align="center" width="50" />
-          <el-table-column label="账号" align="center" key="userName" prop="userName" :show-overflow-tooltip="true" width="110" />
+          <el-table-column label="登录账号" align="center" key="userName" prop="userName" :show-overflow-tooltip="true" width="110" />
           <el-table-column label="姓名" align="center" key="nickName" prop="nickName" :show-overflow-tooltip="true" width="110" />
-          <el-table-column label="手机号" align="center" key="phonenumber" prop="phonenumber" width="120" />
           <el-table-column label="所属科室" align="center" key="deptName" prop="dept.deptName" :show-overflow-tooltip="true" />
           <el-table-column label="角色" align="center" width="170">
             <template slot-scope="scope">

+ 0 - 1
java.java

@@ -1 +0,0 @@
-修改测试

+ 11 - 16
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java

@@ -1,19 +1,5 @@
 package com.ruoyi.web.controller.system;
 
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.controller.BaseController;
@@ -21,10 +7,8 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.service.SysPermissionService;
 import com.ruoyi.framework.web.service.TokenService;
@@ -32,6 +16,14 @@ import com.ruoyi.system.domain.SysUserRole;
 import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 角色信息
@@ -159,6 +151,9 @@ public class SysRoleController extends BaseController {
     @Log(title = "角色管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{roleIds}")
     public AjaxResult remove(@PathVariable Long[] roleIds) {
+        if (Arrays.asList(roleIds).contains(4l)) {
+            return AjaxResult.error("不支持删除医生这个角色");
+        }
         int row = roleService.deleteRoleByIds(roleIds);
         if (row > 0) {
             for (Long roleId : roleIds) {

+ 11 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -242,6 +242,17 @@ public class SysUserController extends BaseController {
         return success();
     }
 
+    @PostMapping("/editInfo")
+    public AjaxResult editInfo(@RequestBody SysUser dto) {
+        SysUser user = new SysUser();
+        user.setUserId(getLoginUser().getUserId());
+        user.setNickName(dto.getNickName());
+        if (user.getIntroduce() != null) {
+            user.setBrief(StringUtils.StripHT(user.getIntroduce()));
+        }
+        return toAjax(userService.updateById(user));
+    }
+
     /**
      * 获取部门树列表
      */

+ 7 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_FollowController.java

@@ -5,6 +5,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.web.work.api.config.BaseController;
 import com.ruoyi.web.work.domain.FollowRecord;
 import com.ruoyi.web.work.domain.dto.FollowRecordDto;
+import com.ruoyi.web.work.domain.vo.FollowRecordVoList;
 import com.ruoyi.web.work.service.IFollowRecordService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -29,16 +30,20 @@ public class Api_FollowController extends BaseController {
     public TableDataInfo list(FollowRecord followRecord) {
         followRecord.setPatientId(getUser().getPatientId());
         startPage();
-        List<FollowRecord> list = followRecordService.selectAppList(followRecord);
+        List<FollowRecordVoList> list = followRecordService.selectAppList(followRecord);
         return getDataTable(list);
     }
 
     @PostMapping("/push")
     public AjaxResult push(@Validated @RequestBody FollowRecordDto dto) {
-
         return followRecordService.push(dto);
     }
 
+    @PostMapping("/read/{id}")
+    public AjaxResult read(@PathVariable("id") Long id) {
+        return followRecordService.read(id);
+    }
+
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id) {
         return followRecordService.detail(id);

+ 5 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_HomeController.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.work.api;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.service.IKnowledgeService;
+import com.ruoyi.web.work.service.IUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,10 +21,14 @@ public class Api_HomeController extends BaseController {
     @Autowired
     private IKnowledgeService knowledgeService;
 
+    @Autowired
+    IUserService userService;
+
     @GetMapping("/index")
     public AjaxResult index() {
         AjaxResult result = new AjaxResult();
         result.put("knowledgeList", knowledgeService.indexList());
+        result.put("expertList", userService.selectExpert());
         return AjaxResult.success(result);
     }
 

+ 2 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_KnowledgeController.java

@@ -4,6 +4,7 @@ import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.web.work.domain.Knowledge;
+import com.ruoyi.web.work.domain.vo.KnowledgeVoList;
 import com.ruoyi.web.work.service.IKnowledgeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -28,7 +29,7 @@ public class Api_KnowledgeController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo list(Knowledge knowledge) {
         startPage();
-        List<Knowledge> list = knowledgeService.selectList(knowledge);
+        List<KnowledgeVoList> list = knowledgeService.selectAppList(knowledge);
         return getDataTable(list);
     }
 

+ 2 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/FollowRecordController.java

@@ -4,7 +4,6 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.core.validate.Groups;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.web.work.domain.FollowRecord;
 import com.ruoyi.web.work.domain.FollowTemplate;
@@ -66,14 +65,14 @@ public class FollowRecordController extends BaseController {
     @PreAuthorize("@ss.hasAnyPermi('work:record:add,work:up:add')")
     @Log(title = "回访记录", businessType = BusinessType.INSERT)
     @PostMapping("/add")
-    public AjaxResult add(@Validated({Groups.Add.class}) @RequestBody FollowRecord followRecord) {
+    public AjaxResult add(@Validated @RequestBody FollowRecord followRecord) {
         return followRecordService.add(followRecord);
     }
 
     @PreAuthorize("@ss.hasAnyPermi('work:record:edit,work:up:edit')")
     @Log(title = "回访记录", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
-    public AjaxResult edit(@Validated({Groups.Edit.class}) @RequestBody FollowRecord followRecord) {
+    public AjaxResult edit(@Validated @RequestBody FollowRecord followRecord) {
         return toAjax(followRecordService.updateById(followRecord));
     }
 

+ 8 - 6
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/FollowRecord.java

@@ -3,11 +3,12 @@ package com.ruoyi.web.work.domain;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BaseData;
-import com.ruoyi.common.core.validate.Groups;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.List;
@@ -25,8 +26,10 @@ public class FollowRecord extends BaseData {
     private Long id;
 
 
-    @NotNull(message = "推送类型不能为空", groups = {Groups.Add.class, Groups.Edit.class})
-    @ApiModelProperty(value = "提醒类型:0=复诊,1=回访")
+    @NotNull(message = "推送类型不能为空")
+    @Min(value = 0, message = "只能选择复诊提醒或随访提醒")
+    @Max(value = 1, message = "只能选择复诊提醒或随访提醒")
+    @ApiModelProperty(value = "提醒类型:0=复诊提醒,1=随访提醒")
     private Integer type;
 
     @ApiModelProperty(value = "患者id")
@@ -35,18 +38,17 @@ public class FollowRecord extends BaseData {
     @ApiModelProperty(value = "患者姓名")
     private String patientName;
 
-    @NotBlank(message = "模板名称或提醒标题不能为空", groups = {Groups.Add.class, Groups.Edit.class})
+    @NotBlank(message = "模板名称或提醒标题不能为空")
     @ApiModelProperty(value = "模板名称")
     private String templateName;
 
-    @NotBlank(message = "回访内容或者提醒内容不能为空", groups = {Groups.Add.class, Groups.Edit.class})
+    @NotBlank(message = "回访内容或者提醒内容不能为空")
     @ApiModelProperty(value = "回访内容")
     private String op;
 
     @ApiModelProperty(value = "状态:0=未回访,1=已回访")
     private Integer state;
 
-    @NotNull(message = "指定患者不能为空", groups = {Groups.Add.class})
     @TableField(exist = false)
     private List<Patient> patientList;
 }

+ 6 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/User.java

@@ -55,4 +55,10 @@ public class User{
     @TableField(exist = false)
     private String token;
 
+    @TableField(exist = false)
+    private Integer remind;
+
+    @TableField(exist = false)
+    private Integer follow;
+
 }

+ 17 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/ExpertVoList.java

@@ -0,0 +1,17 @@
+package com.ruoyi.web.work.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ExpertVoList {
+
+    private Long userId;
+
+    @ApiModelProperty(value = "证件照")
+    private String avatar;
+
+    @ApiModelProperty(value = "姓名")
+    private String nickName;
+
+}

+ 38 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/FollowRecordVoList.java

@@ -0,0 +1,38 @@
+package com.ruoyi.web.work.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author lsw
+ * @date 2024-07-18
+ */
+@Data
+@Accessors(chain = true)
+public class FollowRecordVoList {
+
+    private Long id;
+
+    @ApiModelProperty(value = "所属科室")
+    private String deptName;
+
+    @ApiModelProperty(value = "医生姓名")
+    private String doctorName;
+
+    @ApiModelProperty(value = "模板或提醒标题")
+    private String templateName;
+
+    @ApiModelProperty(value = "回访或提醒内容")
+    private String op;
+
+    @ApiModelProperty(value = "状态:0=未回访,1=已回访")
+    private Integer state;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date createTime;
+
+}

+ 23 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/KnowledgeVoList.java

@@ -0,0 +1,23 @@
+package com.ruoyi.web.work.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class KnowledgeVoList {
+
+    private Long id;
+
+    @ApiModelProperty(value = "分类")
+    private String type;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}

+ 2 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/FollowRecordMapper.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.work.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.web.work.domain.FollowRecord;
 import com.ruoyi.web.work.domain.dto.VisitDto;
+import com.ruoyi.web.work.domain.vo.FollowRecordVoList;
 import com.ruoyi.web.work.domain.vo.VisitVoList;
 
 import java.util.List;
@@ -14,7 +15,7 @@ import java.util.List;
 public interface FollowRecordMapper extends BaseMapper<FollowRecord> {
     List<FollowRecord> selectList(FollowRecord followRecord);
 
-    List<FollowRecord> selectAppList(FollowRecord followRecord);
+    List<FollowRecordVoList> selectAppList(FollowRecord followRecord);
 
     List<VisitVoList> selectVisitList(VisitDto dto);
 }

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/KnowledgeMapper.java

@@ -2,6 +2,7 @@ package com.ruoyi.web.work.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.web.work.domain.Knowledge;
+import com.ruoyi.web.work.domain.vo.KnowledgeVoList;
 
 import java.util.List;
 
@@ -12,5 +13,7 @@ import java.util.List;
 public interface KnowledgeMapper extends BaseMapper<Knowledge> {
     List<Knowledge> selectList(Knowledge knowledge);
 
+    List<KnowledgeVoList> selectAppList(Knowledge knowledge);
+
     List<Knowledge> indexList();
 }

+ 5 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/UserMapper.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.work.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.web.work.domain.User;
+import com.ruoyi.web.work.domain.vo.ExpertVoList;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -18,4 +19,8 @@ public interface UserMapper extends BaseMapper<User> {
     User selectByOpenId(@Param("openId") String openId);
 
     Map<String, Object> statistics(SysUser sysUser);
+
+    User selectUser(User user);
+
+    List<ExpertVoList>selectExpert();
 }

+ 27 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IFollowRecordService.java

@@ -5,6 +5,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.FollowRecord;
 import com.ruoyi.web.work.domain.dto.FollowRecordDto;
 import com.ruoyi.web.work.domain.dto.VisitDto;
+import com.ruoyi.web.work.domain.vo.FollowRecordVoList;
 import com.ruoyi.web.work.domain.vo.VisitVoList;
 
 import java.util.List;
@@ -25,7 +26,7 @@ public interface IFollowRecordService extends IService<FollowRecord> {
     AjaxResult detail(Long id);
 
     /**
-     * 提交回访记录
+     * 患者填写随访内容提交
      *
      * @param dto
      * @return
@@ -34,20 +35,42 @@ public interface IFollowRecordService extends IService<FollowRecord> {
 
 
     /**
-     * 根据医生账户查询该医生的患者
+     * 当前医生所属的患者记录
+     *
      * @param dto
      * @return
      */
     List<VisitVoList> selectVisitList(VisitDto dto);
 
-    List<FollowRecord> selectAppList(FollowRecord followRecord);
 
     /**
-     * 新增回访记录
+     * 当前就诊人的复诊和随访记录
+     *
+     * @param followRecord
+     * @return
+     */
+    List<FollowRecordVoList> selectAppList(FollowRecord followRecord);
+
+    /**
+     * 医生新增随访记录
+     *
      * @param followRecord
      * @return
      */
     AjaxResult add(FollowRecord followRecord);
 
+    /**
+     * 患者阅读复诊提醒
+     *
+     * @param id
+     * @return
+     */
+    AjaxResult read(Long id);
+
+    /**
+     * 向订阅消息的患者推送提醒
+     *
+     * @param record
+     */
     void sendMessage(FollowRecord record);
 }

+ 4 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IKnowledgeService.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.work.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.Knowledge;
+import com.ruoyi.web.work.domain.vo.KnowledgeVoList;
 
 import java.util.List;
 
@@ -11,9 +12,11 @@ import java.util.List;
  * @date 2024-07-10
  */
 public interface IKnowledgeService extends IService<Knowledge> {
+    List<Knowledge> selectList(Knowledge knowledge);
+
     List<Knowledge> indexList();
 
-    List<Knowledge> selectList(Knowledge knowledge);
+    List<KnowledgeVoList> selectAppList(Knowledge knowledge);
 
     /**
      * 知识详情

+ 7 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IUserService.java

@@ -5,6 +5,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.User;
 import com.ruoyi.web.work.domain.dto.LoginDto;
 import com.ruoyi.web.work.domain.dto.UserEditDto;
+import com.ruoyi.web.work.domain.vo.ExpertVoList;
 
 import java.rmi.ServerException;
 import java.util.List;
@@ -62,4 +63,10 @@ public interface IUserService extends IService<User> {
      * @return
      */
     AjaxResult remove(Long[] ids);
+
+    /**
+     * 小程序首页上的权威专家
+     * @return
+     */
+    List<ExpertVoList>selectExpert();
 }

+ 16 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/FollowRecordServiceImpl.java

@@ -11,6 +11,7 @@ import com.ruoyi.web.work.api.util.AppUtil;
 import com.ruoyi.web.work.domain.FollowRecord;
 import com.ruoyi.web.work.domain.dto.FollowRecordDto;
 import com.ruoyi.web.work.domain.dto.VisitDto;
+import com.ruoyi.web.work.domain.vo.FollowRecordVoList;
 import com.ruoyi.web.work.domain.vo.VisitVoList;
 import com.ruoyi.web.work.mapper.FollowRecordMapper;
 import com.ruoyi.web.work.service.IFollowRecordService;
@@ -72,7 +73,7 @@ public class FollowRecordServiceImpl extends ServiceImpl<FollowRecordMapper, Fol
     }
 
     @Override
-    public List<FollowRecord> selectAppList(FollowRecord followRecord) {
+    public List<FollowRecordVoList> selectAppList(FollowRecord followRecord) {
         return followRecordMapper.selectAppList(followRecord);
     }
 
@@ -96,6 +97,18 @@ public class FollowRecordServiceImpl extends ServiceImpl<FollowRecordMapper, Fol
         }
         return AjaxResult.success();
     }
+
+    @Override
+    public AjaxResult read(Long id) {
+        FollowRecord followRecord = getById(id);
+        if (followRecord == null || !followRecord.getPatientId().equals(AppUtil.getUser().getPatientId())) {
+            return AjaxResult.error("复诊提醒不存在或非法操作");
+        }
+        followRecord.setState(1);
+        updateById(followRecord);
+        return AjaxResult.success();
+    }
+
     @Override
     public void sendMessage(FollowRecord record) {
         JSONObject jsonObject = JSONUtil.parseObj(HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + env.getProperty("wx.appid") + "&secret=" + env.getProperty("wx.appSecret")));
@@ -103,7 +116,7 @@ public class FollowRecordServiceImpl extends ServiceImpl<FollowRecordMapper, Fol
         body.set("appid", env.getProperty("wx.appid"));
         JSONObject content = new JSONObject();
         //复诊提醒
-        if (record.getType()==0) {
+        if (record.getType() == 0) {
            /* User user = userService.getById(record.getPatientId);
             body.set("touser", user.getOpenId());
             body.set("template_id", "PtdKbqfzmpvGsJPx_YekDX4-cljbhOXcvoUB3XJaVLg");
@@ -113,7 +126,7 @@ public class FollowRecordServiceImpl extends ServiceImpl<FollowRecordMapper, Fol
             content.set("time2", new JSONObject().set("value", DateUtils.getTime())); //提现时间*/
         }
         //随访提醒
-        if (record.getType()==1) {
+        if (record.getType() == 1) {
            /* User user = userService.getById(pay.getUserId());
             body.set("touser", user.getOpenId());
             body.set("template_id", "NIqSQq0j765o9Iz9gMiSelnuxMgPIPeCnk3lvEnWJlo");

+ 6 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/KnowledgeServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.Knowledge;
+import com.ruoyi.web.work.domain.vo.KnowledgeVoList;
 import com.ruoyi.web.work.mapper.KnowledgeMapper;
 import com.ruoyi.web.work.service.IKnowledgeService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +27,11 @@ public class KnowledgeServiceImpl extends ServiceImpl<KnowledgeMapper, Knowledge
     }
 
     @Override
+    public List<KnowledgeVoList> selectAppList(Knowledge knowledge) {
+        return knowledgeMapper.selectAppList(knowledge);
+    }
+
+    @Override
     @DataScope(deptAlias = "k")
     public List<Knowledge> selectList(Knowledge knowledge) {
         knowledge.setState(0);

+ 7 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/UserServiceImpl.java

@@ -15,6 +15,7 @@ import com.ruoyi.web.work.domain.BindUser;
 import com.ruoyi.web.work.domain.User;
 import com.ruoyi.web.work.domain.dto.LoginDto;
 import com.ruoyi.web.work.domain.dto.UserEditDto;
+import com.ruoyi.web.work.domain.vo.ExpertVoList;
 import com.ruoyi.web.work.mapper.UserMapper;
 import com.ruoyi.web.work.service.IBindUserService;
 import com.ruoyi.web.work.service.IUserService;
@@ -102,7 +103,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
 
     @Override
     public AjaxResult info() {
-        User user = getById(AppUtil.getUser().getId());
+        User user = userMapper.selectUser(AppUtil.getUser());
         user.setBindUserList(bindUserService.selectList(new BindUser().setUserId(user.getId())));
         return AjaxResult.success(user);
     }
@@ -129,6 +130,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return AjaxResult.success();
     }
 
+    @Override
+    public List<ExpertVoList> selectExpert() {
+        return userMapper.selectExpert();
+    }
+
     private void deleteCache(Long id) {
         Collection<String> keys = redisCache.keys(CacheConstants.APP_LOGIN_TOKEN_KEY + "*");
         for (String key : keys) {

+ 17 - 6
ruoyi-admin/src/main/resources/mapper/work/FollowRecordMapper.xml

@@ -28,14 +28,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ${params.dataScope}
     </select>
 
-    <select id="selectAppList" resultType="com.ruoyi.web.work.domain.FollowRecord">
-        select id,template_name,op,state,create_time from tb_follow_record
+    <select id="selectAppList" resultType="com.ruoyi.web.work.domain.vo.FollowRecordVoList">
+        SELECT
+        r.id,
+        r.template_name,
+        r.op,
+        r.state,
+        r.create_time,
+        d.dept_name,
+        u.nick_name AS doctorName
+        FROM
+        tb_follow_record r
+        LEFT JOIN sys_dept d ON d.dept_id = r.dept_id
+        LEFT JOIN sys_user u ON u.user_id = r.user_id
         <where>
-            <if test="type != null "> and type = #{type}</if>
-            <if test="patientId != null "> AND patient_id = #{patientId}</if>
-            <if test="state != null "> and state = #{state}</if>
+            <if test="type != null "> AND r.type = #{type}</if>
+            <if test="patientId != null "> AND r.patient_id = #{patientId}</if>
+            <if test="state != null "> AND r.state = #{state}</if>
         </where>
-        ORDER BY id DESC
+        ORDER BY r.id DESC
     </select>
 
     <select id="selectVisitList" resultType="com.ruoyi.web.work.domain.vo.VisitVoList">

+ 16 - 1
ruoyi-admin/src/main/resources/mapper/work/KnowledgeMapper.xml

@@ -21,7 +21,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ${params.dataScope}
     </select>
 
-    <select id="indexList" resultType="com.ruoyi.web.work.domain.Knowledge">
+    <select id="selectAppList" resultType="com.ruoyi.web.work.domain.vo.KnowledgeVoList">
+        SELECT
+        id,
+        type,
+        title,
+        create_time
+        FROM
+        tb_knowledge
+        WHERE
+        state =0
+            <if test="type != null "> AND type = #{type}</if>
+            <if test="title != null  and title != ''"> AND title LIKE concat('%', #{title}, '%')</if>
+        ORDER BY id DESC
+    </select>
+
+    <select id="indexList" resultType="com.ruoyi.web.work.domain.vo.KnowledgeVoList">
         SELECT id, title,type,create_time FROM tb_knowledge WHERE state=0 ORDER BY id DESC LIMIT 5
     </select>
 

+ 15 - 0
ruoyi-admin/src/main/resources/mapper/work/UserMapper.xml

@@ -25,4 +25,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 ( SELECT COUNT( id ) FROM tb_knowledge WHERE user_id =#{userId} ) AS knowledge
     </select>
 
+    <select id="selectUser" resultType="com.ruoyi.web.work.domain.User">
+        SELECT
+        u.*,
+        ( SELECT COUNT( d.id ) FROM tb_follow_record d WHERE d.patient_id = u.patient_id AND d.type=0 AND d.state=0) AS remind,/*复诊未读消息*/
+        ( SELECT COUNT( d.id ) FROM tb_follow_record d WHERE d.patient_id = u.patient_id AND d.type=1 AND d.state=0) AS follow /*随访未填消息*/
+        FROM
+        tb_user u
+        WHERE
+        id =#{id}
+    </select>
+
+    <select id="selectExpert" resultType="com.ruoyi.web.work.domain.vo.ExpertVoList">
+        SELECT user_id,avatar,nick_name FROM sys_user WHERE shows=1 AND status='0' ORDER BY views ASC LIMIT 10
+    </select>
+
 </mapper>

+ 0 - 3
test.java

@@ -1,3 +0,0 @@
-修改后上传,测四git
-
-培昌403?