瀏覽代碼

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

adminAndroot 9 月之前
父節點
當前提交
0f8a925eb3
共有 46 個文件被更改,包括 984 次插入661 次删除
  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. 165 337
      admin-ui/src/views/work/check/index.vue
  7. 332 0
      admin-ui/src/views/work/check/window.vue
  8. 8 11
      admin-ui/src/views/work/visit/index.vue
  9. 17 11
      admin-ui/src/views/work/visit/search.vue
  10. 11 16
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
  11. 11 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  12. 7 2
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_FollowController.java
  13. 5 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_HomeController.java
  14. 2 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_KnowledgeController.java
  15. 6 11
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/DiagnosisController.java
  16. 2 3
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/FollowRecordController.java
  17. 6 11
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/NextOfKinController.java
  18. 6 11
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/PatientController.java
  19. 2 3
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/ReportController.java
  20. 3 4
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/RequestController.java
  21. 7 12
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/ResultController.java
  22. 9 27
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/VisitController.java
  23. 8 6
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/FollowRecord.java
  24. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/User.java
  25. 14 10
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Visit.java
  26. 5 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/PatientCardDto.java
  27. 17 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/ExpertVoList.java
  28. 38 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/FollowRecordVoList.java
  29. 23 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/KnowledgeVoList.java
  30. 2 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/FollowRecordMapper.java
  31. 3 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/KnowledgeMapper.java
  32. 5 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/UserMapper.java
  33. 2 5
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/VisitMapper.java
  34. 27 4
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IFollowRecordService.java
  35. 4 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IKnowledgeService.java
  36. 7 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IUserService.java
  37. 1 4
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IVisitService.java
  38. 16 3
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/FollowRecordServiceImpl.java
  39. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/KnowledgeServiceImpl.java
  40. 7 1
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/UserServiceImpl.java
  41. 5 12
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/VisitServiceImpl.java
  42. 17 6
      ruoyi-admin/src/main/resources/mapper/work/FollowRecordMapper.xml
  43. 16 1
      ruoyi-admin/src/main/resources/mapper/work/KnowledgeMapper.xml
  44. 1 1
      ruoyi-admin/src/main/resources/mapper/work/PatientMapper.xml
  45. 15 0
      ruoyi-admin/src/main/resources/mapper/work/UserMapper.xml
  46. 23 32
      ruoyi-admin/src/main/resources/mapper/work/VisitMapper.xml

+ 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">

+ 165 - 337
admin-ui/src/views/work/check/index.vue

@@ -1,358 +1,186 @@
-<script>
-import service from '@/utils/request'
-import Template from '@/views/work/follow/template/index.vue'
-import DepartmentTemplate from '@/views/work/check/DepartmentTemplate.vue'
+<template>
+  <div class="app-container">
+    <!-- 行容器 -->
+    <el-row :gutter="20" style="height: 100%">
+      <!-- 列容器 -->
+      <!-- 左边的列表,显示各个科室 -->
+      <el-col
+        :span="4"
+        style="
+          box-shadow: 0 3px 10px 0 rgb(0 0 0 / 6%);
+          border-right: 1px solid #f1f2f4;
+          overflow-y: auto;
+          height: 100%;
+        ">
+        <el-tree :data="deptOptions" @node-click="handleNodeClick"> </el-tree>
+      </el-col>
+      <!-- 患者诊断记录列表 -->
+      <el-col :span="20" style="height: 100%">
+        <el-form :model="queryParams" ref="queryForm" :inline="true">
+          <el-form-item prop="physician">
+            <el-input
+              v-model="queryParams.physician"
+              placeholder="请输入主治医生"
+              clearable
+              @keyup.enter.native="handleQuery"
+              class="se" />
+          </el-form-item>
+          <el-form-item prop="patientName">
+            <el-input
+              v-model="queryParams.patientName"
+              placeholder="请输入患者姓名"
+              clearable
+              @keyup.enter.native="handleQuery"
+              class="se" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" @click="handleQuery"
+              >搜索</el-button
+            >
+            <el-button icon="el-icon-refresh" @click="resetQuery"
+              >重置</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <el-table
+          :data="patientList"
+          border
+          @selection-change="selects"
+          height="calc(100vh - 230px)">
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="科室" align="center" prop="department" />
+          <el-table-column label="患者姓名" align="center" prop="name" />
+          <el-table-column label="主治医生" align="center" prop="physician" />
+          <el-table-column
+            label="出院方式"
+            align="center"
+            prop="dischargeMethod">
+            <template slot-scope="scope">
+              <dict-tag
+                :options="dict.type.discharge_method"
+                :value="scope.row.dischargeMethod"></dict-tag>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="出院时间"
+            align="center"
+            prop="dischargeTime" />
+          <el-table-column
+            label="操作"
+            align="center"
+            class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-search"
+                @click="op('search', scope.row)"
+                >查看</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          v-if="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-col>
+    </el-row>
+  </div>
+</template>
 
