Przeglądaj źródła

fix: 枚举重新定义

bug/0816
yinsiyu 2 miesięcy temu
rodzic
commit
846cb702a0
39 zmienionych plików z 103 dodań i 6559 usunięć
  1. +1
    -1
      src/api/hospital/index.js
  2. +3
    -2
      src/components/ArticlePreview/index.vue
  3. +20
    -0
      src/components/MyTag/index.vue
  4. +0
    -130
      src/constant/index.js
  5. +0
    -13
      src/constant/mixin.js
  6. +0
    -50
      src/constant/tool.js
  7. +53
    -4
      src/enums/index.js
  8. +0
    -2
      src/main.js
  9. +2
    -0
      src/plugins/registComps.js
  10. +1
    -2
      src/utils/ruoyi.js
  11. +0
    -48
      src/views/hospital/followupManage/planManage/addPlan/components/ArticlePreviewPopup/index.vue
  12. +0
    -147
      src/views/hospital/followupManage/planManage/addPlan/components/BaseForm/index.vue
  13. +0
    -169
      src/views/hospital/followupManage/planManage/addPlan/components/FollowTaskSetting/index.vue
  14. +0
    -126
      src/views/hospital/followupManage/planManage/addPlan/components/PeriodSelector/index.vue
  15. +0
    -27
      src/views/hospital/followupManage/planManage/addPlan/components/RemindPreviewPopup/index.vue
  16. +0
    -33
      src/views/hospital/followupManage/planManage/addPlan/components/SurveyPreviewPopup/index.vue
  17. +0
    -269
      src/views/hospital/followupManage/planManage/addPlan/components/TodoItemSelector/index.vue
  18. +0
    -225
      src/views/hospital/followupManage/planManage/addPlan/index.vue
  19. +0
    -274
      src/views/hospital/followupManage/planManage/planList/index.vue
  20. +0
    -196
      src/views/hospital/followupManage/remindManage/components/addDialog/index.vue
  21. +0
    -235
      src/views/hospital/followupManage/remindManage/index.vue
  22. +0
    -56
      src/views/hospital/followupManage/surveyManage/designSurvey/index.vue
  23. +0
    -140
      src/views/hospital/followupManage/surveyManage/surveyList/components/CrudPopup/index.vue
  24. +0
    -284
      src/views/hospital/followupManage/surveyManage/surveyList/index.vue
  25. +0
    -714
      src/views/hospital/patientManage/followupPatient/addPatient/components/CreateFollowPlan/index.vue
  26. +0
    -335
      src/views/hospital/patientManage/followupPatient/addPatient/components/DetailDialog/index.vue
  27. +0
    -306
      src/views/hospital/patientManage/followupPatient/addPatient/components/FollowTaskSetting/index.vue
  28. +0
    -49
      src/views/hospital/patientManage/followupPatient/addPatient/components/SubmitDiag/index.vue
  29. +0
    -281
      src/views/hospital/patientManage/followupPatient/addPatient/components/TodoItemSelector/index.vue
  30. +0
    -579
      src/views/hospital/patientManage/followupPatient/addPatient/index.vue
  31. +0
    -521
      src/views/hospital/patientManage/followupPatient/patientList/index.vue
  32. +0
    -73
      src/views/hospital/teamManage/doctorTeam/list/components/MemberForm.vue
  33. +0
    -214
      src/views/hospital/teamManage/doctorTeam/list/components/MemberSelect.vue
  34. +0
    -275
      src/views/hospital/teamManage/doctorTeam/list/components/MemberSelect2.vue
  35. +0
    -420
      src/views/hospital/teamManage/doctorTeam/list/index.vue
  36. +8
    -6
      src/views/statisticalManage/followupStatistical/detail/index.vue
  37. +15
    -21
      src/views/statisticalManage/followupStatistical/listPage/index.vue
  38. +0
    -331
      src/views/statisticalManage/followupTaskStatistical/listPage/index.vue
  39. +0
    -1
      src/views/userManage/roleManage/roleList/index.vue

+ 1
- 1
src/api/hospital/index.js Wyświetl plik

