Browse Source

修复bug

lsw 1 month ago
parent
commit
07383aa23d

+ 1 - 1
admin-ui/src/assets/styles/extend.scss

@@ -91,7 +91,7 @@
   cursor: pointer;
 }
 .se {
-  width: 165px !important;
+  width: 125px !important;
 }
 .el-input-group__append {
   cursor: pointer !important;

+ 33 - 38
admin-ui/src/views/work/follow/record/edit.vue

@@ -6,10 +6,7 @@
           <el-form-item label="所属科室" prop="deptName">
             <el-input :value="$store.state.user.deptNameStr" placeholder="请输入标题" disabled />
           </el-form-item>
-          <el-form-item label="提醒标题" prop="templateName" v-if="form.type == 0">
-            <el-input v-model="form.templateName" placeholder="请输入提醒标题, 例如:体检异常复检" clearable />
-          </el-form-item>
-          <el-form-item label="回访模板" prop="templateName" v-if="form.type == 1">
+          <el-form-item label="选择模板" prop="templateName">
             <el-select v-model="form.templateName" placeholder="请选择模板" @change="change">
               <el-option v-for="item in templateList" :key="item.title" :label="item.title" :value="item.title" clearable></el-option>
             </el-select>
@@ -23,9 +20,6 @@
               <el-button type="primary" icon="el-icon-plus" @click="selectPatient()" class="btn">添加</el-button>
             </div>
           </el-form-item>
-          <el-form-item label="提醒内容" prop="op" v-if="form.type == 0">
-            <el-input v-model="form.op" type="textarea" placeholder="例如:根据您于本院做的体检结果异常,请到岑溪人民医院做复诊" rows="5" clearable />
-          </el-form-item>
         </el-col>
         <el-col :span="10">
           <div class="div-mc">
@@ -33,30 +27,32 @@
               <div class="guise-mobile-show" ref="scrollbar">
                 <div class="mttv">{{ form.templateName }}</div>
                 <div class="message-bubble-received" v-if="form.type == 0">{{ form.op }}</div>
-                <div class="items" v-for="(item, index) in op" :key="index">
-                  <div class="vtitle" style="font-weight: normal; font-size: 14px">
-                    <span class="ifnull" v-if="item.ifnull == '必填'">*</span>
-                    <span class="index">{{ index + 1 }},</span>
-                    <span class="tm">{{ item.name }} ({{ item.input }})</span>
-                  </div>
-                  <div class="mts">
-                    <el-button style="width: 100%" v-if="item.input == '图片' || item.input == '视频' || item.input == '录音'">
-                      <i class="el-icon-picture" v-if="item.input == '图片'"></i>
-                      <i class="el-icon-video-camera-solid" v-if="item.input == '视频'"></i>
-                      <i class="el-icon-microphone" v-if="item.input == '录音'"></i>
-                      <span>{{ item.input }}</span>
-                    </el-button>
-                    <input v-if="item.input == '填空'" placeholder="请输入" :disabled="true" />
-                    <textarea v-if="item.input == '多行文本'" :disabled="true" placeholder="请输入"></textarea>
-                    <input type="number" v-if="item.input == '数字'" placeholder="请输入" :disabled="true" />
-                    <div class="ops">
-                      <div v-for="(op, i) in item.selects" :key="op.name">
-                        <div class="op">{{ op.name }}</div>
+                <div v-else>
+                  <div class="items" v-for="(item, index) in op" :key="index">
+                    <div class="vtitle" style="font-weight: normal; font-size: 14px">
+                      <span class="ifnull" v-if="item.ifnull == '必填'">*</span>
+                      <span class="index">{{ index + 1 }},</span>
+                      <span class="tm">{{ item.name }} ({{ item.input }})</span>
+                    </div>
+                    <div class="mts">
+                      <el-button style="width: 100%" v-if="item.input == '图片' || item.input == '视频' || item.input == '录音'">
+                        <i class="el-icon-picture" v-if="item.input == '图片'"></i>
+                        <i class="el-icon-video-camera-solid" v-if="item.input == '视频'"></i>
+                        <i class="el-icon-microphone" v-if="item.input == '录音'"></i>
+                        <span>{{ item.input }}</span>
+                      </el-button>
+                      <input v-if="item.input == '填空'" placeholder="请输入" :disabled="true" />
+                      <textarea v-if="item.input == '多行文本'" :disabled="true" placeholder="请输入"></textarea>
+                      <input type="number" v-if="item.input == '数字'" placeholder="请输入" :disabled="true" />
+                      <div class="ops">
+                        <div v-for="(op, i) in item.selects" :key="op.name">
+                          <div class="op">{{ op.name }}</div>
+                        </div>
                       </div>
                     </div>
                   </div>
+                  <el-button type="primary" class="tjiao" v-if="form.type == 1 && form.templateName != null">提交</el-button>
                 </div>
-                <el-button type="primary" class="tjiao" v-if="form.type == 1 && form.templateName != null">提交</el-button>
               </div>
             </div>
           </div>
@@ -75,10 +71,7 @@ import selectPatient from './selectPatient';
 export default {
   data() {
     return {
-      form: {
-        op: '根据您于本院做的体检结果异常,请到岑溪人民医院做复诊',
-        patientList: []
-      },
+      form: { templateName: '', op: '', patientList: [] },
       templateList: [],
       op: [],
       rules: {
@@ -88,23 +81,25 @@ export default {
       }
     };
   },
-  mounted() {
-    if (this.param.type == 1) {
-      this.getTemplate();
+  watch: {
+    'form.'(val) {
+      this.deptId = val;
     }
+  },
+  mounted() {
+    this.form.type = this.param.type;
+    this.getTemplate();
     if (this.param.id) {
       this.ajax({ url: '/work/record/detail/' + this.param.id }).then((response) => {
         this.form = response.data;
         this.op = JSON.parse(response.data.op);
       });
-    } else {
-      this.form.type = this.param.type;
-      this.$forceUpdate();
     }
+    this.$forceUpdate();
   },
   methods: {
     getTemplate() {
-      this.ajax({ url: '/work/record/template/list' }).then((response) => {
+      this.ajax({ url: '/work/record/template/list', data: { type: this.form.type } }).then((response) => {
         this.templateList = response.data;
       });
     },

+ 42 - 26
admin-ui/src/views/work/follow/template/edit.vue

@@ -4,12 +4,20 @@
       <el-col :span="16">
         <el-form ref="form" :model="form" :rules="rules" label-width="80px">
           <el-row>
-            <el-col :span="18">
+            <el-col :span="13">
               <el-form-item label="模板名称" prop="title">
                 <el-input v-model="form.title" placeholder="请输入标题" clearable />
               </el-form-item>
             </el-col>
             <el-col :span="6">
+              <el-form-item label="模板类型" prop="type">
+                <el-select v-model="form.type" 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="5">
               <el-form-item label="状态" prop="state">
                 <el-select v-model="form.state" placeholder="请选择">
                   <el-option label="启用" :value="0"></el-option>
@@ -18,7 +26,10 @@
               </el-form-item>
             </el-col>
           </el-row>
-          <el-form-item label="问题选项" prop="op">
+          <el-form-item label="提醒内容" prop="op" v-if="form.type == 0">
+            <el-input v-model="form.op" type="textarea" placeholder="例如:根据您于本院做的体检结果异常,请到岑溪人民医院做复诊" rows="5" clearable />
+          </el-form-item>
+          <el-form-item label="问题选项" prop="op" v-else>
             <div class="mbg">
               <el-form-item :label="'' + (index + 1)" v-for="(item, index) in form.op" :key="item.key" :prop="'op.' + index + '.name'" :rules="rules.dynamic" class="moptions">
                 <el-input class="minp" v-model="item.name" placeholder="请输入内容" @input="input()" clearable>
@@ -52,32 +63,35 @@
             <div class="guise-mobile-show" ref="scrollbar">
               <!--手机展示内容放置区-->
               <div class="mttv">{{ form.title }}</div>
-              <el-divider>开始</el-divider>
-              <div class="items" v-for="(item, index) in form.op" :key="index">
-                <div class="vtitle" style="font-weight: normal; font-size: 14px">
-                  <span class="ifnull" v-if="item.ifnull == '必填'">*</span>
-                  <span class="index">{{ index + 1 }},</span>
-                  <span class="tm">{{ item.name }} ({{ item.input }})</span>
-                </div>
-                <div class="mts">
-                  <el-button style="width: 100%" v-if="item.input == '图片' || item.input == '视频' || item.input == '录音'">
-                    <i class="el-icon-picture" v-if="item.input == '图片'"></i>
-                    <i class="el-icon-video-camera-solid" v-if="item.input == '视频'"></i>
-                    <i class="el-icon-microphone" v-if="item.input == '录音'"></i>
-                    <span>{{ item.input }}</span>
-                  </el-button>
-                  <input v-if="item.input == '填空'" placeholder="请输入" :disabled="true" />
-                  <textarea v-if="item.input == '多行文本'" :disabled="true" placeholder="请输入"></textarea>
-                  <input type="number" v-if="item.input == '数字'" placeholder="请输入" :disabled="true" />
-                  <div class="ops">
-                    <div v-for="(op, i) in item.selects" :key="op.name">
-                      <div class="op">{{ op.name }}</div>
+              <div class="message-bubble-received" v-if="form.type == 0">{{ form.op.length > 0 ? form.op : '' }}</div>
+              <div v-else>
+                <el-divider>开始</el-divider>
+                <div class="items" v-for="(item, index) in form.op" :key="index">
+                  <div class="vtitle" style="font-weight: normal; font-size: 14px">
+                    <span class="ifnull" v-if="item.ifnull == '必填'">*</span>
+                    <span class="index">{{ index + 1 }},</span>
+                    <span class="tm">{{ item.name }} ({{ item.input }})</span>
+                  </div>
+                  <div class="mts">
+                    <el-button style="width: 100%" v-if="item.input == '图片' || item.input == '视频' || item.input == '录音'">
+                      <i class="el-icon-picture" v-if="item.input == '图片'"></i>
+                      <i class="el-icon-video-camera-solid" v-if="item.input == '视频'"></i>
+                      <i class="el-icon-microphone" v-if="item.input == '录音'"></i>
+                      <span>{{ item.input }}</span>
+                    </el-button>
+                    <input v-if="item.input == '填空'" placeholder="请输入" :disabled="true" />
+                    <textarea v-if="item.input == '多行文本'" :disabled="true" placeholder="请输入"></textarea>
+                    <input type="number" v-if="item.input == '数字'" placeholder="请输入" :disabled="true" />
+                    <div class="ops">
+                      <div v-for="(op, i) in item.selects" :key="op.name">
+                        <div class="op">{{ op.name }}</div>
+                      </div>
                     </div>
                   </div>
                 </div>
+                <el-divider>结束</el-divider>
+                <el-button type="primary" class="tjiao">提交</el-button>
               </div>
-              <el-divider>结束</el-divider>
-              <el-button type="primary" class="tjiao">提交</el-button>
               <!--手机展示内容放置区-->
             </div>
           </div>
@@ -95,7 +109,7 @@
 export default {
   data() {
     return {
-      form: { state: 0, op: [] },
+      form: { state: 0, op: [], type: 1 },
       nulls: ['必填', '非必填'],
       selects: ['填空', '单选', '多选', '判断', '图片', '视频', '录音', '数字', '多行文本'],
       rules: {
@@ -175,7 +189,9 @@ export default {
       this.$refs['form'].validate((valid) => {
         if (valid) {
           let data = JSON.parse(JSON.stringify(this.form));
-          data.op = JSON.stringify(data.op);
+          if (this.form.type == 1) {
+            data.op = JSON.stringify(data.op);
+          }
           if (this.form.id) {
             this.ajax({ method: 'post', url: '/work/follow/template/edit', data: data }).then((response) => {
               this.$modal.msgSuccess('修改成功');

+ 16 - 3
admin-ui/src/views/work/follow/template/index.vue

@@ -1,12 +1,18 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent>
-      <el-form-item label="科室" prop="deptId">
+      <el-form-item label="科室" prop="deptId" v-if="user.roleName != '医生'">
         <dtree v-model="queryParams.deptId" @handleQuery="handleQuery" :tree="false"></dtree>
       </el-form-item>
       <el-form-item label="标题" prop="title">
         <el-input v-model="queryParams.title" placeholder="请输入标题" @keyup.enter.native="handleQuery" clearable class="inp" />
       </el-form-item>
+      <el-form-item label="模板类型" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择类型" clearable class="se">
+          <el-option value="0" label="复诊提醒"></el-option>
+          <el-option value="1" label="随访记录"></el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="状态" prop="state">
         <el-select v-model="queryParams.state" placeholder="请选择状态" clearable class="se">
           <el-option value="0" label="启用"></el-option>
@@ -28,6 +34,11 @@
     <el-table :data="response.rows" border @selection-change="selects" height="calc(100vh - 270px)">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="模板标题" align="left" prop="title" />
+      <el-table-column label="模板类型" align="center" width="140">
+        <template slot-scope="scope">
+          {{ scope.row.type == 0 ? '复诊提醒' : '随访记录' }}
+        </template>
+      </el-table-column>
       <el-table-column label="状态" align="center" prop="state" width="140">
         <template slot-scope="scope">
           <el-tag type="success" v-if="scope.row.state == 0">启用</el-tag>
@@ -57,11 +68,13 @@ export default {
   name: 'Template',
   data() {
     return {
+      user: this.$store.state.user,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         title: null,
         state: null,
+        type: null,
         deptId: null,
         orderByColumn: 'id', //排序字段
         isAsc: 'desc' //排序方式
@@ -90,11 +103,11 @@ export default {
     },
     op(tag, row) {
       if (tag == 'add') {
-        this.iframe({ obj: edit, param: {}, title: '新增', width: '75%', height: '75%' });
+        this.iframe({ obj: edit, param: {}, title: '新增', width: '80%', height: '80%' });
       }
       if (tag == 'edit') {
         const id = row.id || this.ids[0];
-        this.iframe({ obj: edit, param: { id: id }, title: '编辑', width: '75%', height: '80%' });
+        this.iframe({ obj: edit, param: { id: id }, title: '编辑', width: '80%', height: '80%' });
       }
     },
     del(row) {

+ 3 - 3
admin-ui/src/views/work/visit/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-row :gutter="20" style="margin-top: 0">
-      <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-col :span="4">
         <el-input placeholder="输入部门关键字" :clearable="true" v-model="filterText"></el-input>
         <div style="height: calc(-203px + 100vh); overflow-y: auto; margin-top: 3px">
           <el-tree :highlight-current="true" class="filter-tree" :data="deptOptions" node-key="id" :default-expanded-keys="[100]" :filter-node-method="filterNode" @node-click="handleNodeClick" ref="tree"></el-tree>
@@ -10,10 +10,10 @@
       <el-col :span="20" style="height: 100%">
         <el-form :model="queryParams" ref="queryForm" :inline="true" style="margin-top: 0">
           <el-form-item prop="physician">
-            <el-input v-model="queryParams.physician" placeholder="请输入主治医生" clearable @keyup.enter.native="handleQuery" class="se" />
+            <el-input v-model="queryParams.physician" placeholder="请输入主治医生" clearable @keyup.enter.native="handleQuery"/>
           </el-form-item>
           <el-form-item prop="name">
-            <el-input v-model="queryParams.name" placeholder="请输入患者姓名" clearable @keyup.enter.native="handleQuery" class="se" />
+            <el-input v-model="queryParams.name" placeholder="请输入患者姓名" clearable @keyup.enter.native="handleQuery"/>
           </el-form-item>
           <el-form-item>
             <el-date-picker v-model="dischargeTime" type="daterange" start-placeholder="开始时间" end-placeholder="结束时间" value-format="yyyy-MM-dd" />

+ 7 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/FollowRecordController.java

@@ -87,6 +87,13 @@ public class FollowRecordController extends BaseController {
         return toAjax(followRecordService.removeByIds(Arrays.asList(ids)));
     }
 
+    @PreAuthorize("@ss.hasAnyPermi('work:record:remove,work:up:remove')")
+    @Log(title = "回访记录", businessType = BusinessType.DELETE)
+    @GetMapping("/removeOrRevertByIds")
+    public AjaxResult removeOrRevertByIds(Long[] ids, int op) {
+        return followRecordService.removeOrRevertByIds(ids, op);
+    }
+
     @Log(title = "回访记录", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasAnyPermi('work:record:export,work:up:export')")
     @PostMapping("/export")

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/FollowRecord.java

@@ -65,6 +65,9 @@ public class FollowRecord extends BaseData {
     @Excel(name = "回访时间",dateFormat = "yyyy-MM-dd HH:mm",sort =300,width=30)
     private Date returnTime;
 
+    @ApiModelProperty(value = "删除标识:0=未删除,1=已删除")
+    private Integer delFlag;
+
 
     @TableField(exist = false)
     private List<Patient> patientList;

+ 10 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/FollowTemplate.java

@@ -6,6 +6,10 @@ 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.NotNull;
+
 /**
  * @author lsw
  * @date 2024-07-11
@@ -27,5 +31,11 @@ public class FollowTemplate extends BaseData {
     @ApiModelProperty(value = "状态:0=正常,1=停用")
     private Integer state;
 
+    @NotNull(message = "模板类型不能为空")
+    @Min(value = 0, message = "模板类型只能选择复诊提醒或随访提醒")
+    @Max(value = 1, message = "模板类型只能选择复诊提醒或随访提醒")
+    @ApiModelProperty(value = "模板类型:0=复诊提醒,1=随访提醒")
+    private Integer type;
+
 
 }

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

@@ -73,4 +73,11 @@ public interface IFollowRecordService extends IService<FollowRecord> {
      * @param record
      */
     void sendMessage(FollowRecord record);
+
+    /**
+     * 批量删除/或者还原
+     *
+     * @return
+     */
+    AjaxResult removeOrRevertByIds(Long[] ids, int op);
 }

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

@@ -131,7 +131,7 @@ public class FollowRecordServiceImpl extends ServiceImpl<FollowRecordMapper, Fol
             return;
         }
         body.set("touser", user.getOpenId());
-        body.set("page", "pages/user/index?patientId="+record.getPatientId());
+        body.set("page", "pages/user/index?patientId=" + record.getPatientId());
         //复查提醒
         if (record.getType() == 0) {
             body.set("template_id", "S6JARkInVBjID8QMpgZdSHNyxeMDZQq7lur8YrNK0oY");
@@ -151,4 +151,19 @@ public class FollowRecordServiceImpl extends ServiceImpl<FollowRecordMapper, Fol
         System.out.println("body:" + body);
         System.out.println("小程序订阅消息:" + result);
     }
+
+    @Override
+    public AjaxResult removeOrRevertByIds(Long[] ids, int op) {
+        List<FollowRecord> list = new ArrayList();
+        for (Long id : ids) {
+            FollowRecord record = new FollowRecord();
+            record.setId(id);
+            record.setDelFlag(op);
+            list.add(record);
+        }
+        if (!updateBatchById(list)) {
+            throw new ServiceException("批量删除失败");
+        }
+        return AjaxResult.success();
+    }
 }

+ 4 - 0
ruoyi-admin/src/main/resources/mapper/work/FollowRecordMapper.xml

@@ -51,6 +51,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY r.id DESC
     </select>
 
+    <update id="removeByIds">
+
+    </update>
+
     <select id="selectVisitList" resultType="com.ruoyi.web.work.domain.vo.VisitVoList">
         SELECT
             v.pat_id id,

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

@@ -12,6 +12,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         tb_follow_template k
         LEFT JOIN sys_dept d ON d.dept_id = k.dept_id
         WHERE 1=1
+            <if test="type != null "> AND k.type = #{type}</if>
             <if test="userId != null "> and k.user_id = #{userId}</if>
             <if test="title != null  and title != ''"> and k.title like concat('%', #{title}, '%')</if>
             <if test="state != null "> and k.state = #{state}</if>