+<script>
+import window from '@/views/work/check/window.vue'
 export default {
-  components: { DepartmentTemplate, Template },
-  name: 'Check',
+  dicts: ['discharge_method'],
+  name: 'checkUser',
   data() {
     return {
-      // 检查窗口需要用到的数据
-      dialogVisible: false,
-      orcAndObrList: [],
-      reportItemLabelList: [
-        { key: 'reportNo', label: '报告单号' },
-        // { key: "medTechProCode", label: "医技号" },
-        { key: 'medTechProName', label: '医技项目名称' },
-        // { key: 'reportClass', label: '报告单类别名称' },
-        { key: 'reportCompleteTime', label: '报告完成时间' },
-        { key: 'signs', label: '危机标志' },
-        { key: 'sampleReceivedDate', label: '样本收到日期' },
-        { key: 'checkpoint', label: '检查部位或样本' },
-        { key: 'executeDepartmentName', label: '执行科室名称' },
-        // { key: "applyDoctorName", label: "申请医生" },
-        // { key: "testingDoctorName", label: "检验医生信息名称" },
-        { key: 'reviewDoctorName', label: '审核医生' },
-        { key: 'reportDate', label: '报告单日期' },
-      ],
-      timeGroup: {},
-      currentDate: '',
-      currentOrcAndObr: {
-        id: '',
-        orcId: '',
-        medTechProCode: null,
-        medTechProName: '',
-        reportClass: '',
-        reportCompleteTime: '',
-        signs: '',
-        sampleReceivedDate: '',
-        checkpoint: '',
-        executeDepartmentCode: '',
-        executeDepartmentName: '',
-        isFlag: '',
-        reviewDoctorCode: null,
-        reviewDoctorName: '',
-        reportDate: '',
-        reportNo: '',
-      },
-      currentObxList: [],
-
-      /**
-       * 当前病人相关数据
-       * @property {string} patId - 病人id
-       * @property {Array} reportDataList - 报告数据列表
-       * @property {Array} resultList - 检测结果列表
-       */
-      current: {
-        patId: '',
-        obrId: '',
-        reportDataList: [],
-        resultList: [],
-      },
-      checkResultPagination: {
-        total: 0,
-        pageSize: 5,
-        currentPage: 1,
-        obrId: ''
+      total: 0,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      //科室名称
+      deptName: undefined,
+      // 部门树选项
+      deptOptions: null,
+      //患者表
+      patientList: null,
+      //查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        physician: undefined,
+        patientName: undefined,
+        department: undefined,
+        deptId: undefined
       },
     }
   },
+  watch: {},
+  created() {
+    this.getDepartment()
+  },
   methods: {
-    /**
-     * 获取当前病人的所有检查项目结果,通过obrId取出对应检查项目的结果
-     */
-    getCurrentPatientObxList() {
-      service
-        .get(`/work/result/patid/${this.currentPatId}`)
-        .then((response) => {
-          this.obxListAll = response.rows
-          console.log(this.obxListAll)
-          console.log(this.currentOrcAndObr)
-          this.currentObxList = this.obxListAll.filter(
-            (item) => item.obrId === this.currentOrcAndObr.id,
-          )
-        })
-    },
-
-    fillReportItem(reportItemLabelList) {
-      const filledList = [...reportItemLabelList]
-
-      const remainder = filledList.length % 3
-      if (remainder !== 0) {
-        const num = 3 - remainder
-
-        for (let i = num; i > 0; i--) {
-          filledList.push({ key: ``, label: '' })
-        }
-      }
-      return filledList
-    },
-    /**
-     * 处理字符串日期
-     * @param {string} dateString 字符串日期
-     * @example
-     * ```
-     * dateString取值2024-07-23 12:28:42时,
-     * 函数将返回{year: '2024', month: '07', day: '23', time: '12:28:42'}
-     * ```
-     * @return {{year: string, month: string, day: string, time: string}}
-     */
-    handleDate(dateString) {
-      //先把年月日和当天时间分离 2024-07-23 12:28:42->['2024-07-23','12:28:42']
-      const [yearMonthDay, time] = dateString.split(' ')
-
-      //接着把年月日分离 '2024-07-23'->['2024','07','23']
-      const [year, month, day] = yearMonthDay.split('-')
-
-      return {
-        year,
-        month,
-        day,
-        time,
+    // 表单重置
+    reset() {
+      this.form = {
+        physician: undefined,
+        name: undefined,
       }
+      this.resetForm('form')
     },
-    /**
-     * 处理日期数组
-     * @param {{year: string, month: string, day: string, time: string}[]} dates
-     * @return {Record<string,Record<string,Record<string,string[]>>>}
-     * @example
-     * ```
-     * dates取值[
-      { year: '2024', month: '07', day: '23', time: '18:23:23' },
-      { year: '2024', month: '07', day: '23', time: '20:23:23' },
-      { year: '2024', month: '08', day: '24', time: '12:23:23' },
-      { year: '2023', month: '04', day: '08', time: '14:23:23' }
-    ],
-      函数返回
-    {
-      '2023': { '04': { '08': '14:23:23' } },
-      '2024': { '07': { '23': ['18:23:23','20:23:23'] }, '08': { '24': ['12:23:23'] } }
-    }
-     * ```
-     */
-    organizeDates(dates) {
-      const result = {}
-      dates.forEach((date) => {
-        const { year, month, day, time } = date
-        if (!result[year]) {
-          result[year] = {}
-        }
-        if (!result[year][month]) {
-          result[year][month] = {}
-        }
-        if (!result[year][month][day]) {
-          result[year][month][day] = []
-        }
-        result[year][month][day].push(time)
-        // console.log(result)
+    /** 查询患者列表*/
+    getList() {
+      this.get({
+        url: '/work/visit/patientCard',
+        data: {
+          ...this.queryParams,
+        },
+      }).then((response) => {
+        this.patientList = response.rows
+        this.total = response.total
       })
-      return result
     },
-    /**
-     * 处理检测报告数据:把每项待检测报告数据的id属性值(即obrId)作为键,剩余作为对应的值
-     * @param {Array} reportDataList - 待处理的检测报告数据
-     * @example
-     * ```
-     * reportDataList取值[{id: '222', orcId: '33', medTechProCode: null, checkpoint: '样本', ...}]
-     * 函数返回{'222': {orcId: '33', medTechProCode: null, checkpoint: '样本', ...},}
-     * ```
-     */
-    organizeReportData(reportDataList) {
-
+    /** 查询部门 */
+    getDepartment() {
+      this.get({
+        url: '/system/user/deptTree',
+      }).then((response) => {
+        this.deptOptions = response.data
+      })
     },
-    /**
-     * 映射危机标志的对应含义
-     * @param {string} signs 危机标志数值
-     * @return {string} 危机标志对应含义
-     */
-    mapSigns(signs) {
-      switch (signs) {
-        case '0':
-          return '正常'
-        case '1':
-          return '危机'
-        default:
-          return ''
-      }
+    handleNodeClick(data) {
+      this.queryParams.departmentName = data.label
+      this.getList()
     },
-    /**
-     * 映射高低标志的对应含义
-     * @param {string} sign 高低标志
-     * @return {string} 高低标志对应含义
-     */
-    mapHighSign(sign) {
-      switch (sign) {
-        case '0':
-          return '正常'
-        case '1':
-          return '偏低'
-        case '2':
-          return '偏高'
-        default:
-          return ''
-      }
+    selects(rows) {
+      this.ids = rows.map((item) => item.id)
     },
-    /**
-     * 表格分页组件页面变化时的处理逻辑
-     * @param {number} newPage - 新页码
-     */
-    handleCurrentChange(newPage) {
-      console.log(`查看第${newPage}页的数据`)
-      this.checkResultPagination.currentPage = newPage
-
-      this.getCheckResult()
-    },
-    getReportData(patientId) {
-      service.get(`work/request/patid/${patientId}`).then((response) => {
-        console.log(response)
-        this.current.reportDataList = response.rows
+    op(tag, row) {
+      this.iframe({
+        obj: window,
+        param: { id: row.patId },
+        title: '查看患者信息',
+        width: '90%',
+        height: '90%',
+        scroll: true,
       })
     },
-    getCheckResult() {
-      service.get('work/result/list', {
-        params: {
-          obrId: this.checkResultPagination.obrId,
-          pageNum: this.checkResultPagination.currentPage,
-          pageSize: this.checkResultPagination.pageSize,
-        }
-      }).then(response => {
-        this.checkResultPagination.total = response.total
-        console.log(`获得${response.rows}`)
-      })
-    }
-  },
-  watch: {
-    // 监听当前病人id的变化
-    'current.patId'(newPatId) {
-      // console.log(`current.patId=${newPatId}`)
-      this.getReportData(newPatId)
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
     },
   },
 }
 </script>
-
-<template>
-  <DepartmentTemplate :patient-id.sync="current.patId">
-    <template>
-      <el-row class="tac" :gutter="10">
-        <el-col :span="4">
-          <el-menu
-            default-active="1"
-            class="el-menu-vertical-demo"
-            style="height: 200px">
-            <el-submenu
-              v-for="(year, yearIndex) in Object.keys(timeGroup)"
-              :index="`${yearIndex}`">
-              <template slot="title">
-                <span>{{ year }}年</span>
-              </template>
-              <el-submenu
-                v-for="(month, monthIndex) in Object.keys(timeGroup[year])"
-                :index="`${yearIndex}-${monthIndex}`">
-                <template slot="title">
-                  <span>{{ month }}月</span>
-                </template>
-                <el-submenu
-                  v-for="(day, dayIndex) in Object.keys(timeGroup[year][month])"
-                  :index="`${yearIndex}-${monthIndex}-${dayIndex}`">
-                  <template slot="title">
-                    <span>{{ day }}日</span>
-                  </template>
-                  <el-menu-item
-                    v-for="(time, timeIndex) in timeGroup[year][month][day]"
-                    :index="`${yearIndex}-${monthIndex}-${dayIndex} ${timeIndex}`"
-                    @click="
-                      currentDate = `${year}-${month}-${day} ${time}`
-                      currentOrcAndObr = orcAndObrList.find(
-                        (item) => item.reportDate === currentDate,
-                      )
-                      getCurrentPatientObxList()
-                    ">
-                    <span>{{ time }}</span>
-                  </el-menu-item>
-                </el-submenu>
-              </el-submenu>
-            </el-submenu>
-          </el-menu>
-        </el-col>
-
-        <el-col :span="20" style="overflow-y: scroll">
-          <el-descriptions
-            class="margin-top"
-            title="详细检测报告"
-            :column="3"
-            border>
-            <el-descriptions-item
-              v-for="item in fillReportItem(reportItemLabelList)"
-              :key="item.key"
-              :label="item.label">
-              <span v-if="currentOrcAndObr[item.key] && item.key !== 'signs'">{{
-                currentOrcAndObr[item.key]
-              }}</span>
-              <span v-else-if="item.key === 'signs'">{{
-                mapSigns(currentOrcAndObr[item.key])
-              }}</span>
-              <span v-else>{{ '' }}</span>
-            </el-descriptions-item>
-          </el-descriptions>
-
-          <div id="patient-check-projects-table">
-            <el-table width="100%" stripe :data="currentObxList">
-              <el-table-column
-                label="医技项目名称"
-                align="center"
-                prop="mecTechObsName"></el-table-column>
-              <el-table-column
-                label="项目信息结果"
-                align="center"
-                prop="result"></el-table-column>
-              <el-table-column
-                label="项目单位"
-                align="center"
-                prop="unitCode"></el-table-column>
-              <el-table-column
-                label="结果参考值"
-                align="center"
-                prop="result"></el-table-column>
-              <el-table-column
-                label="高低标志"
-                align="center"
-                prop="sign"></el-table-column>
-              <el-table-column
-                label="微生物观察分类"
-                align="center"
-                prop="obsClassification"></el-table-column>
-              <el-table-column
-                label="检验方法"
-                align="center"
-                prop="testMethod"></el-table-column>
-            </el-table>
-            <el-pagination
-              :page-size="checkResultPagination.pageSize"
-              :total="checkResultPagination.total"
-              :current-page.sync="checkResultPagination.currentPage"
-              @current-change="handleCurrentChange"></el-pagination>
-          </div>
-        </el-col>
-      </el-row>
-    </template>
-  </DepartmentTemplate>
-</template>
-
-<style scoped>
-#patient-check-projects-table {
-  min-height: 300px;
-  margin-top: 5vh;
-}
-</style>

+ 332 - 0
admin-ui/src/views/work/check/window.vue

@@ -0,0 +1,332 @@
+<template>
+  <div id="check-window" style="width:100%;">
+    <el-row class="tac" :gutter="10">
+      <el-col :span="4">
+        <el-menu
+          default-active="1"
+          class="el-menu-vertical-demo"
+          style="height: 200px">
+          <el-submenu :index="`year`" v-for="year in Object.keys(timeGroup)">
+            <template slot="title">{{ year }}年</template>
+            <el-submenu
+              :index="`${year}-${month}`"
+              v-for="month in Object.keys(timeGroup[year])">
+              <template slot="title">{{ month }}月</template>
+              <el-submenu
+                :index="`${year}-${month}-${day}`"
+                v-for="day in Object.keys(timeGroup[year][month])">
+                <template slot="title">{{ day }}日</template>
+                <el-menu-item
+                  :index="`${year}-${month}-${day}-${obrIdAndTime.time}`"
+                  v-for="obrIdAndTime in timeGroup[year][month][day]"
+                  @click="current.obrId = obrIdAndTime.obrId">
+                  {{ obrIdAndTime.time }}
+                </el-menu-item>
+              </el-submenu>
+            </el-submenu>
+          </el-submenu>
+        </el-menu>
+      </el-col>
+
+      <el-col :span="20" style="overflow-y: scroll">
+        <el-descriptions
+          class="margin-top"
+          title="详细检测报告"
+          :column="3"
+          border>
+          <el-descriptions-item
+            v-for="item in fillReportItem(reportItemLabelList)"
+            :key="item.key"
+            :label="item.label">
+            <span v-if="current.obr[item.key] && item.key !== 'signs'">{{
+              current.obr[item.key]
+            }}</span>
+            <span v-else-if="item.key === 'signs'">{{
+              mapSigns(current.obr[item.key])
+            }}</span>
+            <span v-else>{{ '' }}</span>
+          </el-descriptions-item>
+        </el-descriptions>
+
+        <div id="patient-check-projects-table">
+          <el-table width="100%" stripe :data="current.obxList">
+            <el-table-column
+              label="医技项目名称"
+              align="center"
+              prop="mecTechObsName"></el-table-column>
+            <el-table-column
+              label="项目信息结果"
+              align="center"
+              prop="result"></el-table-column>
+            <el-table-column
+              label="项目单位"
+              align="center"
+              prop="unitCode"></el-table-column>
+            <el-table-column
+              label="结果参考值"
+              align="center"
+              prop="result"></el-table-column>
+            <el-table-column
+              label="高低标志"
+              align="center"
+              prop="sign"></el-table-column>
+            <el-table-column
+              label="微生物观察分类"
+              align="center"
+              prop="obsClassification"></el-table-column>
+            <el-table-column
+              label="检验方法"
+              align="center"
+              prop="testMethod"></el-table-column>
+          </el-table>
+          <el-pagination
+            :page-count.sync="obxPaginationParams.pageNum"
+            :total="obxPaginationParams.total"
+            :page-size="obxPaginationParams.pageSize" @current-change="handleCurrentPageChange">
+          </el-pagination>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import service from '@/utils/request'
+
+export default {
+  name: 'checkWindow',
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return { id: '' }
+      },
+    },
+  },
+  data() {
+    return {
+      current: {
+        obrId: '',
+        obrAllList: [],
+        obr: {},
+        obxAllList: [],
+        obxList: [],
+      },
+      timeGroup: {},
+      reportItemLabelList: [
+        // { key: 'reportNo', label: '报告单号' },
+        // { key: "medTechProCode", label: "医技号" },
+        { key: 'medTechProName', label: '医技项目名称' },
+        // { key: 'reportClass', label: '报告单类别名称' },
+        { key: 'reportCompleteTime', label: '报告完成时间' },
+        { key: 'signs', label: '危机标志' },
+        { key: 'sampleReceivedDate', label: '样本收到日期' },
+        { key: 'checkpoint', label: '检查部位或样本' },
+        { key: 'executeDepartmentName', label: '执行科室名称' },
+        // { key: "applyDoctorName", label: "申请医生" },
+        // { key: "testingDoctorName", label: "检验医生信息名称" },
+        { key: 'reviewDoctorName', label: '审核医生' },
+        { key: 'reportDate', label: '报告单日期' },
+      ],
+      obxPaginationParams:{
+        pageNum: 1, //当前页数
+        pageSize: 5, //每页数据数量
+        total: 0 //总共数据量
+      },
+      testPatId: 24502 //测试用的patId  测试值:24502, 24503, 24504, 24656
+    }
+  },
+  watch: {
+    'current.obrId'(newValue) {
+      this.current.obr = this.current.obrAllList.find(
+        (item) => item.id === newValue
+      )
+      this.current.obxList = this.current.obxAllList.filter(
+        (item) => item.obrId === newValue
+      )
+    },
+    'current.obxList'(newValue) {
+      // 将obxList每个obx对象的sign替换成对应意义
+      if(newValue) {
+      // console.log(newValue)
+
+      const rs = newValue.map(item => {
+        if(item) {
+        console.log(item)
+
+        item.sign = this.mapHighSign(item.sign)
+        }
+      })
+        console.log(rs)
+      }
+    }
+  },
+  methods: {
+    // 获取当前患者的所有检查项目,同时生成菜单栏需要的时间数据
+    getObrAllListAndGenerateTime() {
+      // this.testPatId要改为this.$props.param.id
+      this.$props.param.id = this.testPatId //后续数据库更新后需要把这行代码注释掉
+      service({
+        url: `/work/request/patid/${this.$props.param.id}`,
+      }).then((response) => {
+        this.current.obrAllList = response.rows
+        // 得到obrAllList的数据后接着生成timeGroup
+        this.handleObrList(response.rows)
+      })
+    },
+    // 获取所有检查项目的所有检测结果,通过检测项目标识obrId来取出对应检测结果,默认获取第一页的数据
+    getObxAllList() {
+      // this.testPatId要改为this.$props.param.id
+      this.$props.param.id = this.testPatId //后续数据库更新后需要把这行代码注释掉
+      service({
+        url: `/work/result/patid/${this.$props.param.id}`,
+        params: {
+          ...this.obxPaginationParams
+        }
+      }).then((response) => {
+        this.current.obxAllList = response.rows
+        this.obxPaginationParams.total = response.total
+              if(this.current.obrId!=='') {
+
+         this.current.obxList = this.current.obxAllList.filter(item => item.obrId === this.current.obrId)
+        }
+      })
+    },
+    // 分页组件页面变化时请求对应页的检测结果
+    handleCurrentPageChange(newPage) {
+      this.obxPaginationParams.pageNum = newPage
+      this.getObxAllList()
+
+    },
+    fillReportItem(reportItemLabelList) {
+      const filledList = [...reportItemLabelList]
+
+      const remainder = filledList.length % 3
+      if (remainder !== 0) {
+        const num = 3 - remainder
+
+        for (let i = num; i > 0; i--) {
+          filledList.push({ key: ``, label: '' })
+        }
+      }
+      return filledList
+    },
+    /**
+     * 映射危机标志的对应含义
+     * @param {string} signs 危机标志数值
+     * @return {string} 危机标志对应含义
+     */
+    mapSigns(signs) {
+      switch (signs) {
+        case '0':
+          return '正常'
+        case '1':
+          return '危机'
+        default:
+          return ''
+      }
+    },
+    /**
+     * 映射高低标志的对应含义
+     * @param {string} sign 高低标志
+     * @return {string} 高低标志对应含义
+     */
+    mapHighSign(sign) {
+      switch (sign) {
+        case '0':
+          return '正常'
+        case '1':
+          return '偏低'
+        case '2':
+          return '偏高'
+        default:
+          return ''
+      }
+    },
+    /**
+     * 处理字符串日期
+     * @param {string} dateString 字符串日期
+     * @example
+     * ```
+     * dateString取值2024-07-23 12:28:42时,
+     * 函数将返回{year: '2024', month: '07', day: '23', time: '12:28:42'}
+     * ```
+     * @return {{year: string, month: string, day: string, time: string}}
+     */
+    handleDate(dateString) {
+      //先把年月日和当天时间分离 2024-07-23 12:28:42->['2024-07-23','12:28:42']
+      const [yearMonthDay, time] = dateString.split(' ')
+
+      //接着把年月日分离 '2024-07-23'->['2024','07','23']
+      const [year, month, day] = yearMonthDay.split('-')
+
+      return { year, month, day, time }
+    },
+    /**
+     * 处理日期数组
+     * @param {{obrId:string,reportCompleteTime:{year: string, month: string, day: string, time: string}}[]} orcIdAndTimeList
+     * @return {Record<string,Record<string,Record<string,string[]>>>}
+     * @example
+     * ```
+     * dates取值[
+      {obrId:'223',reportCompleteTime:{ year: '2024', month: '07', day: '23', time: '18:23:23' }},
+      {obrId:'223',reportCompleteTime:{ year: '2024', month: '07', day: '23', time: '20:23:23' }},
+      {obrId:'223',reportCompleteTime:{ year: '2024', month: '08', day: '24', time: '12:23:23' }},
+      {obrId:'223',reportCompleteTime:{ year: '2023', month: '04', day: '08', time: '14:23:23' }}
+    ],
+      函数返回
+    {
+      '2023': { '04': { '08': [{orcId: '233',time:'14:23:23'}] } },
+      '2024': {
+         '07': { '23': [{orcId: '233',time: '18:23:23'},{orcId: '233',time: '20:23:23'}] },
+         '08': { '24': [{orcId: '233',time: '12:23:23'}]  }
+      }
+     * ```
+     */
+    organizeDates(orcIdAndTimeList) {
+      const result = {}
+      orcIdAndTimeList.forEach((item) => {
+        const { year, month, day, time } = item.reportCompleteTime
+        if (!result[year]) {
+          result[year] = {}
+        }
+        if (!result[year][month]) {
+          result[year][month] = {}
+        }
+        if (!result[year][month][day]) {
+          result[year][month][day] = []
+        }
+        result[year][month][day].push({ obrId: item.obrId, time: time })
+      })
+      return result
+    },
+    /**
+     * 处理current.obrAllList
+     * @param {Array} obrAllList
+     */
+    handleObrList(obrAllList) {
+      // 从current.obrAllList获取对象{obrId: '',reportCompleteTime: {year, month, day, time}}数组
+      const orcIdAndTimeList = obrAllList.map((item) => {
+
+        const handledDate = this.handleDate(item.reportCompleteTime)
+        return { obrId: item.id, reportCompleteTime: handledDate }
+      })
+
+
+      this.timeGroup = this.organizeDates(orcIdAndTimeList)
+    },
+  },
+  // 当弹窗组件创建时请求当前患者所有检查项目信息
+  created() {
+    this.getObrAllListAndGenerateTime()
+    this.getObxAllList()
+  },
+}
+</script>
+
+<style scoped>
+#patient-check-projects-table {
+  min-height: 300px;
+  margin-top: 5vh;
+}
+</style>

+ 8 - 11
admin-ui/src/views/work/patient/index.vue → admin-ui/src/views/work/visit/index.vue

@@ -1,15 +1,9 @@
 <template>
   <div class="app-container">
-    <!-- 行容器 -->
     <el-row :gutter="20" style="height: 100%">
-      <!-- 列容器 -->
-      <!-- 左边的列表,显示各个科室 -->
       <el-col :span="4" style="box-shadow: 0 3px 10px 0 rgb(0 0 0 / 6%); border-right: 1px solid #f1f2f4; overflow-y: auto; height: 100%">
-        <el-tree :data="deptOptions" @node-click="handleNodeClick">
-
-        </el-tree>
+        <el-tree :data="deptOptions" @node-click="handleNodeClick" :default-expand-all="true"></el-tree>
       </el-col>
-      <!-- 患者诊断记录列表 -->
       <el-col :span="20" style="height: 100%">
         <el-form :model="queryParams" ref="queryForm" :inline="true" >
           <el-form-item prop="physician">
@@ -41,14 +35,13 @@
           </el-table-column>
         </el-table>
         <pagination v-if="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList"/>
-
       </el-col>
     </el-row>
   </div>
 </template>
 
 <script>
-import search from "@/views/work/patient/search.vue";
+import search from "@/views/work/visit/search.vue";
 export default {
   dicts:['discharge_method'],
   name: 'User',
@@ -73,7 +66,8 @@ export default {
         pageSize:10,
         physician: undefined,
         patientName:undefined,
-        departmentName:undefined,
+        department:undefined,
+        deptId:undefined,
       },
     };
   },
@@ -93,6 +87,7 @@ export default {
     },
     /** 查询患者列表*/
     getList(){
+      console.log(this.deptId)
       this.get({
         url:'/work/visit/patientCard',
         data: {
@@ -109,10 +104,12 @@ export default {
         url:'/system/user/deptTree'
       }).then((response) => {
         this.deptOptions = response.data;
+        this.queryParams.deptId = response.data[0].id;
+        this.getList();
       });
     },
     handleNodeClick(data){
-      this.queryParams.departmentName = data.label;
+      this.queryParams.deptId = data.id;
       this.getList();
     },
     selects(rows) {

+ 17 - 11
admin-ui/src/views/work/patient/search.vue → admin-ui/src/views/work/visit/search.vue

@@ -2,7 +2,6 @@
   <div class="container" style="height: 80vh; width: 87vw">
     <el-row :gutter="10">
       <el-col :span="5">
-        <!-- 左边的导航菜单 -->
         <div class="left-body">
           <el-menu :default-active="activeNow" @open="handleOpen" :unique-opened="true">
             <el-menu-item index="1" @click="activePatient(1)">
@@ -23,7 +22,7 @@
                     <span>{{month}}月</span>
                   </template>
                   <el-menu-item v-for="item in days" @click="getCard(item.id); activePatient(2); getDgList()" :key="item.id" :index="item.id.toString()">
-                    {{year}}年{{month}}月{{item.day}}日
+                    {{item.day}}日 {{item.HH}}:{{item.MM}}:{{item.SS}}
                   </el-menu-item>
                 </el-submenu>
               </el-submenu>
@@ -32,11 +31,8 @@
         </div>
       </el-col>
       <el-col :span="19">
-        <!-- 右边的信息显示 -->
         <div class="right-body">
-          <!-- 患者基本信息/亲属 -->
           <div class="patient-info-nk" v-if="active === 1">
-            <!-- 患者基本信息 -->
             <div class="patient-info">
               <el-descriptions  style="width: 69vw; margin-top: 10px" title="患者信息" :column="3" border>
                 <el-descriptions-item label="患者标识符" v-if="patientInfo">{{patientInfo.patientCode}}</el-descriptions-item>
@@ -60,7 +56,7 @@
                 <el-descriptions-item label="婴儿序号" v-if="patientInfo">{{patientInfo.yexh}}</el-descriptions-item>
               </el-descriptions>
             </div>
-            <!-- 患者亲属 -->
+
             <div class="patient-nk" style="margin-top: 10px">
               <el-table style="width:69vw;" height="calc(75vh - 270px)"  :data="nkList" highlight-current-row>
                 <el-table-column label="姓名" align="center" prop="name"></el-table-column>
@@ -73,9 +69,8 @@
               <pagination v-show="totalNk > 0" :total="totalNk" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getNkList" />
             </div>
           </div>
-          <!-- 诊断信息 -->
+
           <div class="dg-info" v-if="active === 2">
-            <!-- 单次就诊的详细信息 -->
             <div class="pv">
               <el-descriptions :column="3" border style="width: 69vw; margin-top: 10px"  title="就诊信息">
                 <el-descriptions-item label="患者类别">
@@ -100,7 +95,7 @@
                 <el-descriptions-item label="出区原因">{{pvList.reasonArea}}</el-descriptions-item>
               </el-descriptions>
             </div>
-            <!-- 诊断结果列表 -->
+
             <div class="dg" style="margin-top: 10px">
               <el-table style=" width:69vw;" height="calc(75vh - 270px)" :data="dgList" highlight-current-row>
                 <el-table-column label="诊断名称" align="center" prop="diagnosticName"></el-table-column>
@@ -179,7 +174,7 @@ export default {
     this.getNkList();
   },
   methods:{
-    handleOpen(index, indexPath){
+    handleOpen(index){
       if(index === "2"){
         this.activeIndex();
       }
@@ -238,6 +233,7 @@ export default {
         }
       }).then( (response) => {
         this.timeList = response.rows;
+        console.log(this.timeList)
         this.groupDates(this.timeList);
       })
     },
@@ -246,6 +242,9 @@ export default {
         this.year = date.admissionTime.substring(0, 4);
         this.month = date.admissionTime.substring(5, 7);
         this.day = date.admissionTime.substring(8, 10);
+        this.HH = date.admissionTime.substring(11,13);
+        this.MM = date.admissionTime.substring(14,16);
+        this.SS = date.admissionTime.substring(17,20);
         this.id = date.id;
         if (!this.groupedDates[this.year]) {
           this.groupedDates[this.year] = {};
@@ -253,7 +252,14 @@ export default {
         if (!this.groupedDates[this.year][this.month]) {
           this.groupedDates[this.year][this.month] = [];
         }
-        this.groupedDates[this.year][this.month].push({id: this.id, day: this.day});
+        this.groupedDates[this.year][this.month].push(
+          {
+            id: this.id,
+            day: this.day,
+            HH: this.HH,
+            MM: this.MM,
+            SS: this.SS
+          });
       })
       this.$forceUpdate();
     },

+ 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);
     }
 

+ 6 - 11
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/DiagnosisController.java

@@ -8,6 +8,7 @@ import com.ruoyi.web.work.service.IDiagnosisService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -27,7 +28,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
  * @date 2024-07-19
  */
 @Api(tags = "诊断管理")
-@Anonymous
 @RestController
 @RequestMapping("/work/diagnosis")
 public class DiagnosisController extends BaseController {
@@ -35,8 +35,7 @@ public class DiagnosisController extends BaseController {
     private IDiagnosisService dgService;
 
     @ApiOperation(value = "获取诊断列表")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:dg:list')")
+    @PreAuthorize("@ss.hasPermi('work:diagnosis:list')")
     @GetMapping("/list")
     public TableDataInfo list(Diagnosis diagnosis){
         startPage();
@@ -45,16 +44,14 @@ public class DiagnosisController extends BaseController {
     }
 
     @ApiOperation(value = "根据id查询")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:dg:query')")
+    @PreAuthorize("@ss.hasPermi('work:diagnosis:query')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id){
         return AjaxResult.success(dgService.getById(id));
     }
 
     @ApiOperation(value = "添加诊断信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:dg:add')")
+    @PreAuthorize("@ss.hasPermi('work:diagnosis:add')")
     @Log(title = "诊断", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody Diagnosis dg){
@@ -62,8 +59,7 @@ public class DiagnosisController extends BaseController {
     }
 
     @ApiOperation(value = "修改诊断信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:dg:edit')")
+    @PreAuthorize("@ss.hasPermi('work:diagnosis:edit')")
     @Log(title = "诊断", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     public AjaxResult edit(@RequestBody Diagnosis dg){
@@ -71,8 +67,7 @@ public class DiagnosisController extends BaseController {
     }
 
     @ApiOperation(value = "删除诊断信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:dg:remove')")
+    @PreAuthorize("@ss.hasPermi('work:diagnosis:remove')")
     @Log(title = "诊断", businessType = BusinessType.DELETE)
     @GetMapping("/remove/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids){

+ 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));
     }
 

+ 6 - 11
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/NextOfKinController.java

@@ -8,6 +8,7 @@ import com.ruoyi.web.work.domain.NextOfKin;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -27,7 +28,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
  * @date 2024-07-19
  */
 @Api(tags = "亲属关系管理")
-@Anonymous
 @RestController
 @RequestMapping("/work/nk")
 public class NextOfKinController extends BaseController {
@@ -35,8 +35,7 @@ public class NextOfKinController extends BaseController {
     private INextOfKinService nkService;
 
     @ApiOperation(value = "获取亲属信息列表")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:nk:list')")
+    @PreAuthorize("@ss.hasPermi('work:nk:list')")
     @GetMapping("/list")
     public TableDataInfo list(NextOfKin nk){
         startPage();
@@ -45,16 +44,14 @@ public class NextOfKinController extends BaseController {
     }
 
     @ApiOperation(value = "根据id查询亲属信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:nk:query')")
+    @PreAuthorize("@ss.hasPermi('work:nk:query')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id){
         return AjaxResult.success(nkService.getById(id));
     }
 
     @ApiOperation(value = "添加亲属信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:nk:add')")
+    @PreAuthorize("@ss.hasPermi('work:nk:add')")
     @Log(title = "亲属关系", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody NextOfKin nk){
@@ -62,8 +59,7 @@ public class NextOfKinController extends BaseController {
     }
 
     @ApiOperation(value = "修改亲属信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:nk:edit')")
+    @PreAuthorize("@ss.hasPermi('work:nk:edit')")
     @Log(title = "亲属关系", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     public AjaxResult edit(@RequestBody NextOfKin nk){
@@ -71,8 +67,7 @@ public class NextOfKinController extends BaseController {
     }
 
     @ApiOperation(value = "删除亲属信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:nk:remove')")
+    @PreAuthorize("@ss.hasPermi('work:nk:remove')")
     @Log(title = "亲属关系", businessType = BusinessType.DELETE)
     @GetMapping("/remove/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids){

+ 6 - 11
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/PatientController.java

@@ -7,6 +7,7 @@ import com.ruoyi.common.annotation.Anonymous;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
@@ -22,7 +23,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
  * @date 2024-07-19
  */
 @Api(tags = "患者信息管理")
-@Anonymous
 @RestController
 @RequestMapping("/work/patient")
 public class PatientController extends BaseController {
@@ -31,8 +31,7 @@ public class PatientController extends BaseController {
     private IPatientService patientService;
 
     @ApiOperation(value = "获取患者信息列表")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:patient:list')")
+    @PreAuthorize("@ss.hasPermi('work:patient:list')")
     @GetMapping("/list")
     public TableDataInfo list(Patient patient){
         startPage();
@@ -41,16 +40,14 @@ public class PatientController extends BaseController {
     }
 
     @ApiOperation(value = "根据id查询患者个人信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:patient:query')")
+    @PreAuthorize("@ss.hasPermi('work:patient:query')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id){
         return AjaxResult.success(patientService.getById(id));
     }
 
     @ApiOperation(value = "添加患者信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:patient:add')")
+    @PreAuthorize("@ss.hasPermi('work:patient:add')")
     @Log(title = "患者", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody Patient patient){
@@ -58,8 +55,7 @@ public class PatientController extends BaseController {
     }
 
     @ApiOperation(value = "修改患者信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:patient:edit')")
+    @PreAuthorize("@ss.hasPermi('work:patient:edit')")
     @Log(title = "患者", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     public AjaxResult edit(@RequestBody Patient patient){
@@ -67,8 +63,7 @@ public class PatientController extends BaseController {
     }
 
     @ApiOperation(value = "删除患者信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:patient:remove')")
+    @PreAuthorize("@ss.hasPermi('work:patient:remove')")
     @Log(title = "患者", businessType = BusinessType.DELETE)
     @GetMapping("/remove/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids){

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

@@ -25,7 +25,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
  * @date 2024-07-24
  */
 @Api(tags = "医嘱信息管理")
-@Anonymous
 @RestController
 @RequestMapping("/work/report")
 public class ReportController extends BaseController {
@@ -34,7 +33,7 @@ public class ReportController extends BaseController {
 
 
     @ApiOperation(value = "根据患者ID获取此人的全部医嘱信息列表")
-    //@PreAuthorize("@ss.hasPermi('work:request:list')")
+    @PreAuthorize("@ss.hasPermi('work:report:list')")
     @GetMapping("/patid/{patId}")
     public TableDataInfo getAllReportByPatId(@PathVariable("patId") Long patId){
         startPage();
@@ -43,7 +42,7 @@ public class ReportController extends BaseController {
     }
 
 
-    //@PreAuthorize("@ss.hasPermi('work:report:list')")
+    @PreAuthorize("@ss.hasPermi('work:report:list')")
     @GetMapping("/list")
     public TableDataInfo list(Report report){
         startPage();

+ 3 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/RequestController.java

@@ -23,7 +23,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
  * @date 2024-07-23
  */
 @Api(tags = "科室申请管理")
-@Anonymous
 @RestController
 @RequestMapping("/work/request")
 public class RequestController extends BaseController {
@@ -32,7 +31,7 @@ public class RequestController extends BaseController {
     private IRequestService requestService;
 
     @ApiOperation(value = "根据患者ID获取此人的全部检查项目列表")
-    //@PreAuthorize("@ss.hasPermi('work:request:list')")
+    @PreAuthorize("@ss.hasPermi('work:request:list')")
     @GetMapping("/patid/{patId}")
     public TableDataInfo getAllRequestByPatId(@PathVariable("patId") Long patId){
         startPage();
@@ -42,7 +41,7 @@ public class RequestController extends BaseController {
 
 
     @ApiOperation(value = "获取科室申请列表")
-    //@PreAuthorize("@ss.hasPermi('work:request:list')")
+    @PreAuthorize("@ss.hasPermi('work:request:list')")
     @GetMapping("/list")
     public TableDataInfo list(Request request){
         startPage();
@@ -51,7 +50,7 @@ public class RequestController extends BaseController {
     }
 
     @ApiOperation(value = "根据Id获取科室申请列表")
-    //@PreAuthorize("@ss.hasPermi('work:request:query')")
+    @PreAuthorize("@ss.hasPermi('work:request:query')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id){
         return AjaxResult.success(requestService.getById(id));

+ 7 - 12
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/ResultController.java

@@ -8,6 +8,7 @@ import com.ruoyi.web.work.domain.Request;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
@@ -23,7 +24,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
  * @date 2024-07-23
  */
 @Api(tags = "检测项目管理")
-@Anonymous
 @RestController
 @RequestMapping("/work/result")
 public class ResultController extends BaseController {
@@ -32,7 +32,7 @@ public class ResultController extends BaseController {
 
 
     @ApiOperation(value = "根据患者ID获取此人的全部检查结果列表")
-    //@PreAuthorize("@ss.hasPermi('work:request:list')")
+    @PreAuthorize("@ss.hasPermi('work:result:list')")
     @GetMapping("/patid/{patId}")
     public TableDataInfo getAllResultByPatId(@PathVariable("patId") Long patId){
         startPage();
@@ -41,8 +41,7 @@ public class ResultController extends BaseController {
     }
 
     @ApiOperation(value = "获取检测项目列表")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:request:list')")
+    @PreAuthorize("@ss.hasPermi('work:result:list')")
     @GetMapping("/list")
     public TableDataInfo list(Result result){
         startPage();
@@ -51,31 +50,27 @@ public class ResultController extends BaseController {
     }
 
     @ApiOperation(value = "根据Id获取检测项目列表")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:request:query')")
+    @PreAuthorize("@ss.hasPermi('work:result:query')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id){
         return AjaxResult.success(resultService.getById(id));
     }
 
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:request:add')")
+    @PreAuthorize("@ss.hasPermi('work:result:add')")
     @Log(title = "request", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody Result request){
         return toAjax(resultService.save(request));
     }
 
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:request:edit')")
+    @PreAuthorize("@ss.hasPermi('work:result:edit')")
     @Log(title = "request", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     public AjaxResult edit(@RequestBody Result request){
         return toAjax(resultService.updateById(request));
     }
 
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:request:remove')")
+    @PreAuthorize("@ss.hasPermi('work:result:remove')")
     @Log(title = "request", businessType = BusinessType.DELETE)
     @GetMapping("/remove/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids){

+ 9 - 27
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/VisitController.java

@@ -10,6 +10,7 @@ import com.ruoyi.web.work.service.IVisitService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
@@ -23,7 +24,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
  * @date 2024-07-19
  */
 @Api(tags = "住院信息管理")
-@Anonymous
 @RestController
 @RequestMapping("/work/visit")
 public class VisitController extends BaseController {
@@ -31,31 +31,17 @@ public class VisitController extends BaseController {
     @Autowired
     private IVisitService visitService;
 
-
-    //@PreAuthorize("@ss.hasPermi('work:pv1:list')")
-    @ApiOperation(value = "获取所有科室")
-    @Anonymous
-    @GetMapping("/department")
-    public TableDataInfo getAllDepartment() {
-        List<String> list=visitService.getAllDepartment();
-        return getDataTable(list);
-    }
-
+    @PreAuthorize("@ss.hasPermi('work:visit:list')")
     @ApiOperation(value = "根据姓名、科室、主治医生查询就诊信息列表",notes = "可单条件或多条件查询,需要查哪个就传哪个")
-    @Anonymous
     @GetMapping("/patientCard")
-    public TableDataInfo getPatientCardByNameOrDepartment(@RequestParam(value = "patientName",required = false) String patientName,
-                                                            @RequestParam(value = "departmentName",required = false) String departmentName,
-                                                          @RequestParam(value = "physician",required = false) String physician){
+    public TableDataInfo getPatientCardByNameOrDepartment(PatientCardDto patientCardDto){
         startPage();
-        List<PatientCardDto> list=visitService.getPatientCardByNameOrDepartmentOrPhysician(patientName,departmentName,physician);
+        List<PatientCardDto> list=visitService.getPatientCardByNameOrDepartmentOrPhysician(patientCardDto);
         return getDataTable(list);
     }
 
-
     @ApiOperation(value = "获取住院信息列表")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:pv1:list')")
+    @PreAuthorize("@ss.hasPermi('work:visit:list')")
     @GetMapping("/list")
     public TableDataInfo list(Visit visit){
         startPage();
@@ -64,16 +50,14 @@ public class VisitController extends BaseController {
     }
 
     @ApiOperation(value = "根据id查询住院信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:pv1:query')")
+    @PreAuthorize("@ss.hasPermi('work:visit:query')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id){
         return AjaxResult.success(visitService.getById(id));
     }
 
     @ApiOperation(value = "添加住院信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:pv1:add')")
+    @PreAuthorize("@ss.hasPermi('work:visit:add')")
     @Log(title = "住院信息", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody Visit pv1){
@@ -81,8 +65,7 @@ public class VisitController extends BaseController {
     }
 
     @ApiOperation(value = "修改住院信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:pv1:edit')")
+    @PreAuthorize("@ss.hasPermi('work:visit:edit')")
     @Log(title = "住院信息", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     public AjaxResult edit(@RequestBody Visit pv1){
@@ -90,8 +73,7 @@ public class VisitController extends BaseController {
     }
 
     @ApiOperation(value = "删除住院信息")
-    @Anonymous
-    //@PreAuthorize("@ss.hasPermi('work:pv1:remove')")
+    @PreAuthorize("@ss.hasPermi('work:visit:remove')")
     @Log(title = "住院信息", businessType = BusinessType.DELETE)
     @GetMapping("/remove/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids){

+ 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;
+
 }

+ 14 - 10
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Visit.java

@@ -2,6 +2,8 @@ package com.ruoyi.web.work.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseData;
+import com.ruoyi.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -17,7 +19,7 @@ import java.util.List;
 @Data
 @TableName(value = "tb_visit")
 @Accessors(chain = true)
-public class Visit {
+public class Visit extends BaseData {
 
     private Long id;
     @ApiModelProperty(value = "患者ID")
@@ -26,8 +28,10 @@ public class Visit {
     private Long cardId;
     @ApiModelProperty(value = "患者分类")
     private String patClass;
-    @ApiModelProperty(value = "科室代码")
+
+    @ApiModelProperty(value = "科室Code")
     private String deptCode;
+
     @ApiModelProperty(value = "科室")
     private String department;
     @ApiModelProperty(value = "床位")
@@ -69,14 +73,14 @@ public class Visit {
 
 
 
-    private String createBy;  //创建人
-    @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Data createTime;  //创建时间
-    private String updateBy;  //更新人
-    @TableField(fill = FieldFill.UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Data updateTime;  //更新时间
+    //private String createBy;  //创建人
+    //@TableField(fill = FieldFill.INSERT)
+    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    //private Data createTime;  //创建时间
+    //private String updateBy;  //更新人
+    //@TableField(fill = FieldFill.UPDATE)
+    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    //private Data updateTime;  //更新时间
 
     @TableField(exist = false)
     private List<Patient> patients;

+ 5 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/PatientCardDto.java

@@ -1,5 +1,6 @@
 package com.ruoyi.web.work.domain.dto;
 
+import com.ruoyi.common.core.domain.BaseData;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -8,7 +9,7 @@ import java.sql.Timestamp;
 
 @Data
 @Accessors(chain = true)
-public class PatientCardDto {
+public class PatientCardDto extends BaseData {
 
 
     @ApiModelProperty(value = "科室")
@@ -39,6 +40,9 @@ public class PatientCardDto {
     private String cardId;
 
 
+    @ApiModelProperty(value = "患者姓名")
+    private String patientName;
+
 
 }
 

+ 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();
 }

+ 2 - 5
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/VisitMapper.java

@@ -16,11 +16,6 @@ import org.apache.ibatis.annotations.Param;
 public interface VisitMapper extends BaseMapper<Visit>{
     List<Visit> selectList(Visit visit);
 
-    List<PatientCardDto> getPatientCardByNameOrDepartmentOrPhysician(@Param("patientName") String patientName, @Param("departmentName") String departmentName, @Param("physician") String physician);
-
-    List<String> getAllDepartment();
-
-    List<Visit> getVisitByTime(String beginTime, String endTime, Long patId);
 
     List<Visit> selectVisitsByCardId(String cardId);
 
@@ -31,4 +26,6 @@ public interface VisitMapper extends BaseMapper<Visit>{
 
     //获取当前用户部门下的患者信息
     List<Visit> selectVisitsByIdAndUserName(@Param("deptId") Long deptId,@Param("userName") String userName);
+
+    List<PatientCardDto> getPatientCardByNameOrDepartmentOrPhysician(PatientCardDto patientCardDto);
 }

+ 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();
 }

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

@@ -12,11 +12,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface IVisitService extends IService<Visit>{
     List<Visit> selectList(Visit visit);
 
-    List<PatientCardDto> getPatientCardByNameOrDepartmentOrPhysician(String patientName, String departmentName, String physician);
+    List<PatientCardDto> getPatientCardByNameOrDepartmentOrPhysician(PatientCardDto patientCardDto);
 
-    List<String> getAllDepartment();
-
-    List<Visit> getVisitByTime(String beginTime, String endTime, Long patId);
 
     //根据患者Id获取就诊记录列表
     List<Visit> getVisitByPatId(String patId,String startTime,String endTime);

+ 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) {

+ 5 - 12
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/VisitServiceImpl.java

@@ -4,6 +4,7 @@ package com.ruoyi.web.work.service.impl;
 import java.util.List;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.mapper.SysDeptMapper;
@@ -30,27 +31,19 @@ public class VisitServiceImpl extends ServiceImpl<VisitMapper, Visit> implements
 
 
     @Override
+    @DataScope(deptAlias = "v")
     public List<Visit> selectList(Visit visit) {
         return visitMapper.selectList(visit);
     }
 
     @Override
-    public List<PatientCardDto> getPatientCardByNameOrDepartmentOrPhysician(String patientName, String departmentName, String physician) {
-        return visitMapper.getPatientCardByNameOrDepartmentOrPhysician(patientName, departmentName, physician);
+    @DataScope(deptAlias = "v")
+    public List<PatientCardDto> getPatientCardByNameOrDepartmentOrPhysician(PatientCardDto patientCardDto) {
+        return visitMapper.getPatientCardByNameOrDepartmentOrPhysician(patientCardDto);
     }
 
 
     @Override
-    public List<String> getAllDepartment() {
-        return visitMapper.getAllDepartment();
-    }
-
-    @Override
-    public List<Visit> getVisitByTime(String beginTime, String endTime, Long patId) {
-        return visitMapper.getVisitByTime(beginTime,endTime,patId);
-    }
-
-    @Override
     public List<Visit> getVisitByPatId(String patId,String startTime,String endTime) {
         return visitMapper.selectVisitsByPatId(patId,startTime,endTime);
     }

+ 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>
 

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

@@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>
             tb_patient.event_type='7'
             <if test="id != null "> and id = #{id}</if>
+            <if test="wnPatId != null "> and wn_pat_id = #{wnPatId}</if>
             <if test="patientCode != null  and patientCode != ''"> and patient_code = #{patientCode}</if>
             <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
             <if test="birthDate != null  and birthDate != ''"> and birth_date = #{birthDate}</if>
@@ -26,7 +27,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="brkh != null  and brkh != ''"> and brkh = #{brkh}</if>
             <if test="sfzh != null  and sfzh != ''"> and sfzh = #{sfzh}</if>
             <if test="yexh != null  and yexh != ''"> and yexh = #{yexh}</if>
-            <if test="msgType != null  and msgId != ''"> and msg_Type = #{msgType}</if>
         </where>
     </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>

+ 23 - 32
ruoyi-admin/src/main/resources/mapper/work/VisitMapper.xml

@@ -5,9 +5,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <mapper namespace="com.ruoyi.web.work.mapper.VisitMapper">
 
     <select id="selectList" resultType="com.ruoyi.web.work.domain.Visit">
-        select * from tb_visit
+        select * from tb_visit v
         <where>
-            tb_visit.hospital_status = '3'
+            v.hospital_status = '3'
             <if test="id != null "> and id = #{id}</if>
             <if test="patId != null "> and pat_id = #{patId}</if>
             <if test="cardId != null "> and card_id = #{cardId}</if>
@@ -29,54 +29,45 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="reasonArea != null  and reasonArea != ''"> and reasonArea = #{reasonArea}</if>
             <if test="wardCode != null  and wardCode != ''"> and ward_code = #{wardCode}</if>
             <if test="wardName != null  and wardName != ''"> and ward_name = #{wardName}</if>
+            <if test="deptId != null and deptId != 0">AND (v.dept_id = #{deptId} OR v.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))</if>
         </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
     </select>
 
 
     <select id="getPatientCardByNameOrDepartmentOrPhysician" resultType="com.ruoyi.web.work.domain.dto.PatientCardDto">
         SELECT
-            tb_visit.department,
-            tb_visit.physician,
+            v.department,
+            v.physician,
             tb_patient.`name`,
-            tb_visit.discharge_method,
-            tb_visit.discharge_time,
-            tb_visit.id as visit_id,
-            tb_visit.pat_id,
-            tb_visit.card_id
+            v.discharge_method,
+            v.discharge_time,
+            v.id as visit_id,
+            v.pat_id,
+            v.card_id
         FROM
-            tb_visit
-                JOIN
-            tb_patient ON tb_visit.pat_id = tb_patient.id
+            tb_visit v
+        JOIN tb_patient ON v.pat_id = tb_patient.id
+        JOIN sys_dept d ON d.dept_id = v.dept_id
         <where>
-            tb_visit.hospital_status = '3'
+            v.hospital_status = '3'
             <if test="patientName!='' and patientName!=null">
                AND tb_patient.`name` like concat('%', #{patientName}, '%')
             </if>
-            <if test="departmentName!='' and departmentName!= null">
-                AND tb_visit.department =#{departmentName}
+            <if test="department!='' and department!= null">
+                AND v.department =#{department}
             </if>
             <if test="physician!='' and physician!= null">
-                AND tb_visit.physician like concat('%', #{physician}, '%')
+                AND v.physician like concat('%', #{physician}, '%')
             </if>
+            <if test="deptId !=null and deptId != 0">AND (v.dept_id = #{deptId} OR v.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))</if>
         </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
     </select>
 
 
-    <select id="getAllDepartment" resultType="com.ruoyi.web.work.domain.dto.PatientCardDto">
-        select department from tb_visit GROUP BY department
-    </select>
-
-
-    <select id="getVisitByTime" resultType="com.ruoyi.web.work.domain.Visit">
-        SELECT *
-        FROM tb_visit tb_visit.pat_id=#{patId}
-        <where>
-            <if test="beginTime !=null and beginTime != '' and endTime != null and endTime != ''">
-                and  tb_visit.admission_time BETWEEN #{beginTime} AND #{endTime}
-            </if>
-        </where>
-    </select>
-
     <select id="selectVisitsByCardId" resultType="com.ruoyi.web.work.domain.Visit">
         select * from tb_visit  where card_id=#{cardId}
                                         and tb_visit.hospital_status = '3'
@@ -95,7 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="patId" column="pat_id"/>
         <result property="cardId" column="card_id"/>
         <result property="patClass" column="pat_class"/>
-        <result property="deptCode" column="dept_code"/>
+        <result property="deptId" column="dept_id"/>
         <result property="department" column="department"/>
         <result property="bed" column="bed"/>
         <result property="doctorCode" column="doctor_code"/>