@@ -32,7 +32,7 @@ export function getMedicalLabel(query) {
// 获取所有医生
export function getDoctorAllList(query) {
return request({
url: `/common/patient/doctor/list`,
url: `/common/doctor/list`,
method: "get",
params: query,
});


+ 3
- 2
src/components/ArticlePreview/index.vue Wyświetl plik

@@ -1,7 +1,7 @@
<template>
<div class="article-preview" v-loading="loading">
<template v-if="detail">
<template v-if="detail.type == articleTypeMap.edit">
<template v-if="detail.type == ARTICLE_TYPE.getValueByName('edit')">
<h1 class="article-preview__title">{{ detail.name }}</h1>
<p v-if="detail.author" class="article-preview__author">作者: {{ detail.author }}</p>
<div class="article-preview__content" v-html="detail.content" />
@@ -20,9 +20,9 @@

<script>
import { getArticleTemp, getArticleSnapshot } from "@/api/common";
import { ARTICLE_TYPE } from '@/enums/index'
export default {
name: "ArticlePreview",
enums: ["articleTypeMap"],
props: {
articleId: {
type: [String, Number],
@@ -34,6 +34,7 @@ export default {
},
data() {
return {
ARTICLE_TYPE,
detail: null,
loading: false,
};


+ 20
- 0
src/components/MyTag/index.vue Wyświetl plik

@@ -0,0 +1,20 @@
<template>
<div>
<el-tag v-if="type" :type="type">
<slot></slot>
</el-tag>
<span v-else>--</span>
</div>

</template>
<script>
export default {
name: 'MyTag',
props: ["type"],
data() {
return {

}
}
}
</script>

+ 0
- 130
src/constant/index.js Wyświetl plik

@@ -1,130 +0,0 @@
import { createOptionsEnum } from "./tool";

export const todoItemTypeMap = {
survey: 1,
article: 2,
remark: 3,
remind: 4
};

// 文章创作类型
export const articleTypeMap = {
edit: 0, // 内容编辑
link: 1, //链接
};

export const sysStatusMap = {
enabled: 0,
disabled: 1,
};

export const periodUnitMap = {
day: 0,
month: 1,
year: 2,
};

export const periodUnitEnum = createOptionsEnum([
{ label: "天", value: periodUnitMap.day },
{ label: "月", value: periodUnitMap.month },
{ label: "年", value: periodUnitMap.year },
]);

export const sysStatusEnum = createOptionsEnum([
{ label: "启用", value: sysStatusMap.enabled },
{ label: "停用", value: sysStatusMap.disabled },
]);
// 待办事项类型
export const todoItemTypeEnum = createOptionsEnum([
{ label: "随访问卷", value: todoItemTypeMap.survey },
{ label: "患教文章", value: todoItemTypeMap.article },
{ label: "备注", value: todoItemTypeMap.remark },
{ label: '提醒', value: todoItemTypeMap.remind }
]);

// 待办事项类型
export const todoItemStatusEnum = createOptionsEnum([
{ label: "未完成", value: "0" },
{ label: "已完成", value: "1" },
]);

export const cardTypeEnum = createOptionsEnum([{ label: "身份证", value: "SF" }]);

// 随访单状态
export const followItemStatusEnum = createOptionsEnum([
{ label: "待开始", value: 0, color: "#E6A23C" },
{ label: "进行中", value: 1, color: "#67c23a" },
{ label: "已完成", value: 2, color: "#909399" },
{ label: "已过期", value: 3, color: "#909399" },
{ label: "已终止", value: 4, color: "#F56C6C" },
]);

// 随访问卷|状态
export const surveyTempMap = {
drafts: 0,
save: 1,
online: 2,
offline: 3,
};
export const surveyTempEnum = createOptionsEnum([
{ label: "草稿", value: surveyTempMap.drafts, color: "#909399" },
{ label: "待发布", value: surveyTempMap.save, color: "#E6A23C" },
{ label: "已发布", value: surveyTempMap.online, color: "#67c23a" },
{ label: "已下线", value: surveyTempMap.offline, color: "#E6A23C" },
]);

//
export const reportStatusEnum = createOptionsEnum([
{
label: "待报到",
value: 0,
color: "#E6A23C"
},
{
label: "已入组",
value: 1,
color: "#67c23a"
}
// { label: "待报到", value: null, color: "#909399" },
// { label: "待审核", value: 0, color: "#E6A23C" },
// { label: "待分配", value: 1, color: "#E6A23C" },
// { label: "已入组", value: 2, color: "#67c23a" },
// { label: "已拒绝", value: 3, color: "#F56C6C" },
]);

// 性别
export const sexMap = {
female: "女",
male: "男",
};
export const sexEnum = createOptionsEnum([
{ label: "女", value: sexMap.female },
{ label: "男", value: sexMap.male },
]);

// 就诊类型
export const treatmentEnum = createOptionsEnum([
{ label: "住院", value: "住院" },
{ label: "门诊", value: "门诊" },
]);

// 婚姻状况
export const maritalStatusEnum = createOptionsEnum([
{ label: "未婚", value: 0 },
{ label: "已婚", value: 1 },
{ label: "已婚已育", value: 2 },
]);

// 吸烟史
export const smokingEnum = createOptionsEnum([
{ label: "有", value: 1 },
{ label: "无", value: 0 },
{ label: "有,现已戒烟", value: 2 },
]);

// 喝酒史
export const drinkingEnum = createOptionsEnum([
{ label: "有", value: 1 },
{ label: "无", value: 0 },
{ label: "有,现已戒酒", value: 2 },
]);

+ 0
- 13
src/constant/mixin.js Wyświetl plik

@@ -1,13 +0,0 @@
import * as Constant from "@/constant";
export default {
data() {
if (this.$options === undefined || this.$options.enums === undefined) {
return {};
}
const data = {};
this.$options.enums.forEach((key) => {
data[key] = Constant[key];
});
return data;
},
};

+ 0
- 50
src/constant/tool.js Wyświetl plik

@@ -1,50 +0,0 @@
/**
* 将KeyValue数组转换为对象
* @param {Array} keyValues
* @returns {Object}
*/
function keyValueToMap(keyValues) {
return keyValues.reduce((map, kv) => {
map[kv.value] = kv;
return map;
}, {});
}

/**
* 根据value从KeyValue中查找label
* @param {Array} keyValues
* @param {string|number} value
* @returns {string}
*/
function getLabelFromKeyValue(keyValues, value) {
const kv = keyValues.find((kv) => kv.value == value);
return kv?.label || "-";
}

/**
* 根据label从KeyValue中查找value
* @param {Array} keyValues
* @param {string} label
* @returns {string|number|null}
*/
function getValueFromLabel(keyValues, label) {
const kv = keyValues.find((kv) => kv.label === label);
return kv?.value || null;
}

// 同样改写getOther和getEnabled函数

/**
* OptionsEnum对象
*/
export function createOptionsEnum(keyValues) {
const options = keyValues;

return {
options,
enum: keyValueToMap(keyValues),
getLabel: (value) => getLabelFromKeyValue(options, value),
getValue: (label) => getValueFromLabel(options, label),
// 其他函数
};
}

+ 53
- 4
src/enums/index.js Wyświetl plik

@@ -10,16 +10,16 @@ export default function createEnum(dictList) {
...nameToItemMap,
options: dictList,
getValueByName(enumName) {
return nameToItemMap[enumName].value;
return nameToItemMap && nameToItemMap[enumName].value;
},
getLabelByValue(value) {
return valueToItemMap[value].label || '';
return valueToItemMap[value] && valueToItemMap[value].label || '';
},
getLabelByName(name) {
return nameToItemMap[name].label
return nameToItemMap && nameToItemMap[name].label
},
getTagByValue(value) {
return valueToItemMap[value].tag || ''
return valueToItemMap[value] && valueToItemMap[value].tag || ''
}
};
}
@@ -110,6 +110,55 @@ export const FOLLOWUP_STATUS = createEnum([
tag: 'danger'
}
])
// 待办事项类型
export const TODO_TYPE = createEnum([
{
value: 1,
label: '随访问卷',
name: 'survey'
},
{
value: 2,
label: '患教文章',
name: 'article'
},
{
value: 3,
label: '备注',
name: 'remark'
},
{
value: 4,
label: '提醒',
name: 'remind'
}
])
// 待办事项状态
export const TODO_STATUS = createEnum([
{
value: 0,
label: '未完成',
name: 'unfinished'
},
{
value: 1,
label: '已完成',
name: 'finished'
}
])
// 文章创作类型
export const ARTICLE_TYPE = createEnum([
{
label: '内容编辑',
value: 0,
name: 'edit'
},
{
label: '链接',
value: 1,
name: 'link'
}
])
// 日期单位
export const PERIOD_UNIT = createEnum([
{


+ 0
- 2
src/main.js Wyświetl plik

@@ -25,7 +25,6 @@ import {
selectDictLabels,
handleTree,
} from "@/utils/ruoyi";
import constMixin from "@/constant/mixin";
// 分页组件
import Pagination from "@/components/Pagination";
// 自定义表格工具组件
@@ -68,7 +67,6 @@ Vue.use(directive);
Vue.use(plugins);
Vue.use(registComps);
Vue.use(VueMeta);
Vue.mixin(constMixin);

/**
* If you don't want to use mock-server


+ 2
- 0
src/plugins/registComps.js Wyświetl plik

@@ -1,7 +1,9 @@
import CommonModal from '@/components/CommonModal'
import MyTag from '@/components/MyTag'

export default {
install(app) {
app.component("CommonModal", CommonModal);
app.component("MyTag", MyTag);
}
}

+ 1
- 2
src/utils/ruoyi.js Wyświetl plik

@@ -2,7 +2,6 @@
* 通用js方法封装处理
* Copyright (c) 2019 ruoyi
*/
import { sexMap } from "@/constant";
// 日期格式化
export function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
@@ -253,7 +252,7 @@ export function parseIDCard(idCard) {

// 提取性别(奇数为男,偶数为女)
const genderDigit = parseInt(idCard.charAt(16), 10);
const gender = genderDigit % 2 === 0 ? sexMap.female : sexMap.male;
const gender = genderDigit % 2 === 0 ? '女' : '男';

return {
birthYear: birthYear,


+ 0
- 48
src/views/hospital/followupManage/planManage/addPlan/components/ArticlePreviewPopup/index.vue Wyświetl plik

@@ -1,48 +0,0 @@
<template>
<Popup ref="popup" title="" width="600px" :isCrud="false">
<ArticlePreview style="height: 75vh; overflow-y: auto" :articleId="articleId" />
</Popup>
</template>

<script>
import Popup from "@/components/Popup";
import ArticlePreview from "@/components/ArticlePreview";
export default {
name: "ArticlePreviewPopup",
components: {
Popup,
ArticlePreview,
},
data() {
return {
articleId: "",
};
},
methods: {
open(id) {
this.articleId = id;
this.$refs.popup.open();
},
},
};
</script>

<style lang="scss" scoped>
.article-preview {
padding: 15px;
&__title {
font-size: 19px;
font-weight: 500;
color: #12111e;
line-height: 27px;
}
&__author {
font-size: 13px;
color: #00b191;
line-height: 19px;
margin-top: 10px;
}
&__content {
}
}
</style>

+ 0
- 147
src/views/hospital/followupManage/planManage/addPlan/components/BaseForm/index.vue Wyświetl plik

@@ -1,147 +0,0 @@
<template>
<div class="plan-base-form">
<!--判断预览页 禁用状态设置-->
<el-form :model="form" :rules="rules" ref="form" label-width="110px" style="height: 100%" :disabled="isPreview === 'preview' ? true : false">
<el-form-item label="模板名称" prop="name" required>
<el-input v-model="form.name" maxlength="32"></el-input>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="应用科室" prop="deptId">
<TreeDept
ref="treeDept"
:defaultName="defaultDeptName"
v-model="form.deptId"
@change="onChangeDept"
/>
</el-form-item>

<el-form-item label="随访周期" prop="periodNumber" required>
<PeriodSelector
:value="{ quantity: form.periodNumber, unit: form.periodUnit }"
@change="hanldeSelectorTimeChange"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="应用疾病" prop="labelId">
<el-select v-model="form.labelId" filterable>
<el-option
v-for="item in diseaseList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否自动匹配" prop="isMatch">
<el-radio-group v-model="form.isMatch">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import { getMedicalLabel } from "@/api/hospital";
import TreeDept from "@/components/TreeDept";
import PeriodSelector from "../PeriodSelector";
export default {
enums: ["periodUnitMap"],
components: {
PeriodSelector,
TreeDept,
},
data() {
return {
form: {
name: "",
deptId: "",
labelId: "",
periodNumber: "",
periodUnit: "",
isMatch: 0,
wardId: null
},
rules: {
name: [
{ required: true, message: "请输入模板名称", trigger: "blur" },
{ max: 32, message: "长度不能超过32个字符", trigger: "blur" },
],
deptId: [{ required: true, message: "请选择应用科室", trigger: "change" }],
labelId: [{ required: true, message: "请选择应用疾病", trigger: "change" }],
periodNumber: [{ required: true, message: "请选择随访周期", trigger: "change" }],
isMatch: [
{
required: true,
message: '请选择是否字动匹配',
trigger: ['blur', 'change']
}
]
},
diseaseList: [],
defaultDeptName: "",
};
},
created() {
this.form.periodUnit = this.periodUnitMap.day;
},
watch: {
"form.deptId": {
handler: "loadDisease",
},
},
props: {
isPreview: { // 预览标记
type: String,
},
},
methods: {
init(params) {
for (const key of Object.keys(this.form)) {
this.form[key] = params[key];
this.defaultDeptName = params.deptName;
}
},
submit() {
return new Promise((resolve, reject) => {
this.$refs.form.validate((valid) => {
if (valid) {
resolve(this.form);
} else {
reject(new Error("校验不通过"));
console.log("error submit!!");
return false;
}
});
});
},
resetForm() {
this.resetForm("form");
},
onChangeDept(val, selectItem) {
console.log('val=', val, selectItem)
this.form.labelId = ''
this.form.wardId = selectItem?.wardId || null
},
hanldeSelectorTimeChange({ quantity, unit }) {
this.form.periodNumber = quantity;
this.form.periodUnit = unit;
},
async loadDisease() {
const res = await getMedicalLabel({ deptId: this.form.deptId || "" });
this.diseaseList = res.data || [];
},
},
};
</script>

<style lang="scss" scoped>
.plan-base-form {
}
</style>

+ 0
- 169
src/views/hospital/followupManage/planManage/addPlan/components/FollowTaskSetting/index.vue Wyświetl plik

@@ -1,169 +0,0 @@
<template>
<div class="follow-task">
<el-steps direction="vertical" :active="value.length + 1">
<el-step v-for="(item, index) in value" :key="index">
<template slot="title">
<div style="display: flex; align-items: center">
<span>第{{ index + 1 }}次随访任务</span>
<span class="ml10" style="font-size: 14px; color: #cccccc">基线时间+</span>
<div class="ml10">
<el-input-number
size="mini"
v-model="item.lagNumber"
v-bind="getTaskTimeRange(item, index)"
:disabled="!!isPreview"
></el-input-number>
<span class="ml5" style="font-size: 12px; color: #000">天</span>
<!-- <PeriodSelector
:hasZero="index === 0"
size="mini"
:value="{ quantity: item.lagNumber, unit: item.lagUnit }"
@change="
item.lagNumber = $event.quantity;
item.lagUnit = $event.unit;
"
/> -->
</div>
<span :class="['ml20', isPreview ? 'gary-button': '']" v-if="value.length - 1 === index">
<i
@click="handleDelTask(index)"
class="el-icon-remove mr5"
style="cursor: pointer"
></i>
<i
v-if="value.length < 10 && (!item.lagNumber || item.lagNumber < maxDays)"
@click="handleAddTask"
class="el-icon-circle-plus"
style="cursor: pointer"
></i>
</span>
</div>
</template>
<template slot="description">
<el-table :data="item.items" border emptyText="暂无待办事项" class="mt10">
<el-table-column align="center" property="targetType" label="待办类型">
<template slot-scope="scope">
{{ todoItemTypeEnum.getLabel(scope.row.targetType) }}
</template>
</el-table-column>
<el-table-column align="center" property="targetName" label="名称" />
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handlePrewviewItem(scope.row)">
查看
</el-button>
<el-button size="mini" type="text" @click="hanldeDelTodoItem(scope.$index, index)" v-if="!isPreview">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-button
v-if="item.items.length < 10"
@click="handleAddTodo(index)"
class="mb20"
type="primary"
style="width: 100%"
:disabled="!!isPreview"
>
添加待办事项
</el-button>
</template>
</el-step>
</el-steps>
<ArticlePreviewPopup ref="previewArticle" />
<SurveyPreviewPopup ref="previewSurvey" />
<RemindPreviewPopup ref="previewRemind" />
</div>
</template>
<script>
import PeriodSelector from "../PeriodSelector";
import TodoItemSelector from "../TodoItemSelector";
import ArticlePreviewPopup from "../ArticlePreviewPopup";
import SurveyPreviewPopup from "../SurveyPreviewPopup";
import RemindPreviewPopup from "../RemindPreviewPopup";

export default {
enums: ["todoItemTypeEnum", "periodUnitMap", "todoItemTypeMap"],
components: {
PeriodSelector,
TodoItemSelector,
ArticlePreviewPopup,
SurveyPreviewPopup,
RemindPreviewPopup
},
props: {
value: {
type: Array,
default: () => [],
},
maxDays: {
type: Number,
},
isPreview: { // 预览标记
type: String,
},
},
created() {
if (this.value.length === 0) {
// 自动插入一条
this.handleAddTask();
}
},
methods: {
getTaskTimeRange(item, index) {
const range = {
min: index === 0 ? 0 : this.value[index - 1].lagNumber + 1,
max: this.maxDays - 1,
};
console.log(range);
return range;
},
handleAddTask() {
if (this.isPreview === 'preview') return false;
this.$emit("input", [
...this.value,
{
lagNumber: undefined,
lagUnit: this.periodUnitMap.day,
items: [],
},
]);
},
handleDelTask(index) {
if (this.isPreview === 'preview') return false;
if (index === 0) {
return this.$message.warning("至少包含一个任务");
}
const taskList = [...this.value];
taskList.splice(index);
this.$emit("input", taskList);
},
// 修改添加待办事项
handleAddTodo(index) {
this.$emit("selectTodo", index);
},
// 查看预览待办事项
handlePrewviewItem(item) {
if (item.targetType === this.todoItemTypeMap.article) {
this.$refs.previewArticle.open(item.targetId);
} else if (item.targetType === this.todoItemTypeMap.survey) {
this.$refs.previewSurvey.open(item.surveyId);
} else if (item.targetType === this.todoItemTypeMap.remind) {
this.$refs.previewRemind.open(item.targetId)
}
},
// 删除待办事项
hanldeDelTodoItem(todoIndex, taskIndex) {
const taskList = [...this.value];
taskList[taskIndex].items.splice(todoIndex, 1);
this.$emit("change", taskList);
},
},
};
</script>

<style lang="scss" scoped>
.follow-task {
}
</style>

+ 0
- 126
src/views/hospital/followupManage/planManage/addPlan/components/PeriodSelector/index.vue Wyświetl plik

@@ -1,126 +0,0 @@
<template>
<div class="time-selector">
<el-select
class="quantity mr10"
:size="size"
:value="value.quantity"
@change="handleChange('quantity', $event)"
placeholder="请选择"
no-data-text="选择单位后载入数据"
:clearable="isClearable"
>
<el-option v-if="hasZero && value.unit === periodUnitMap.day" key="0" label="0" :value="0" />
<el-option
v-for="quantity in quantities"
:key="quantity"
:label="quantity.toString()"
:value="quantity"
/>
</el-select>

<el-select
class="unit"
:size="size"
:value="value.unit"
@change="handleChange('unit', $event)"
placeholder="请选择"
:clearable="isClearable"
style="width: 120px"
>
<el-option
:label="item.label"
:value="item.value"
v-for="item in periodUnitEnum.options"
:key="item.value"
/>
</el-select>
</div>
</template>

<script>
import { periodUnitMap } from "@/constant";
export default {
enums: ["periodUnitMap", "periodUnitEnum"],
data() {
return {
quantities: [],
};
},
props: {
size: String,
value: {
type: Object,
defualt: {},
},
hasZero: {
type: Boolean,
default: false,
},
clearable: {
type: Boolean,
default: false,
},
defaultUnit: {
type: [Number, String],
default: periodUnitMap.day,
},
},
created() {
if (!this.value.unit && this.defaultUnit) {
this.handleChange("unit", this.defaultUnit);
}
this.init();
},
computed: {
isClearable() {
return this.clearable || this.clearable === "";
},
},
watch: {
"value.unit"() {
this.init();
},
},
methods: {
init() {
const { unit, quantity } = this.value;
if (unit === this.periodUnitMap.day) {
this.quantities = Array.from({ length: 30 }, (_, i) => i + 1);
if (quantity > 30) {
this.handleChange("quantity", 30);
}
} else if (unit === this.periodUnitMap.month) {
this.quantities = Array.from({ length: 12 }, (_, i) => i + 1);
if (quantity > 12) {
this.handleChange("quantity", 12);
}
} else if (unit === this.periodUnitMap.year) {
this.quantities = Array.from({ length: 10 }, (_, i) => i + 1);
if (quantity > 10) {
this.handleChange("quantity", 10);
}
} else {
this.quantities = [];
this.handleChange("quantity", "");
}
},
handleChange(field, value) {
this.$emit("change", {
unit: this.value.unit,
quantity: this.value.quantity,
[field]: value,
});
},
},
};
</script>

<style lang="scss" scoped>
.time-selector {
display: flex;
align-items: center;
.unit {
width: 80px;
}
}
</style>

+ 0
- 27
src/views/hospital/followupManage/planManage/addPlan/components/RemindPreviewPopup/index.vue Wyświetl plik

@@ -1,27 +0,0 @@
<template>
<Popup ref="popup" title="提醒详情" width="400px" :isCrud="false">
<RemindPreview v-if="id" :id="id"/>
</Popup>
</template>
<script>
import Popup from "@/components/Popup";
import RemindPreview from '@/components/RemindPreview'
export default {
name: 'RemindPreviewPopup',
components: {
Popup,
RemindPreview
},
data() {
return {
id: null,
}
},
methods: {
open(id) {
this.id = id;
this.$refs.popup.open()
}
},
}
</script>

+ 0
- 33
src/views/hospital/followupManage/planManage/addPlan/components/SurveyPreviewPopup/index.vue Wyświetl plik

@@ -1,33 +0,0 @@
<template>
<Popup ref="popup" title="" width="1000px" :isCrud="false">
<DWViewer style="height: 75vh; overflow-y: auto" :url="url" />
</Popup>
</template>

<script>
import Popup from "@/components/Popup";
import DWViewer from "@/components/DWViewer";
export default {
name: "SurveyPreviewPopup",
components: {
Popup,
DWViewer,
},
data() {
return {
surveyId: "",
};
},
computed: {
url() {
return `${process.env.VUE_APP_SURVEY_PREFIX}/survey/diaowen-m.html?surveyId=${this.surveyId}&sid=&tag=p-auth-0`;
},
},
methods: {
open(id) {
this.surveyId = id;
this.$refs.popup.open();
},
},
};
</script>

+ 0
- 269
src/views/hospital/followupManage/planManage/addPlan/components/TodoItemSelector/index.vue Wyświetl plik

@@ -1,269 +0,0 @@
<template>
<div class="todo-selector" v-show="visible">
<div class="sf-title mb5">添加待办事项</div>
<el-card>
<el-form ref="form" inline>
<el-form-item label="类型" prop="targetType" placeholder="请选择" style="margin: 0">
<el-select v-model="targetType">
<el-option
v-for="item in targetTypeOptions"
:label="item.label"
:value="item.value"
:key="item.value"
/>
</el-select>
</el-form-item>
<el-form-item
label="状态"
prop="selectType"
placeholder="请选择"
style="margin: 0; margin-left: 20px"
>
<el-select v-model="queryParams.selectType">
<el-option label="全部" value="" />
<el-option label="已选" value="1" />
<el-option label="未选" value="2" />
</el-select>
</el-form-item>
<el-form-item label="" prop="keyword" style="margin: 0; margin-left: 20px">
<el-input
v-model="queryParams.keyword"
placeholder="请输入待办事项名称进行搜索"
></el-input>
</el-form-item>
</el-form>
</el-card>
<div class="table">
<el-table :data="paginatedData" border class="mt20">
<el-table-column align="center" width="300" property="targetName" label="名称" />
<el-table-column align="center" property="targetType" label="类型">
<template slot-scope="scope">
{{ todoItemTypeEnum.getLabel(scope.row.targetType) }}
</template>
</el-table-column>
<el-table-column align="center" property="status" label="状态">
<template slot-scope="scope">
<div :class="[getCheckedStatus(scope.row) ? 'green-button' : 'gary-button']">{{ getCheckedStatus(scope.row) ? "已选" : "未选" }}</div>
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-checkbox
:value="getCheckedStatus(scope.row)"
@change="handleCheckedChange(scope.row, $event)"
></el-checkbox>
<el-button @click="handlePreview(scope.row)" class="ml10" size="mini" type="text">
详情
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="searchData.length > 0"
:total="searchData.length"
:page.sync="pageNum"
:limit.sync="pageSize"
/>
<el-card class="mt20">
<div class="footer">
<el-button @click="handleCancel">取 消</el-button>
<el-button type="primary" @click="handleConfirm">确定</el-button>
</div>
</el-card>
</div>
<ArticlePreviewPopup ref="previewArticle" />
<SurveyPreviewPopup ref="previewSurvey" />
<RemindPreviewPopup ref="previewRemind" />
</div>
</template>

<script>
import { getPlanItemList } from "@/api/hospital";
import { todoItemTypeMap } from "@/constant";
import ArticlePreviewPopup from "../ArticlePreviewPopup";
import SurveyPreviewPopup from "../SurveyPreviewPopup";
import RemindPreviewPopup from "../RemindPreviewPopup";


export default {
enums: ["todoItemTypeEnum", "todoItemTypeMap"],
components: {
ArticlePreviewPopup,
SurveyPreviewPopup,
RemindPreviewPopup
},
props: {
defaultValue: {
type: Array,
default: () => [],
},
form: {
type: Object,
default: () => ({}),
},
},
data() {
return {
pageNum: 1,
pageSize: 10,
targetType: todoItemTypeMap.survey,
queryParams: {
selectType: "",
keyword: "",
},
listMap: {
[todoItemTypeMap.article]: 'allArticleList',
[todoItemTypeMap.survey]: 'allSurveyList',
[todoItemTypeMap.remind]: 'allRemindList'
},
allArticleList: null, // 文章
allSurveyList: null, // 问卷数据
allRemindList: null,
selectList: [],
visible: false,
};
},
computed: {
// 分页后数据
paginatedData() {
const startIndex = (this.pageNum - 1) * this.pageSize;
const endIndex = startIndex + this.pageSize;
return this.searchData.slice(startIndex, endIndex);
},
listField() {
return this.listMap[this.targetType]
},
// 过滤查询的数据
searchData() {
const allData = this[this.listField] || []
return allData.filter((item) => {
// 未选/已选
if (this.queryParams.selectType) {
const checked = this.getCheckedStatus(item);
if (this.queryParams.selectType === "1" && !checked) {
return false;
}
if (this.queryParams.selectType === "2" && checked) {
return false;
}
}
// 按名称搜索
if (this.queryParams.keyword) {
return item.targetName.includes(this.queryParams.keyword);
}
return true;
});
},
targetTypeOptions() {
return this.todoItemTypeEnum.options.filter(item => item.value !== todoItemTypeMap.remark)
}
},
watch: {
targetType: "getList",
"form.labelId"() {
// 修改疾病,清空数据
this.allArticleList = null;
this.allSurveyList = null;
},
},
methods: {
open(defaultValue = []) {
this.getList();
this.selectList = [...defaultValue];
this.defaultCheckIds = this.getCheckedIds(this.selectList);

this.visible = true;
this.promise = {};
return new Promise((resolve, reject) => {
this.promise.resolve = resolve;
this.promise.reject = reject;
});
},
getList() {
if (this[this.listField]) return;
getPlanItemList({ targetType: this.targetType, labelId: this.form.labelId }).then((res) => {
this[this.listField] = res.data || [];
});
},
getCheckedIds(list) {
return list
.map((item) => item.targetId)
.sort()
.join(",");
},
reset() {
this.visible = false;
this.queryParams.selectType = "";
this.queryParams.keyword = "";
this.targetType = todoItemTypeMap.survey;
},
handleCancel() {
const newCheckedIds = this.getCheckedIds(this.selectList);
const close = () => {
this.reset();
this.promise.reject();
};
if (this.defaultCheckIds !== newCheckedIds) {
this.$modal.confirm("页面内信息尚未保存,是否继续确定退出?").then(close);
return false;
}
close();
},
handleConfirm() {
if (this.selectList.length === 0) {
this.$message.error("至少选择一个待办事项");
return;
}
this.reset();
this.promise.resolve(this.selectList);
},
getCheckedStatus(row) {
return this.selectList.some(
(item) => item.targetId === row.targetId && item.targetType === row.targetType
);
},
handleCheckedChange(row, checked) {
console.log('row=', checked)
const selectList = this.selectList.filter((item) => item.targetType === row.targetType);
if (checked) {
if (selectList.length >= 5) {
this.$message.error("同一类型待办事项最多5个");
return;
}
this.selectList.push({ ...row });
} else {
const index = this.selectList.findIndex(
(item) => item.targetId === row.targetId && item.targetType === row.targetType
);
if (index > -1) {
this.selectList.splice(index, 1);
}
}
},
// 预览文章/问卷
handlePreview(item) {
if (item.targetType === this.todoItemTypeMap.article) {
this.$refs.previewArticle.open(item.targetId);
} else if(item.targetType === this.todoItemTypeMap.survey) {
this.$refs.previewSurvey.open(item.surveyId);
} else if (item.targetType === this.todoItemTypeMap.remind) {
this.$refs.previewRemind.open(item.targetId)
}
},
},
};
</script>
<style lang="scss" scoped>
.todo-selector {
max-width: 1000px;
.tree-menus {
border: 1px solid #dfe4ed;
height: 200px;
border-radius: 4px;
overflow-y: auto;
}
.footer {
text-align: center;
}
}
</style>

+ 0
- 225
src/views/hospital/followupManage/planManage/addPlan/index.vue Wyświetl plik

@@ -1,225 +0,0 @@
<template>
<div class="app-container">
<el-card v-show="!visiable" class="card" :body-style="{ height: '100%', maxWidth: '1000px' }">
<div class="main">
<div class="form" v-show="step === 1">
<BaseForm ref="form" :isPreview="isPreview"/>
</div>
<template v-if="step === 2">
<el-form>
<el-form-item label="随访任务" prop="tasks" required>
<span style="color: #f56c6c; font-size: 12px">
单个任务最多添加10个待办事项(5篇患教文章+5个随访问卷)
</span>
</el-form-item>
</el-form>
<el-card class="tasks">
<FollowTaskSetting :maxDays="maxDays" :isPreview="isPreview" v-model="tasks" @selectTodo="handleSelectTodo" />
</el-card>
</template>
</div>
<div class="footer">
<el-button @click="handleBack">取消</el-button>
<el-button key="next" type="primary" v-if="step === 1" @click="handleNextStep">
下一步
</el-button>
<template v-else>
<el-button key="prev" type="warning" @click="handlePrevStep" plain>上一步</el-button>
<template v-if="!isPreview"><!--非预览展示操作按钮-->
<el-button type="primary" @click="handleSaveDrafts" plain>保存草稿</el-button>
<el-button type="primary" @click="handleSubmit">提交</el-button>
</template>
</template>
</div>
</el-card>
<el-collapse-transition>
<TodoItemSelector ref="todoSelector" :form="formData" />
</el-collapse-transition>
</div>
</template>
<script>
import { addFollowUpPlan, updateFollowUpPlan, getPlanDetail } from "@/api/hospital";
import BaseForm from "./components/BaseForm";
import TodoItemSelector from "./components/TodoItemSelector";
import FollowTaskSetting from "./components/FollowTaskSetting";
export default {
name: "AddPlan",
enums: ["periodUnitMap", "surveyTempMap"],
components: {
BaseForm,
FollowTaskSetting,
TodoItemSelector,
},
data() {
return {
step: 1,
formData: {},
tasks: [],
maxDays: 0, // 随访周期
editId: this.$route.params.id,
isPreview: this.$route.params.isPreview, // 预览标记 'preview'
visiable: false,
};
},
created() {
if (this.editId) {
this.getDetail();
}
},
computed: {
saveParams() {
return {
...this.formData,
followTaskTemplates: this.tasks.map((task, index) => {
return {
...task,
batchNo: index + 1,
items: task.items.map((item, i) => {
return {
...item,
serialNo: i + 1,
};
}),
};
}),
};
},
},
methods: {
getDetail() {
getPlanDetail(this.editId).then((res) => {
const { taskList, ...params } = res.data;
this.tasks = taskList;
this.$refs.form.init(params);
});
},
// 取消
handleBack() {
this.$tab.closePage(undefined, { name: "PlanManage" });
},
// 上一步
handlePrevStep() {
this.step = 1;
},
// 下一步
handleNextStep() {
this.$refs.form.submit().then((data) => {
this.formData = { ...data };
this.maxDays = this.getDays(this.formData.periodNumber, this.formData.periodUnit);
this.step = 2;
});
},
// 选择待办事项
handleSelectTodo(index) {
const curTask = this.tasks[index];
this.visiable = true;
this.$refs.todoSelector
.open(curTask.items)
.then((items) => {
this.tasks.splice(index, 1, {
...curTask,
items,
});
this.visiable = false;
})
.catch(() => {
this.visiable = false;
});
},
validate() {
if (this.tasks.length === 0) {
this.$message.error("随访任务不能为空");
return false;
}
let preTime = 0;
for (const [index, task] of this.tasks.entries()) {
if (typeof task.lagNumber !== "number") {
this.$message.error(`第${index + 1}次随访任务[基线时间+]未选择`);
return false;
}
if (task.items.length === 0) {
this.$message.error(`第${index + 1}次随访任务未添加待办事项`);
return false;
}
if (task.lagNumber < preTime) {
this.$message.error(
`第${index + 1}次随访任务[基线时间+]不能小于${index === 0 ? "0" : "前一次"}`
);
return false;
}
preTime = task.lagNumber;
if (task.lagNumber >= this.maxDays) {
this.$message.error(`随访任务[基线时间+]超过了随访总周期`);
return false;
}
}

return true;
},
getDays(periodNumber, periodUnit) {
switch (periodUnit) {
case this.periodUnitMap.day:
return periodNumber;
break;
case this.periodUnitMap.month:
return periodNumber * 30;
break;
case this.periodUnitMap.year:
return periodNumber * 30 * 12;
break;
}
},
// 保存草稿
handleSaveDrafts() {
this.save(this.surveyTempMap.drafts);
},
// 提交
handleSubmit() {
this.save(this.surveyTempMap.save);
},
async save(status) {
if (!this.validate()) return;
const api = this.editId ? updateFollowUpPlan : addFollowUpPlan;
const res = await api({
...this.saveParams,
id: this.editId,
status,
});
// 保存成功页面不跳转,再次保存即编辑
if (!this.editId) {
this.editId = res.data.id;
}
if (status === this.surveyTempMap.save) {
this.$message.success("提交成功");
this.handleBack();
} else {
this.$message.success("保存成功");
}
},
},
};
</script>

<style lang="scss" scoped>
.app-container {
height: 100%;
.card {
height: 100%;
}
.main {
height: calc(100% - 100px);
.tasks {
height: calc(100% - 50px);
overflow-y: auto;
::v-deep .el-step__description {
padding-right: 0 !important;
}
}
}

.footer {
margin-top: 50px;
text-align: center;
}
}
</style>

+ 0
- 274
src/views/hospital/followupManage/planManage/planList/index.vue Wyświetl plik

@@ -1,274 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="模板状态" prop="status">
<el-select v-model="queryParams.status" clearable style="width: 240px">
<el-option v-for="dict in surveyTempEnum.options" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>

<el-form-item label="随访周期" prop="status">
<PeriodSelector clearable style="width: 240px" defaultUnit=""
:value="{ quantity: queryParams.periodNumber, unit: queryParams.periodUnit }" @change="
queryParams.periodNumber = $event.quantity;
queryParams.periodUnit = $event.unit;
" />
</el-form-item>

<el-form-item label="应用科室" prop="deptIds">
<TreeDept v-model="queryParams.deptIds" clearable style="width: 240px" :props="{ emitPath: true }"
@change="queryParams.labelId = ''" />
</el-form-item>

<el-form-item label="应用疾病" prop="labelId">
<el-select v-model="queryParams.labelId" filterable clearable style="width: 240px">
<el-option v-for="item in diseaseList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>

<el-form-item label="模板名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入模板名称" clearable style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="是否自动匹配" prop="isMatch">
<el-select v-model="queryParams.isMatch" placeholder="请选择" clearable style="width: 240px">
<el-option label="是" :value="1"></el-option>
<el-option label="否" :value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">
搜索
</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>

<div style="display: flex;justify-content: flex-end;padding-bottom: 8px;">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">
新增模板
</el-button>
<el-button :disabled="selectDatas.length <= 0" type="success" plain icon="el-icon-upload2" size="mini"
@click="handlePublish" v-loading="isPublishLoading">发布模板</el-button>
</div>

<el-table v-loading="loading" :data="pageList" border @selection-change="selectionChange">
<el-table-column type="selection" width="55" align="center" :selectable="isSelectable"></el-table-column>
<el-table-column align="center" label="序号" type="index"
:index="(index) => (queryParams.pageNum - 1) * queryParams.pageSize + index + 1" width="120" />
<el-table-column align="center" label="随访模板名称" prop="name" :show-overflow-tooltip="true"
:class-name="'column-style-cursor'">
<template slot-scope="scope">
<div @click="setPreviewTemplate(scope.row)">{{ scope.row.name }}</div>
</template>
</el-table-column>
<el-table-column align="center" label="随访模板ID" prop="id" :show-overflow-tooltip="true" />
<el-table-column align="center" label="应用疾病" prop="labelName" :show-overflow-tooltip="true" />
<el-table-column align="center" label="应用科室" prop="deptName" :show-overflow-tooltip="true" />
<el-table-column align="center" label="随访周期" prop="deptName" :show-overflow-tooltip="true">
<template slot-scope="scope">
{{ scope.row.periodNumber + periodUnitEnum.getLabel(scope.row.periodUnit) }}
</template>
</el-table-column>
<el-table-column align="center" label="随访模板状态" prop="status" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span :style="{ color: surveyTempEnum.enum[scope.row.status].color }">
{{ surveyTempEnum.getLabel(scope.row.status) }}
</span>
</template>
</el-table-column>
<el-table-column align="center" label="是否自动匹配" prop="isMatch">
<template slot-scope="scope">
{{ scope.row.isMatch === 1 ? '是' : '否' }}
</template>
</el-table-column>
<el-table-column align="center" label="随访单数" prop="followupDocumentSize" :show-overflow-tooltip="true" />
<el-table-column align="center" label="操作" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleSwitchStatus(scope.row)"
:disabled="scope.row.status === surveyTempMap.drafts"
:class="[scope.row.status === surveyTempMap.online ? 'yellow-button' : 'green-button']">
{{ scope.row.status === surveyTempMap.online ? "下线" : "发布" }}
</el-button>
<el-button size="mini" type="text" @click="handleEdit(scope.row)"
:disabled="scope.row.status === surveyTempMap.online">
编辑
</el-button>

<el-button size="mini" type="text" @click="handleDelete(scope.row)"
:disabled="scope.row.status === surveyTempMap.online" class="red-button">
删除
</el-button>
</template>
</el-table-column>
</el-table>

<pagination v-show="total > 0" :total="total" :sizes="[10]" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
</div>
</template>

<script>
import ApiButton from "@/components/ApiButton/index.vue";
import TreeDept from "@/components/TreeDept";
import {
followUpPlanPageList,
delFollowUpPlan,
getMedicalLabel,
switchPlanStatus,
publishFollowUpPlanApi
} from "@/api/hospital";
import PeriodSelector from "../addPlan/components/PeriodSelector";
import { surveyTempMap } from "@/constant";

export default {
name: "PlanManage",
enums: ["surveyTempMap", "surveyTempEnum", "periodUnitEnum"],
components: {
ApiButton,
PeriodSelector,
TreeDept,
},
data() {
return {
// 遮罩层
loading: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 日期范围
dateRange: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
status: "",
labelId: "",
deptIds: [],
periodNumber: "",
periodUnit: "",
name: "",
isMatch: null
},
pageList: [],
diseaseList: [],
selectDatas: [],
isPublishLoading: false
};
},
created() {
this.loadData();
},
activated() {
this.loadData();
},
watch: {
"queryParams.deptIds"(val) {
const deptId = val[1] || val[0];
if (deptId) {
this.loadDisease(deptId);
} else {
this.diseaseList = [];
}
},
},
methods: {
isSelectable(row, index) {
return ![surveyTempMap.online, surveyTempMap.drafts].includes(row.status);
},
selectionChange(value) {
this.selectDatas = value || [];
},
async handlePublish() {
this.isPublishLoading = true;
const ids = this.selectDatas.map(item => item.id);
try {
await publishFollowUpPlanApi(ids)
this.$message.success("发布成功!")
this.getList();
} catch (err) {
console.log("err=", err);
} finally {
this.isPublishLoading = false;
}
},
loadData() {
this.getList();
},
getList() {
this.loading = true;
followUpPlanPageList(this.addDateRange(this.queryParams, this.dateRange))
.then((res) => {
const { data: { list, page } } = res
this.pageList = list || [];
this.total = Number(page.total) || 0;
})
.finally(() => {
this.loading = false;
});
},

async loadDisease(deptId) {
const res = await getMedicalLabel({ deptId });
this.diseaseList = res.data;
},

// 表单重置
reset() {
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增患者 */
handleAdd() {
this.$router.push({ name: "AddPlan" });
},
/*预览模版 预览标记 'preview'*/
setPreviewTemplate(item) {
this.$router.push({ name: "EditPlan", params: { id: item.id, isPreview: 'preview' } });
},
/** 编辑 */
handleEdit(item) {
this.$router.push({ name: "EditPlan", params: { id: item.id } });
},
// 发布下线
handleSwitchStatus(item) {
const isOnline = item.status === this.surveyTempMap.online;
const fetch = async () => {
await switchPlanStatus(item.id);
this.$message.success("操作成功");
this.getList();
};
if (isOnline) {
this.$modal
.confirm(`是否确认下线?`)
.then(fetch)
.catch(() => { });
} else {
fetch();
}
},
handleDelete(item) {
this.$modal
.confirm("是否确认删除?")
.then(async () => {
await delFollowUpPlan(item.id);
this.$message.success("操作成功");
this.getList();
})
.catch(() => { });
},
},
};
</script>
<style lang="scss" scoped></style>

+ 0
- 196
src/views/hospital/followupManage/remindManage/components/addDialog/index.vue Wyświetl plik

@@ -1,196 +0,0 @@
<template>
<el-dialog :title="showTitle" :visible="visible" width="600px" center :before-close="onClose">
<el-form :model="formData" :disabled="isLoading" ref="formRef" :rules="formRules" label-width="120px">
<el-form-item label="应用科室:" prop="deptId">
<TreeDept v-model="formData.deptId" clearable style="width: 100%" :options="deptList" :autoFetch="false"
:props="{ emitPath: false }" placeholder="请选择应用科室" @change="onChangeDept" />
</el-form-item>
<el-form-item label="应用疾病:" prop="labelId">
<el-select v-model="formData.labelId" placeholder="请选择应用疾病" filterable clearable>
<el-option v-for="item in diseaseList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="提醒类型:" prop="categoryId">
<el-select v-model="formData.categoryId" placeholder="请选择提醒类型" filterable clearable>
<el-option v-for="item in categoryList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="提醒名称" prop="name">
<el-input v-model.trim="formData.name" type="textarea" placeholder="请输入提醒名称" maxlength="30" resize="none" show-word-limit />
</el-form-item>
<el-form-item label="提醒内容:" prop="remark">
<el-input v-model.trim="formData.remark" type="textarea" placeholder="请输入提醒内容" maxlength="30" resize="none" show-word-limit/>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button :disabled="isLoading" @click="onClose">取 消</el-button>
<el-button type="primary" @click="onSubmit">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
import { updateRemindTemplateApi } from '@/api/hospital/remindManage/remindList'
import { getClientId } from '@/utils/auth'
import TreeDept from "@/components/TreeDept";
import { getTreeHospDeptByPatient } from "@/api/admin";
import { getMedicalLabel } from "@/api/hospital";
import { getReminderListApi } from '@/api/common/dictManage/reminder'
export default {
name: 'AddDialog',
components: {
TreeDept
},
computed: {
showTitle() {
return this.formData.id ? '编辑提醒' : '新增提醒'
}
},
data() {
return {
visible: false,
deptList: [],
diseaseList: [],
categoryList: [],
formData: {
id: undefined,
deptId: '',
labelId: null,
categoryId: null,
remark: null,
name: ''
},
formRules: {
deptId: [
{
required: true,
message: '请选择应用科室',
trigger: ['blur', 'change']
}
],
labelId: [
{
required: true,
message: '请选择应用疾病 ',
trigger: ['blur', 'change']
}
],
categoryId: [
{
required: true,
message: '请选择提醒类型 ',
trigger: ['blur', 'change']
}
],
name: [
{
required: true,
message: '请输入提醒名称',
trigger: ['blur', 'change']
}
],
remark: [
{
required: true,
message: '请输入提醒内容',
trigger: ['blur', 'change']
}
]
},
isLoading: false
}
},
methods: {
/*获取科室数据*/
async getDeptList() {
const res = await getTreeHospDeptByPatient();
this.deptList = res.data || [];
},
// 获取病种数据
async loadMedicalLabel() {
const { deptId } = this.formData
const res = await getMedicalLabel({
deptId,
});
this.diseaseList = res.data || [];
},
// 获取提醒分类列表
async getRemindTypeList() {
const { data: { list } } = await getReminderListApi({
pageNum: 1,
pageSize: 1000,
clientId: getClientId()
})
this.categoryList = list || []
},
loadOptions() {
this.getDeptList()
this.loadMedicalLabel()
this.getRemindTypeList()
},
onChangeDept() {
this.formData.labelId = null;
this.loadMedicalLabel();
},
openDialog(initData) {
if (initData) {
const { id, deptId, labelId, categoryId,remark, name } = initData
console.log('initData=', initData)
this.formData = {
id,
deptId,
labelId,
categoryId,
remark,
name
}
}
this.loadOptions()
this.visible = true
},
onClose() {
this.formData = {
id: undefined,
deptId: '',
labelId: null,
categoryId: null,
remark: null,
name: ''
}
this.$nextTick(() => {
this.$refs.formRef.clearValidate()
})

console.log('formData=', this.formData)
this.visible = false
},
onSubmit() {
this.$refs.formRef.validate(async isValid => {
if (!isValid) {
return
}
const { deptId } = this.formData
try {
this.isLoading = true
await updateRemindTemplateApi({
...this.formData,
deptId,
clientId: getClientId()
})
this.$message.success('操作成功')
this.onClose()
this.$emit('onOk')
} catch (err) {
console.log(err)
} finally {
this.isLoading = false
}
})
}
}
}
</script>
<style lang="scss" scoped>
.el-select {
width: 100%;
}
</style>

+ 0
- 235
src/views/hospital/followupManage/remindManage/index.vue Wyświetl plik

@@ -1,235 +0,0 @@
<template>
<div class="app-container">
<el-form size="small" label-width="70px" class="mb8">
<el-row :gutter="10">
<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="4">
<el-form-item label="应用科室">
<TreeDept
v-model="formParams.deptId"
clearable
style="width: 100%"
:options="deptList"
:autoFetch="false"
:props="{ emitPath: false }"
@change="onChangeDept"
/>
<!-- <el-select v-model="formParams.deptId" placeholder="请选择应用科室"></el-select> -->
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="4">
<el-form-item label="应用疾病">
<el-select
v-model="formParams.labelId"
placeholder="请选择应用疾病"
filterable
clearable
>
<el-option
v-for="item in diseaseList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="4">
<el-form-item label="提醒类型">
<el-select
v-model="formParams.categoryId"
placeholder="请选择提醒类型"
filterable
clearable
>
<el-option
v-for="item in categoryList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="4">
<el-form-item label="提醒名称">
<el-input v-model="formParams.name" placeholder="请输入提醒名称" />
</el-form-item>
</el-col>
<el-col :xs="12" :sm="6" :md="6" :lg="4" :xl="4">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="onSearch"
:disabled="loading"
>
搜索
</el-button>
<el-button icon="el-icon-refresh" size="mini" :disabled="loading" @click="handleReset">
重置
</el-button>
</el-col>
</el-row>
</el-form>
<div style="display: flex; justify-content: flex-end; padding-bottom: 8px">
<el-button icon="el-icon-plus" type="primary" size="mini" plain @click="onAdd">
新增提醒
</el-button>
</div>
<el-table v-loading="loading" align="center" :data="tableData">
<el-table-column type="index" label="序号" width="100px" align="center"></el-table-column>
<el-table-column label="提醒名称" align="center" prop="name"></el-table-column>
<el-table-column label="提醒类型" align="center" prop="categoryName"></el-table-column>
<el-table-column
label="最后编辑时间"
align="center"
prop="updateTime"
min-width="160px"
></el-table-column>
<el-table-column label="应用科室" align="center" prop="deptName"></el-table-column>
<el-table-column label="应用疾病" align="center" prop="labelName"></el-table-column>
<el-table-column label="操作" align="center" fixed="right">
<template slot-scope="{ row }">
<el-button size="mini" type="text" @click="onEdit(row)">编辑</el-button>
<el-button size="mini" type="text" @click="onDel(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
:total="pageable.total"
:page.sync="pageable.pageNum"
:limit.sync="pageable.pageSize"
@pagination="getList"
/>
<AddDialog ref="dialogRef" @onOk="onOk" />
</div>
</template>
<script>
import { TableMixin } from "@/mixins/tableMixin2";
import {
remindTemplateListApi,
deleteRemindTemplateApi,
} from "@/api/hospital/remindManage/remindList";
import AddDialog from "./components/addDialog/index.vue";
import TreeDept from "@/components/TreeDept";
import { getTreeHospDeptByPatient } from "@/api/admin";
import { getReminderListApi } from "@/api/common/dictManage/reminder";
import { getMedicalLabel } from "@/api/hospital";
import { getClientId } from "@/utils/auth";

export default {
name: "RemindManage",
components: {
AddDialog,
TreeDept,
},
mixins: [TableMixin],
data() {
return {
apiMethod: remindTemplateListApi,
formParams: {
deptId: "",
labelId: null,
categoryId: null,
name: "",
},
deptList: [],
diseaseList: [],
categoryList: [],
};
},
methods: {
/*获取科室数据*/
async getDeptList() {
const res = await getTreeHospDeptByPatient();
this.deptList = res.data || [];
},
// 获取病种数据
async loadMedicalLabel() {
const { deptId } = this.formParams;
const res = await getMedicalLabel({
deptId,
});
this.diseaseList = res.data || [];
},
// 获取提醒分类列表
async getRemindTypeList() {
const {
data: { list },
} = await getReminderListApi({
pageNum: 1,
pageSize: 1000,
clientId: getClientId(),
});
this.categoryList = list || [];
},
loadOptions() {
this.getDeptList();
this.loadMedicalLabel();
this.getRemindTypeList();
},
onChangeDept() {
this.formParams.labelId = null;
this.loadMedicalLabel();
},
paramsCallback() {
const { deptId, labelId, categoryId, name } = this.formParams;
return {
pageNum: this.pageable.pageNum,
pageSize: this.pageable.pageSize,
deptId,
labelId,
categoryId,
name,
};
},
onAdd() {
this.$nextTick(() => {
this.$refs.dialogRef.openDialog();
});
},
onEdit(row) {
this.$nextTick(() => {
this.$refs.dialogRef.openDialog(row);
});
},
onDel(row) {
this.$modal.confirm("是否确认删除?").then(async () => {
await deleteRemindTemplateApi({ id: row.id });
this.$message.success("操作成功");
this.pageable.pageNum = 1;
this.getList();
});
},
onOk() {
this.pageable.pageNum = 1;
this.formParams = {
deptId: "",
labelId: null,
categoryId: null,
remark: "",
name: "",
};
this.getList();
},
handleReset() {
this.formParams = {
deptId: "",
labelId: null,
categoryId: null,
remark: "",
};
this.onSearch();
},
},
mounted() {
this.loadOptions();
},
};
</script>
<style lang="scss" scoped>
.el-select,
.el-input {
width: 100%;
}
</style>

+ 0
- 56
src/views/hospital/followupManage/surveyManage/designSurvey/index.vue Wyświetl plik

@@ -1,56 +0,0 @@
<template>
<div class="app-container">
<DWViewer :url="url" @goback="hanldeBack" @publish="hanldePublish" @save="handleSave" @back="handleBack" />
</div>
</template>

<script>
import { publishSurvey, saveSurveyDraft } from "@/api/hospital";
import DWViewer from "@/components/DWViewer/index.vue";

export default {
name: "DesignSurvey",
components: {
DWViewer,
},
data() {
return {
url: `${process.env.VUE_APP_SURVEY_PREFIX}/survey/design-survey.html?surveyId=${this.$route.query.surveyId}`,
};
},
methods: {
// 发布
hanldePublish() {
publishSurvey(this.$route.query.id).then(() => {
this.$message.success("发布成功");
this.hanldeBack();
});
},
// 保存
handleSave() {
setTimeout(() => {
saveSurveyDraft(this.$route.query.surveyId
).then(() => {
this.hanldeBack();
})
}, 2000)
},
// 返回按钮
handleBack() {
saveSurveyDraft(this.$route.query.surveyId
).then(() => {
this.hanldeBack();
})
},
// 返回
hanldeBack() {
this.$tab.closePage(undefined, { name: "SurveyManage" });
},
},
};
</script>
<style lang="scss" scoped>
.app-container {
height: 100%;
}
</style>

+ 0
- 140
src/views/hospital/followupManage/surveyManage/surveyList/components/CrudPopup/index.vue Wyświetl plik

@@ -1,140 +0,0 @@
<template>
<Popup ref="popup" title="随访问卷~" @closed="dialogClosed">
<el-form :model="form" :rules="rules" ref="form" label-width="80px">
<el-form-item label="问卷名称" prop="name">
<el-input v-model="form.name" :maxlength="32"></el-input>
</el-form-item>

<el-form-item label="应用科室" prop="deptId">
<TreeDept :defaultName="defaultDeptName" v-model="form.deptId"
@change="form.labelId = ''" />
</el-form-item>

<el-form-item label="应用疾病" prop="labelId">
<el-select v-model="form.labelId" filterable>
<el-option v-for="item in diseaseList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-form>

<template slot="footer">
<el-button @click="handleCancel">取 消</el-button>
<el-button type="primary" @click="handleSubmit">下一步</el-button>
</template>
</Popup>
</template>

<script>
import Popup from "@/components/Popup";
import TreeDept from "@/components/TreeDept";
import { addSurvey, editSurvey, getMedicalLabel, copySurvey } from "@/api/hospital";
export default {
components: {
Popup,
TreeDept,
},
data() {
return {
form: this.getFormDefaultValue(),
rules: {
name: [
{ required: true, message: "请输入问卷名称", trigger: "blur" },
{ max: 32, message: "长度不能超过32个字符", trigger: "blur" },
],
labelId: [{ required: true, message: "请选择应用疾病", trigger: "change" }],
deptId: [{ required: true, message: "请选择应用疾病", trigger: "change" }],
},
diseaseList: [],
defaultDeptName: "",
};
},
watch: {
"form.deptId": {
handler: "loadDisease",
},
},
methods: {
async loadDisease() {
const res = await getMedicalLabel({ deptId: this.form.deptId || "" });
this.diseaseList = res.data || [];
},
getFormDefaultValue() {
return {
name: "",
labelId: "",
deptId: "",
};
},
open(params) {
if (params) {
for (const key of [
...Object.keys(this.form),
"id",
"surveyId",
"clientId",
"deptName",
"labelName",
"status",
]) {
this.form[key] = params[key];
this.defaultDeptName = params.deptName || "";
}
}
this.$refs.popup.open(params);
this.promise = {};
return new Promise((resolve, reject) => {
this.promise.resolve = resolve;
this.promise.reject = reject;
});
},
handleDeptLevelChange() {
this.$refs.form.clearValidate(["parentId", "wardId"]);
},
handleCancel() {
this.$refs.popup.close();
},
handleSubmit() {
this.$refs.form.validate(async (valid) => {
if (valid) {
this.loading = true;
try {
if (this.form.id) {
await editSurvey(this.form);
this.$message.success("保存成功");
} else if (this.form.surveyId) {
//没有id但有surveyId,那就是复制
const res = await copySurvey(this.form);
this.form.surveyId = res.data.surveyId;
this.form.id = res.data.id;
this.$message.success("复制成功");
} else {
// 新增接口
const res = await addSurvey(this.form);
this.form.surveyId = res.data.surveyId;
this.form.id = res.data.id;
this.$message.success("新增成功");
}
this.$router.push({
name: "DesignSurvey",
query: { id: this.form.id, surveyId: this.form.surveyId },
});
} finally {
this.loading = false;
}
this.$refs.popup.close();
this.promise.resolve();
} else {
// 表单校验失败
return false;
}
});
},
dialogClosed() {
this.form = this.getFormDefaultValue();
this.$nextTick(this.$refs.form.clearValidate);
// this.promise.reject();
},
},
};
</script>

+ 0
- 284
src/views/hospital/followupManage/surveyManage/surveyList/index.vue Wyświetl plik

@@ -1,284 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="问卷状态" prop="status">
<el-select v-model="queryParams.status" clearable style="width: 240px">
<el-option v-for="dict in surveyTempEnum.options" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>

<el-form-item label="应用科室" prop="deptIds">
<TreeDept v-model="queryParams.deptIds" clearable style="width: 240px" :props="{ emitPath: true }"
@change="queryParams.labelId = ''" />
</el-form-item>

<el-form-item label="应用疾病" prop="labelId">
<el-select v-model="queryParams.labelId" filterable clearable style="width: 240px">
<el-option v-for="item in diseaseList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>

<el-form-item label="问卷名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入问卷名称" clearable style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>

<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">
搜索
</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>

<div style="display: flex;justify-content: flex-end;padding-bottom: 8px;">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">
新增问卷
</el-button>
<el-button :disabled="selectDatas.length <= 0" type="success" plain icon="el-icon-upload2" size="mini"
@click="handlePublish" v-loading="isPublishLoading">发布问卷</el-button>
</div>

<el-row :gutter="10" class="mb8">
<el-col :span="1.5">

</el-col>
</el-row>

<el-table v-loading="loading" :data="pageList" border @selection-change="selectionChange">
<el-table-column type="selection" width="55" align="center" :selectable="isSelectable"></el-table-column>
<el-table-column align="center" label="序号" type="index"
:index="(index) => (queryParams.pageNum - 1) * queryParams.pageSize + index + 1" width="120" />
<el-table-column align="center" label="随访问卷名称" prop="name" :show-overflow-tooltip="true"
:class-name="'column-style-cursor'">
<template slot-scope="scope">
<div @click="setPreview(scope.row)">{{ scope.row.name }}</div>
</template>
</el-table-column>
<el-table-column align="center" label="随访问卷ID" prop="surveyId" :show-overflow-tooltip="true" />
<el-table-column align="center" label="最后编辑时间" prop="updateTime" :show-overflow-tooltip="true" />
<el-table-column align="center" label="应用疾病" prop="labelName" :show-overflow-tooltip="true" />
<el-table-column align="center" label="应用科室" prop="deptName" :show-overflow-tooltip="true" />
<el-table-column align="center" label="问卷状态" prop="status" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span :style="{ color: surveyTempEnum.enum[scope.row.status].color }">
{{ surveyTempEnum.getLabel(scope.row.status) }}
</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleSwitchStatus(scope.row)"
:disabled="scope.row.status === surveyTempMap.drafts"
:class="[scope.row.status === surveyTempMap.online ? 'yellow-button' : 'green-button']">
{{ scope.row.status === surveyTempMap.online ? "下线" : "发布" }}
</el-button>
<el-button size="mini" type="text" @click="handleCopy(scope.row)">
复制
</el-button>
<el-button size="mini" type="text" @click="handleEdit(scope.row)"
:disabled="scope.row.status === surveyTempMap.online">
编辑
</el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)"
:disabled="scope.row.status === surveyTempMap.online" class="red-button">
删除
</el-button>
</template>
</el-table-column>
</el-table>

<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<CrudPopup ref="crud" />
<SurveyPreviewPopup ref="previewSurvey" />
</div>
</template>

<script>
import ApiButton from "@/components/ApiButton/index.vue";
import TreeDept from "@/components/TreeDept";
import {
surveyPageList,
delSurvey,
getMedicalLabel,
offlineSurvey,
publishSurvey,
batchPublishSurveyApi
} from "@/api/hospital";
import { surveyTempMap } from "@/constant";
import CrudPopup from "./components/CrudPopup/index.vue";
import SurveyPreviewPopup from "../../planManage/addPlan/components/SurveyPreviewPopup";

export default {
name: "SurveyManage",
enums: ["surveyTempMap", "surveyTempEnum"],
components: {
ApiButton,
CrudPopup,
TreeDept,
SurveyPreviewPopup,
},
data() {
return {
// 遮罩层
loading: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 日期范围
dateRange: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
name: "",
deptIds: [],
labelId: "",
status: "",
},
pageList: [],
diseaseList: [],
selectDatas: [],
isPublishLoading: false
};
},
created() {
this.loadData();
},
activated() {
this.loadData();
},
watch: {
"queryParams.deptIds"(val) {
const deptId = val[1] || val[0];
if (deptId) {
this.loadDisease(deptId);
} else {
this.diseaseList = [];
}
},
},
methods: {
isSelectable(row, index) {
return ![surveyTempMap.online, surveyTempMap.drafts].includes(row.status);
},
selectionChange(value) {
this.selectDatas = value;
},
async handlePublish() {
this.isPublishLoading = true;
const ids = this.selectDatas.map(item => item.id);
try {
await batchPublishSurveyApi(ids)
this.$message.success("发布成功!")
this.getList();
} catch (err) {
console.log("err=", err);
} finally {
this.isPublishLoading = false;
}
},
// 预览问卷
setPreview(item) {
this.$refs.previewSurvey.open(item.surveyId);
},
loadData() {
this.getList();
},
async loadDisease(deptId) {
const res = await getMedicalLabel({ deptId });
this.diseaseList = res.data;
},
/** 查询角色列表 */
getList() {
this.loading = true;
surveyPageList(this.addDateRange(this.queryParams, this.dateRange))
.then((res) => {
const { data: { list, page } } = res
this.pageList = list || [];
this.total = page?.total || 0;
})
.finally(() => {
this.loading = false;
});
},

// 表单重置
reset() {
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增 */
handleAdd() {
this.$refs.crud.open().then(this.getList);
},
/** 编辑 */
handleEdit(item) {
this.$refs.crud.open(item).then(this.getList);
},
/** 复制 */
handleCopy(item) {
this.$refs.crud
.open({
...item,
name: item.name + " (复制)",
id: undefined,
// deptId: item.deptId,
// deptName: item.deptName,
// labelId: item.labelId,
// name: item.name + " (复制)",
// clientId: item.clientId,
// surveyId: item.surveyId,
// labelName: item.labelName,
// status: item.status,
})
.then(this.getList);
},
// 发布下线
handleSwitchStatus(item) {
const isOnline = item.status === this.surveyTempMap.online;
const fetch = async () => {
if (isOnline) {
await offlineSurvey(item.id);
} else {
await publishSurvey(item.id);
}
this.$message.success("操作成功");
this.getList();
};
if (isOnline) {
this.$modal
.confirm(`是否确认下线?`)
.then(fetch)
.catch(() => { });
} else {
fetch();
}
},
// 删除
handleDelete(item) {
this.$modal
.confirm("是否确认删除?")
.then(async () => {
await delSurvey(item.id);
this.$message.success("操作成功");
this.getList();
})
.catch(() => { });
},
},
};
</script>
<style lang="scss" scoped></style>

+ 0
- 714
src/views/hospital/patientManage/followupPatient/addPatient/components/CreateFollowPlan/index.vue Wyświetl plik

@@ -1,714 +0,0 @@
<template>
<div>
<el-dialog
title="随访计划--添加"
:visible="showModal"
:before-close="onBeforeClose"
width="90%"
append-to-body
>
<div class="step1" v-show="currentStep === 1" key="1">
<el-row>
<el-col :span="24">
<div class="sf-title">报到</div>
</el-col>
<el-col :span="24">
<vxe-grid
ref="xGrid1"
v-bind="gridConfig1"
:columns="columns1"
:proxyConfig="proxyConfig1"
@radio-change="onChangeDoctor"
>
<template #table_create_time="{ row }">
{{ row.createTime ? parseTime(row.createTime, "{y}-{m}-{d}") : "" }}
</template>
<!-- <template #table_visit_time="{ row }">
{{ row.visitTime ? parseTime(row.visitTime, "{y}-{m}-{d}") : "" }}
</template> -->
</vxe-grid>
</el-col>
</el-row>
</div>
<div class="step2" v-show="currentStep === 2" key="2">
<el-row>
<el-col :span="24">
<div class="sf-title">选择随访模板</div>
</el-col>
<el-col :span="24">
<vxe-grid
ref="xGrid2"
v-bind="gridConfig2"
:columns="columns2"
:formConfig="formConfig2"
:proxyConfig="proxyConfig2"
>
<template #form_dept="{ data }">
<TreeDept
v-model="data.deptIds"
clearable
style="width: 300px"
:options="deptOptions"
:autoFetch="false"
:props="{ emitPath: true }"
@change="(val) => onDeptChange(val, data)"
/>
</template>
<template #form_btn_items>
<vxe-button type="submit" status="primary" content="查询"></vxe-button>
<vxe-button type="reset" content="重置"></vxe-button>
</template>
<template #t_period_default="{ row }">
{{ row.periodNumber }}{{ periodUnitEnum.getLabel(row.periodUnit) }}
</template>
<template #table_operation="{ row }">
<vxe-button type="text" status="primary" @click="onPreview(row)">预览</vxe-button>
</template>
</vxe-grid>
</el-col>
</el-row>
</div>
<div class="step3" v-show="currentStep === 3" key="3">
<el-row>
<el-col :span="24">
<vxe-grid ref="xGrid3" v-bind="gridConfig3" :columns="columns3" :data="step3TableList">
<template #table_lagTime="{ row }">
{{ row.lagTime }}
</template>
<template #table_lagTime_edit="{ row, rowIndex }">
<el-date-picker
transfer
v-model="row.lagTime"
value-format="yyyy-MM-dd"
type="date"
placeholder="选择日期"
:picker-options="pickerOptions"
></el-date-picker>
</template>
<template #t_period_default="{ row }">
{{ row.periodNumber }}{{ periodUnitEnum.getLabel(row.periodUnit) }}
</template>
<template #table_operation="{ row }">
<vxe-button type="text" status="primary" @click="onEditPlan(row)">编辑</vxe-button>
</template>
</vxe-grid>
</el-col>
</el-row>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="onLeftBtn">{{ showLeftBtnText }}</el-button>
<el-button
type="primary"
@click="onRightBtn"
style="margin-left: 20px"
v-loading="submitting"
>
{{ showRightBtnText }}
</el-button>
</div>
</el-dialog>
<el-dialog title="预览模板事项" :visible.sync="previewVisible" width="90%" append-to-body>
<FollowTaskSetting
:maxDays="maxDays"
v-model="detailTaskList"
:isPreview="previewVisible"
></FollowTaskSetting>
<span slot="footer" class="dialog-footer">
<el-button @click="previewVisible = false">取 消</el-button>
</span>
</el-dialog>
<el-dialog
v-if="editFollowPlanVisible"
title="随访模板编辑"
:visible.sync="editFollowPlanVisible"
width="90%"
append-to-body
:before-close="onBeforeCloseEditFollowPlan"
>
<el-row>
<el-col :span="24">
<FollowTaskSetting
v-show="!visiable"
:maxDays="maxDays"
:isPreview="previewVisible"
v-model="detailTaskList"
@selectTodo="handleSelectTodo"
@closeEditDialog="editFollowPlanVisible = false"
@save="saveItems"
></FollowTaskSetting>
<el-collapse-transition>
<TodoItemSelector ref="todoSelector" :form="formData" :visiable.sycn="visiable"/>
</el-collapse-transition>
</el-col>
</el-row>
</el-dialog>
</div>
</template>
<script>
import { commonGridConfig1 } from "@/config/vxeGrid";
import TreeDept from "@/components/TreeDept";
import { getTreeHospDeptByPatient } from "@/api/admin";
import { getMedicalLabel } from "@/api/hospital";
import FollowTaskSetting from "../FollowTaskSetting";
import TodoItemSelector from "../TodoItemSelector";
import {
getFollowupReportListAPi,
submitFollowupPlanApi,
} from "@/api/hospital/patientManage/followupPatient";
import {
getPlanDetail,
getFollowupTemplateListApi,
} from "@/api/hospital/followupManage/followupPlan";
export default {
name: "CreateFollowPlan",
components: {
TreeDept,
FollowTaskSetting,
TodoItemSelector,
},
props: {
visible: {
type: Boolean,
default: false,
},
},
enums: ["followItemStatusEnum", "periodUnitEnum", "periodUnitMap"],
computed: {
showModal: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:visible", val);
},
},
showLeftBtnText() {
if (this.currentStep === 1) {
return "取 消";
} else if ([2, 3].includes(this.currentStep)) {
return "上一步";
} else {
return "取 消";
}
},
showRightBtnText() {
if (this.currentStep === 1) {
return "下一步";
} else if (this.currentStep === 2) {
return "下一步";
} else {
return "保 存";
}
},
selectReports() {
return this.$refs?.xGrid1.getRadioRecord(true) || [];
},
selectTemps() {
return this.$refs?.xGrid2?.getCheckboxRecords(true) || [];
},
},
data() {
return {
// 当前所处步骤
currentStep: 1,
/**
* 报到表格配置
*/
gridConfig1: {
...commonGridConfig1,
rowConfig: {
keyField: "id",
},
radioConfig: {
reserve: true,
trigger: "row",
highlight: true,
},
maxHeight: 600,
transfer: true,
pagerConfig: {
enabled: false,
},
},
columns1: [
{
type: "seq",
title: "序号",
width: 60,
},
{
field: "deptName",
title: "科室",
},
{
field: "userInfo.userName",
title: "医生",
},
{
field: "createTime",
title: "报到时间",
slots: {
default: "table_create_time",
},
},
// {
// field: "visitTime",
// title: "就诊时间",
// slots: {
// default: "table_visit_time",
// },
// },
{
type: "radio",
width: 120,
fixed: "right",
},
],
proxyConfig1: {
response: {
list: "data",
},
ajax: {
query: ({ page }) => {
const { currentPage: pageNum, pageSize } = page;
console.log("page=", page);
console.log("执行了");
return getFollowupReportListAPi(this.$route.params.id);
},
},
},
/**
* 随访模板表格配置
*/
gridConfig2: {
...commonGridConfig1,
rowConfig: {
keyField: "id",
},
checkboxConfig: {
showHeader: false,
keyField: "id",
reserve: true,
trigger: "row",
highlight: true,
checkMethod: ({ row }) => {
return (
this.selectTemps.length < 5 ||
this.selectTemps.findIndex((item) => item.id === row.id) >= 0
);
},
},
maxHeight: 600,
},
formConfig2: {
titleWidth: 90,
titleAlign: "right",
titleColon: true,
items: [
{
field: "deptId",
title: "科室",
itemRender: {},
slots: {
default: "form_dept",
},
},
{
field: "labelId",
title: "应用疾病",
itemRender: {
name: "VxeSelect",
options: [],
props: {
clearable: true,
placeholder: "请选择应用疾病",
transfer: true,
},
optionProps: {
value: "id",
label: "name",
},
},
},
{
field: "name",
title: "模板名称",
itemRender: {
name: "VxeInput",
props: {
clearable: true,
placeholder: "请选择模板名称",
style: "width: 300px",
},
},
},
{ itemRender: {}, slots: { default: "form_btn_items" } },
],
},
columns2: [
{
field: "name",
title: "随访模板名称",
},
{
field: "wardName",
title: "院区",
},
{
field: "labelName",
title: "应用疾病",
},
{
field: "deptName",
title: "科室",
},
{
field: "periodNumber",
title: "随访周期",
slots: {
default: "t_period_default",
},
},
{
field: "operation",
title: "操作",
slots: {
default: "table_operation",
},
},
{
type: "checkbox",
},
],
proxyConfig2: {
form: true,
response: {
result: "data.list",
total: "data.page.total",
},
ajax: {
query: async ({ form, page }) => {
const { deptIds, labelId, name } = form;
const { currentPage: pageNum, pageSize } = page;
console.log("form=", form);
console.log("page=", page);
const queryParams = {
status: 2,
deptIds,
labelId,
name,
pageNum,
pageSize,
};
return getFollowupTemplateListApi(queryParams);
},
},
},
// 科室下拉框数据
deptOptions: [],
// 预览弹窗控制
previewVisible: false,
maxDays: 0,
detailTaskList: [],
/**
* 随访模板基线
*/
gridConfig3: {
...commonGridConfig1,
// editConfig: {
// trigger: 'click',
// mode: 'row'
// },
maxHeight: 600,
},
columns3: [
{
field: "name",
title: "随访模板名称",
},
{
field: "wardName",
title: "院区",
},
{
field: "labelName",
title: "应用疾病",
},
{
field: "deptName",
title: "应用科室",
},
{
field: "periodNumber",
title: "随访周期",
slots: {
default: "t_period_default",
},
},
{
field: "lagTime",
title: "基线时间",
width: 300,
slots: {
default: "table_lagTime_edit",
},
},
{
field: "operation",
title: "操作",
slots: {
default: "table_operation",
},
},
],
pickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now() - 8.64e7;
},
},
// 步骤三表格数据
step3TableList: [],
editFollowPlanVisible: false,
visiable: false,
submitting: false,
// 患者id
patientId: null,
// 选择的医生id
doctorId: null,
// 没选择基线时间的数据
noLagTime: [],
};
},
methods: {
// 关闭弹窗
onBeforeClose(done) {
this.showModal = false;
},
/**
* 选择随访模板
* */
// 查询科室下拉框数据
async loadDeptOptions() {
const res = await getTreeHospDeptByPatient();
this.deptOptions = res.data || [];
},
// 选中科室
onDeptChange(val, data) {
console.log("vla=", val);
console.log("vla=", data);
data.labelId = null;
const deptId = val?.[val?.length - 1] || undefined;
this.loadDiseaseOptions(deptId);
},
// 查询应用疾病下拉数据
async loadDiseaseOptions(deptId) {
const { data } = await getMedicalLabel({
deptId: deptId ? deptId : undefined,
});
console.log("diseaseOptions=", data);
await this.$nextTick();
const $grid = this.$refs.xGrid2;
if ($grid) {
const diseaseItem = $grid.getFormItems(1);
console.log("diseaseItem=", diseaseItem);
diseaseItem.itemRender.options = data;
}
},
// 选择医生
onChangeDoctor({ newValue }) {
console.log("newValue=", newValue);
this.doctorId = newValue.doctorId;
},
// 预览
async onPreview(row) {
const { data } = await getPlanDetail(row.id);
console.log("data=", data);
this.detailTaskList = data.taskList;
this.previewVisible = true;
},
getDays(periodNumber, periodUnit) {
switch (periodUnit) {
case this.periodUnitMap.day:
return periodNumber;
case this.periodUnitMap.month:
return periodNumber * 30;
case this.periodUnitMap.year:
return periodNumber * 30 * 12;
}
},
// 编辑计划
onEditPlan(row) {
console.log("row=", row);
this.previewVisible = false;
this.formData = row;
this.maxDays = this.getDays(row.periodNumber, row.periodUnit);
this.detailTaskList = row.taskList;
this.editFollowPlanVisible = true;
},
// 选择待办事项
async handleSelectTodo(index) {
const curTask = this.detailTaskList[index];
this.visiable = true;
await this.$nextTick();
this.$refs.todoSelector
.open(curTask.items)
.then((items) => {
this.detailTaskList.splice(index, 1, {
...curTask,
items,
});
this.visiable = false;
})
.catch(() => {
this.visiable = false;
});
},
validate() {
console.log("validate");
if (this.detailTaskList.length === 0) {
this.$message.error("随访任务不能为空");
return false;
}
let preTime = 0;
for (const [index, task] of this.detailTaskList.entries()) {
if (typeof task.lagNumber !== "number") {
this.$message.error(`第${index + 1}次随访任务[基线时间+]未选择`);
return false;
}
if (task.items.length === 0) {
this.$message.error(`第${index + 1}次随访任务未添加待办事项`);
return false;
}
if (task.lagNumber < preTime) {
this.$message.error(
`第${index + 1}次随访任务[基线时间+]不能小于${index === 0 ? "0" : "前一次"}`
);
return false;
}
preTime = task.lagNumber;
if (task.lagNumber > this.maxDays) {
this.$message.error(`随访任务[基线时间+]超过了随访总周期`);
return false;
}
}
return true;
},
saveItems() {
if (!this.validate()) return;
this.editFollowPlanVisible = false;
},
// 上一步/取消
onLeftBtn() {
if (this.currentStep === 1) {
this.showModal = false;
} else if (this.currentStep === 2) {
this.currentStep = 1;
} else if (this.currentStep === 3) {
this.currentStep = 2;
}
},
// 下一步/保存
async onRightBtn() {
if (this.currentStep === 1) {
if (this.selectReports.length <= 0) {
console.log("asdadsa", this.selectReports);
return this.$message.error("请选择一个报到单!");
}
this.currentStep = 2;
} else if (this.currentStep === 2) {
if (this.selectTemps.length <= 0) {
return this.$message.error("请至少选择一个随访模版!");
}
this.selectTemps.forEach((item) => {
item.lagTime = "";
});
this.step3TableList = JSON.parse(JSON.stringify(this.selectTemps)) || [];
this.currentStep = 3;
} else if (this.currentStep === 3) {
try {
this.submitting = true;
console.log();
await this.$nextTick();
const labelIds = [];
this.noLagTime = [];
const documentList = this.step3TableList.map((item1, index) => {
const { lagTime, labelId, id: tempId, taskList } = item1;
if (!lagTime) {
this.noLagTime.push(index);
}
if (labelIds.findIndex(i => i === item1.labelId ) < 0) {
labelIds.push(labelId);
}
const newTaskList = taskList.map((item2) => {
const { batchNo, lagNumber, lagUnit, items } = item2;
const newItems = items.map((item3) => {
const { targetId: itemTempId, targetType: itemType, targetName: itemName } = item3;
return {
itemTempId,
itemName,
itemType,
};
});
return {
batchNo,
lagNumber,
lagUnit,
items: newItems,
};
});
return {
lagTime: new Date(lagTime + " 00:00:00").getTime(),
tempId,
taskList: newTaskList,
};
});
if (this.noLagTime.length > 0) {
return this.$message.error("请完善基线时间");
}
const params = {
patientId: this.patientId,
doctorId: this.doctorId,
documentList,
labelIdList: labelIds,
};
await submitFollowupPlanApi(params);
this.$message.success("操作成功");
this.showModal = false;
this.$emit("success");
} catch (err) {
console.log("err=", err);
} finally {
this.submitting = false;
}
}
},
onBeforeCloseEditFollowPlan() {
this.visiable = false
this.editFollowPlanVisible = false
},
async init() {
this.patientId = this.$route.params.id;
this.loadDeptOptions();
await this.$nextTick();
this.loadDiseaseOptions();
},
},
created() {
this.init();
},
};
</script>
<style lang="scss" scoped>
.dialog-footer {
display: flex;
justify-content: center;
}
::v-deep .red-tip {
.el-input__inner {
border: 1px solid red !important;
}
}
::v-deep .el-card__body {
height: 100%;
}
</style>

+ 0
- 335
src/views/hospital/patientManage/followupPatient/addPatient/components/DetailDialog/index.vue Wyświetl plik

@@ -1,335 +0,0 @@
<!--
* @Author: guanxiaoyan guanxiaoyan@pb-station.com
* @Deion:
* @Date: 2023-12-08 10:10:44
* @LastEditors: guanxiaoyan guanxiaoyan@pb-station.com
* @LastEditTime: 2024-01-03 18:05:31
* @FilePath: /followUp-operate/src/views/workStation/followTask/DetailDialog/detail.vue
-->
<template>
<!-- <el-dialog title="随访计划--查看" :visible.sync="followTaskDetailVisible" width="90%"
@close="closeDialog"> -->
<el-container class="followDetail-box">
<el-header style="margin-bottom: 20px;height:auto">
<!-- 随访列表 -->
<el-table ref="followTaskTable" :data="followPlanTableData" highlight-current-row border
@current-change="handleFollowPlanList">
<el-table-column align="center" property="name" label="随访模板名称">
</el-table-column>
<el-table-column align="center" property="labelName" label="应用疾病">
</el-table-column>
<el-table-column align="center" property="deptName" label="应用科室">
</el-table-column>
<el-table-column align="center" property="doctorName" label="责任医生">
</el-table-column>
<el-table-column align="center" prop="periodNumber" label="随访周期">
<template slot-scope="scope">
{{ scope.row.periodNumber + periodUnitEnum.getLabel(scope.row.periodUnit) }}
</template>
</el-table-column>
<el-table-column align="center" property="lagTime" label="基线时间">
<template slot-scope="scope">
{{ scope.row.lagTime ? parseTime(scope.row.lagTime, "{y}-{m}-{d}") : '' }}
</template>
</el-table-column>
<el-table-column align="center" property="statusDesc" label="状态">
</el-table-column>
</el-table>
</el-header>
<el-main style="padding: 0 20px" v-loading="tableLoading">
<el-row type="flex" :gutter="20">
<el-col :span="12" >
<div style="height: 100%">
<el-container style="height: 100%">
<el-main style="padding: 0;">
<el-row type="flex">
<el-col :span="8">
<!-- 历史列表 -->
<el-card :body-style="{ height: '100%', 'overflowY': 'auto' }">
<div slot="header" class="el-descriptions__title">
任务列表
</div>
<el-table ref="taskTable" :data="followTaskTableData" highlight-current-row
@current-change="handleSelectTask" :show-header="false" border>
<el-table-column align="center" property="taskBeginTime" label="日期"
:class-name="'column-style-cursor'">
<template slot-scope="scope">
{{ parseTime(scope.row.taskBeginTime, "{y}-{m}-{d}") }}
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
<el-col :span="16">
<!-- 待办事项 -->
<el-card>
<div slot="header" class="el-descriptions__title">
待办事项
</div>
<el-table ref="todoTable" :data="todoList" highlight-current-row border
@current-change="handleSelectItem">
<el-table-column align="center" property="itemType" label="类型"
:class-name="'column-style-cursor'">
<template slot-scope="scope">
{{ todoItemTypeEnum.getLabel(scope.row.itemType) }}
</template>
</el-table-column>
<el-table-column align="center" property="itemName" label="名称"
:class-name="'column-style-cursor'" />
<el-table-column align="center" property="status" label="状态"
:class-name="'column-style-cursor'">
<template slot-scope="scope">
{{ checkHasValue(scope.row.status) ? todoItemStatusEnum.getLabel(`${scope.row.status}`) : ''
}}
</template>
</el-table-column>
<el-table-column align="center" property="status" label="操作"
:class-name="'column-style-cursor'">
<template slot-scope="{row}">
<el-button
v-if="editWJ !== row.id || !(parseTime(followTaskItem.taskBeginTime, '{y}-{m}-{d}') === parseTime(new Date(), '{y}-{m}-{d}') && followItem.status === 1 && previewItem.status === 0)"
type="text"
:disabled="![todoItemTypeMap.survey].includes(row.itemType) || row.status !== 0 || followItem.status !== 1 || parseTime(followTaskItem.taskBeginTime, '{y}-{m}-{d}') !== parseTime(new Date(), '{y}-{m}-{d}')"
@click.stop="handleEdit(row)">编辑</el-button>
<el-button v-else type="text" :disabled="![todoItemTypeMap.survey].includes(row.itemType)"
@click.stop="handleCancel(row)">取消</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-main>
</el-container>
</div>
</el-col>
<el-col :span="12">
<el-card>
<div style="height:100%;" v-if="previewItem" :key="previewItem && previewItem.itemId">
<DWViewer
v-if="previewItem.itemType === todoItemTypeMap.survey && editWJ && parseTime(followTaskItem.taskBeginTime, '{y}-{m}-{d}') === parseTime(new Date(), '{y}-{m}-{d}') && followItem.status === 1 && previewItem.status === 0"
:url="`${surveyPrefix}/survey/diaowen-m.html?surveyId=${previewItem.itemId}&t=${new Date().getTime()}`"
:isStorage="false" @submitSurveyScuccess="submitSurveyScuccess" />
<DWViewer v-else-if="previewItem.itemType === todoItemTypeMap.survey"
:url="`${surveyPrefix}/survey/answer-data.html?surveyId=${previewItem.itemId}&t=${new Date().getTime()}`" />
<!-- 文章 -->
<ArticlePreview :isTemp="false"
v-else-if="previewItem.itemType === todoItemTypeMap.article" :articleId="previewItem.itemId" />
</div>
</el-card>
</el-col>
</el-row>
</el-main>
</el-container>
<!-- </el-dialog> -->
</template>
<script>
import DWViewer from "@/components/DWViewer";
import ArticlePreview from "@/components/ArticlePreview";
import { checkHasValue } from "@/utils/index";
import { getFollowTaskDetailApi, finishWaitProcessItemApi } from '@/api/hospital/patientManage/followupPatient'
export default {
name: "FollowTaskDetail",
enums: ["todoItemTypeEnum", "todoItemStatusEnum", "todoItemTypeMap", "periodUnitEnum"],
components: {
DWViewer,
ArticlePreview,
},
props: ["followRow", "isAllList"],
data() {
return {
surveyPrefix: process.env.VUE_APP_SURVEY_PREFIX || "",
followPlanTableData: [],
followTaskTableData: [],
previewItem: {},
editWJ: null, // 是否编辑问卷
taskList: [], //任务列表
todoList: [], //待办事项
tableLoading: false,
currentTask: "",
pageSize: 10,
pageNum: 1,
followListTotal: 0,
followId: null,
followItem: {},
followTaskItem: {
taskBeginTime: "",
},
};
},
created() {
this.initData();
},
methods: {
checkHasValue,
initData() {
// this.followPlanTableData = [this.followRow];
this.followItem = this.followRow;
console.log("this.followRow=", this.followRow);
this.getFollowPlanDetail(this.followRow.id);
},
async submitSurveyScuccess() {
console.log('提交==')
try {
await finishWaitProcessItemApi({
id: this.editWJ,
}).then((res) => {
this.$message.success("编辑成功!");
this.editWJ = null;
this.initData();
});
} catch (err) {
console.log("err=", err);
} finally {
}
},
// 获取随访计划详情
async getFollowPlanDetail(followId) {
this.followId = followId;
this.followPlanTableData = []
this.followTaskTableData = [];
this.todoList = [];
this.tableLoading = true;
try {
const { data } = await getFollowTaskDetailApi({ followId: followId });
if (data) {
const { taskList, ...otherObject } = data;
this.followPlanTableData = [otherObject];
this.followTaskTableData = taskList || [];
this.followTaskItem = this.followTaskTableData[0];
this.todoList = taskList[0].items;
this.currentTask = taskList[0].id;
if (this.todoList?.length > 0) {
this.previewItem = this.todoList[0];
}
this.$nextTick(() => {
this.$refs.taskTable.setCurrentRow(this.followTaskTableData[0]);
if (this.todoList?.length > 0) {
this.$refs.todoTable.setCurrentRow(this.todoList[0]);
}
});
}
} catch (err) {
console.log(err);
} finally {
this.tableLoading = false;
}
},
setHightLight(row) {
if (this.followTaskTableData.length > 1) {
this.$refs.taskTable.setCurrentRow(row);
}
if (row.items.length > 1) {
const currentRow = this.todoList.filter((t) => t.taskId === row.id);
if (currentRow.length) {
this.$refs.todoTable.setCurrentRow(currentRow[0]);
}
}
},
// 点击随访列表
handleFollowPlanList(rowVal) {
console.log("rowVal", rowVal);
if (rowVal) {
return;
}
this.followItem = rowVal;
if (rowVal) {
this.getFollowPlanDetail(rowVal.id);
}
},
// 点击任务列表
handleSelectTask(rowVal) {
if (!rowVal) {
return;
}
this.followTaskItem = rowVal;
console.log("任务列表=", rowVal);
if (rowVal) {
if (this.currentTask === rowVal.id) return;
this.currentTask = rowVal.id;
this.editWJ = null;
this.todoList = rowVal.items || [];
if (this.todoList.length > 0) {
this.previewItem = this.todoList[0];
this.$nextTick(() => {
this.$refs.todoTable.setCurrentRow(this.todoList[0]);
});
} else {
this.previewItem = {};
this.editWJ = null;
}
}
},
// 点击单条事项查看PDF文件
handleSelectItem(item) {
console.log("item", item);
if (!item) {
return;
}
this.previewItem = item;
if (this.editWJ !== item.id) {
this.editWJ = null;
}
},
// 点击编辑
handleEdit(row) {
this.editWJ = row.id;
this.previewItem = row;
this.$nextTick(() => {
this.$refs.todoTable.setCurrentRow(row);
});
},
handleCancel(row) {
console.log("row=", row);
this.editWJ = null;
},
},
};
</script>

<style lang="scss" scoped>
/* 样式代码相同 */
// ::v-deep .el-card {
// height: 100%;
// .el-card__body {
// height: 100%;
// }
// }

.column-style-cursor {
cursor: pointer;
}

.followDetail-box {
display: flex;
flex-direction: column;
height: 100%;
.el-header,
.el-main {
overflow: hidden;
padding: 0 !important;
}
.el-main {
box-sizing: border-box;
flex: 1;
padding: 20px;
.el-row {
height: 100%;
overflow: hidden;
}
.el-col {
height: 100%;
}
::v-deep .el-card {
box-sizing: border-box;
display: flex;
flex-direction: column;
height: 100%;
}
::v-deep .el-card__body {
overflow: auto;
flex: 1;
}
}
}
</style>

+ 0
- 306
src/views/hospital/patientManage/followupPatient/addPatient/components/FollowTaskSetting/index.vue Wyświetl plik

@@ -1,306 +0,0 @@
<template>
<div class="follow-task">
<el-row v-show="!showItemsTable" :gutter="20" style="width: 100%">
<el-col :span="12" class="itemsTable-box">
<el-card class="left-card">
<el-steps direction="vertical" :active="value.length + 1">
<el-step v-for="(item, index) in value" :key="index" style="flex-basis: auto">
<template slot="title">
<div style="display: flex; align-items: center">
<span>第{{ index + 1 }}次随访任务</span>
<span class="ml10" style="font-size: 14px; color: #cccccc">基线时间+</span>
<div class="ml10">
<el-input-number v-if="isPreview" size="mini" v-model="item.lagNumber"
disabled></el-input-number>
<el-input-number v-else size="mini" v-model="item.lagNumber"
v-bind="getTaskTimeRange(item, index)"
@change="changeNumber(item,index)"></el-input-number>
<span class="ml5" style="font-size: 12px; color: #000">天</span>
</div>
</div>
</template>
<template slot="description">
<el-table :data="item.items" :ref="'previewTemplateTable'+index" border
emptyText="暂无待办事项" highlight-current-row class="mt10"
@current-change="handleCurrentChange(index,$event)">
<el-table-column align="center" property="targetType" label="待办类型">
<template slot-scope="scope">
{{ todoItemTypeEnum.getLabel(scope.row.targetType) }}
</template>
</el-table-column>
<el-table-column align="center" property="targetName" label="名称" />
<el-table-column v-if="!isPreview" align="center" label="操作">
<template slot-scope="scope">
<el-button class="color-red" size="mini" type="text"
@click="hanldeDelTodoItem(scope.$index, index)" v-if="!isPreview">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-button v-if="item.items.length < 10 && !isPreview" @click="handleAddTodo(index)"
class="mb20" type="primary" style="width: 100%">
添加待办事项
</el-button>
</template>
</el-step>
</el-steps>
<div v-if="!isPreview" class="operation-btn" style="width:100%;text-align: center">
<el-button type="default" class="btn-style" @click="cancel">取消</el-button>
<el-button type="primary" class="btn-style" @click="sureSelectedItem">保存</el-button>
</div>
</el-card>
</el-col>
<el-col :span="11" :offset="1">
<el-card>
<ArticlePreview v-if="previewData.targetType === todoItemTypeMap.article" style="height: 100%;"
:articleId="previewData.targetId" :isTemp="true" />
<DWViewer v-else-if="previewData.targetType === todoItemTypeMap.survey" :url="url" />
</el-card>
</el-col>
</el-row>

</div>
</template>
<script>
import ArticlePreview from "@/components/ArticlePreview";
import DWViewer from "@/components/DWViewer";
export default {
enums: ["todoItemTypeEnum", "periodUnitMap", "todoItemTypeMap"],
components: {
ArticlePreview,
DWViewer,
},
props: {
value: {
type: Array,
default: () => [],
},
maxDays: {
type: Number,
},
isPreview: {
// 预览标记
type: Boolean,
default: false,
},
},
computed: {
url() {
return `${process.env.VUE_APP_SURVEY_PREFIX}/survey/diaowen-m.html?surveyId=${this.previewData.surveyId}&sid=&tag=p-auth-0&t=${new Date().getTime()}`;
},
},
watch: {
value(newVal, oldVal) {
console.log("newVal", newVal, oldVal);
if (newVal.length && newVal[0].items.length) {
const item = newVal[0].items[0];
this.setPdf(item);
// this.setCurrent(0, item);
}
},
},
data() {
return {
previewData: {},
showArticle: true,
searchItemsForm: {
pageSize: 10,
pageNum: 1,
name: "",
type: 1,
},
loading: false,
itemsTableList: [],
showItemsTable: false,
total: 0,
selectedItem: [],
itemArticleId: "",
itemSurveyId: "",
isItemArticle: true,
editIndex: null,
};
},
created() {},
mounted() {
if (this.value.length === 0 && !this.isPreview) {
// 自动插入一条
this.handleAddTask();
}
if (this.value.length && this.value[0].items.length) {
const item = this.value[0].items[0];
this.setPdf(item);
}
},
unMounted() {
this.showArticle = true;
this.previewData = {}
},
methods: {
getTaskTimeRange(item, index) {
let maxNum = this.maxDays;
if (index !== this.value.length - 1) {
maxNum = this.maxDays - (this.value.length - (index + 1));
}
const range = {
min: index === 0 ? 0 : this.value[index - 1].lagNumber + 1,
max: index === this.value.length - 1 ? this.maxDays : maxNum,
};
// console.log(`${index}----range`, range);
return range;
},
changeNumber(item, index) {
this.computNumAdd(item, index);
this.computNumRemove(item, index);
},
computNumAdd(item, index) {
const currentIndexNum = this.value[index].lagNumber;
let maxNum = this.maxDays;
if (index !== this.value.length - 1) {
maxNum = this.maxDays - (this.value.length - (index + 1));
}
// console.log("maxNum!!!", maxNum);
if (index < this.value.length - 1 && this.value[index + 1].lagNumber <= maxNum) {
this.value[index + 1].lagNumber = currentIndexNum + 1;
this.computNumAdd(item, index + 1);
}
},
computNumRemove(item, index) {
if (index !== 0) {
const currentIndexNum = this.value[index].lagNumber;
const lastIndexNum = this.value[index - 1].lagNumber;
if (lastIndexNum >= currentIndexNum) {
this.value[index - 1].lagNumber = currentIndexNum - 1;
this.computNumRemove(item, index - 1);
}
}
},
handleAddTask() {
if (this.isPreview === "preview") return false;
this.$emit("input", [
...this.value,
{
lagNumber: undefined,
lagUnit: this.periodUnitMap.day,
items: [],
},
]);
},
handleDelTask(index) {
if (this.isPreview === "preview") return false;
if (index === 0) {
return this.$message.warning("至少包含一个任务");
}
const taskList = [...this.value];
taskList.splice(index);
this.$emit("input", taskList);
},
// 修改添加待办事项
handleAddTodo(index) {
this.$emit("selectTodo", index);
},
// 查看预览待办事项
handlePrewviewItem(item) {
if (item.targetType === this.todoItemTypeMap.article) {
this.$refs.previewArticle.open(item.targetId);
} else {
this.$refs.previewSurvey.open(item.surveyId);
}
},
// 删除待办事项
hanldeDelTodoItem(todoIndex, taskIndex) {
const taskList = [...this.value];
taskList[taskIndex].items.splice(todoIndex, 1);
this.$emit("change", taskList);
},
setCurrent(index, row) {
this.$nextTick(() => {
this.$refs["previewTemplateTable" + index][0].setCurrentRow(row);
});
},
clearCurrentRow() {
// 清除高亮
this.$nextTick(() => {
console.log(this.$refs);
this.value.forEach((table, index) => {
console.log(this.$refs["previewTemplateTable" + index]);
this.$refs["previewTemplateTable" + index][0].setCurrentRow(null);
});
});
},
handleCurrentChange(index, row) {
console.log('index===', index)
this.setPdf(row);
},
setPdf(row) {
if (!row) {
this.previewData = {}
return
}
this.previewData = row
// console.log('row=', row)
// const item = row;
// this.articleId = "";
// this.surveyId = "";
// if (item.targetType === this.todoItemTypeMap.article) {
// this.showArticle = true;
// this.articleId = item.targetId;
// } else if(item.targetType === this.todoItemTypeMap.survey) {
// this.showArticle = false;
// this.surveyId = item.surveyId;
// }
},
// 确定按钮
sureSelectedItem() {
this.$emit("save");
},
cancel() {
this.$emit("closeEditDialog");
},
},
};
</script>

<style lang="scss" scoped>
.follow-task {
display: flex;
height: 75vh;
.el-row {
height: 100%;
.el-card {
height: 100%;
}
::v-deep .el-card__body {
overflow: auto;
height: 100%;
}
.el-steps {
height: auto;
min-height: 80%;
}
}
.el-col {
height: 100%;
}

::v-deep .el-step__description {
padding-right: 0 !important;
margin-bottom: 30px !important;
}
::v-deep .el-table .el-table__header .el-table-column--selection .el-checkbox {
display: none !important;
}
::v-deep .el-table .cell::before {
content: "";
text-align: center;
line-height: 37px;
}
.itemsTable-box {
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
}
</style>


+ 0
- 49
src/views/hospital/patientManage/followupPatient/addPatient/components/SubmitDiag/index.vue Wyświetl plik

@@ -1,49 +0,0 @@
<template>
<el-dialog title="提示" :visible="showModal" :before-close="onBeforeClose" center width="400px" top="30vh">
<div class="content">
<h4>患者信息保存后,仅支持修改手机号</h4>
<h4>请仔细核对患者基础信息是否准确无误</h4>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="showModal = false">取 消</el-button>
<el-button type="primary" @click="onSubmit">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
export default {
name: "SubmitDiag",
computed: {
showModal: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:visible", val);
},
},
},
props: ["visible"],
data() {
return {};
},
methods: {
onBeforeClose(done) {
this.showModal = false;
},
onSubmit() {
this.$emit("onOk");
},
},
};
</script>
<style lang="scss" scoped>
.content {
h4 {
color: #000;
font-size: 16px;
font-weight: 600;
text-align: center;
}
}
</style>

+ 0
- 281
src/views/hospital/patientManage/followupPatient/addPatient/components/TodoItemSelector/index.vue Wyświetl plik

@@ -1,281 +0,0 @@
<!--
* @Author: guanxiaoyan guanxiaoyan@pb-station.com
* @Deion:
* @Date: 2023-12-25 09:51:03
* @LastEditors: guanxiaoyan guanxiaoyan@pb-station.com
* @LastEditTime: 2024-01-03 10:53:08
* @FilePath: /followUp-operate/src/views/workStation/followTask/CreateFollowPlan/components/TodoItemSelector/index.vue
-->
<template>
<div class="todo-selector" v-show="visiable">
<div class="sf-title mb5">添加待办事项</div>
<el-row>
<el-col :span="12">
<el-card>
<el-form ref="form" inline>
<el-form-item label="类型" prop="targetType" placeholder="请选择" style="margin: 0">
<el-select size="mini" v-model="queryParams.targetType" @change="getList">
<el-option v-for="item in todoItemTypeEnum.options.filter(
(item) => item.value !== todoItemTypeMap.remark
)" :label="item.label" :value="item.value" :key="item.value" />
</el-select>
</el-form-item>
<el-form-item label="" prop="name" style="margin: 0; margin-left: 20px">
<el-input size="mini" v-model="queryParams.name" style="width:200px"
placeholder="请输入待办事项名称进行搜索"></el-input>
</el-form-item>
<el-form-item style="margin-left:20px">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">
搜索
</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<div class="table">
<el-table :data="tableList" ref="todoTableRef" border class="mt20" v-loading="loading"
highlight-current-row @current-change="handleCurrentChange(index,$event)">
<el-table-column align="center" width="300" property="targetName" label="名称" />
<el-table-column align="center" property="targetType" label="类型">
<template slot-scope="scope">
{{ todoItemTypeEnum.getLabel(scope.row.targetType) }}
</template>
</el-table-column>
<el-table-column align="center" property="status" label="状态">
<template slot-scope="scope">
<div :class="[getCheckedStatus(scope.row) ? 'green-button' : 'gary-button']">
{{ getCheckedStatus(scope.row) ? "已选" : "未选" }}</div>
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-checkbox :value="getCheckedStatus(scope.row)"
@change="handleCheckedChange(scope.row, $event)"></el-checkbox>
<!-- <el-button @click="handlePreview(scope.row)" class="ml10" size="mini" type="text">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
<div class="footer" style="margin-top:50px">
<el-button @click="handleCancel">取 消</el-button>
<el-button type="primary" @click="handleConfirm">确定</el-button>
</div>
</div>
</el-card>
</el-col>
<el-col :span="11" :offset="1" style="height:100%;min-height:500px;flex:1;">
<!-- <div class="sf-title mb5">事项预览</div> -->
<el-card>
<ArticlePreview v-if="selectPreview.targetType === todoItemTypeMap.article" style="height: 75vh; overflow-y: auto"
:articleId="selectPreview.targetId" :isTemp="false"/>
<DWViewer v-else-if="selectPreview.targetType === todoItemTypeMap.survey" style="height: 75vh; overflow-y: auto" :url="url" />
</el-card>
</el-col>
</el-row>

</div>
</template>

<script>
import ArticlePreview from "@/components/ArticlePreview";
import DWViewer from "@/components/DWViewer";
import { todoItemTypeMap } from "@/constant";
import { surveyPageList } from '@/api/hospital/followupManage/followupSurvey'
import { remindTemplateListApi } from '@/api/hospital/remindManage/remindList'
import { getArticlePageApi } from '@/api/hospital/followupManage/followupPlan'
export default {
enums: ["todoItemTypeEnum", "todoItemTypeMap"],
components: {
ArticlePreview,
DWViewer,
},
props: {
defaultValue: {
type: Array,
default: () => [],
},
form: {
type: Object,
default: () => ({}),
},
visiable: {
type: Boolean
}
},
data() {
return {
queryParams: {
targetType: todoItemTypeMap.survey,
name: "",
pageNum: 1,
pageSize: 10,
},
tableList: [],
selectList: [],
loading: false,
total: 0,
defaultCheckIds: null,
surveyId: "",
articleId: "",
showArticle: false,
// 当前选中的数据
selectPreview: {}
};
},
computed: {
url() {
return `${process.env.VUE_APP_SURVEY_PREFIX}/survey/diaowen-m.html?surveyId=${this.selectPreview.targetId}&sid=&tag=p-auth-0&t=${new Date().getTime()}`;
},
},
watch: {},
mounted() {
this.getList();
},
methods: {
open(defaultValue = []) {
this.selectList = [...defaultValue];
this.getList();
this.defaultCheckIds = this.getCheckedIds(this.selectList);
this.$emit('update:visiable', true)
this.promise = {};
return new Promise((resolve, reject) => {
this.promise.resolve = resolve;
this.promise.reject = reject;
});
},
// 搜索
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
resetQuery() {
this.queryParams.targetType === this.todoItemTypeMap.survey;
this.queryParams.name = "";
},
getList() {
this.tableList = [];
this.loading = true;
let apiMethod = ''
if (this.queryParams.targetType === this.todoItemTypeMap.survey) {
apiMethod = surveyPageList
} else if (this.queryParams.targetType === this.todoItemTypeMap.article) {
apiMethod = getArticlePageApi
} else if (this.queryParams.targetType === this.todoItemTypeMap.remind) {
apiMethod = remindTemplateListApi
}
apiMethod(this.queryParams).then(async (res) => {
if (res?.data?.list.length) {
const list = res.data.list;
list.forEach((item) => {
item.targetName = item.name;
item.targetType = this.queryParams.targetType;
item.targetId = item.id;
});
this.tableList = list || [];
this.total = Number(res.data.page.total);
// 默认选中第一条
const item = this.tableList[0];
await this.$nextTick()
this.$refs.todoTableRef?.setCurrentRow(item);
this.setPdf(item);
}
})
.finally(() => {
this.loading = false;
});
},
getCheckedIds(list) {
return list
.map((item) => item.targetId)
.sort()
.join(",");
},
reset() {
this.$emit('update:visable', false)
this.queryParams.name = "";
this.targetType = this.todoItemTypeMap.survey;
},
handleCancel() {
const newCheckedIds = this.getCheckedIds(this.selectList);
const close = () => {
this.reset();
this.promise.reject();
};
if (this.defaultCheckIds !== newCheckedIds) {
this.$modal.confirm("页面内信息尚未保存,是否继续确定退出?").then(close);
return false;
}
close();
},
handleConfirm() {
if (this.selectList.length === 0) {
this.$message.error("至少选择一个待办事项");
return;
}
this.reset();
this.promise.resolve(this.selectList);
},
getCheckedStatus(row) {
return this.selectList.some(
(item) => item.targetId === row.targetId && item.targetType === row.targetType
);
},
handleCheckedChange(row, checked) {
console.log('row=', row)
const selectList = this.selectList.filter((item) => item.targetType === row.targetType);
if (checked) {
if (selectList.length >= 5) {
this.$message.error("同一类型待办事项最多5个");
return;
}
this.selectList.push({ ...row });
} else {
const index = this.selectList.findIndex(
(item) => item.targetId === row.targetId && item.targetType === row.targetType
);
if (index > -1) {
this.selectList.splice(index, 1);
}
}
},
// 预览pdf
setPdf(row) {
const item = row;
// this.articleId = "";
// this.surveyId = "";
// console.log('setPdf=', row)
this.selectPreview = row
// if (item.targetType === this.todoItemTypeMap.article) {
// this.showArticle = true;
// this.articleId = item.targetId;
// } else if(item.targetType === this.todoItemTypeMap.survey) {
// this.showArticle = false;
// this.surveyId = item.surveyId;
// }
},
handleCurrentChange(index, row) {
console.log('TodoItemSelector=handleCurrentChangeindex=', index)
console.log('row', row)
if (!row) {
return
}
this.setPdf(row);
},
},
};
</script>
<style lang="scss" scoped>
.todo-selector {
.tree-menus {
border: 1px solid #dfe4ed;
height: 200px;
border-radius: 4px;
overflow-y: auto;
}
.footer {
text-align: center;
}
}
</style>

+ 0
- 579
src/views/hospital/patientManage/followupPatient/addPatient/index.vue Wyświetl plik

@@ -1,579 +0,0 @@
<template>
<div class="app-container">
<el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
<div class="patient-info" v-loading="isLoading">
<el-row>
<el-col :span="24">
<div class="sf-title">患者信息</div>
</el-col>
<el-form ref="formRef" :model="patientForm" :rules="formRules" label-width="100px">
<el-col :span="12">
<el-form-item label="姓名:" prop="name">
<el-input
:disabled="isDetail"
v-model.trim="patientForm.name"
placeholder="请输入姓名"
maxlength="20"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手机号:" prop="phoneNumber">
<el-input
v-model.trim="patientForm.phoneNumber"
placeholder="请输入手机号"
maxlength="11"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号:" prop="cardNumber">
<el-input
:disabled="isDetail"
v-model.trim="patientForm.cardNumber"
placeholder="请输入身份证号"
maxlength="18"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="责任医生:" prop="doctorIds">
<el-select
multiple
:value="patientForm.doctorIds"
placeholder="请选择责任医生"
v-loading="bindLoading"
@change="onChangeDoctor"
>
<el-option
v-for="item in doctorOptions"
:key="item.doctorId"
:label="item.userInfo && item.userInfo.userName"
:value="item.doctorId"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别:" prop="sex">
<el-radio-group v-model="patientForm.sex" disabled>
<el-radio :label="item.value" v-for="item in sexEnum.options" :key="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="年龄:" prop="age">
<el-input v-model="patientForm.age" disabled placeholder="请输入身份证获取年龄" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="patientId" label="就诊材料:" prop="materialList">
<div class="materials-box">
<!-- v-for="picItem in patientForm.materialList"
:key="picItem" -->
<div
class="image-box"
v-if="materialUrls && materialUrls.length > 0"
>
<el-image
:src="materialUrls[0]"
:preview-src-list="materialUrls"
/>
<el-tooltip placement="right">
<div slot="content">
<span>点击可查看所有材料</span>
</div>
<i class="el-icon-question"></i>
</el-tooltip>
</div>
<div v-else>暂无数据</div>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病标签:">
<div class="disease-container">
<el-tag
class="disease-item"
v-for="item in patientForm.labelList"
:key="item.id"
>
{{ item.labelName }}
</el-tag>
</div>
</el-form-item>
</el-col>
</el-form>
</el-row>
</div>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
<el-row>
<el-col :span="24">
<div class="sf-title">随访计划</div>
</el-col>
<el-col :span="24">
<vxe-grid ref="xGrid" v-bind="gridConfig" :columns="columns" :proxyConfig="proxyConfig">
<template #t_operate_default="{ row }">
<vxe-button type="text" status="primary" @click="onOperation(1, row)">
查看
</vxe-button>
<vxe-button
type="text"
:disabled="![0, 1].includes(row.status)"
status="danger"
@click="onDel(row)"
>
删除
</vxe-button>
</template>
<template #t_period_default="{ row }">
{{ row.periodNumber }}{{ periodUnitEnum.getLabel(row.periodUnit) }}
</template>
<template #t_lagTime_default="{ row }">
{{ row.lagTime ? parseTime(row.lagTime, "{y}-{m}-{d}") : "" }}
</template>
<template #bottom>
<div>
<vxe-button
status="primary"
icon="vxe-icon--plus"
style="width: 100%; max-width: 100%"
@click="onAddPlan"
>
添加随访计划
</vxe-button>
</div>
</template>
</vxe-grid>
</el-col>
</el-row>
</el-col>
</el-row>
<div class="footer">
<el-button style="width: 200px" @click="onCancel">取消</el-button>
<el-button type="primary" style="width: 200px" @click="onSubmit" v-loading="isSubmitting">
保存
</el-button>
</div>
<!-- 随访计划——查看 -->
<el-dialog
title="随访计划--查看"
v-if="followTaskDetailVisible"
:visible.sync="followTaskDetailVisible"
width="90%"
@close="(followTaskDetailVisible = false), getFollowList()"
:close-on-click-modal="false"
>
<div style="height: 800px">
<FollowTaskDetailComp :isAllList="false" :followRow="followRow"></FollowTaskDetailComp>
</div>
</el-dialog>
<CreateFollowPlan
v-if="createFollowPlanVisible"
:visible.sync="createFollowPlanVisible"
@success="initData"
></CreateFollowPlan>
<SubmitDiag
v-if="submitConfirmVisible"
:visible.sync="submitConfirmVisible"
@onOk="onSubmitApi"
/>
</div>
</template>
<script>
import { patientDetail, getDoctorAllList } from "@/api/hospital";
import { requireReg, phoneReg, idCardReg } from "@/regular/index";
import { commonGridConfig1 } from "@/config/vxeGrid";
import CreateFollowPlan from "./components/CreateFollowPlan";
import { validIdCard } from "@/utils/validate";
import { parseIDCard, calculateAge } from "@/utils/ruoyi";
import {
addPatient,
editPatient,
getFollowupPlanListApi,
bindDoctorApi,
unbindDoctorApi,
} from "@/api/hospital/patientManage/followupPatient";
import FollowTaskDetailComp from "./components/DetailDialog";
import {
deleteFollowDocumentApi,
} from "@/api/hospital/patientManage/followupPatient";
import SubmitDiag from "./components/SubmitDiag";
export default {
name: "AddPatient2",
enums: ["sexEnum", "cardTypeEnum", "periodUnitEnum", "followItemStatusEnum"],
components: {
CreateFollowPlan,
FollowTaskDetailComp,
SubmitDiag,
},
computed: {
isDetail() {
return !!this.patientId;
},
materialUrls() {
return this.patientForm.materialList ? this.patientForm.materialList.map(item => item.attachment) : []
}
},
data() {
return {
patientId: null,
isLoading: false,
patientForm: {
name: undefined,
phoneNumber: undefined,
cardType: "SF",
cardNumber: undefined,
sex: undefined,
age: undefined,
materialList: [],
doctorIds: [],
labelList: [],
},
formRules: {
name: [
requireReg("请输入姓名"),
{ max: 32, message: "长度不能超过32个字符", trigger: "blur" },
],
sex: [{ required: true, message: "输入完整证件号后自动选择", trigger: "change" }],
age: [{ required: true, message: "输入完整证件号后自动计算", trigger: "change" }],
phoneNumber: [requireReg("请输入手机号"), phoneReg()],
cardNumber: [requireReg("请输入身份证号"), idCardReg()],
doctorIds: [{ required: true, message: "请选择责任医生", trigger: "change" }],
},
// 责任医生下拉框数据
doctorOptions: [],
// 解绑医生禁用控制
bindLoading: false,
gridConfig: {
...commonGridConfig1,
showOverflow: false,
maxHeight: 600,
},
columns: [
{
field: "name",
title: "随访模板名称",
minWidth: 160,
},
{
field: "labelName",
title: "应用疾病",
minWidth: 100,
},
{
field: "deptName",
title: "应用科室",
minWidth: 100,
},
{
field: "doctorName",
title: "责任医生",
minWidth: 100,
},
{
field: "reportId",
title: "随访周期",
minWidth: 100,
slots: {
default: "t_period_default",
},
},
{
field: "lagTime",
title: "基线时间",
minWidth: 100,
slots: {
default: 't_lagTime_default'
}
},
{
field: "statusDesc",
title: "状态",
minWidth: 100,
},
{
field: "operation",
title: "操作",
width: 160,
fixed: "right",
slots: {
default: "t_operate_default",
},
},
],
proxyConfig: {
autoLoad: false,
response: {
result: "data.list",
total: "data.page.total",
},
ajax: {
query: async ({ page, ...args }) => {
const { currentPage: pageNum, pageSize } = page;
const queryParams = {
pageNum,
pageSize,
patientId: this.$route.params.id,
};
return getFollowupPlanListApi(queryParams);
},
},
},
// 创建随访计划,弹窗控制
createFollowPlanVisible: false,
// 点击保存按钮
isSubmitting: false,
// 查看随访计划数据
followRow: {},
// 随访计划查看弹窗
followTaskDetailVisible: false,
// 提交确认弹窗
submitConfirmVisible: false,
};
},
watch: {
"patientForm.cardNumber": "idCardGetInfo",
},
methods: {
// 加载责任医生下拉选项数据
async loadDoctorOptions() {
try {
const { data } = await getDoctorAllList();
this.doctorOptions = data || [];
} catch (err) {}
},
// 获取患者详情
async getPatientDetail() {
this.patientId = this.$route.params.id;
this.isLoading = true;
try {
const { data } = await patientDetail(this.patientId);
const { id, name, phoneNumber, cardNumber, materialList, doctors, labelList } = data;
const doctorIds = (doctors || []).map((item) => item.doctorId);
this.patientForm = {
id,
name,
phoneNumber,
cardNumber,
doctorIds,
materialList: materialList,
labelList
};
this.idCardGetInfo(cardNumber);
this.getFollowList();
} catch (err) {
console.log("err", err);
this.$message.error("获取患者信息失败");
} finally {
this.isLoading = false;
}
},
// 查询随访计划数据
async getFollowList() {
await this.$nextTick();
this.$refs.xGrid.commitProxy("query");
},
// 根据身份证号自动计算年龄和性别
idCardGetInfo(val) {
if (!validIdCard(val)) {
this.patientForm.sex = "";
this.patientForm.age = "";
return;
}
const { birthYear, birthMonth, birthDay, gender } = parseIDCard(val);
this.patientForm.sex = gender;
this.patientForm.age = calculateAge(`${birthYear}-${birthMonth}-${birthDay}`);
},
// 解绑医生
async unbindDoctor(val, newVal) {
this.bindLoading = true;
try {
await unbindDoctorApi({
patientId: this.patientId,
doctorId: val,
});
this.patientForm.doctorIds = newVal;
} catch (err) {
console.log("err", err);
this.$message.error("解绑医生失败");
} finally {
this.bindLoading = false;
}
},
// 绑定医生
async bindDoctor(val, newVal) {
this.bindLoading = true;
try {
await bindDoctorApi({
patientId: this.patientId,
doctorId: val,
});
this.patientForm.doctorIds = newVal;
} catch (err) {
console.log("err");
this.$message.error("绑定医生失败");
} finally {
this.bindLoading = false;
}
},
// 更改选中责任医生:可能是绑定操作,也可能是解绑操作,也可能是新增的不操作
async onChangeDoctor(val) {
console.log("changeDoctor=", val);
// 如果是新增,直接返回
if (!this.patientId) {
this.patientForm.doctorIds = val;
return;
}
// 是编辑的话,判断解绑还是绑定
const beforeLens = this.patientForm.doctorIds?.length || 0;
const currentLens = val?.length || 0;
// 删除
if (beforeLens > currentLens) {
await this.unbindDoctor(this.patientForm.doctorIds[beforeLens - 1], val);
} else if (beforeLens < currentLens) {
await this.bindDoctor(val[currentLens - 1], val);
}
},
// 查看
onOperation(type, row) {
if (type === 1) {
this.followRow = row;
this.followTaskDetailVisible = true;
}
},
// 新增计划
onAddPlan() {
if (!this.patientId) {
return this.$message.warning("请先保存患者信息再操作!");
}
this.createFollowPlanVisible = true;
console.log("点击了=", this.createFollowPlanVisible);
},
// 取消
onCancel() {
this.$router.go(-1);
},
// 点击提交
async onSubmitApi() {
const { id, name, phoneNumber, cardNumber, doctorIds } = this.patientForm;
if (!this.patientId) {
try {
this.isSubmitting = true;
const {
data: { id },
} = await addPatient({
name,
phoneNumber,
cardNumber,
doctorIds,
});
this.$message.success("创建成功");
this.$router.replace({
name: "EditPatient",
params: {
id,
},
});
} catch (err) {
console.log(err);
} finally {
this.isSubmitting = false;
}
} else {
// 如果是编辑
try {
this.isSubmitting = true;
await editPatient({
id,
phoneNumber,
doctorIds,
});
this.submitConfirmVisible = false
this.$message.success("修改成功");
} catch (err) {
console.log("err=", err);
} finally {
this.isSubmitting = false;
}
}
},
// 提交
onSubmit() {
this.$refs.formRef.validate(async (valid) => {
if (!valid) {
return;
}
// 如果是新增
this.submitConfirmVisible = true;
});
},
// 删除
async onDel(row) {
this.$modal.confirm("是否确认删除?").then(async () => {
await deleteFollowDocumentApi({
followId: row.id,
});
this.$message.success("操作成功");
this.getFollowList();
});
},
initData() {
if (this.$route.params.id) {
this.getPatientDetail();
}
this.loadDoctorOptions();
},
},
created() {
this.initData();
},
};
</script>
<style lang="scss" scoped>
.materials-box {
display: flex;
flex-wrap: wrap;
flex-direction: column;
.image-box {
position: relative;
width: 100px;
height: 100px;
i {
position: absolute;
top: 0;
right: 0;
transform: translate(100%, -50%);
font-size: 14px;
cursor: pointer;
}
}
.el-image {
width: 100px;
height: 100px;
}
}
.disease-container {
display: flex;
flex-wrap: wrap;
.disease-item {
margin-right: 10px;
margin-bottom: 10px;
}
}
.el-select {
width: 100%;
}
.doctor-select-container {
display: flex;
flex-direction: column;
}
.footer {
margin-top: 50px;
text-align: center;
}
</style>

+ 0
- 521
src/views/hospital/patientManage/followupPatient/patientList/index.vue Wyświetl plik

@@ -1,521 +0,0 @@
<template>
<div class="app-container">
<vxe-grid
class="grid"
ref="xGrid"
v-bind="gridConfig"
:formConfig="formConfig"
:columns="columns"
:span-method="spanMethod"
:proxyConfig="proxyConfig"
:toolbarConfig="toolbarConfig"
@toolbar-button-click="toolbarBtnClick"
>
<template #patient_num>
<div class="mb10" style="margin-left: 10px; font-size: 16px; font-weight: 500">
总计患者
<span style="color: #409eff; font-weight: bold">{{ total }}</span>
</div>
</template>
<template #date_item="{ data }">
<el-date-picker
style="width: 300px"
v-model="data.dateRange"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
@change="(val) => onDateChange(val, data)"
></el-date-picker>
</template>
<template #dept_item="{ data }">
<TreeDept
v-model="data.deptId"
clearable
style="width: 300px"
:options="deptList"
:autoFetch="false"
:props="{ emitPath: false }"
@change="(value, deptItem) => onChangeDept(value, deptItem, data)"
/>
</template>
<template #btn_items>
<vxe-button type="submit" status="primary" content="查询"></vxe-button>
<vxe-button type="reset" content="重置"></vxe-button>
</template>
<template #table_cardType="{ row }">
<span>{{ cardTypeEnum.getLabel(row.cardType) }}</span>
</template>
<template #createTime_t_d="{ row }">
{{ row.doctor && row.doctor.reportStatus === 1 ? row.doctor.updateTime : '--' }}
</template>
<template #reportStatus_t_d="{ row }">
<span :style="{color: reportStatusEnum.enum[row.doctor.reportStatus].color}">
{{ reportStatusEnum.getLabel(row.doctor.reportStatus) }}
</span>
</template>
<template #isFollowed_t_d="{row}">
{{ row.doctor.isFollowed == 0 ? '否' : row.doctor.isFollowed == 1 ? '是' : '--' }}
</template>
<template #operation="{ row }">
<vxe-button type="text" status="primary" @click="onEdit(row)">编辑</vxe-button>
<vxe-button type="text" status="danger" @click="onDel(row)">删除</vxe-button>
</template>
</vxe-grid>
</div>
</template>
<script>
import { commonGridConfig1 } from "@/config/vxeGrid";
import { getTreeHospDeptByPatient } from "@/api/admin";
import { getDoctorAllList, getMedicalLabel, patientPageList, delPatient } from "@/api/hospital";
import { getReportStatusApi } from "@/api/hospital/patientManage/followupPatient";
import TreeDept from "@/components/TreeDept";
export default {
name: "PatientList2",
components: {
TreeDept,
},
enums: ["reportStatusEnum", "cardTypeEnum"],
data() {
return {
gridConfig: {
...commonGridConfig1,
},
formConfig: {
titleWidth: 140,
titleAlign: "right",
titleColon: true,
items: [
{
field: "dateRange",
title: "报到时间",
itemRender: {},
slots: {
default: "date_item",
},
},
{
field: "deptId",
title: "科室",
itemRender: {},
slots: {
default: "dept_item",
},
},
{
field: 'name',
title: '患者姓名',
itemRender: {
name: "VxeInput",
props: {
placeholder: "请输入患者姓名"
}
}
},
{
field: "doctorId",
title: "责任医生",
itemRender: {
name: "VxeSelect",
options: [],
props: {
clearable: true,
placeholder: "请选择责任医生",
},
optionProps: {
value: "doctorId",
label: "userName",
},
},
},
{
field: "labelId",
title: "诊断疾病",
itemRender: {
name: "VxeSelect",
options: [],
props: {
clearable: true,
placeholder: "请选择诊断疾病",
},
optionProps: {
value: "id",
label: "name",
},
},
},
{
field: "reportStatus",
title: "报到状态",
itemRender: {
name: "VxeSelect",
options: [],
props: {
clearable: true,
placeholder: "请选择报到状态",
},
optionProps: {
value: "value",
label: "label",
},
},
},
{
field: "isFollowed",
title: "是否配置随访计划",
itemRender: {
name: "VxeSelect",
options: [
{
value: 0,
label: '否'
},
{
value: 1,
label: '是'
}
],
props: {
clearable: true,
placeholder: "请选择",
},
optionProps: {
},
},
},
{ itemRender: {}, slots: { default: "btn_items" } },
{
span: 24,
itemRender: {},
slots: {
default: "patient_num",
},
},
],
},
columns: [
{
field: "id",
title: "患者ID",
minWidth: 100,
},
{
field: "name",
title: "患者名称",
minWidth: 200,
},
{
field: "sex",
title: "患者性别",
minWidth: 200,
},
{
field: "cardType",
title: "证件类型",
minWidth: 200,
slots: {
default: "table_cardType",
},
},
{
field: "cardNumber",
title: "证件号",
minWidth: 200,
},
{
field: "phoneNumber",
title: "联系电话",
minWidth: 150,
},
{
field: 'doctor.deptName',
title: '科室名称',
minWidth: 150
},
{
field: "createTime",
title: "报到时间",
minWidth: 200,
slots: {
default: 'createTime_t_d'
}
},
{
field: 'doctor.userInfo.userName',
title: '医生姓名',
minWidth: 150
},
{
field: "status",
title: "报到状态",
minWidth: 160,
slots: {
default: "reportStatus_t_d",
},
},
{
field: 'isFollowed',
title: '是否配置随访计划',
minWidth: 160,
slots: {
default: 'isFollowed_t_d'
}
},
{
field: "operation",
title: "操作",
width: 200,
fixed: "right",
slots: {
default: "operation",
},
},
],
proxyConfig: {
form: true,
response: {
result: "list",
total: "page.total",
},
ajax: {
query: async ({ form, page, ...args }) => {
const { dateRange, deptId, doctorId, labelId, name, reportStatus, isFollowed } = form;
const { currentPage: pageNum, pageSize } = page;
const queryParams = {
beginTime: dateRange?.[0] ? dateRange?.[0] + " 00:00:00" : undefined,
endTime: dateRange?.[1] ? dateRange?.[1] + " 23:59:59" : undefined,
deptId,
doctorId,
labelId,
name,
reportStatus,
isFollowed,
pageNum,
pageSize,
};
const { data: { list, page:page2} } = await patientPageList(queryParams);
const params = {
list: [],
page: page2
}
list.forEach(item => {
const { doctors, ...otherInfo } = item;
const lens = doctors?.length
if (doctors?.length > 0) {
doctors.forEach((item2, index) => {
if (index === 0) {
params.list.push({
...otherInfo,
doctor: item2,
rowspan: lens
});
} else {
params.list.push({
...otherInfo,
doctor: item2,
rowspan: 0
});
}
})
} else {
params.list.push({
...otherInfo,
doctor: {
userInfo: {}
},
rowspan: 1
});
}
})
this.total = page2.total || 0;
console.log('params=', params, page)
return params;
},
},
},
toolbarConfig: {
buttons: [
{
code: "add",
name: "新增患者",
status: "success",
icon: "vxe-icon--plus",
},
{
code: "download",
name: "下载数据模板",
status: "danger",
icon: "vxe-icon--download",
},
],
},
deptList: [],
diseaseList: [],
total: 0,
// 患者状态查看按钮点击查看报道详情
reportInfo: [],
reportLoading: false,
};
},
methods: {
/*获取科室数据*/
async getDeptList() {
const res = await getTreeHospDeptByPatient();
this.deptList = res.data || [];
},
// 获取医生下拉框数据
async findDoctorList() {
const { data } = await getDoctorAllList();
await this.$nextTick();
const $grid = this.$refs.xGrid;
if ($grid) {
const doctorItem = $grid.getFormItems(3);
doctorItem.itemRender.options =
data.map((item) => {
const { userInfo, ...params } = item;
return {
...params,
...userInfo,
};
}) || [];
}
console.log("res=", data);
},
// 获取疾病下拉框数据
async findDiseaseList(deptId) {
const { data } = await getMedicalLabel({
deptId,
});
await this.$nextTick();
const $grid = this.$refs.xGrid;
if ($grid) {
const diseaseItem = $grid.getFormItems(4);
diseaseItem.itemRender.options = data;
}
},
async onDateChange(val, data) {
if (val && val.length > 0) {
data.reportStatus = 1
await this.$nextTick();
const $grid = this.$refs.xGrid;
if ($grid) {
const reportItem = $grid.getFormItems(5)
reportItem.itemRender.props = {
...reportItem.itemRender.props,
disabled: true
}
}
} else {
data.reportStatus = null
await this.$nextTick();
const $grid = this.$refs.xGrid;
if ($grid) {
const reportItem = $grid.getFormItems(5)
reportItem.itemRender.props = {
...reportItem.itemRender.props,
disabled: false
}
}
}
console.log('val=', val)
console.log('data=', data)
},
// 获取报到状态
async findReportStatusOptions() {
await this.$nextTick();
const $grid = this.$refs.xGrid
if ($grid) {
const reportItem = $grid.getFormItems(5)
reportItem.itemRender.options = this.reportStatusEnum.options
}
},
// 加载下拉框数据
loadOptions() {
this.getDeptList();
this.findDoctorList();
this.findDiseaseList();
this.findReportStatusOptions();
},
// 选择科室
onChangeDept(value, deptItem, formData) {
console.log("value=", value, deptItem, formData);
formData.labelId = null;
this.findDiseaseList(value);
},
toolbarBtnClick({ code, button, $event }) {
console.log("code=", code);
console.log("button=", button);
console.log("$event=", $event);
if (code === "download") {
window.open(process.env.VUE_APP_BASE_PATH + "template/patientTemplate.xlsx");
} else if (code === "add") {
this.$router.push({
path: "/patientManage/followupPatient/add",
});
}
},
async onReportStatusDetail(row) {
console.log("查看患者详情=", row);
this.reportInfo = [];
try {
this.reportLoading = true;
const { data } = await getReportStatusApi(row.id);
this.reportInfo = data || [];
} catch (err) {
console.log(err);
} finally {
this.reportLoading = false;
}
},
// 编辑
onEdit(row) {
if (!row.id) {
return this.$message.warning('缺失患者id')
}
this.$router.push({
name: 'EditPatient',
params: {
id: row.id
}
})
},
// 删除
async onDel(row) {
this.$modal.confirm("是否确认删除?").then(async () => {
await delPatient(row.id);
this.$message.success("操作成功");
await this.$nextTick();
const $grid = this.$refs.xGrid;
$grid.commitProxy("query");
});
},
spanMethod({ row, rowIndex, columnIndex }) {
if ([7, 8, 9, 10].includes(columnIndex)) {
return {
rowspan: 1,
colspan: 1
}
}
return {
rowspan: row.rowspan,
colspan: 1
}
}
},
created() {
this.loadOptions();
},
};
</script>
<style lang="scss" scoped>
::v-deep .vxe-grid--form-wrapper {
.vxe-select {
width: 300px;
}
.vxe-input {
width: 300px
}
}
</style>

+ 0
- 73
src/views/hospital/teamManage/doctorTeam/list/components/MemberForm.vue Wyświetl plik

@@ -1,73 +0,0 @@
<template>
<div>
<el-form-item label="团队长:" prop="leader" required>
<member-select
:value="leader"
@updateLeader="updateLeader"
v-bind="$attrs"
v-on="$listeners"
></member-select>
</el-form-item>
<!-- :prop="`users.${index}.userId`" -->
<el-form-item
v-for="(item, index) in users"
:key="`${item.nanoid}${item.userId}`"
:label="`团队成员${index + 1}:`"
inline-message
:rules="rules.userId"
>
<member-select2
:users="users"
:leader="leader"
:value="item"
:index="index"
@updateUsers="updateUsers"
v-on="$listeners"
></member-select2>
</el-form-item>
</div>
</template>
<script>
import MemberSelect from "./MemberSelect.vue";
import MemberSelect2 from "./MemberSelect2.vue";
import XeUtils from "xe-utils";
export default {
name: "MemberForm",
components: {
MemberSelect,
MemberSelect2,
},
props: {
leader: {
type: Object,
default: () => ({}),
},
users: {
type: Array,
default: () => [],
},
rules: {
type: Object
}
},
data() {
return {
};
},
methods: {
updateLeader(value) {
console.log("value=", value);
this.$emit("update:leader", value);
},
updateUsers(value, index) {
let newUsers = XeUtils.clone(this.users, true);
newUsers[index] = XeUtils.clone(value);
this.$emit("update:users", newUsers);
console.log("newUsers=", newUsers);
},
},
mounted() {
console.log("this.$attrs=", this.rules);
},
};
</script>

+ 0
- 214
src/views/hospital/teamManage/doctorTeam/list/components/MemberSelect.vue Wyświetl plik

@@ -1,214 +0,0 @@
<template>
<div>
<el-input :value="value.doctorName" placeholder="请选择">
<template #suffix>
<div style="padding-right: 20px">
<el-button :disabled="type === 2" type="text" @click="onOpen">选择</el-button>
</div>
</template>
</el-input>
<!-- @close="onClose" -->
<vxe-modal
v-if="show"
type="modal"
v-model="show"
v-bind="modalConfig"
title="选择团队长"
:before-hide-method="onBeforeClose"
>
<template #default>
<vxe-grid ref="gridRef" v-bind="gridConfig" @radio-change="onRadioChange"></vxe-grid>
</template>
<template #footer>
<div class="footer-btn">
<vxe-button style="margin-right: 10px" @click="onClose">取消</vxe-button>
<vxe-button status="primary" @click="onConfirm">保存</vxe-button>
</div>
</template>
</vxe-modal>
</div>
</template>
<script>
import { commonGridConfig1 } from "@/config/vxeGrid";
import { modalConfigMap, combineConfig } from "@/config/vxeModal";
import { getLeaderDoctorListApi } from "@/api/hospital/doctorManage/doctor";
export default {
name: "MemberSelect",
props: {
value: {
type: Object,
default: () => null,
},
type: {
type: Number,
default: 1
}
},
computed: {
isDisableSelect: function() {
return this.type === 2;
}
},
data() {
return {
modalConfig: {
...modalConfigMap.get("default"),
position: {
top: 50
}
},
gridConfig: {
...commonGridConfig1,
maxHeight: 600,
keepSource: true,
rowConfig: {
keyField: "userId",
isCurrent: true,
isHover: true,
},
radioConfig: {
strict: true,
reserve: true,
trigger: "row",
},
formConfig: {
titleColon: true,
titleAlign: "right",
data: {},
items: [
{
field: "doctorName",
title: "",
itemRender: {
name: "VxeInput",
props: {
placeholder: "请输入员工姓名",
},
},
},
{
itemRender: {
name: "VxeButtonGroup",
options: [
{
type: "submit",
content: "搜索",
status: "primary",
},
{
type: "reset",
content: "重置",
},
],
},
},
],
},
columns: [
{
type: "radio",
width: 100,
},
{
type: "seq",
title: "序号",
width: 100,
},
{
field: "doctorName",
title: "姓名",
width: 150,
},
{
field: "cardNumber",
title: "证件号",
minWidth: 200,
},
{
field: "phoneNumber",
title: "手机号",
minWidth: 200,
},
// {
// field: "operation",
// slots: {
// default: "operation_t_d"
// }
// },
],
proxyConfig: {
form: true,
autoLoad: false,
response: {
result: "data.list",
total: "data.page.total",
},
ajax: {
query: ({ page, form }) => {
const { currentPage: pageNum, pageSize } = page;
console.log("page=", page);
console.log("form=", form);
const params = {
pageNum,
pageSize,
...form
};
return getLeaderDoctorListApi(params);
},
},
},
},
show: false,
selectDoctor: null,
};
},
methods: {
onOpen() {
this.show = true;
this.$nextTick(() => {
console.log("打开=");
this.$refs.gridRef.commitProxy("query");
this.selectDoctor = this.value ? { ...this.value } : null;
this.$refs.gridRef.setRadioRow(this.selectDoctor);
});

console.log("this.selectDoctor=", this.selectDoctor);
},
onBeforeClose() {
console.log("关闭前");
this.selectDoctor = null;
this.$refs.gridRef.clearRadioRow();
this.$refs.gridRef.clearRadioReserve();
this.show = false;
},
onClose() {
console.log("close=");
this.$nextTick(() => {
this.selectDoctor = null;
this.$refs.gridRef.clearRadioRow();
this.$refs.gridRef.clearRadioReserve();
this.show = false;
});
},
onConfirm() {
if (!this.selectDoctor) {
return this.$message.warning("请选择团队长");
}
this.$emit("updateLeader", this.selectDoctor);
this.show = false;
},
onRadioChange({ newValue, oldValue, ...args }) {
this.selectDoctor = newValue;
},
},
mounted() {
console.log('this.type=', this.type)
}
};
</script>
<style lang="scss" scoped>
.footer-btn {
display: flex;
justify-content: center;
}
</style>

+ 0
- 275
src/views/hospital/teamManage/doctorTeam/list/components/MemberSelect2.vue Wyświetl plik

@@ -1,275 +0,0 @@
<template>
<div>
<div class="input-content">
<el-input :value="value.userName" placeholder="请选择">
<template #suffix>
<div style="padding-right: 20px">
<el-button type="text" @click="onOpen">选择</el-button>
</div>
</template>
</el-input>
<div class="btn-content">
<i v-if="index >= users.length - 1 && users.length < 9" class="el-icon-circle-plus" @click="onAdd"></i>
<i v-if="users.length > 1" class="el-icon-remove" @click="onDel"></i>
</div>
</div>
<!-- @close="onClose" -->
<vxe-modal
v-if="show"
type="modal"
v-model="show"
v-bind="modalConfig"
title="选择团队成员"
:before-hide-method="onBeforeClose"
>
<template #default>
<vxe-grid ref="gridRef" v-bind="gridConfig" @radio-change="onRadioChange">
<template #operation_t_d="{ row }">
<vxe-button type="text" status="info" v-if="isSelect(row)">已选择</vxe-button>
<vxe-button type="text" status="primary" v-else>未选择</vxe-button>
</template>
</vxe-grid>
</template>
<template #footer>
<div class="footer-btn">
<vxe-button style="margin-right: 10px" @click="onClose">取消</vxe-button>
<vxe-button status="primary" @click="onConfirm">保存</vxe-button>
</div>
</template>
</vxe-modal>
</div>
</template>
<script>
import { commonGridConfig1 } from "@/config/vxeGrid";
import { modalConfigMap } from "@/config/vxeModal";
import { getTrustDoctorListApi } from "@/api/hospital/doctorManage/doctor";
export default {
name: "MemberSelect",
props: {
value: {
type: Object,
default: () => null,
},
index: {
type: Number,
default: 0,
},
users: {
type: Array,
default: () => [],
},
leader: {
type: Object,
default: () => ({})
}
},
data() {
return {
modalConfig: {
...modalConfigMap.get("default"),
position: {
top: 50,
},
},
gridConfig: {
...commonGridConfig1,
maxHeight: 600,
keepSource: true,
rowConfig: {
keyField: "userId",
isCurrent: true,
isHover: true,
},
radioConfig: {
strict: true,
reserve: true,
trigger: "row",
checkMethod: ({ row }) => {
return (
(this.users.findIndex((item) => row.userId === item.userId) < 0 && this.leader.userId !== row.userId) ||
this.value?.userId === row.userId
);
},
},
formConfig: {
titleColon: true,
titleAlign: "right",
data: {},
items: [
{
field: "name",
title: "",
itemRender: {
name: "VxeInput",
props: {
placeholder: "请输入员工姓名",
},
},
},
{
itemRender: {
name: "VxeButtonGroup",
options: [
{
type: "submit",
content: "搜索",
status: "primary",
},
{
type: "reset",
content: "重置",
},
],
},
},
],
},
columns: [
{
type: "radio",
width: 100,
},
{
type: "seq",
title: "序号",
width: 100,
},
{
field: "userName",
title: "姓名",
width: 150,
},
{
field: "userIdcardNum",
title: "证件号",
minWidth: 180,
},
{
field: "userPhone",
title: "手机号",
minWidth: 160,
},
{
field: "operation",
title: "状态",
slots: {
default: "operation_t_d",
},
width: 80,
fixed: "right",
},
],
proxyConfig: {
form: true,
autoLoad: false,
response: {
result: "data.list",
total: "data.page.total",
},
ajax: {
query: ({ page, form }) => {
const { currentPage: pageNum, pageSize } = page;
console.log("page=", page);
console.log("form=", form);
const params = {
pageNum,
pageSize,
...form
};
return getTrustDoctorListApi(params);
},
},
},
},
show: false,
selectDoctor: null,
};
},
methods: {
isSelect(row) {
//
return this.users.filter(item => {
if (item.userId === this.value.userId) {
if (this.value.userId !== this.selectDoctor?.userId) {
return false
} else {
return true
}
}
return true
}).findIndex(item => row.userId === item.userId) >= 0 || row.userId === this.selectDoctor?.userId || this.leader.userId === row.userId

},
onOpen() {
this.show = true;
this.$nextTick(() => {
console.log("打开=");
this.$refs.gridRef.commitProxy("query");
this.selectDoctor = this.value ? { ...this.value } : null;
this.$refs.gridRef.setRadioRow(this.selectDoctor);
});

console.log("this.selectDoctor=", this.selectDoctor);
},
onBeforeClose() {
console.log("关闭前");
this.selectDoctor = null;
this.$refs.gridRef.clearRadioRow();
this.$refs.gridRef.clearRadioReserve();
this.show = false;
},
onClose() {
console.log("close=");
this.$nextTick(() => {
this.selectDoctor = null;
this.$refs.gridRef.clearRadioRow();
this.$refs.gridRef.clearRadioReserve();
this.show = false;
});
},
onConfirm() {
if (!this.selectDoctor) {
return this.$message.warning("请选择团队成员");
}
this.$emit("updateUsers", this.selectDoctor, this.index);
this.show = false;
},
onRadioChange({ newValue, oldValue, ...args }) {
this.selectDoctor = newValue;
},
onAdd() {
this.$emit('memberAdd', this.index)
},
onDel() {
this.$emit('memberDel', this.index)
}
},
};
</script>
<style lang="scss" scoped>
.input-content {
display: flex;
align-items: center;
.btn-content {
display: flex;
align-items: center;
padding-left: 10px;
width: 80px;
i {
font-size: 28px;
cursor: pointer;
}
i.el-icon-circle-plus {
margin-right: 6px;
color: #1890ff;
}
i.el-icon-remove {
color: red;
}
}
}
.footer-btn {
display: flex;
justify-content: center;
}
</style>

+ 0
- 420
src/views/hospital/teamManage/doctorTeam/list/index.vue Wyświetl plik

@@ -1,420 +0,0 @@
<template>
<div class="app-container">
<vxe-grid ref="gridRef" v-bind="gridConfig" @toolbar-button-click="toolbarBtnClick">
<template #dept_f_d="{ data }">
<TreeDept ref="treeDept" v-model="data.deptId" clearable />
</template>
<template #member_t_d="{ row }">
<el-popover placement="bottom" width="200" trigger="click">
<template #reference>
<vxe-button type="text" status="primary" @click="onShow(row.id)">查看</vxe-button>
</template>
<div class="team-member-content" v-loading="loadingMember">
<div
:class="['team-item', item.type === 2 ? 'team-item-blue' : '']"
v-for="item in teamMembers"
:key="item.id"
>
<div class="team-label" v-if="item.type === 1">成员:</div>
<div class="team-label" v-else-if="item.type === 2">团队长:</div>
<div class="team-name">{{ item.doctorName }}</div>
</div>
</div>
</el-popover>
</template>
<template #operation_t_d="{ row }">
<vxe-button type="text" status="primary" @click="onEditTeam(row.id)">编辑</vxe-button>
<vxe-button type="text" status="danger" @click="onDelTeam(row.id)">删除</vxe-button>
</template>
</vxe-grid>
<CommonModal
v-if="visible"
:visible.sync="visible"
:title="title"
:position="{
top: 50,
}"
:closeCb="closeCb"
>
<template #default>
<div class="form-content">
<el-form ref="formRef" :model="formData" :rules="rules" label-width="110px">
<el-form-item label="团队名称:" prop="name" inline-message>
<el-input v-model="formData.name" placeholder="请输入团队名称" size="small" />
</el-form-item>
<MemberForm
:type="type"
:rules="rules"
:leader.sync="formData.leader"
:users.sync="formData.users"
@memberAdd="onMemberAdd"
@memberDel="onMemberDel"
/>
</el-form>
</div>
</template>
<template #footer>
<div class="btn-content">
<el-button style="margin-right: 10px" @click="onClose">取消</el-button>
<el-button type="primary" @click="onSubmit" :loading="isLoading">确定</el-button>
</div>
</template>
</CommonModal>
</div>
</template>
<script>
import { commonGridConfig1 } from "@/config/vxeGrid";
import {
doctorTeamListApi,
updateDoctorTeamApi,
delDoctorTeamApi,
getDoctorTeamMemberApi,
detailTeamApi,
} from "@/api/hospital/teamManage/doctor";
import MemberForm from "./components//MemberForm.vue";
import TreeDept from "@/components/TreeDept";
import { requireReg } from "@/regular";
import { nanoid } from "nanoid";
export default {
name: "DoctorTeam",
components: {
MemberForm,
TreeDept,
},
data() {
var validateLeader = (rule, value, callback) => {
if (!value.id) {
callback(new Error("请选择团队长"));
return;
}
callback();
};
var validateUsers = (rule, value, callback) => {
console.log("value=", value);
if (!value) {
callback(new Error("请选择成员"));
return;
}
callback();
};
return {
gridConfig: {
...commonGridConfig1,
showOverflow: false,
maxHeight: 600,
formConfig: {
titleColon: true,
titleAlign: "right",
titleWidth: "90px",
data: {
name: undefined,
deptId: undefined,
},
items: [
{
field: "deptId",
title: "科室名称",
itemRender: {},
slots: {
default: "dept_f_d",
},
},
{
field: "name",
title: "团队名称",
itemRender: {
name: "VxeInput",
props: {
placeholder: "请输入团队名称",
},
},
},
{
itemRender: {
name: "VxeButtonGroup",
options: [
{ type: "submit", content: "搜索", status: "primary" },
{ type: "reset", content: "重置" },
],
},
},
],
},
columns: [
{
type: "seq",
title: "序号",
width: 100,
},
{
field: "name",
title: "团队名称",
minWidth: 200,
},
{
field: "deptName",
title: "科室名称",
minWidth: 200,
},
{
field: "cy",
title: "成员",
minWidth: 100,
slots: {
default: "member_t_d",
},
},
{
field: "operation",
title: "操作",
width: 200,
fixed: "right",
slots: {
default: "operation_t_d",
},
},
],
proxyConfig: {
form: true,
response: {
result: "data.list",
total: "data.page.total",
},
ajax: {
query: ({ form, page }) => {
console.log("form=", form);
const { currentPage: pageNum, pageSize } = page;
const queryParams = {
pageNum,
pageSize,
...form,
};
return doctorTeamListApi(queryParams);
},
},
},
toolbarConfig: {
buttons: [
{
code: "add",
name: "新增团队",
status: "primary",
icon: "vxe-icon--plus",
},
],
},
type: 1,
title: "新增团队",
},
visible: false,
formData: {
name: "",
leader: {},
users: [
{
nanoid: nanoid(),
userId: null,
},
],
},
rules: {
name: [requireReg("请输入团队名称")],
leader: [
{
validator: validateLeader,
},
],
userId: [
{
validator: validateUsers,
},
],
},
isLoading: false,
loadingMember: false,
teamMembers: [],
};
},
methods: {
toolbarBtnClick({ code, button, $event }) {
console.log("提交=", code, button, $event);
if (code === "add") {
this.type = 1;
this.title = "新增团队";
this.formData = {
name: "",
leader: {},
users: [
{
nanoid: nanoid(),
userId: null,
},
],
};
this.visible = true;
}
},
onMemberAdd(index) {
console.log("index=", index);
this.formData.users.splice(index + 1, 0, {
nanoid: nanoid(),
});
},
onMemberDel(index) {
console.log("index=", index);
this.formData.users.splice(index, 1);
},
closeCb() {
this.formData = {
name: "",
leader: {},
users: [
{
nanoid: nanoid,
userId: "",
},
],
};
this.$nextTick(() => {
this.$refs.formRef.clearValidate();
});
},
onClose() {
this.formData = {
name: "",
leader: {},
users: [
{
nanoid: nanoid,
userId: "",
},
],
};
this.$nextTick(() => {
this.$refs.formRef.clearValidate();
this.visible = false;
});
},
onSubmit() {
this.$refs.formRef.validate(async (isValid) => {
this.isLoading = true;
if (!isValid) {
this.isLoading = false;
return;
}
const { name, leader, users, id } = this.formData;
const params = {
id: id ? id : undefined,
name,
leaderDoctorId: leader.id,
ywxUserIds: users.filter(item => !!item.userId).map((item) => item.userId),
// }
};
try {
await updateDoctorTeamApi(params);
this.$message.success("操作成功");
this.visible = false;
this.$nextTick(() => {
this.$refs.gridRef.commitProxy("query");
});
} catch (err) {
} finally {
this.isLoading = false;
}
});
},
async onEditTeam(teamId) {
const { data } = await detailTeamApi(teamId);
console.log("data=", data);
const { name, id, followTeamDoctors } = data;
let leader = (followTeamDoctors || []).find((item) => item.type === 2) || {};
let users =
followTeamDoctors
.filter((item) => item.type === 1)
.map((item) => {
return {
...item,
userName: item.doctorName,
};
}) || [];
this.formData = {
id,
name,
leader: {
...leader,
id: leader.doctorId,
},
users:
users.length === 0
? [
{
nanoid: nanoid(),
userId: null,
},
]
: users,
};
this.type = 2;
this.title = "编辑团队";
this.visible = true;
},
onDelTeam(id) {
this.$modal
.confirm("删除后团队成员将无法继续开展随访业务是否继续操作")
.then(async () => {
console.log("是否走进了这里");
await delDoctorTeamApi(id);
this.$message.success("操作成功");
this.$nextTick(() => {
this.$refs.gridRef.commitProxy("query");
});
})
.catch(() => {});
},
async onShow(id) {
this.loadingMember = true;
try {
const { data } = await getDoctorTeamMemberApi(id);
this.teamMembers = data || [];
console.log("this.teamMembers=", data);
} catch (err) {
} finally {
this.loadingMember = false;
}
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .el-form-item__error {
line-height: 5px;
}
.btn-content {
display: flex;
justify-content: center;
}
.team-member-content {
overflow: auto;
display: flex;
flex-direction: column;
align-items: center;
max-height: 200px;
.team-item {
display: flex;
width: 100%;
.team-label {
width: 80px;
}
.team-name {
flex: 1;
}
}
.team-item-blue {
color: #409eff;
}
}
.form-content {
overflow: auto;
max-height: 400px;
}
</style>

+ 8
- 6
src/views/statisticalManage/followupStatistical/detail/index.vue Wyświetl plik

@@ -84,13 +84,13 @@
>
<el-table-column align="center" property="itemType" label="类型" :class-name="'column-style-cursor'">
<template slot-scope="scope">
{{ todoItemTypeEnum.getLabel(scope.row.itemType) }}
{{ TODO_TYPE.getLabelByValue(scope.row.itemType) }}
</template>
</el-table-column>
<el-table-column align="center" property="itemName" label="名称" :class-name="'column-style-cursor'"/>
<el-table-column align="center" property="status" label="状态" :class-name="'column-style-cursor'">
<template slot-scope="scope">
{{ todoItemStatusEnum.getLabel(scope.row.status) }}
{{ TODO_STATUS.getLabelByValue(scope.row.status) }}
</template>
</el-table-column>
</el-table>
@@ -105,12 +105,12 @@
<el-card height="100%" :body-style="{ height: '100%' }">
<div style="height: 100%;overflow-y: scroll;" v-if="previewItem" :key="previewItem && previewItem.itemId">
<DWViewer
v-if="previewItem.itemType === todoItemTypeMap.survey"
v-if="previewItem.itemType === TODO_TYPE.getValueByName('survey')"
:url="`${surveyPrefix}/survey/answer-data.html?surveyId=${previewItem.itemId}`"
/>
<ArticlePreview
:isTemp="false"
v-else-if="previewItem.itemType === todoItemTypeMap.article"
v-else-if="previewItem.itemType === TODO_TYPE.getValueByName('article')"
:articleId="previewItem.itemId"
/>
</div>
@@ -121,18 +121,20 @@
</el-container>
</template>
<script>
import { statisticalDetail, statisticalTasks, followupTodoItem } from "@/api/common";
import { statisticalDetail, followupTodoItem } from "@/api/common";
import DWViewer from "@/components/DWViewer";
import ArticlePreview from "@/components/ArticlePreview";
import { TODO_TYPE, TODO_STATUS } from '@/enums'
export default {
name: "FollowUpDetail",
enums: ["todoItemTypeEnum", "todoItemStatusEnum", "todoItemTypeMap"],
components: {
DWViewer,
ArticlePreview,
},
data() {
return {
TODO_TYPE,
TODO_STATUS,
surveyPrefix: process.env.VUE_APP_SURVEY_PREFIX || "",
baseInfo: {},
followTaskDocuments: [],


+ 15
- 21
src/views/statisticalManage/followupStatistical/listPage/index.vue Wyświetl plik

@@ -45,9 +45,9 @@
/>
</el-select>
</el-form-item>
<el-form-item label="医生名称" prop="name">
<el-form-item label="医生名称" prop="doctorId">
<el-select
v-model="queryParams.name"
v-model="queryParams.doctorId"
placeholder="请输入医生名称"
clearable
filterable
@@ -55,9 +55,9 @@
>
<el-option
v-for="item in doctorList"
:key="item.doctorId"
:value="item.userName"
:label="item.userName"
:key="item.id"
:value="item.id"
:label="item.doctorName"
></el-option>
</el-select>
</el-form-item>
@@ -80,7 +80,7 @@
</el-form-item>
</el-form>
<div class="overview">
<div class="overview-item">
<!-- <div class="overview-item">
<div class="title-label">
<span>诊后患者总计</span>
<el-tooltip content="已添加至随访系统的患者总数" placement="top">
@@ -121,7 +121,7 @@
<div class="num">
{{ viewData.patientCompletedPercent ? viewData.patientCompletedPercent + "%" : 0 }}
</div>
</div>
</div> -->
<div class="overview-item">
<div class="title-label">
<span>随访计划完成率</span>
@@ -133,7 +133,7 @@
{{ viewData.taskCompletedPercent ? viewData.taskCompletedPercent + "%" : 0 }}
</div>
</div>
<div class="overview-item">
<!-- <div class="overview-item">
<div class="title-label">
<span>诊后线上回流率</span>
<el-tooltip content="通过随访小程序跳转至互联网医院小程序的患者数/已添加至随访系统的患者总数" placement="top">
@@ -143,7 +143,7 @@
<div class="num">
--
</div>
</div>
</div> -->
</div>

<div style="display: flex; justify-content: space-between; padding-bottom: 8px">
@@ -212,11 +212,11 @@
/>
<el-table-column align="center" label="随访状态" width="100">
<template slot-scope="scope">
<el-tag :type="FOLLOWUP_STATUS.getTagByValue(scope.row.status)">
<my-tag :type="FOLLOWUP_STATUS.getTagByValue(scope.row.status)">
{{
FOLLOWUP_STATUS.getLabelByValue(scope.row.status)
}}
</el-tag>
</my-tag>
</template>
</el-table-column>
<el-table-column align="center" label="最近任务时间" prop="nextTaskDate" width="180">
@@ -228,9 +228,9 @@
</el-table-column>
<el-table-column align="center" label="任务状态" width="100">
<template slot-scope="scope">
<el-tag :type="FOLLOWUP_STATUS.getTagByValue(scope.row.nextTaskStatus)">
<my-tag :type="FOLLOWUP_STATUS.getTagByValue(scope.row.nextTaskStatus)">
{{ FOLLOWUP_STATUS.getLabelByValue(scope.row.nextTaskStatus) }}
</el-tag>
</my-tag>
</template>
</el-table-column>
<el-table-column
@@ -311,7 +311,6 @@ export default {
status: "",
wardId: "", // 院区ID
deptId: [],
name: "",
},
pageList: [],
viewData: {},
@@ -358,13 +357,7 @@ export default {
async getDoctorOptions() {
const { data } = await getDoctorAllList();
console.log("data=", data);
this.doctorList = data.map((item) => {
const { doctorId, userInfo = {} } = item;
return {
doctorId,
...userInfo,
};
});
this.doctorList = data
},
loadData() {
this.loadWardIdList();
@@ -444,6 +437,7 @@ export default {
.overview {
display: flex;
flex-wrap: wrap;
justify-content: center;
width: 100%;
padding-bottom: 10px;
.overview-item {


+ 0
- 331
src/views/statisticalManage/followupTaskStatistical/listPage/index.vue Wyświetl plik

@@ -1,331 +0,0 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="80px"
>
<el-form-item label="科室" prop="deptId">
<TreeDept
v-model="queryParams.deptId"
clearable
style="width: 240px"
:options="deptList"
:autoFetch="false"
:props="{ emitPath: false, checkStrictly: false }"
@change="onChangeDept"
/>
</el-form-item>
<el-form-item label="医生名称" prop="doctorName">
<el-select
v-model="queryParams.doctorName"
placeholder="请输入医生名称"
clearable
filterable
style="width: 240px"
>
<el-option
v-for="item in doctorList"
:key="item.doctorId"
:value="item.userName"
:label="item.userName"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="随访时间">
<el-date-picker
v-model="dateRange"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">
搜索
</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<div class="overview">
<div class="overview-item">
<div class="title-label">
<span>随访任务完成率</span>
<el-tooltip content="已完成的随访任务数/全部随访任务数" placement="top">
<i class="el-icon-question" style="color: #909399"></i>
</el-tooltip>
</div>
<div class="num">{{ viewData ? viewData + '%' : viewData }}</div>
</div>
</div>

<div style="display: flex; justify-content: space-between; padding-bottom: 8px">
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
<!-- <ApiButton type="primary" plain icon="el-icon-download" size="mini" :api="exportRequest">
导出Excel表
</ApiButton> -->
</div>

<el-table v-loading="loading" :data="pageList" border row-key="id">
<el-table-column
align="center"
label="序号"
type="index"
:index="(index) => (queryParams.pageNum - 1) * queryParams.pageSize + index + 1"
:min-width="120"
/>
<el-table-column
align="center"
label="随访单编号"
prop="task.id"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column
align="center"
label="患者名称"
prop="patient.name"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column
align="center"
label="患者性别"
prop="patient.sex"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column
align="center"
label="联系电话"
prop="patient.phoneNumber"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column
align="center"
label="科室"
prop="followDocument.deptName"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column
align="center"
label="责任医生"
prop="followDocument.doctorName"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column
align="center"
label="任务次数"
prop="task.batchNo"
:show-overflow-tooltip="true"
:min-width="150"
>
<template #default="{row}">
{{ row.task.batchNo ? `第${row.task.batchNo}次任务` : '--' }}
</template>
</el-table-column>
<el-table-column
align="center"
label="任务开始时间"
prop="task.taskBeginTime"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column
align="center"
label="任务结束时间"
prop="task.taskEndTime"
:show-overflow-tooltip="true"
:min-width="150"
/>
<el-table-column align="center" label="任务状态" :min-width="100">
<template slot-scope="scope">
<span
:style="{
color: ![undefined, null].includes(scope.row.task.status)
? followItemStatusEnum.enum[scope.row.task.status].color
: '',
}"
>
{{
scope.row.task.status !== undefined
? followItemStatusEnum.getLabel(scope.row.task.status)
: ""
}}
</span>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>

<script>
import { getDoctorAllList } from "@/api/hospital/index";
import { followUpTaskViewData, followUpTaskStaticalListApi }from "@/api/common/statisticalManage/followupTaskStatistical";
import { getAllHospital, getTreeHospDeptByPatient } from "@/api/admin";
import ApiButton from "@/components/ApiButton";
import TreeDept from "@/components/TreeDept";

export default {
name: "FollowUpStatistical",
enums: ["followItemStatusEnum", "periodUnitEnum"],
components: {
ApiButton,
TreeDept,
},
data() {
return {
// 遮罩层
loading: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 日期范围
dateRange: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
doctorId: undefined,
status: "",
wardId: "", // 院区ID
deptId: "",
doctorName: "",
},
pageList: [],
viewData: null,
deptList: [], // 科室数据
doctorList: [],
};
},
created() {
this.loadData();
},
activated() {
this.loadData();
},
methods: {
async getDoctorOptions() {
const { data } = await getDoctorAllList({
deptId: this.queryParams.deptId
});
console.log("data=", data);
this.doctorList = data.map((item) => {
const { doctorId, userInfo = {} } = item;
return {
doctorId,
...userInfo,
};
});
},
loadData() {
this.getDoctorOptions();
this.getDeptList();
this.getViewData();
this.getList();
},
onChangeDept(val) {
console.log('val=', val, this.queryParams)
this.queryParams.doctorId = undefined
this.queryParams.doctorName = undefined
this.getDoctorOptions()
},
/*获取科室数据*/
async getDeptList(wardId) {
const res = await getTreeHospDeptByPatient({ wardId: wardId });
this.deptList = res.data || [];
},
// 面板展示数据
async getViewData() {
const params = JSON.parse(JSON.stringify(this.queryParams));
Reflect.deleteProperty(params, "pageNum");
Reflect.deleteProperty(params, "pageSize");
const res = await followUpTaskViewData(this.addDateRange(params, this.dateRange));
this.viewData = res.data;
},
/** 查询列表 */
getList() {
this.loading = true;
const params = JSON.parse(JSON.stringify(this.queryParams));
console.log('params=', params)
params.beginTime = this.dateRange?.[0]
params.endTime = this.dateRange?.[1]
followUpTaskStaticalListApi(params)
.then((res) => {
const {
data: { list, page },
} = res;
this.pageList = list || [];
this.total = page?.total || 0;
})
.finally(() => {
this.loading = false;
});
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getViewData();
this.getDeptList(this.queryParams.wardId);
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
this.handleQuery();
}
},
};
</script>
<style lang="scss" scoped>
.overview {
display: flex;
flex-wrap: wrap;
justify-content: center;
width: 100%;
padding-bottom: 10px;
.overview-item {
display: flex;
flex-direction: column;
width: calc(25% - 10px);
min-width: 300px;
height: 130px;
margin-right: 10px;
margin-bottom: 10px;
padding: 0 20px;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
background-color: #fff;
.title-label {
font-size: 16px;
font-weight: 600;
line-height: 40px;
}
.num {
padding-top: 10px;
font-size: 30px;
font-weight: 600;
text-align: center;
color: #1890ff;
}
}
}
</style>

+ 0
- 1
src/views/userManage/roleManage/roleList/index.vue Wyświetl plik

@@ -107,7 +107,6 @@ import CrudPopup from "./components/CrudPopup/index.vue";
import { RULE_STATUS } from '@/enums/index';
export default {
name: "RoleManage",
enums: ["sysStatusMap", "sysStatusEnum"],
components: {
ApiButton,
CrudPopup,


Ładowanie…
Anuluj
Zapisz